ブロックデバイスとパーティション番号を知り、パーティションデバイス名を(安定的に)取得する方法は?
たとえば、
_get_part_dev_from_disk_dev /dev/ccis0 3
=> /dev/ccis0p3. #Note p
_get_part_dev_from_disk_dev /dev/sde 2
=> /dev/sde2
現在私が使用する方法は次のとおりですが、最初のディスクを除いてマイナー番号をパーティション番号と仮定するため、バグがあります。これは完全に間違っています。マイナー計算は可能ですが、限界が多いです。まず最大値に達した後、devを動的に割り当てます。
_get_part_dev_from_disk_dev() {
if test -b "$1"
then
DEV_MAJOR=$(printf "%d" "0x$(stat -c '%t' $1)")
else
shellout "[$1] is no a block device"
fi
test -n "${2//[0-9]/}" && shellout "[$2] is not a partition number"
if test ! -r /sys/dev/block/$DEV_MAJOR:$2/uevent
then
logerror "Can't read /sys/dev/block/$DEV_MAJOR:$2/uevent"
shellout "Can't gather $1 partition $2 informations"
fi
. /sys/dev/block/$DEV_MAJOR:$2/uevent
test "$DEVTYPE" != "partition" && shellout "/sys/dev/block/$DEV_MAJOR:$2 TYPE=$DEVTYPE is not a partition."
# echo $(udevadm info --query=name --path=/sys/dev/block/$DEV_MAJOR:$2)
echo "/dev/$DEVNAME"
}
これは、ブロックデバイス名とパーティション番号を知っているパーティションを作成するスクリプトの一部です。後でファイルシステムを作成する必要がありますが、パーティション名はブロックデバイス名の後にパーティション番号が続くと仮定することはできません。時には文字pがあります(ドライバによって異なります)。
たぶんudevはこれを知っていますか?
答え1
時には文字pがあります(ドライバによって異なります)。
p
ディスクが数字で終わると、常に文字が追加されます。したがって、ディスク名とパーティション番号がある場合は、常にパーティション名が次のようになると想定できます。ディスク名+数字またはディスク名+ p
+数字。このために専攻/不専攻を確認する必要はありません。
難しい部分は、「3番目のパーティションが何であるか」に答えることです。ディスクの3番目または3番目のパーティションですか?sda1
場所によっては、ディスクの3番目のパーティションにすることができます。
ディスク上のパーティションがどこにあるかを知りたい場合は、パーティションテーブルを理解するツールを使用する必要がparted
ありますfdisk
。sfdisk
スクリプトでより簡単に解析できるように、JSON出力オプションがあります。
3番目のパーティションのみが必要な場合は、ディスク名/パスに単に追加3
(または上記を参照)してパーティション名/パスを取得できます。p3
答え2
解決策を見つけたようですが、信頼できるかどうかはわかりません。誰でも確認できますか?開発シンボリックリンクを照会し、最初のシンボリックリンクを選択します。それらはすべて同等ですか?最初は信じるか?もしそうなら、次の行が正しく動作すると思います(ディスク/ dev / sdaの2番目のパーティションのデバイス名を取得します)。
readlink -f /dev/$(udevadm info -q symlink /dev/sda|cut -d' ' -f1)-part2
=> /dev/sda2