On this page
lsblk
lsblk lists the block devices on the system and their relationships — disks, their partitions, and the device-mapper and loop devices layered on top. It is the device-oriented companion to mount: where mount with no arguments shows what is mounted, lsblk shows what is available to mount and what filesystem sits on each device.
lsblk [options] [DEVICE...]
By default it prints a tree, one row per device with children indented beneath their parent. Given one or more DEVICE operands (a name like sda, a full path like /dev/sda, or anything resolving to a device node), it re-roots the output at those devices.
Where the data comes from
Each column is sourced from one of four places, and any that cannot be read degrades to an empty cell rather than aborting the run:
- sysfs (
/sys/block) — the device tree, sizes, and the topology/hardware columns. Peios leaves/sys/blockunpatched, so this is the standard no-udev path. - libblkid — filesystem identity:
FSTYPE,FSVER,UUID,LABEL, and the partition-table columns. libblkid is opened at runtime. - The device node's security descriptor —
OWNERandMODE, read the same wayls -lreads them. - The
/dev/disk/by-*symlink farm —ID-LINK. There is deliberately no/run/udev/dataparser, so this column is empty until a device manager populates the farm.
Output modes
The mode selects how the rows are formatted; it does not change which columns are shown.
| Flag | Mode |
|---|---|
| (default) | Indented tree. |
-l, --list |
Flat list — the same columns, no tree glyphs. |
-J, --json |
JSON. Flag columns render as bare booleans and MOUNTPOINTS as an array; children nest under a children key. |
-P, --pairs |
KEY="value" pairs, one device per line. |
-r, --raw |
Raw, space-separated. Values that could contain a space or control character are hex-escaped (\xNN) so fields stay parseable. |
-T, --tree[=COLUMN] |
Force tree output even alongside -l, optionally attaching the tree glyphs to COLUMN instead of NAME. |
Columns
With no column flag, lsblk prints the default set: NAME, MAJ:MIN, RM, SIZE, RO, TYPE, MOUNTPOINTS. Three flags swap in a preset, and -o names an explicit list (which wins over all of them):
| Flag | Column set |
|---|---|
-o, --output LIST |
Exactly the comma-separated columns named (case-insensitive; an unknown name is a usage error). |
-O, --output-all |
Every available column. |
-f, --fs |
Filesystem view: NAME, FSTYPE, FSVER, LABEL, UUID, MOUNTPOINTS. |
-m, --perms |
Permissions view: NAME, SIZE, OWNER, MODE. |
The available columns are NAME, KNAME, PATH, MAJ:MIN, FSTYPE, FSVER, LABEL, UUID, PTUUID, PTTYPE, PARTTYPE, PARTLABEL, PARTUUID, MOUNTPOINT, MOUNTPOINTS, SIZE, RO, RM, HOTPLUG, TYPE, OWNER, MODE, MODEL, VENDOR, REV, SERIAL, TRAN, HCTL, ALIGNMENT, MIN-IO, OPT-IO, PHY-SEC, LOG-SEC, STATE, ROTA, SCHED, PKNAME, and ID-LINK.
The OWNER and MODE columns
OWNER and MODE describe the device node, not the filesystem on it, and they mirror ls -l exactly — there is no GROUP column and no POSIX permission bits, because access to a device node is governed by its security descriptor, not by a mode. OWNER is the owner SID (S-1-…); MODE is a three-character [type][x][+]: the device-type character (b for a block device, c for a character device), an x slot (never set for a block device), and a + when the DACL is inheritance-protected. When the SD cannot be read — for instance on a non-Peios host with no KACS syscalls — OWNER shows ? and MODE degrades honestly.
Filtering, sorting and shaping
| Flag | Effect |
|---|---|
-a, --all |
Include empty (zero-size) devices, which are hidden by default. |
-d, --nodeps |
Do not print a device's holders or slaves (drop the children). |
-I, --include LIST |
Show only devices with these major numbers (comma-separated). |
-e, --exclude LIST |
Exclude devices by major number. The default is 1 (RAM disks); an explicit -e replaces that default, and -a clears exclusions entirely. |
-s, --inverse |
Print dependencies in inverse order (holders above the devices they depend on). |
-M, --merge |
Collapse a subtree shared by several parents (a multipath device) to a single occurrence. |
-E, --dedup COLUMN |
Drop rows whose COLUMN value duplicates an earlier one. |
-x, --sort COLUMN |
Sort siblings by COLUMN (numeric columns sort by value, not text). |
Formatting
| Flag | Effect |
|---|---|
-b, --bytes |
Print SIZE as an exact byte count instead of a human-readable value. |
-p, --paths |
Print full /dev paths in the NAME column. |
-n, --noheadings |
Omit the header row. |
-i, --ascii |
Draw the tree with ASCII characters instead of box-drawing glyphs. |
-y, --shell |
Render column keys shell-safe (MAJ:MIN becomes MAJ_MIN). |
-w, --width NUM |
Truncate each table row to NUM columns wide. |
--sysroot DIR |
Read sysfs, the mount table and /dev from DIR instead of / (chiefly for testing against a fixture). |
-h, --help / -V, --version |
Standard. |
Exit status
| Code | Meaning |
|---|---|
0 |
Success. |
1 |
Incorrect invocation (an unknown column, a malformed major-number or width value) or a failed run (for example, /sys/block is unreadable). |
lsblk uses this single non-zero code, matching util-linux. A per-device read failure is not fatal: it degrades the affected columns to empty or ? and the run continues. A broken output pipe (piping into head, for instance) is treated as success.