Linux世界纷繁复杂,从高耸的内核代码到底层的磁盘分区,一切都隐藏在平静的命令行之下。而lsblk,一个看似简单的命令,正是揭开这层神秘面纱的钥匙。lsblk顾名思义,是一个用于列出系统中块设备的命令。块设备是Linux存储架构的核心,它涵盖了硬盘、SSD、USB设备、CD-ROM甚至是某些虚拟镜像文件所映射的逻辑设备。
常见的块设备:
/dev/sda, /dev/sdb:物理磁盘或虚拟磁盘
/dev/loopX:镜像文件映射成的虚拟块设备
/dev/nvmeXn1:NVMe 固态硬盘
/dev/mapper/:LVM 或加密设备映射路径
基本用法预览:简单不代表简单
lsblk
输出示例:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 30G 0 part /
└─sda3 8:3 0 9G 0 part [SWAP]
loop0 7:0 0 640M 1 loop /mnt/image
你没看错!loop0就是一个挂载的镜像文件。
镜像的真相:loop设备背后的世界
我们经常使用 .iso、.img 或 .qcow2 等格式的镜像文件用于测试系统、搭建虚拟环境或备份数据。通过 losetup 工具将这些镜像绑定到 loop 设备后,就能用 lsblk 看到其结构。
示例:挂载镜像并查看结构
创建一个测试镜像(模拟安装镜像):
dd if=/dev/zero of=test.img bs=1M count=100
mkfs.ext4 test.img
绑定 loop 设备:
sudo losetup /dev/loop10 test.img
查看结构:
lsblk
输出示例:
loop10 7:10 0 100M 0 loop
此时你看到的 /dev/loop10 就是 test.img 镜像映射出的块设备。进一步格式化和挂载即可操作文件系统。
深入分析:默认的 lsblk 输出较为简洁,我们可以通过 -f、-o 参数输出更多细节。
添加文件系统信息:
lsblk -f
输出:
NAME FSTYPE LABEL UUID MOUNTPOINT
loop10 ext4 2f58c1a3-2a49-4d08-8244-14f82f15274f /mnt/test
自定义字段输出:
lsblk -o NAME,TYPE,SIZE,RO,MOUNTPOINT,FSTYPE,UUID,MODEL
这样可以看到每个设备的挂载点、只读状态、文件系统类型等,特别适用于分析镜像内容。
镜像嵌套结构:多分区镜像也能识别
对于更复杂的镜像,比如包含多个分区的 .img 文件,lsblk 同样适用。
示例:
使用 fdisk 为 test.img 创建多个分区。
重新绑定 loop 并使用分区探测:
losetup -P /dev/loop10 test.img
其中 -P 表示自动探测分区,生成 /dev/loop10p1, /dev/loop10p2 等。
查看结构:
lsblk /dev/loop10
输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop10 7:10 0 200M 0 loop
├─loop10p1 259:1 0 50M 0 part /mnt/p1
└─loop10p2 259:2 0 150M 0 part /mnt/p2
lsblk 自动解析了镜像的分区结构,无需挂载就能看到全貌。
调试虚拟机镜像,KVM 用户常用 .qcow2 虚拟磁盘镜像,同样可通过 qemu-nbd 映射为块设备后用 lsblk 分析:
modprobe nbd
qemu-nbd --connect=/dev/nbd0 disk.qcow2
lsblk /dev/nbd0
支持复杂的分区结构、LVM 等信息显示。
lsblk虽然不是专门为镜像设计的工具,但它用一种“非侵入式”的方式帮助我们快速掌握块设备的结构,尤其是在处理镜像文件时尤为重要。无论是日常排查挂载问题,还是深入剖析虚拟机镜像结构,lsblk都是系统管理员和开发者不可或缺的利器。