如何从分区设备名称获取块设备名称?

如何从分区设备名称获取块设备名称?

我正在寻找一种可移植的方法来获取/dev/sda给定分区设备名称(例如)的父块设备名称(例如/dev/sda1)。我知道我可以删除最后一个字符,但在某些情况下这是行不通的:

  • MMC 读卡器通常具有类似 的名称/dev/mmcblk0,而其分区具有类似的名称/dev/mmcblk0p1(请注意额外的p)。
  • 可选:某些块设备根本没有任何分区表,并且被格式化为单个分​​区。在这种情况下,分区设备和父块设备是相同的。

LVM 卷完全是另一回事。我现在不需要支持他们,但如果考虑到他们不需要额外的努力,我不会介意。

答案1

如果你使用的是 Linux,你可以使用lsblk(这是 的一部分util-linux):

lsblk -no pkname /dev/sda1

答案2

如果一个设备是另一个设备的分区,那么/sys/class/block/$dev将包含一个名为partition(其内容是分区号)的文件。

如果是这种情况,您可以通过以下方式获取父设备的名称:

basename "$(readlink -f "/sys/class/block/$dev/..")"

或者与zsh

echo /sys/class/block/$dev(:A:h:t)

例子:

$ dev=sda1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
sda
$ dev=nbd0p1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
nbd0

LVM 卷完全不同,它们不是分区除非在特殊情况下,它们是linear物理 PV 的一个连续映射。

如果您遇到这种情况,您可以通过以下方式获取该 PV 的名称:

ls "/sys/class/block/$dev/slaves"

哪里$dev有类似的东西dm-2(你可以从 获得"$(basename "$(readlink -f /dev/VG/LV)")")。

相关内容