Linux (Debian) でディスク (パーティションではない) を確実に識別する

Linux (Debian) でディスク (パーティションではない) を確実に識別する

次のようなスクリプトでディスクのパーティション テーブルをバックアップします。

sfdisk --dump /dev/sda > partition_table.dump

しかし

  • /dev/sda信頼できない可能性があるので、使用したくありません。

  • /dev/disk/by-id どうやら信頼できない。

  • /dev/disk/by-uuidパーティションのみdf(ディスクは含まない)が含まれます。

ただし、fdisk -l「ディスク識別子」UUID が表示されます。sdaディスク識別子からディスク名 ( ) を取得することはできますか? または、ディスクを確実に識別する別の方法はありますか?

答え1

とにかく使ってください/dev/disk/by-id/リンク先の問題まれなハードウェアの故障か、それと似たような悪い事態のように見えます。

比較する

ls -l /dev/disk/by-id/

# 'lsblk' is from 'util-linux' package
lsblk -pdo NAME,VENDOR,MODEL,SERIAL,WWN

ただし、一部のシステムでは上記のコマンドを実行すると空白の値が表示されますが、それでも試すことができます:

# the below 'smartctl' command (from 'smartmontools' package) probably needs 'sudo'
for sd in $(lsblk -pdo NAME | tail -n +2); do
  printf "%s\n" "$sd"; smartctl -i "$sd" |
  grep -E "Model:|Number:|WWN"
done

あまり知らないワールドワイドただし、シリアル番号はハードウェアにハードコードされている必要があります。つまり、何らかの理由でシリアル番号が変更されると、バックアップ スクリプトが突然機能しなくなるよりも大きな問題が発生する可能性があるということです。


シリアル番号は、パーティションテーブルが何であっても物理デバイスを識別することに注意してください(パーティションテーブルが存在する場合は、「スーパーフロッピー」という用語を調べてください)。この質問パーティションテーブル自体を識別したい場合は、発見したこれらの「ディスク識別子」UUIDが適切なアプローチになります(GPTスキームでは128ビットのUUIDですが、MBRでは32ビットのオプションの署名であることに注意してください)。例はこちら)。これらは、変更、クローン、バックアップが可能なディスク上の数バイトにすぎません。使用可能なデバイスを参照する以外に、このタイプの識別子でデバイス ノードを識別する簡単な方法は見つかりませんでした。

id=8080fdb4-6905-4f34-91fa-61389615d7d3
# the below 'fdisk' command (from 'util-linux' package) probably needs 'sudo'
for sd in $(lsblk -pdo NAME | tail -n +2); do
  fdisk -l "$sd" | grep -qi " ${id}$" && printf "%s\n" "$sd"
done

/dev/disk/by-uuid[...] パーティションのみが含まれます (ディスクは含まれません)。

まあ、UUID はパーティション内の構造 (ファイルシステムやスワップなど) を参照しており、パーティション自体を参照しているわけではないので、すべてが含まれているとは限りません (スーパーフロッピーを扱う場合は、ディスク全体がここに表示されます)。これらの UUID はそれぞれ、対応するパーティション (スーパーフロッピーの場合はデバイス) 内のどこかに書き込まれます。これらは、たとえば次のように呼び出すときに表示される識別子です。

# 'file' is from 'file' package
file -s /dev/sda2

パーティション識別子が必要な場合は、 にあります/dev/disk/by-partuuid/。これらは と同じです。

# 'partx' is from 'util-linux' package
partx --show /dev/sda

これらは対応するパーティションテーブルに保存されており、パーティション内ではありません。以下を実行すると、より広い範囲で情報を得ることができます。

# 'blkid' (from 'util-linux' package) probably needs 'sudo'
blkid

特定の UUID を持つパーティションを保持するデバイスを識別するには、次を試してください。

id=68e3b991-5c7a-4d18-a120-834ef4effe00
readlink -e "/dev/disk/by-partuuid/$id" | sed 's/[0-9]*$//'

(ここでは末尾の数字のみを削除します)。このソリューションは、必要に応じてsed情報を取得するために簡単に適応できます。/dev/disk/by-uuid/

関連情報