5

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.
7

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 with:

lsblk -no pkname /dev/sda1
  • 4
    No need for a script to do that, to print the just the parent device run: lsblk -no pkname /dev/sda1 – don_crissti Aug 30 '15 at 16:39
  • @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. – Snoop05 Aug 30 '15 at 16:50
  • pkname is not in my man page, but in the output of lsblk -h, so it's easy to miss! – meuh Aug 30 '15 at 17:03
  • 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 Aug 30 '15 at 17:19
  • On my Debian Wheezy I get the error message: lsblk: unknown column: pkname – Marco Aug 30 '15 at 18:30
0

Perhaps not beautiful:

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

It works only for 'real' disks not for LVM.

0

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...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.