Linux lsblk 命令详解:块设备信息查看与磁盘管理实战
做服务器运维的时候,经常需要搞清楚机器上挂了哪些磁盘、分区情况怎么样、文件系统是什么类型。df -h能看已挂载的磁盘空间,但看不到未挂载的分区和磁盘的物理拓扑关系。这时候lsblk就派上用场了。
lsblk 是什么
lsblk(List Block Devices)是 Linux util-linux 包提供的一个命令,用来列出系统上所有块设备的信息。所谓块设备,就是以固定大小块(通常是 512 字节或 4KB)进行数据读写的存储设备——硬盘、SSD、U 盘、光驱这些都算。
它最大的优势是能以树形结构展示设备和分区的父子关系,让你一眼看清"哪块盘下面有几个分区、分别挂载到哪里"。
基本用法
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 | 挂载点 |
常用参数实战
查看文件系统信息
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参数可以指定要显示的列,组合非常灵活:
# 只看名称、大小、文件系统类型和挂载点lsblk-oNAME,SIZE,FSTYPE,MOUNTPOINT# 查看设备对应的物理旋转状态(SSD vs HDD)lsblk-oNAME,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 格式输出
lsblk-J输出 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可以精确提取任意字段:
# 获取所有磁盘的大小lsblk-J-d-oNAME,SIZE|jq'.blockdevices[] | {name, size}'# 获取所有未挂载的分区lsblk-J-oNAME,MOUNTPOINT|jq'.blockdevices[].children[] | select(.mountpoint == null) | .name'列表格式输出
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只看磁盘不看分区
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 中创建对应的目录结构。
# 查看内核识别到的所有块设备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。
实际运维场景
场景一:新服务器磁盘初始化
拿到一台新机器,第一步就是看看有哪些盘:
# 查看所有块设备及其文件系统lsblk-f# 确认哪块盘是 SSD(ROTA=0)lsblk-d-oNAME,SIZE,ROTA,MODEL# 确认未挂载的分区lsblk-oNAME,SIZE,FSTYPE,MOUNTPOINT|grep-v'/'场景二:排查磁盘空间不足
# 看整体拓扑,确认是否有未挂载的大分区lsblk# 配合 df 确认已用空间df-h# 找出所有 LVM 逻辑卷lsblk-oNAME,SIZE,TYPE|greplvm场景三:自动化脚本中获取磁盘信息
#!/bin/bash# 获取第一块非系统盘的设备名DISK=$(lsblk-d-n-oNAME,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 文件系统挂载
