ブロックデバイスがある場合、パーティション名に「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

関連情報