![如何从分区设备名称获取块设备名称?](https://linux22.com/image/94108/%E5%A6%82%E4%BD%95%E4%BB%8E%E5%88%86%E5%8C%BA%E8%AE%BE%E5%A4%87%E5%90%8D%E7%A7%B0%E8%8E%B7%E5%8F%96%E5%9D%97%E8%AE%BE%E5%A4%87%E5%90%8D%E7%A7%B0%EF%BC%9F.png)
我正在寻找一种可移植的方法来获取/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)")"
)。