Linux lsblk 命令详解:块设备信息查看与磁盘管理实战

做服务器运维的时候,经常需要搞清楚机器上挂了哪些磁盘、分区情况怎么样、文件系统是什么类型。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

常用的可用列包括:NAMESIZETYPEFSTYPEMOUNTPOINTUUIDLABELMODELSERIALROTA(旋转)、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 文件系统挂载

相关推荐
2023自学中1 小时前
Linux 解压命令速查表
linux·服务器·嵌入式·开发板
geshifei1 小时前
Sched_ext 回调深度解析(八):running —— 任务开始执行(6.18.26)
linux·ebpf
say_fall1 小时前
Linux系统编程(十一):深入理解Linux进程地址空间
android·linux·运维
lld9510271 小时前
(三)本地策略框架
java·服务器·数据库
专注搞钱1 小时前
【行业思考】半导体CIM+AI+SKILL融合探索|FAB设备智能自动化演进解析
运维·人工智能·自动化
码云骑士1 小时前
PowerShell自动化运维:批量调用图吧工具箱实现硬件检测与报告生成
运维·自动化
Plastic garden1 小时前
k8s(3)rocky9.7 k8s和Rancher
运维·docker·容器
专注VB编程开发20年1 小时前
C#,VB.NET 生成debug日志文件
服务器·数据库·c#
老H科研技术1 小时前
第 02 篇:5 分钟搭建第一个 MCP 服务器
大数据·运维·服务器·人工智能·学习·aigc·ai编程