Lsblk is a very nice utility installed by default on practically all Linux distributions: we can use it to retrieve a vast range of information about all the block devices attached to the system. In this article we will see how it works and how to use it.
In this tutorial you will learn:
- How to use the lsblk utility to retrieve information about block devices
- What is the meaning of the columns displayed in the default utility output
- How to specify the columns to be displayed and format the output as json or as a list
- How to display information about a specific device.
Software requirements and conventions used
Category | Requirements, Conventions or Software Version Used |
---|---|
System | Distribution independent |
Software | lsblk |
Other | No other requirements needed |
Conventions | # – requires given linux-commands to be executed with root privileges either directly as a root user or by use of sudo command$ – requires given linux-commands to be executed as a regular non-privileged user |
Lsblk basic usage
In its most basic usage, when invoked without any specific option or argument, the lsblk utility will produce a tree-like output including all the block devices attached to the operating system. Here is an example:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 232.9G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 231.9G 0 part └─luks-5794a0b4-7082-4769-b86b-bd27a544361a 253:0 0 231.9G 0 crypt ├─fingolfin_vg-root_lv 253:1 0 35G 0 lvm / ├─fingolfin_vg-swap_lv 253:2 0 6G 0 lvm [SWAP] ├─fingolfin_vg-home_lv 253:3 0 15G 0 lvm /home └─fingolfin_vg-data_lv 253:4 0 170G 0 lvm /mnt/data sr0 11:0 1 1024M 0 rom zram0 252:0 0 2.8G 0 disk [SWAP]
The tree-like structure is very useful to identify devices and their partitions, plus how they are structured on the device. In the output above, for example we can see that are two partitions on the sda
device: sda1
and sda2
.
As we can observe, the former is a “standard” partition: we can identify is as such because we can take a look at the corresponding value in the TYPE column, which in this case is part. We can also observe that the partition is currently mounted at /boot
.
The latter, sda2
, is also a standard partition, but as we can easily understand from the graph, it has some “children” or “slave” devices. The first one is a LUKS container identified by luks-5794a0b4-7082-4769-b86b-bd27a544361a
(this is the device mapper name). Being the system installed on a lvm on luks setup, the luks container itself is marked as a physical volume, and contains some logical volumes mounted on various part of the system.
In the first column of the output we can see information about the device NAME are provided, that is quite easy to understand. Please notice that only the device name is displayed by default, and not its full path: for it to be displayed, instead, we should use the -p
option.
The second column is named MAJ:MIN: those are the numbers used by the kernel to internally identify the devices, the first number specifying the device type (8
for example, is used for SCSI disks).
The third column displayed in the default lsblk output is RM: by looking at this column we can see if the device is removable (the value would be 1
), or not. In the output above, only one device is marked as removable, sr0
, which is
an optical drive.
The scope of the fourth column is easily identified by its name: SIZE. In it the size of the corresponding devices is displayed.
The fifth column is RO: this column is used to specify if the device is read-only or not. Like the RM column, the values in the column are used as booleans, so 1
means the device is read-only.
The sixth column of the output is TYPE: as we already mentioned before, this column is used to identify the device or partition type. For example, observing the output of the command, we can see that the crypt
value is used to identify the luks container while lvm
is used to identify logical volume devices, and disk
is used for raw block devices like sda
.
The seventh and last column is MOUNTPOINT: this column provides information about the current mountpoint of each partition/block device.
Gathering information about a specific device
As we saw above, if we invoke the lsblk
command without any other arguments or options we obtain information about the currently devices attached to the system. What if we want to obtain information about a specific device?
All we have to do is to pass the device we want to gather information about as the argument of the lsblk command. For example, if we only want to inspect the sda1
device, we would run:
$ lsblk /dev/sda1
Notice the we provided the full path of the device, and not only its name. The output produced from the command above, as one would expect, is the following:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda1 8:1 0 1G 0 part /boot
Specifying the columns to be displayed in the lsblk output
We already saw what are the columns included by default in the output of lsblk when it is invoked without any specific option. Those are, however, only a small subset of the available ones. To specify the information we want to be included in the output we must use the -o
option (short for --output
) and provide a comma-separated list of the columns we want to be included. For example, for the output to include only information about devices names and filesystem types, we could run:
$ lsblk -o NAME,FSTYPE
The command above would return the following output:
NAME FSTYPE sda ├─sda1 ext2 └─sda2 crypto_LUKS └─luks-5794a0b4-7082-4769-b86b-bd27a544361a LVM2_member ├─fingolfin_vg-root_lv ext4 ├─fingolfin_vg-swap_lv swap ├─fingolfin_vg-home_lv ext4 └─fingolfin_vg-data_lv ext4 sr0 zram0
For a complete list of the available columns and an explanation of the information they provide, we can invoke the lsblk utility with the --help
option:
Available output columns: NAME device name KNAME internal kernel device name PATH path to the device node MAJ:MIN major:minor device number FSAVAIL filesystem size available FSSIZE filesystem size FSTYPE filesystem type FSUSED filesystem size used FSUSE% filesystem use percentage FSVER filesystem version MOUNTPOINT where the device is mounted LABEL filesystem LABEL UUID filesystem UUID PTUUID partition table identifier (usually UUID) PTTYPE partition table type PARTTYPE partition type code or UUID PARTTYPENAME partition type name PARTLABEL partition LABEL PARTUUID partition UUID PARTFLAGS partition flags RA read-ahead of the device RO read-only device RM removable device HOTPLUG removable or hotplug device (usb, pcmcia, ...) MODEL device identifier SERIAL disk serial number SIZE size of the device STATE state of the device OWNER user name GROUP group name MODE device node permissions ALIGNMENT alignment offset MIN-IO minimum I/O size OPT-IO optimal I/O size PHY-SEC physical sector size LOG-SEC logical sector size ROTA rotational device SCHED I/O scheduler name RQ-SIZE request queue size TYPE device type DISC-ALN discard alignment offset DISC-GRAN discard granularity DISC-MAX discard max bytes DISC-ZERO discard zeroes data WSAME write same max bytes WWN unique storage identifier RAND adds randomness PKNAME internal parent kernel device name HCTL Host:Channel:Target:Lun for SCSI TRAN device transport type SUBSYSTEMS de-duplicated chain of subsystems REV device revision VENDOR device vendor ZONED zone model DAX dax-capable device
Some options can also be used, which comprehend a pre-defined set of columns: invoking lsblk with the -f
(or --fs
) option, for example, is like calling it by specifying the AME,FSTYPE,LABEL,UUID,FSAVAIL,FSUSE%,MOUNTPOINT
columns.
Modifying output format
In the previous examples we saw how the default output produced by the invocation of lsblk command, is a tree-like representation of the block devices attached to the system, and their child or slave devices. There are, however a bunch of options we can use to modify how the output is displayed.
First of all, we can use the -d
option (short for --nodeps
) to display only parent devices. Here is the result of invoking lsblk with said option:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 232.9G 0 disk sr0 11:0 1 1024M 0 rom zram0 252:0 0 2.8G 0 disk [SWAP]
Another, very interesting option, is -J
, or --json
: with it we can obtain information about the block devices and their relationships, in the json format:
$ lsblk -J { "blockdevices": [ {"name":"sda", "maj:min":"8:0", "rm":false, "size":"232.9G", "ro":false, "type":"disk", "mountpoint":null, "children": [ {"name":"sda1", "maj:min":"8:1", "rm":false, "size":"1G", "ro":false, "type":"part", "mountpoint":"/boot"}, {"name":"sda2", "maj:min":"8:2", "rm":false, "size":"231.9G", "ro":false, "type":"part", "mountpoint":null, "children": [ {"name":"luks-5794a0b4-7082-4769-b86b-bd27a544361a", "maj:min":"253:0", "rm":false, "size":"231.9G", "ro":false, "type":"crypt", "mountpoint":null, "children": [ {"name":"fingolfin_vg-root_lv", "maj:min":"253:1", "rm":false, "size":"35G", "ro":false, "type":"lvm", "mountpoint":"/"}, {"name":"fingolfin_vg-swap_lv", "maj:min":"253:2", "rm":false, "size":"6G", "ro":false, "type":"lvm", "mountpoint":"[SWAP]"}, {"name":"fingolfin_vg-home_lv", "maj:min":"253:3", "rm":false, "size":"15G", "ro":false, "type":"lvm", "mountpoint":"/home"}, {"name":"fingolfin_vg-data_lv", "maj:min":"253:4", "rm":false, "size":"170G", "ro":false, "type":"lvm", "mountpoint":"/mnt/data"} ] } ] } ] }, {"name":"sr0", "maj:min":"11:0", "rm":true, "size":"1024M", "ro":false, "type":"rom", "mountpoint":null}, {"name":"zram0", "maj:min":"252:0", "rm":false, "size":"2.8G", "ro":false, "type":"disk", "mountpoint":"[SWAP]"} ] }
This type of output is very useful, among the other things, since it can easily be parsed with more complete programming languages like Python.
Another way to change the displayed output is to use the -l
or --list
option, which produces an output in the form of a list. When this output is selected, however, the relationships between devices are omitted, since a list, by its
nature is “flat”:
$ lsblk -l NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 232.9G 0 disk sda1 8:1 0 1G 0 part /boot sda2 8:2 0 231.9G 0 part sr0 11:0 1 1024M 0 rom zram0 252:0 0 2.8G 0 disk [SWAP] luks-5794a0b4-7082-4769-b86b-bd27a544361a 253:0 0 231.9G 0 crypt fingolfin_vg-root_lv 253:1 0 35G 0 lvm / fingolfin_vg-swap_lv 253:2 0 6G 0 lvm [SWAP] fingolfin_vg-home_lv 253:3 0 15G 0 lvm /home fingolfin_vg-data_lv 253:4 0 170G 0 lvm /mnt/data
To organize the output in “pairs”, instead, we can use the -P
or --pairs
option:
$ lsblk --pairs NAME="sda" MAJ:MIN="8:0" RM="0" SIZE="232.9G" RO="0" TYPE="disk" MOUNTPOINT="" NAME="sda2" MAJ:MIN="8:2" RM="0" SIZE="231.9G" RO="0" TYPE="part" MOUNTPOINT="" NAME="luks-5794a0b4-7082-4769-b86b-bd27a544361a" MAJ:MIN="253:0" RM="0" SIZE="231.9G" RO="0" TYPE="crypt" MOUNTPOINT="" NAME="fingolfin_vg-root_lv" MAJ:MIN="253:1" RM="0" SIZE="35G" RO="0" TYPE="lvm" MOUNTPOINT="/" NAME="fingolfin_vg-data_lv" MAJ:MIN="253:4" RM="0" SIZE="170G" RO="0" TYPE="lvm" MOUNTPOINT="/mnt/data" NAME="fingolfin_vg-swap_lv" MAJ:MIN="253:2" RM="0" SIZE="6G" RO="0" TYPE="lvm" MOUNTPOINT="[SWAP]" NAME="fingolfin_vg-home_lv" MAJ:MIN="253:3" RM="0" SIZE="15G" RO="0" TYPE="lvm" MOUNTPOINT="/home" NAME="sda1" MAJ:MIN="8:1" RM="0" SIZE="1G" RO="0" TYPE="part" MOUNTPOINT="/boot" NAME="sr0" MAJ:MIN="11:0" RM="1" SIZE="1024M" RO="0" TYPE="rom" MOUNTPOINT="" NAME="zram0" MAJ:MIN="252:0" RM="0" SIZE="2.8G" RO="0" TYPE="disk" MOUNTPOINT="[SWAP]"
Another very important option that is useful to use especially in scripts, is -n
, which is the short for --no-headings
. This option modifies the output so that the header line, and the name of the columns are omitted. A concrete use case would be the following. Suppose that in a script we want to get the filesystem type of a specific partition (let’s suppose is sda1
), and “store it” in a variable, we could write:
$ fsys="$(lsblk --noheadings -o FSTYPE /dev/sda1)"
Conclusions
In this tutorial we learned to know the lsblk command and how it can be used to retrieve information about block devices attached to the system and their relationships. We learned the meaning of the default columns displayed when the utility is called without any option or arguments, we saw how to get information about a specific device, and the various options we can use to