给定一个块设备,如何检测分区名称是否必须包含“p”?

给定一个块设备,如何检测分区名称是否必须包含“p”?

我想使用自动分区块设备sfdisk。这可能是 SD 卡、硬盘、SATA 或 NVME 设备。最初我认为这sfdisk需要这些名称,因此我希望正确生成它们,但显然无论如何都可以忽略它们。 :)

与传统的 ATA 和 SATA 设备不同,传统的 ATA 和 SATA 设备将分区名称简单地附加到设备名称(例如,/dev/sda1对于块设备的第一个分区sda),对于基于闪存并使用其他驱动程序的块设备,存在另一种方案。这些p在设备和分区名称之间添加一个(例如,/dev/mmcblk0p1对于第一个分区mmcblk0)。不幸的是我没有找到任何关于这些细节的内核文档。

给定一个块设备(例如,/dev/mmcblk0),我如何决定相应的(尚未存在的)分区是否用 来命名p(例如,/dev/mmcblk0p1/dev/mmcblk01)?

这基本上是一个反向问题这个但由于额外的扭曲,分区尚不存在(为了这个问题,我不允许答案实际修改分区表,因此尝试它是无效的)。

答案1

如果设备名称以数字结尾,则内核添加“p”符号以将分区号与设备名称分开。

/dev/sda -> /dev/sda1
/dev/mmcblk0 -> /dev/mmcblk0p1

有关详细信息,请参阅disk_nameLinux 内核源代码 (linux/block/partition-generic.c) 中的函数:

if (isdigit(hd->disk_name[strlen(hd->disk_name)-1]))
    snprintf(buf, BDEVNAME_SIZE, "%sp%d", hd->disk_name, partno);
else
    snprintf(buf, BDEVNAME_SIZE, "%s%d", hd->disk_name, partno)

答案2

以下是对这项工作可能有帮助或没有帮助的内容:

# Try to figure out if partition names are separated by "p" from the device name or not.
# The following cases imply a "p"
# - If the device name starts with mmcblk (common drivers for SD card readers)
# - If there is no device/type file for the respective device in /sys/class/block (e.g., NVME drives)
# - If the respective device/type indicates "0" (hard disks)
base_dev=$(basename "$sd_dev")
if [[ "$base_dev" =~ mmcblk[0-9]+ || \
      ! -e "/sys/class/block/${base_dev}/device/type" || \
      $(cat "/sys/class/block/${base_dev}/device/type") != 0 \
    ]]; then
    part_sep="p"
else
    part_sep=""
fi

相关内容