web-dev-qa-db-ja.com

パーティションデバイス名からブロックデバイス名を取得する方法

親ブロックのデバイス名を取得するポータブルな方法を探しています(例:/dev/sda)パーティションデバイス名を指定(例:/dev/sda1)。私は最後の文字をドロップすることができることを知っていますが、それはいくつかのケースではうまくいきません:

  • MMCカードリーダーの名前は通常、/dev/mmcblk0、パーティションには/dev/mmcblk0p1(追加のpに注意してください)。
  • オプション:一部のブロックデバイスにはパーティションテーブルがまったくなく、単一のパーティションとしてフォーマットされます。この場合、パーティションデバイスと親ブロックデバイスは同じです。

LVMボリュームは、まったく異なる魚のやかんです。現時点ではサポートする必要はありませんが、それらを考慮に入れるのにほとんど手間がかからなければ問題ありません。

14

Linuxを使用している場合は、lsblkutil-linuxの一部)を使用できます。

lsblk -no pkname /dev/sda1
16
don_crissti

デバイスが別のデバイスのパーティションである場合、_/sys/class/block/$dev_にはpartitionというファイルが含まれます(そのコンテンツはパーティション番号です)。

その場合は、次のコマンドで親デバイスの名前を取得できます。

_basename "$(readlink -f "/sys/class/block/$dev/..")"
_

またはzshを使用:

_echo /sys/class/block/$dev(:A:h:t)
_

例:

_$ dev=sda1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
sda
$ dev=nbd0p1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
nbd0
_

LVMボリュームは完全に異なります。物理PVの1つの連続したlinearマッピングである特別な場合を除いて、パーティションではありません。

そのような場合は、次のコマンドでPVの名前を取得できます。

_ls "/sys/class/block/$dev/slaves"
_

ここで、_$dev_は_dm-2_("$(basename "$(readlink -f /dev/VG/LV)")"から取得できます)のようなものです。

16