親ブロックのデバイス名を取得するポータブルな方法を探しています(例:/dev/sda
)パーティションデバイス名を指定(例:/dev/sda1
)。私は最後の文字をドロップすることができることを知っていますが、それはいくつかのケースではうまくいきません:
/dev/mmcblk0
、パーティションには/dev/mmcblk0p1
(追加のp
に注意してください)。LVMボリュームは、まったく異なる魚のやかんです。現時点ではサポートする必要はありませんが、それらを考慮に入れるのにほとんど手間がかからなければ問題ありません。
Linuxを使用している場合は、lsblk
(util-linux
の一部)を使用できます。
lsblk -no pkname /dev/sda1
デバイスが別のデバイスのパーティションである場合、_/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)")"
から取得できます)のようなものです。