How to get disk name that contains a specific partition
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...
Related videos on Youtube
Snoop05
Updated on September 18, 2022Comments
-
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.
-
Admin over 1 yearI have a horrible solution to a getting the disk name from a file here - stackoverflow.com/a/72219415/1569204
- The output should be only a path to disk (like
-
don_crissti about 8 yearsNo need for a script to do that, to print the just the parent device run:
lsblk -no pkname /dev/sda1
-
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 about 8 yearspkname is not in my man page, but in the output of
lsblk -h
, so it's easy to miss! -
don_crissti about 8 yearsmeuh, 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 about 8 years@Marco - yeah, debian, ubuntu and derivatives have their own version of
lsblk
(modified or something)... Most answers related tolsblk
columns usually get this kind of comment from people who use those distros.