我想使用自动分区块设备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_name
Linux 内核源代码 (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