lsblk 命令详解与参数实测(Ubuntu 22.04)

lsblk 命令逐参数实测详解:默认树状视图与 MOUNTPOINTS 多挂载列、-f 文件系统列、-m 属主权限、-d 仅顶层、-a 含空设备、-o 自定义列与单设备查询退出码,附 lsblk/blkid/fdisk 工具对比,全部命令与回显在 Ubuntu 22.04(util-linux 2.37.2)实测通过。

Linux命令Linux系统UbuntuUbuntu 22.04命令行文件管理系统信息2026/10/15

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 回答并修改"分区表怎么划分"。

六、参考链接