如何在知道块设备和分区号的情况下(可靠地)获取分区设备名称?
例如:
_get_part_dev_from_disk_dev /dev/ccis0 3
=> /dev/ccis0p3. # 注意 p
_get_part_dev_from_disk_dev /dev/sde 2
=> /dev/sde2
我当前的方法如下,但它有错误,因为它假设次要编号是分区号,除了第一个磁盘之外,这是完全错误的。可以计算minor,但它有很多限制。一是达到最大值后,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
+数字。无需为此检查主修/辅修。
困难的部分是回答“第三个分区是什么”。它是磁盘上的第三个分区还是第三个分区?sda1
按位置可以是磁盘上的第三个分区。
如果您对磁盘上的分区位置感兴趣,则需要使用了解分区表的工具 soparted
或fdisk
。sfdisk
具有 JSON 输出选项,可以更轻松地从脚本中解析。
如果您只需要第三个分区,那么您可以简单地将3
(或p3
,见上文)添加到磁盘名称/路径,您将获得分区名称/路径。
答案2
我想我找到了一个解决方案,但我不确定它是否可靠,有人可以确认吗?我查询开发符号链接并选择第一个。它们都是等价的吗?第一个靠谱吗?如果是,我认为以下行可以正确完成工作(获取磁盘 /dev/sda 的第二个分区的设备名称
readlink -f /dev/$(udevadm info -q symlink /dev/sda|cut -d' ' -f1)-part2
=> /dev/sda2