Linux: get the current boot disk's device name

When booting a machine by USB stick,

sudo fdisk -l

outputs you two devices marked with an asterisk, and you'll never know which was the boot device.

I need a list of all disks attached to the current machine where

sed -ne 's/.*\([sh]d[a-zA-Z]\+$\)/\/dev\/\1/p' /proc/partitions 

is a good way, it outputs

/dev/sda
/dev/sdb

That does give me a clue which is the boot device, which is essential as a want to boot from the one and secure delete the other - automatically (stick in, boot, let it run...) as I do that on a bunch of machines at one time, making sure that no data remains on customer computer hard disks.

awk '$2 == "/"' /proc/self/mounts 

That gives you the UUID-number - but how to find the /dev/sd? belonging to it?

(Hint about "use UUID" isn't helpful - I don't want to reconfigure the system, I want to clean it. Of course I can assign new UUIDs when doing that, it costs a second, but that is definitely not the goal, and still misses the fact that I don't know which device /dev/sd? to give a new one.)

dban did the job, but won't be free to use in future.


You almost have it with your awk invocation. A few small tweaks should be enough.

awk '$1 ~ /^\/dev\// && $2 == "/" { print $1 }' /proc/self/mounts

The $1 ~ /^\/dev\// part requires that any satisfying line names a device somewhere under /dev. Now all we need is a mapping from the device UUID name to the kernel-assigned name, which is easy since all names listed will either be that name directly, or a symbolic link (ultimately) pointing to that name, so we can just feel them to ls -l like so:

ls -l $(awk '$1 ~ /^\/dev\// && $2 == "/" { print $1 }' /proc/self/mounts)

This should give you a single line of output which tells you which physical device the root file system is currently mounted from. It won't be foolproof, so I wouldn't automate anything potentially destructive based on this alone, but for a human who just wants some help in figuring out which device to point at, it should be enough.


You should find where your / is mounted.

findmnt -n / | awk '{ print $2 }'

Lets say the result you get is /dev/sda1. Use that to find parent device:

lsblk -no pkname /dev/sda1

And that should give you lets say sda. You can prepend that with /dev/ if need be.

Dunno how fool proof this is. But it might be better than this answer.