Linux

給定一個塊設備,如何檢測分區名稱是否必須包含“p”?

  • February 18, 2019

我想用sfdisk. 這可能是 SD 卡、硬碟、SATA 或 NVME 設備。最初我認為這sfdisk需要這些名稱,因此我希望正確生成它們,但顯然無論如何都可以將它們排除在外。:)

與傳統的 ATA 和 SATA 設備的分區名稱簡單地附加到設備名稱(例如,/dev/sda1對於塊設備的第一個分區sda)不同,存在另一種基於快閃記憶體並使用其他驅動程序的塊設備方案。這些在設備和分區名稱之間添加一個p(例如/dev/mmcblk0p1,對於 的第一個分區mmcblk0)。不幸的是,我還沒有找到任何關於這些細節的核心文件。

給定一個塊設備(例如,/dev/mmcblk0),我如何決定各個(但不存在的)分區是否將命名為p(例如,/dev/mmcblk0p1/dev/mmcblk01)?

這基本上是這個問題的相反問題,有一個額外的轉折,即分區還不存在(為了這個問題,我不允許答案實際修改分區表,因此嘗試它是無效的)。

如果設備名稱以數字結尾,則核心添加“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)

以下是對這項工作可能會或可能不會有幫助的內容:

# 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

引用自:https://unix.stackexchange.com/questions/500887