Linux
給定一個塊設備,如何檢測分區名稱是否必須包含“p”?
我想用
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_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)
以下是對這項工作可能會或可能不會有幫助的內容:
# 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