例如,如果我知道一个分区,/dev/sda1
我如何获取/dev/sda
包含该分区的磁盘名称(在本例中)?
- 输出应该只是磁盘的路径(如
/dev/sda
)。 - 它不需要字符串操作,因为我需要它适用于不同的磁盘类型。
答案1
您可以在/sys
块设备中观察给定的分区名称。例如,/dev/sda1:
$ ls -l /sys/class/block/sda1
lrwxrwxrwx 1 root root /sys/class/block/sda1 -> \
../../devices/pci0000:00/.../ata1/host0/target0:0:0/0:0:0:0/block/sda/sda1
/dev/sda1
获取 arg并打印的脚本/dev/sda
是:
part=$1
part=${part#/dev/}
disk=$(readlink /sys/class/block/$part)
disk=${disk%/*}
disk=/dev/${disk##*/}
echo $disk
我没有 lvm 等可以尝试,但可能有一些类似的路径。
还有lsblk
:
$ lsblk -as /dev/sde1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sde1 8:65 1 7.4G 0 part
`-sde 8:64 1 7.4G 0 disk
正如 @don_crissti 所说,您可以通过-o pkname
仅获取名称列来直接获取父级,-n
删除标题,并且-d
不包括持有者设备或从属设备:
lsblk -ndo pkname /dev/sda1
答案2
它仅适用于 UTF-8 语言环境。 lvm、zfs、raid 测试正常。
parent_tree_disk() {
lsblk | awk '/^[A-Za-z]/{d0=$1; print d0};/^[└─├─]/{d1=$1; print d0, d1};/^ [└─├─]/{d2=$1; print d0, d1, d2}' | sed 's/[├─└─]//g'
}
alias pd='parent_tree_disk'
外壳命令:#pd
名称
sda
sda sda1
sda sda2
sda sda2 cl-root
sda sda2 cl-swap
外壳命令:#PD | awk '/sda2/{print $1}'
sda
您可以在 pd 列表输出上使用其他过滤器,例如排序、uniq...
答案3
也许并不美丽:
for d in `fdisk -l 2>/dev/null | grep "^Disk " | cut -d":" -f1 | cut -f2`
do
if [ `fdisk -l $d 2>/dev/null | grep -c "/dev/sda1"` -gt 0 ]
then
echo On disk $d
fi
done
它仅适用于“真实”磁盘,不适用于 LVM。