web-dev-qa-db-ja.com

システム内のディスクがフォーマットされているかどうかをテストする方法

現在、複数のシステムでディスクの任意のグループを扱っているプロジェクトに取り組んでいます。これらのディスクを焼き付けるための一連のソフトウェアを作成しました。そのプロセスの一部は、ディスクをフォーマットすることでした。ソフトウェアをテストしているときに、ディスクのフォーマット中のある時点でプロセスが停止/終了し、プロセスを再開したい場合、セット内のすべてのディスクを再フォーマットする必要はないことに気付きました。正常にフォーマットされました。

私はこのソフトウェアをRAMFSから実行していますが、ディスクはマウントされておらず、作業中のディスクもマウントされておらず、使用されていませんテスト以外のソフトウェアなので、これらの悪者は何でもします。関係するデータはありません。

編集:

いいえ、パーティションを設定していません。

はい、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.

魔法のポーションはJanの提案を拡張して、私が気にかけていたことを単純に出力することに注意してください:lsblk -no KNAME,FSTYPE $drive

6
Jim

ドライブへのアクセス方法によっては、ドライブでblkid -o list(非推奨)を使用して、出力を解析できます。
このコマンドは、ファイルシステムを示すfs_typeラベル列を出力します。

blkid -o listlsblk -fに置き換えられました。

6
Jan

私が使用するロジックは少し複雑であるように見えるかもしれませんが、私はそれが失敗モードをキャッチするべきだと思います。

基本的にステップは

  1. mke2fs
  2. ファイルシステムをマウントする
  3. ファイルシステムに「format.complete」というファイルを作成します
  4. ファイルシステムをアンマウントする

したがって、この前にいくつかのテストを行う必要があります。ロジックは次のようになります。

  1. $tmpmountでファイルシステムをマウントしようとしましたext2を強制しています
  2. mountがエラーコードを返した場合==> Goto NOT FORMATTED
  3. $tmpmount/lost+foundが存在しない場合は、奇妙なファイルシステムがマウントされています。起こらないはずですが... umount。フォーマットされていないGoto
  4. $tmpmount/format.completeが存在しない場合、フォーマットは中断されました。 umount。フォーマットされていないGoto
  5. umount ==>フォーマット済み、次のディスクにスキップします。

「フォーマットされていません」は元の4つのステップになります。

これらの構造を一緒に追加できます。その結果、ディスクは、format.completeファイルが存在しない場合にのみフォーマットされます。

すべてのディスクがフォーマットされたら、オプションで各ディスクを再マウントしてformat.completeファイルを削除できます。

基本的に、各ディスクで少量の状態を維持し、それを使用してフォーマットが成功したかどうかを判断します。

1
Stephen Harris