블록 장치가 있는 경우 파티션 이름에 "p"가 포함되어야 하는지 여부를 어떻게 감지할 수 있나요?

블록 장치가 있는 경우 파티션 이름에 "p"가 포함되어야 하는지 여부를 어떻게 감지할 수 있나요?

자동 파티션 장치를 사용하고 싶습니다 sfdisk. 이는 SD 카드, 하드 드라이브, SATA 또는 NVME 장치일 수 있습니다. 처음에는 이러한 이름이 필요하다고 생각하여 sfdisk올바르게 생성되기를 원했지만 어쨌든 무시할 수 있습니다. :)

단순히 장치 이름에 파티션 이름을 추가하는 기존 ATA 및 SATA 장치와 달리(예: /dev/sda1블록 장치의 첫 번째 파티션 sda), 플래시 기반이고 추가 드라이버를 사용하는 블록 장치의 경우 다른 옵션이 있습니다. 이는 p장치와 파티션 이름 사이에 1을 추가합니다(예: /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

관련 정보