做服务器运维的时候,经常需要搞清楚机器上挂了哪些磁盘、分区情况怎么样、文件系统是什么类型。df -h 能看已挂载的磁盘空间,但看不到未挂载的分区和磁盘的物理拓扑关系。这时候 lsblk 就派上用场了。
lsblk 是什么
lsblk(List Block Devices)是 Linux util-linux 包提供的一个命令,用来列出系统上所有块设备的信息。所谓块设备,就是以固定大小块(通常是 512 字节或 4KB)进行数据读写的存储设备------硬盘、SSD、U 盘、光驱这些都算。
它最大的优势是能以树形结构展示设备和分区的父子关系,让你一眼看清"哪块盘下面有几个分区、分别挂载到哪里"。
基本用法
bash
lsblk
输出类似这样:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 500G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 100G 0 part /
└─sda3 8:3 0 399G 0 part /home
sdb 8:16 0 2T 0 disk
└─sdb1 8:17 0 2T 0 part /data
sr0 11:0 1 1024M 0 rom
各列含义:
| 列名 | 含义 |
|---|---|
| NAME | 设备名称 |
| MAJ:MIN | 主设备号:次设备号(内核识别用) |
| RM | 是否可移动设备(1=是,0=否) |
| SIZE | 设备大小 |
| RO | 是否只读 |
| TYPE | 设备类型(disk/part/rom/lvm等) |
| MOUNTPOINT | 挂载点 |
常用参数实战
查看文件系统信息
bash
lsblk -f
-f 参数会额外显示文件系统类型(FSTYPE)、UUID、挂载选项和标签:
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 boot a1b2c3d4-... /boot
├─sda2 ext4 root e5f6g7h8-... /
└─sda3 ext4 home i9j0k1l2-... /home
sdb
└─sdb1 xfs data m3n4o5p6-... /data
这个在配置 /etc/fstab 时特别有用------你需要 UUID 来做持久化挂载,而不是设备名(因为设备名可能会变)。
自定义输出列
-o 参数可以指定要显示的列,组合非常灵活:
bash
# 只看名称、大小、文件系统类型和挂载点
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
# 查看设备对应的物理旋转状态(SSD vs HDD)
lsblk -o NAME,SIZE,TYPE,ROTA
# ROTA=1 表示机械硬盘,ROTA=0 表示 SSD
常用的可用列包括:NAME、SIZE、TYPE、FSTYPE、MOUNTPOINT、UUID、LABEL、MODEL、SERIAL、ROTA(旋转)、TRAN(传输协议:sata/nvme/usb)、HOTPLUG(热插拔)、STATE。
JSON 格式输出
bash
lsblk -J
输出 JSON 格式,方便脚本解析:
json
{
"blockdevices": [
{
"name": "sda",
"maj:min": "8:0",
"rm": false,
"size": "500G",
"ro": false,
"type": "disk",
"mountpoint": null,
"children": [
{
"name": "sda1",
"maj:min": "8:1",
"size": "1G",
"type": "part",
"mountpoint": "/boot"
}
]
}
]
}
这个在写自动化运维脚本时非常实用,配合 jq 可以精确提取任意字段:
bash
# 获取所有磁盘的大小
lsblk -J -d -o NAME,SIZE | jq '.blockdevices[] | {name, size}'
# 获取所有未挂载的分区
lsblk -J -o NAME,MOUNTPOINT | jq '.blockdevices[].children[] | select(.mountpoint == null) | .name'
列表格式输出
bash
lsblk -l
去掉树形缩进,用纯列表展示。在写脚本需要 awk/grep 处理时更方便:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 500G 0 disk
sda1 8:1 0 1G 0 part /boot
sda2 8:2 0 100G 0 part /
sda3 8:3 0 399G 0 part /home
只看磁盘不看分区
bash
lsblk -d
-d(--nodeps)参数只显示顶层设备,不显示子设备(分区):
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 500G 0 disk
sdb 8:16 0 2T 0 disk
sr0 11:0 1 1024M 0 rom
底层原理:lsblk 从哪获取数据
lsblk 的数据来源是 /sys/block 和 /dev 目录下的 sysfs 虚拟文件系统。内核在检测到块设备时,会在 sysfs 中创建对应的目录结构。
bash
# 查看内核识别到的所有块设备
ls /sys/block/
# 查看某块盘的具体信息
cat /sys/block/sda/size # 扇区数量
cat /sys/block/sda/queue/rotational # 是否旋转(0=SSD, 1=HDD)
cat /sys/block/sda/device/model # 磁盘型号
理解这一点很重要:lsblk 不需要 root 权限就能读取大部分信息(因为它读的是 sysfs),但某些详细信息(如 SERIAL)可能需要 root。
实际运维场景
场景一:新服务器磁盘初始化
拿到一台新机器,第一步就是看看有哪些盘:
bash
# 查看所有块设备及其文件系统
lsblk -f
# 确认哪块盘是 SSD(ROTA=0)
lsblk -d -o NAME,SIZE,ROTA,MODEL
# 确认未挂载的分区
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT | grep -v '/'
场景二:排查磁盘空间不足
bash
# 看整体拓扑,确认是否有未挂载的大分区
lsblk
# 配合 df 确认已用空间
df -h
# 找出所有 LVM 逻辑卷
lsblk -o NAME,SIZE,TYPE | grep lvm
场景三:自动化脚本中获取磁盘信息
bash
#!/bin/bash
# 获取第一块非系统盘的设备名
DISK=$(lsblk -d -n -o NAME,SIZE,TYPE | \
grep 'disk' | \
awk 'NR>1 {print $1; exit}')
echo "找到数据盘: /dev/$DISK"
-n 参数去掉表头,-o 指定列,这样脚本处理起来干净利落。
lsblk 与其他命令的配合
| 命令 | 用途 | 与 lsblk 的关系 |
|---|---|---|
df -h |
查看已挂载分区的空间使用 | lsblk 看物理拓扑,df 看使用率 |
fdisk -l |
查看分区表详情 | fdisk 更底层,lsblk 更直观 |
blkid |
查看块设备 UUID 和类型 | lsblk -f 包含了 blkid 的信息 |
parted -l |
GPT 分区表操作 | parted 可修改,lsblk 只读 |
smartctl |
磁盘健康状态检测 | lsblk 看结构,smartctl 看健康 |
小结
lsblk 是 Linux 系统管理中一个"小而美"的命令------它不修改任何东西,只负责把块设备信息清晰地展示出来。日常运维中,lsblk -f 基本能覆盖 80% 的磁盘查看需求,lsblk -J 则是自动化脚本的好帮手。
更多 Linux 命令参考,可以使用 JsonKit Linux 命令参考 工具在线查询。
相关工具:Linux fdisk 磁盘分区工具 | Linux mount 文件系统挂载
