Linux:如何获取给定块设备的第三个分区的设备名称

Linux:如何获取给定块设备的第三个分区的设备名称

如何在知道块设备和分区号的情况下(可靠地)获取分区设备名称?

例如:

_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按位置可以是磁盘上的第三个分区。

如果您对磁盘上的分区位置感兴趣,则需要使用了解分区表的工具 sopartedfdisksfdisk具有 JSON 输出选项,可以更轻松地从脚本中解析。

如果您只需要第三个分区,那么您可以简单地将3(或p3,见上文)添加到磁盘名称/路径,您将获得分区名称/路径。

答案2

我想我找到了一个解决方案,但我不确定它是否可靠,有人可以确认吗?我查询开发符号链接并选择第一个。它们都是等价的吗?第一个靠谱吗?如果是,我认为以下行可以正确完成工作(获取磁盘 /dev/sda 的第二个分区的设备名称

readlink -f /dev/$(udevadm info -q symlink /dev/sda|cut -d' ' -f1)-part2

=> /dev/sda2

相关内容