如何获取包含特定分区的磁盘名称

如何获取包含特定分区的磁盘名称

例如,如果我知道一个分区,/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。

相关内容