DD Zero 오류: 장치에 남은 공간이 없습니다.

DD Zero 오류: 장치에 남은 공간이 없습니다.

안녕하세요, 현재 단일 명령으로 드라이브 배치를 대량으로 지우기 위해 Xenial 서버 중 하나에서 이 스크립트를 실행할 때 문제가 발생했습니다. 첫째, 모든 드라이브가 lsblk에 표시되므로 문제가 되지 않습니다. sudo dd if=/dev/zero of=/dev/<insert drive path> bs=64KB status=progress여러 탭에서 실행하면 개별적으로 지워지지만 최근에는 다음 오류와 관련된 문제가 발생했습니다.

dd: writing to '/dev/sdb'$'\n''sdc'$'\n''sdd': No space left on device
1+0 records in
0+0 records out
0 bytes copied, 0.000280477 s, 0.0kB/s

이 문제의 원인이 무엇인지 아시나요? 아래에 코드를 남겨두었습니다. 감사해요

#!/bin/bash
erasure=
RAIDFILE="/tmp/raiddrives"
sudo rm "$RAIDFILE"
echo "Drive Wiper 1.3"
echo "Waiting for Disks to initilise"
sleep 30s # Waiting for the HDDs and SSDs to power up.

sudo /opt/MegaRAID/storcli/storcli64 /c0 set alarm=off
sudo /opt/MegaRAID/storcli/storcli64 /c0 show | grep -E ^[[:digit:]]+:[[:digit:]] >> $RAIDFILE
while read LINE; do
    declare -a slotinfo
    IFS=' ' read -r -a slotinfo <<< "$LINE"

    if [ "${slotinfo[2]}" == "UBad" ] && [ "${slotinfo[3]}" == "-" ]; then
    IFS=':' read -r -a driveid <<< "${slotinfo[0]}"
    sudo /opt/MegaRAID/storcli/storcli64 /c0/e"${driveid[0]}"/s"${driveid[1]}" set good
    echo "${slotinfo[0]} has been set to good "

    if [ "${slotinfo[2]}" == "UGood" ] && [ "${slotinfo[3]}" == "F" ]; then
      sudo /opt/MegaRAID/storcli/storcli64 /c0/fall delete
      echo "Deleted foreign RAID config on ${slotinfo[0]} "
    fi

    if [ "${slotinfo[2]}" == "UGood" ]; then
    sudo /opt/MegaRAID/storcli/storcli64 /c0 add vd r0 drives="${slotinfo[0]}"
    echo "${slotinfo[0]} available for erasure"
    fi
done < "$RAIDFILE"

echo 'Available drive(s) to be wiped' #print a list of the unmounted drives only
declare -a drivevar
drivevar=$(lsblk | awk {'print $1'} | grep '^sd' | grep -v 'sda\|sdb') #removed nvme in live version
echo $drivevar
read -p "Confirm erasure of drives, or to amend list (Y/N/A): " erasure #confirm disk erasure
erasure=${erasure^^} #capitalise erasure

yesnocheck=0 #checking if the user enters a yes or no command.
while [[ yesnocheck -eq 0 ]]; do
  case "$erasure" in
    Y|YES)
      yesnocheck=1
      : handle 'yes' cases #dont need any special actions to happen for yes or no cases
      ;;
    N|NO)
      yesnocheck=1
      : handle 'no' cases
      ;;
    A|AMEND)
      unset drivevar 1>&2 #will loop error, and constantly ask for a yes no answer until it receives one.
      declare -a drivevar
      read -p "Confirm which drives to erase e.g.sda (each seperated by a space)" drivevar
      read -p "Confirm erasure of drives, or to amend list (Y/N/A): " erasure
      erasure=${erasure^^}
      ;;
    *)
      printf '%s\n' "Not a valid selection" 1>&2 #will loop error, and constantly ask for a yes no answer until it receives one.
      read -p "Confirm erasure of drives, or to amend list (Y/N/A): " erasure
      erasure=${erasure^^}
      ;;
  esac
done

if [ "$erasure" = "Y" -o "$erasure" = "YES" ] ; #or inside a statement
then
{ for i in "${drivevar[@]}"; #getting the results from the drivevar array
do
  sudo dd if=/dev/zero of=/dev/"$i" bs=64KB status=progress & #Parrallell Wiping process, wait allows the process to be cancelled although the process is slower.
  done
  wait
      }
elif [ "$erasure" = "N" -o "$erasure" = "NO" ] ;
then
  printf '%s\n' 'Operation Aborted!'
else
  echo "Ooooops!" #something has gone wrong somewhere, this shouldnt show.
fi

답변1

배열로 선언 drivevar하지만 단일 요소 문자열로 사용합니다.

예를 들어 drivevar=$(lsblk...)배열의 첫 번째(0번째) 요소에 출력을 할당하고 echo $drivevar동일한 요소를 출력합니다. 그러나 당신은 그것을 배열로 사용하지 않습니다. 공백으로 구분된 항목 목록을 포함하는 문자열로 사용합니다.

이는 반복하려고 하면 for i in "${drivevar[@]}"모든 결과가 첫 번째(유일한) 요소에 있음을 의미합니다.

아마도 다음 형식의 배열 할당을 사용해야 합니다 var=(element element…).

drivevar=( $(lsblk …) )               # Assignment
echo "drivevar=( ${drivevar[@]} )"    # Debug line, I assume

오. 원래 오류를 발생시킨 파일을 삭제해야 합니다. 파일 이름에 개행 문자가 포함되어 있으므로 ls또는 를 사용할 때 이상하게 보일 수 있습니다 rm. rm -i삭제 전 확인을 요구 하는 데 사용됩니다 .

rm -i /dev/sdb*sdc*sdd*

그런데, 할당 표현식은 다음과 같이 단순화될 수 있습니다.

lsblk | awk {'print $1'} | grep '^sd' | grep -v 'sda\|sdb'

awk | grep안티 패턴을 피하기 위해 이와 같은 것

lsblk -dn -o NAME | awk '/^sd[^ab]/'

관련 정보