lsblk 命令详解与参数实测(Ubuntu 22.04)
lsblk 命令逐参数实测详解:默认树状视图与 MOUNTPOINTS 多挂载列、-f 文件系统列、-m 属主权限、-d 仅顶层、-a 含空设备、-o 自定义列与单设备查询退出码,附 lsblk/blkid/fdisk 工具对比,全部命令与回显在 Ubuntu 22.04(util-linux 2.37.2)实测通过。
lsblk 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 lsblk 命令——默认树状视图与列含义、
-f文件系统信息列、-m属主权限、-d仅列顶层设备、-a全部设备(含空设备)、-o自定义列与单设备查询退出码,全部命令与回显已在 Ubuntu 22.04(util-linux 2.37.2)实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- 内核版本:6.8.0-138-generic(
uname -r实测) - lsblk 版本:util-linux 2.37.2(
lsblk --version实测) - 测试介质:
/root/demo/img/ext4.img(dd 创建的 64 MiB 映像)→ losetup 关联/dev/loop17→ mkfs.ext4 格式化 → 挂载/mnt/ext4-demo - 环境特征:系统中存在 17 个回环设备(loop0–loop17)、一块 800G 磁盘 sda(3 个分区)与光驱 sr0
二、命令概览
2.1 语法与实测环境准备
lsblk 的语法很简单:lsblk [options] [<device> ...]——不带设备名则列全部块设备,带设备名只查指定设备。准备测试盘并挂载,让输出里有一块"认识的盘":
💡 技术拓展:"看一块盘"有多个视角的命令,信息层次横向对比——
工具 原理/职责 适用场景 lsblk 枚举块设备并以树形展示拓扑(盘→分区) 一眼看全设备层级与挂载点 blkid 探测设备上的文件系统类型与 UUID 拿 UUID/TYPE 写 fstab fdisk -l 读分区表,显示分区布局细节 分区操作前的布局确认 df -h 只看已挂载文件系统的容量 关心空间而非设备拓扑 本文主角是 lsblk:唯一以"拓扑树"呈现全部块设备(含未挂载/空设备)的工具,其余命令各管一个切面。
$ mkdir -p /root/demo/img
$ dd if=/dev/zero of=/root/demo/img/ext4.img bs=1M count=64
64+0 records in
64+0 records out
67108864 bytes (67 MB, 64 MiB) copied, 0.0438927 s, 1.5 GB/s
$ losetup -f --show /root/demo/img/ext4.img
/dev/loop17
$ mkfs.ext4 -F /dev/loop17
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: 0/16384 done
Creating filesystem with 16384 4k blocks and 16384 inodes
Allocating group tables: 0/1 done
Writing inode tables: 0/1 done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: 0/1 done
$ mkdir -p /mnt/ext4-demo
$ mount /dev/loop17 /mnt/ext4-demo
2.2 --help 全量回显
lsblk --help 输出全部参数(实测原样保留):
Usage:
lsblk [options] [<device> ...]
List information about block devices.
Options:
-D, --discard print discard capabilities
-E, --dedup <column> de-duplicate output by <column>
-I, --include <list> show only devices with specified major numbers
-J, --json use JSON output format
-O, --output-all output all columns
-P, --pairs use key="value" output format
-S, --scsi output info about SCSI devices
-T, --tree[=<column>] use tree format output
-a, --all print all devices
-b, --bytes print SIZE in bytes rather than in human readable format
-d, --nodeps don't print slaves or holders
-e, --exclude <list> exclude devices by major number (default: RAM disks)
-f, --fs output info about filesystems
-i, --ascii use ascii characters only
-l, --list use list format output
-M, --merge group parents of sub-trees (usable for RAIDs, Multi-path)
-m, --perms output info about permissions
-n, --noheadings don't print headings
-o, --output <list> output columns
-p, --paths print complete device path
-r, --raw use raw output format
-s, --inverse inverse dependencies
-t, --topology output info about topology
-w, --width <num> specifies output width as number of characters
-x, --sort <column> sort output by <column>
-z, --zoned print zone model
--sysroot <dir> use specified directory as system root
-h, --help display this help
-V, --version display version
帮助后半段是 60 余个可用输出列(NAME/KNAME/PATH/MAJ:MIN/FSTYPE/FSVER/LABEL/UUID/MOUNTPOINTS/OWNER/GROUP/MODE/SIZE/TYPE/RO/RM 等),供 -o 与 --output-all 使用。
💡 说明:util-linux 2.37 的默认挂载点列叫 MOUNTPOINTS(复数)——同一设备挂到多个位置时会展开多行显示,老版本的 MOUNTPOINT 列仍可用
-o MOUNTPOINT显式指定。
2.3 版本确认
$ lsblk --version
lsblk from util-linux 2.37.2
三、参数逐项实测
3.1 默认树状输出
不带参数,按"盘 → 分区 → 挂载点"层级画树(输出完整保留):
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 4K 1 loop
loop1 7:1 0 74.2M 1 loop
loop2 7:2 0 74M 1 loop
loop3 7:3 0 66.8M 1 loop
loop4 7:4 0 266.6M 1 loop
loop5 7:5 0 262.2M 1 loop
loop6 7:6 0 497M 1 loop
loop7 7:7 0 531.5M 1 loop
loop8 7:8 0 615.3M 1 loop
loop9 7:9 0 91.7M 1 loop
loop10 7:10 0 402M 1 loop
loop11 7:11 0 11.8M 1 loop
loop12 7:12 0 12.3M 1 loop
loop13 7:13 0 50.3M 1 loop
loop14 7:14 0 44.7M 1 loop
loop15 7:15 0 828K 1 loop
loop16 7:16 0 452K 1 loop
loop17 7:17 0 64M 0 loop /mnt/ext4-demo
sda 8:0 0 800G 0 disk
|-sda1 8:1 0 1M 0 part
|-sda2 8:2 0 513M 0 part
`-sda3 8:3 0 799.5G 0 part /etc/resolv.conf
/etc/hosts
/etc/hostname
sr0 11:0 1 1024M 0 rom
列含义:MAJ:MIN 主次设备号;RM 可移动设备(1=是);SIZE 容量;RO 只读(loop0–16 都是 RO=1 的只读回环设备);TYPE 设备类型(loop/part/disk/rom);MOUNTPOINTS 挂载点。两个看点:sda 的三个分区用树形挂在 sda 之下;sda3 一台设备挂载了三个位置,MOUNTPOINTS 列展开为三行——这正是 2.37 复数列名的用意。
3.2 -f:文件系统信息列
-f 追加 FSTYPE/FSVER/LABEL/UUID/FSAVAIL/FSUSE% 六列(输出节选(实测),中间 loop 行省略):
$ lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
loop0
loop1
loop17 51.5M 0% /mnt/ext4-demo
sda
|-sda1
|-sda2
`-sda3 303.7G 57% /etc/resolv.conf
/etc/hosts
/etc/hostname
sr0
实测要点:FSAVAIL/FSUSE%/MOUNTPOINTS 三列正常(loop17 可用 51.5M、sda3 使用率 57%),但 FSTYPE/LABEL/UUID 列在本环境为空——lsblk 的文件系统属性来自 libblkid/udev 探测,本环境探测无产出。需要拿 UUID 时用 blkid 命令(见 blkid 篇实测,直接读超级块可靠取值);在常规服务器上 -f 通常能直接显示这两列。
3.3 -m:属主与权限
-m 输出设备节点的 OWNER/GROUP/MODE(输出节选(实测),中间 loop 行省略):
$ lsblk -m
NAME SIZE OWNER GROUP MODE
loop0 4K root disk brw-rw----
loop17 64M root disk brw-rw----
sda 800G root disk brw-rw----
|-sda1 1M root disk brw-rw----
|-sda2 513M root disk brw-rw----
`-sda3 799.5G root disk brw-rw----
sr0 1024M root cdrom brw-rw----
设备节点权限 brw-rw---- 属 root:disk(光驱属 root:cdrom)——排查"非 root 用户读不了块设备"时先看这里。
3.4 -d:仅列顶层设备
-d(--nodeps)不显示 slaves/holders 关系,即不展开分区等子设备(输出节选(实测),中间 loop 行省略):
$ lsblk -d
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 4K 1 loop
loop17 7:17 0 64M 0 loop /mnt/ext4-demo
sda 8:0 0 800G 0 disk
sr0 11:0 1 1024M 0 rom
对比 3.1:sda1/2/3 三个分区行消失,只剩 4 个顶层设备。只想要"有几块盘"的清单时用它,常配合 -n 与 -o NAME,SIZE 做脚本输出。
💡 说明:
-d与-o组合是脚本取值的定式——lsblk -dn -o NAME,SIZE输出无表头、无子设备、无树形缩进的纯列表,while read逐行消费最稳;这正是 3.6 自定义列的动机之一。
3.5 -a:全部设备(含空设备)
默认输出会略过部分"空"设备,-a 全量列出。实测的关键差异是多了一个 0B 的 loop18(输出节选(实测),中间 loop 行省略):
$ lsblk -a
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 4K 1 loop
loop17 7:17 0 64M 0 loop /mnt/ext4-demo
loop18 7:18 0 0B 0 loop
sda 8:0 0 800G 0 disk
|-sda1 8:1 0 1M 0 part
|-sda2 8:2 0 513M 0 part
`-sda3 8:3 0 799.5G 0 part /etc/resolv.conf
/etc/hosts
/etc/hostname
sr0 11:0 1 1024M 0 rom
loop18 是回环驱动预创建的空设备节点:0B、未关联任何映像,默认输出不显示,-a 才露面。排障时若怀疑"设备节点存在但没关联好",用 -a 对照。
3.6 -o:自定义输出列
-o 逗号组合任意列名:
$ lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
NAME SIZE TYPE FSTYPE MOUNTPOINT
loop0 4K loop
loop1 74.2M loop
loop17 64M loop /mnt/ext4-demo
sda 800G disk
|-sda1 1M part
|-sda2 513M part
`-sda3 799.5G part /etc/resolv.conf
sr0 1024M rom
(输出节选(实测),中间 loop 行省略。)常用组合:-o NAME,SIZE,TYPE,MOUNTPOINT 挂载概览、-o NAME,RO,SIZE 检查只读盘、--output-all 全列输出。
3.7 单设备查询与错误场景
指定设备名只查该设备;查询不存在的设备报错并返回退出码 32:
$ lsblk /dev/loop17
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop17 7:17 0 64M 0 loop /mnt/ext4-demo
$ lsblk /dev/loop99; echo exit=$?
lsblk: /dev/loop99: not a block device
exit=32
四、实战示例
实战一:盘点服务器磁盘
新接手一台机器,先看"有几块盘、多大、挂哪了":
lsblk -d -o NAME,SIZE,TYPE,RO,MOUNTPOINT # 顶层设备清单(回显见 3.4/3.6 列组合)
-d 去掉分区噪音、RO 列识别只读盘(本环境 loop0–16 全部 RO=1)、MOUNTPOINT 看谁在用。多块盘时再对目标盘执行 lsblk /dev/sdb 下钻(回显见 3.7)。
实战二:确认设备节点与权限
部署服务报"无权访问设备"时:
lsblk -m /dev/loop17 # 看属主与权限位(输出形式见 3.3)
设备属 root:disk 且模式 brw-rw----,非 root 用户需加入 disk 组或用 udev 规则调整。
五、注意事项与常见问题
Q1:系统里为什么有一大串 loop 设备? loop 是回环设备——把普通映像文件模拟成块设备。本环境实测 17 个(loop0–loop17),其中 loop0–16 为只读(RO=1)的系统预占回环设备,loop17 是本文手动创建的。映像/快照类应用会批量占用 loop 设备,属正常现象。
Q2:-f 的 FSTYPE/UUID 列为什么是空的?
lsblk 的文件系统属性经 libblkid/udev 探测获得,本环境探测无产出,因此为空(实测 3.2);容量与挂载点列来自挂载表统计,不受影响。要拿 UUID 直接用 blkid /dev/loop17(见 blkid 篇实测)。
Q3:MOUNTPOINTS 列一设备多行是怎么回事?
2.37 的默认挂载点列是 MOUNTPOINTS(复数):同一设备挂到 N 个位置就展开 N 行,实测 sda3 同时挂载 /etc/resolv.conf、/etc/hosts、/etc/hostname 三处(3.1)。想要每设备一行的旧版行为,用 -o MOUNTPOINT(单数列)。
Q4:查询不存在的设备报什么错?
lsblk: /dev/loop99: not a block device,退出码 32(3.7 实测)。脚本中判断设备存在性可用 lsblk /dev/loop17 的退出码(0=存在,不存在报 exit=32,见 3.7)。
与相邻工具的分工对比
| 工具 | 定位 | 信息来源 | 典型用途 |
|---|---|---|---|
| lsblk | 块设备树总览 | sysfs 设备树 + 挂载表 | 看拓扑:盘→分区→挂载点、容量、权限 |
| blkid | 超级块探测 | 直接读设备超级块(含缓存) | 取 UUID/LABEL/TYPE,供 fstab 使用 |
| fdisk | 分区表查看与管理 | 读 MBR/GPT 分区表 | 查看分区结构、修改分区 |
三者互补:lsblk 回答"设备长什么样",blkid 回答"设备上是什么文件系统",fdisk 回答并修改"分区表怎么划分"。
六、参考链接
- lsblk(8) 手册:https://man7.org/linux/man-pages/man8/lsblk.8.html
- util-linux 上游仓库:https://github.com/util-linux/util-linux
- 内核 sysfs 块设备文档:https://docs.kernel.org/admin-guide/sysfs-rules.html