예약된 목록을 제외한 모든 디스크에서 "echo 1 > /sys/block/sdX/device/delete"

예약된 목록을 제외한 모든 디스크에서 "echo 1 > /sys/block/sdX/device/delete"

제거해야 할 scsi 디스크 목록이 있습니다. 이 목록은 기껏해야 무작위로 간주되며 수시로 변경될 수 있습니다. 내가 만든 미리 정의된 목록을 제외한 모든 항목을 삭제하고 싶습니다. 이제 다음을 유지하고 싶다고 가정해 보겠습니다.

/dev/sda
/dev/sdb

내가 실행해야 하는 명령은 다음과 같습니다.

"echo 1 > /sys/block/sdX/device/delete"

여기서 X는 제거할 장치입니다.

저는 bash 스크립팅에 능숙하지 않아서 어디서부터 시작해야 할지 잘 모르겠습니다.

명확하지 않아서 DV를 받지 않도록 요약하자면.

시스템의 모든 sdX 장치에 대해 "echo 1 > /sys/block/sdX/device/delete"를 수행해야 합니다(예약된 목록 제외).

편집: 아래 답변 후에 이것이 제가 사용하기로 결정한 것입니다. "LocalDisks.txt"에는 "/dev/sda"와 같은 줄이 포함되어야 합니다.

#!/bin/bash
exclude=$(cut -d/ -f3 LocalDisks.txt)

for sysfile in /sys/block/sd* ; do

dev=$(basename $sysfile)
del=$sysfile/device/delete

if [[ $exclude == *$dev* ]] ; then
    echo "Device $dev excluded"

elif [ ! -w $del ] ; then
    echo "$del does not exist or is not writable"

else
    echo 1 > $del
fi

done

답변1

작동하는 접근 방식은 다음과 같습니다.

  • sdX제외할 장치 목록 가져오기

    exclude=$(cut -d/ -f3 exclude.txt)
    
  • 디렉토리 반복 /sys/block/sdX:

    for sysfile in /sys/block/sd? ; do
    
  • sdX해당 경로에서 이름을 추출하고 delete파일 이름을 만듭니다.

      dev=$(basename $sysfile)
      del=$sysfile/device/delete
    
  • sdX제외 목록에 있는지 확인하십시오 .

      if [[ $exclude == *$dev* ]] ; then
        echo "Device $dev excluded"
    
  • 파일을 삭제할 수 있는 적절한 쓰기 권한이 있는지 확인하세요.

      elif [ ! -w $del ] ; then
        echo "$del does not exist or is not writable"
    
  • 삭제(별로 그렇지 않음)

      else
        echo "echo 1 > $del"
      fi
    
  • 이제 끝났습니다!

    done
    

관련 정보