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 文件系统挂载

相关推荐
wuyk55518 小时前
【Socket 进阶之路】第 3 章 TCP 三次握手 & 四次挥手深度剖析|连接建立、断开、状态机、TIME_WAIT 核心工程问题
服务器·开发语言·网络·物联网·网络协议·tcp/ip
一技安身1 天前
【Docker】 镜像导出 & 导入,实验环境aarch64(arm64)Linux操作系统
linux·docker·容器
平头哥AI1 天前
Day 22 _ 包装错误别丢链_%w、errors.Is 与 errors.As
android·服务器·学习·golang·go
代码村新手1 天前
Linux调试器-gdb的使用
linux
新时代牛马1 天前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
两点王爷1 天前
解决 Linux 中 version `CXXABI_1.3.8‘ not found 报错
linux·运维·服务器
xx~t1 天前
嵌入式——51单片机1
linux·c语言·单片机·嵌入式硬件·51单片机
啦啦啦啦啦zzzz1 天前
利用RAII机制进行日志的采集
linux·服务器·c++·网络编程·c++20
0+1111 天前
Linux --线程概念与控制
linux·运维·服务器·jvm
nLif1 天前
基于GTK的简易MFC对话框兼容层 -- MfcToGTK
linux·c++·mfc·gtk