How to get disk name that contains a specific partition

10,533

Solution 1

You can observe in /sys the block device for a given partition name. For example, /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

A script to take arg /dev/sda1 and print /dev/sda is:

part=$1
part=${part#/dev/}
disk=$(readlink /sys/class/block/$part)
disk=${disk%/*}
disk=/dev/${disk##*/}
echo $disk

I don't have lvm etc to try out, but there is probably some similar path.


There is also 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 

and as @don_crissti said you can get the parent directly by using -o pkname to get just the name column, -n to remove the header, and -d to not include holder devices or slaves:

lsblk -ndo pkname /dev/sda1

Solution 2

It's work only with UTF-8 locale. lvm, zfs, raid tested ok.

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'

shell command:# pd
NAME
sda
sda sda1
sda sda2
sda sda2 cl-root
sda sda2 cl-swap

shell command:# pd | awk '/sda2/{print $1}'
sda

And you can use other filter on pd list output, like sort, uniq...

Share:
10,533

Related videos on Youtube

Snoop05
Author by

Snoop05

Updated on September 18, 2022

Comments

  • Snoop05
    Snoop05 about 1 year

    If I know that a partition is for example /dev/sda1 how can I get the disk name (/dev/sda in this case) that contains the partition ?

    • The output should be only a path to disk (like /dev/sda).
    • It shouldn't require string manipulation, because I need it to work for different disk types.
  • don_crissti
    don_crissti about 8 years
    No need for a script to do that, to print the just the parent device run: lsblk -no pkname /dev/sda1
  • Snoop05
    Snoop05 about 8 years
    @don_crissti Thanks! I was reading help and man pages of every single unix utility that can manage partitions or list them, i cant belive that i didnt saw "PKNAME internal parent kernel device name" in lsblk.
  • meuh
    meuh about 8 years
    pkname is not in my man page, but in the output of lsblk -h, so it's easy to miss!
  • don_crissti
    don_crissti about 8 years
    meuh, it is not present in any man page version, the man page clearly says (twice): Use lsblk --help to get a list of all available/supported columns.
  • don_crissti
    don_crissti about 8 years
    @Marco - yeah, debian, ubuntu and derivatives have their own version of lsblk (modified or something)... Most answers related to lsblk columns usually get this kind of comment from people who use those distros.