시스템 디스크가 포맷되었는지 테스트하는 방법

시스템 디스크가 포맷되었는지 테스트하는 방법

현재 여러 시스템에 걸쳐 임의의 디스크 그룹을 작업하는 프로젝트를 진행하고 있습니다. 나는 이 디스크를 굽기 위한 소프트웨어를 작성했습니다. 프로세스의 일부는 디스크를 포맷하는 것입니다. 내 소프트웨어를 테스트하는 동안 디스크 포맷 중 어느 시점에서 프로세스가 중지/종료되고 프로세스를 다시 시작하려는 경우 그룹의 모든 디스크를 다시 포맷하고 싶지 않다는 것을 깨달았습니다. 이러한 디스크는 포맷되었습니다. 성공적으로.

나는 디스크의 ramf가 마운트된 상태에서 이 소프트웨어를 실행한 적이 없으며, 내가 작업 중인 디스크는 마운트되지 않았습니다.아니요내 소프트웨어는 테스트 이외의 용도로 사용할 수 있으므로 이 나쁜 놈들에게는 어떤 것이든 적합합니다. 참고할만한 자료가 없습니다.

편집하다:

아니요, 분할하지 않습니다.

예, ext2 fs입니다.

다음은 포맷하는 데 사용하는 명령입니다.

(/sbin/mke2fs -q -O sparse_super,large_file -m 0 -T largefile -T xfs -FF $drive >> /tmp/mke2fs_drive.log 2>&1 & echo $? > $status_file &)

해결책:

다음 제안을 주신 Jan에게 감사드립니다.

# lsblk -f /dev/<drv>다음 쉘 함수를 작성했는데 예상대로 작동합니다.

원천

is_formatted()
{
  drive=$1
  fs_type=$2

  if [[ ! -z $drive ]]
  then
    if [[ ! -z $fs_type ]]
    then
      current_fs=$(lsblk -no KNAME,FSTYPE $drive)

      if [[ $(echo $current_fs | wc -w) == 1 ]]
      then
        echo "[INFO] '$drive' is not formatted. Formatting."
        return 0
      else
        current_fs=$(echo $current_fs | awk '{print $2}')

        if [[ $current_fs == $fs_type ]]
        then
          echo "[INFO] '$drive' is formatted with correct fs type. Moving on."
          return 1
        else
          echo "[WARN] '$drive' is formatted, but with wrong fs type '$current_fs'. Formatting."
          return 0
        fi
      fi
    else
      echo "[WARN] is_formatted() was called without specifying fs_type. Formatting."
      return 0
    fi
  else
    echo "[FATAL] is_formatted() was called without specifying a drive. Quitting."
    return -1
  fi
}

데이터

sdca  ext2             46b669fa-0c78-4b37-8fc5-a26368924b8c
sdce  ext2             1a375f80-a08c-4889-b759-363841b615b1
sdck  ext2             f4f43e8c-a5c6-495f-a731-2fcd6eb6683f
sdcn
sdby  ext2             cf276cce-56b1-4027-a795-62ef62d761fa
sdcd  ext2             42fdccb8-e9bc-441e-a43a-0b0f8d409c71
sdci  ext2             d6e7dc60-286d-41e2-9e1b-a64d42072253
sdbw  ext2             c3986491-b83f-4001-a3bd-439feb769d6a
sdch  ext2             3e7dba24-e3ec-471a-9fae-3fee91f988bd
sdcq
sdcf  ext2             8fd2a6fd-d1ae-449b-ad48-b2f9df997e5f
sdcs
sdco
sdcw  ext2             27bf220e-6cb3-4953-bee4-aff27c491721
sdcp  ext2             133d9474-e696-49a7-9deb-78d79c246844
sdcx
sdct
sdcu
sdcy
sdcr
sdcv
sdde
sddc  ext2             0b22bcf1-97ea-4d97-9ab5-c14a33c71e5c
sddi  ext2             3d95fbcb-c669-4eda-8b57-387518ca0b81
sddj
sddb
sdda  ext2             204bd088-7c48-4d61-8297-256e94feb264
sdcz
sddk  ext2             ed5c8bd8-5168-487f-8fee-4b7c671ef2cb
sddl
sddn
sdds  ext2             647d2dea-f71d-4e87-bbe5-30f6424b36c9
sddf  ext2             47128162-bcb7-4eab-802d-221e8eb36074
sddo
sddh  ext2             b7f41e1a-216d-4580-97e6-f2df917754a8
sddg  ext2             39b838e0-f0ae-447c-8876-2d36f9099568

결과 :

[INFO] '/dev/sdca' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdce' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdck' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcn' is not formatted. Formatting.
[INFO] '/dev/sdby' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcd' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdci' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdbw' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdch' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcq' is not formatted. Formatting.
[INFO] '/dev/sdcf' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcs' is not formatted. Formatting.
[INFO] '/dev/sdco' is not formatted. Formatting.
[INFO] '/dev/sdcw' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcp' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcx' is not formatted. Formatting.
[INFO] '/dev/sdct' is not formatted. Formatting.
[INFO] '/dev/sdcu' is not formatted. Formatting.
[INFO] '/dev/sdcy' is not formatted. Formatting.
[INFO] '/dev/sdcr' is not formatted. Formatting.
[INFO] '/dev/sdcv' is not formatted. Formatting.
[INFO] '/dev/sdde' is not formatted. Formatting.
[INFO] '/dev/sddc' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddi' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddj' is not formatted. Formatting.
[INFO] '/dev/sddb' is not formatted. Formatting.
[INFO] '/dev/sdda' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcz' is not formatted. Formatting.
[INFO] '/dev/sddk' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddl' is not formatted. Formatting.
[INFO] '/dev/sddn' is not formatted. Formatting.
[INFO] '/dev/sdds' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddf' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddo' is not formatted. Formatting.
[INFO] '/dev/sddh' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddg' is formatted with correct fs type. Moving on.

Magic Potion은 내가 관심 있는 내용을 간단히 출력하도록 Jan의 제안을 확장하고 있습니다.lsblk -no KNAME,FSTYPE $drive

답변1

드라이브에 액세스하는 방법에 따라 blkid -o list드라이브를 사용한 다음(권장하지 않음) 출력을 구문 분석할 수 있습니다.
무엇보다도 이 명령은 파일 시스템을 표시하는 fs_type 레이블 열을 출력합니다.

blkid -o list이(가) 대체되었습니다 lsblk -f.

답변2

제가 사용할 로직은 다소 복잡해 보일 수 있지만 실패 모드를 포착해야 한다고 생각합니다.

기본적으로 단계는 다음과 같습니다.

  1. mke2fs
  2. 파일 시스템 마운트
  3. 파일 시스템에 "format.complete"라는 파일을 생성합니다.
  4. 파일 시스템 마운트 해제

따라서 그 전에 몇 가지 테스트를 수행해야 합니다. 논리는 다음과 같습니다.

  1. $tmpmount파일 시스템을 강제로 마운트 해 보세요ext2
  2. 오류 코드가 반환된 경우 mount==> 포맷되지 않음으로 이동
  3. 거기에 없으면 $tmpmount/lost+found이상한 파일 시스템이 마운트되어 있어서는 안 되지만 umount...unformatted로 이동하세요.
  4. $tmpmount/format.complete존재하지 않으면 포맷이 중단 됩니다 umount. 포맷되지 않은 상태로 이동
  5. umount==> 포맷되었습니다. 다음 디스크로 이동합니다.

"포맷되지 않음"은 원래 4단계입니다.

우리는 이러한 구조를 함께 추가할 수 있습니다. 결과적으로 디스크는 format.complete파일이 없는 경우에만 포맷됩니다.

모든 디스크를 포맷한 후 각 디스크를 다시 설치하고 파일을 삭제하도록 선택할 수 있습니다 format.complete.

기본적으로 우리는 각 디스크에 소량의 상태를 유지하고 이를 사용하여 포맷이 성공했는지 여부를 확인합니다.

관련 정보