为什么需要lsblk和blkid
很多刚开始接触Linux服务器的朋友,要查看磁盘信息时第一反应是 fdisk -l。fdisk确实能看到磁盘信息,但它的输出格式相对老旧,而且不会直观展示磁盘之间的父子关系(比如哪个分区在哪个磁盘上)。
lsblk(list block devices,列出块设备)就是为此设计的。它用树状结构展示磁盘、分区以及它们之间的从属关系,看一眼就知道你有多块硬盘、每块分了几个区、挂载在哪里。而 blkid(block device ID)则专门用来查看块设备的UUID(通用唯一标识符)和文件系统的LABEL(标签)。
我个人的经验是,lsblk和blkid是磁盘管理中最互补的一对命令。lsblk展示拓扑结构,blkid展示身份标识。配合使用,几分钟就能摸清一台陌生服务器的磁盘布局。
lsblk基本用法
查看磁盘拓扑结构
# 查看所有块设备的树状视图
lsblk
输出示例:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 200.4G 0 part /
└─sda3 8:3 0 264.9G 0 part /home
nvme0n1 259:0 0 238.5G 0 disk
└─nvme0n1p1 259:1 0 238.5G 0 part /data
从这个输出可以清晰看到:系统有两块磁盘,一块是 sda(传统的SATA/SCSI磁盘),容量465.8GB,分了三个区;另一块是 nvme0n1(NVMe固态硬盘),容量238.5GB,只有一个分区。每个分区挂载在哪里也是一目了然。
各列的含义:
- ·NAME:设备名称
- ·MAJ:MIN:设备主次编号
- ·RM:是否可移动设备(1表示是可移动的,如U盘)
- ·SIZE:容量大小
- ·RO:是否只读
- ·TYPE:设备类型(disk=磁盘,part=分区,rom=光驱)
- ·MOUNTPOINT:挂载点
查看文件系统和UUID
这是lsblk最实用的参数之一,结合了文件系统类型、UUID等功能。
# 查看文件系统类型和UUID
lsblk -f
输出示例:
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
├─sda1 vfat FAT32 1234-ABCD 499.8M 2% /boot/efi
├─sda2 ext4 1.0 a1b2c3d4-e5f6-7890-abcd-ef1234567890 120.5G 40% /
└─sda3 ext4 1.0 b2c3d4e5-f6a7-8901-bcde-f12345678901 200.3G 24% /home
nvme0n1
└─nvme0n1p1 ext4 1.0 data c3d4e5f6-a7b8-9012-cdef-123456789012 180.2G 24% /data
这里的 FSTYPE 列显示了文件系统类型(如 ext4、vfat、xfs),UUID 列显示了每个分区的唯一标识,LABEL 列显示了卷标(如果设置过的话)。data 这个卷标就是手动设置的,方便识别用途。
其他实用参数
# 显示设备大小以易读格式(MB/GB),默认已经是这样
lsblk --output NAME,SIZE,TYPE,MOUNTPOINT
# 显示所有列信息,包括磁盘型号、厂商等
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL,VENDOR
# 只列出磁盘设备,不显示分区
lsblk -d
-o 参数可以自定义输出列。如果你只需要设备名和挂载点来确定磁盘使用情况,就可以只输出这两列,让结果更干净。
blkid查看UUID和LABEL
blkid 是专门用来查看和管理块设备身份标识的。它的核心作用就是告诉你每个分区的UUID、文件系统类型和卷标。
# 查看所有块设备的UUID和LABEL
sudo blkid
输出示例:
/dev/sda1: UUID="1234-ABCD" TYPE="vfat" PARTUUID="abcd1234-01"
/dev/sda2: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4" PARTUUID="abcd1234-02"
/dev/sda3: UUID="b2c3d4e5-f6a7-8901-bcde-f12345678901" TYPE="ext4" PARTUUID="abcd1234-03"
/dev/nvme0n1p1: UUID="c3d4e5f6-a7b8-9012-cdef-123456789012" TYPE="ext4" LABEL="data" PARTUUID="ef567890-01"
观察输出可以看到,UUID 是文件系统级别的,PARTUUID 是分区表级别的(GPT分区表自带的标识)。两者用途不同,但在 /etc/fstab 里都可以用。
查看指定设备的UUID
# 只查看指定分区的UUID
sudo blkid /dev/sda2
# 只显示UUID值,不显示其他信息
sudo blkid -s UUID /dev/sda2
# 只显示UUID值(去掉键名,方便脚本使用)
sudo blkid /dev/sda2 -o value -s UUID
最后一种写法在脚本中很常用,因为输出的值可以直接赋值给变量。
# 把UUID赋值给脚本变量
DISK_UUID=$(sudo blkid /dev/sda2 -o value -s UUID)
echo "系统盘UUID为: $DISK_UUID"
查看设备的文件系统LABEL
# 查看指定设备的标签
sudo blkid /dev/nvme0n1p1 -o value -s LABEL
# 也可以从 lsblk 看到
lsblk -f /dev/nvme0n1p1
卷标(LABEL)是文件系统创建时可以设置的名称,比如把数据盘设置为 data、backup、logs 等,方便识别用途。
修改文件系统LABEL
既然提到了LABEL,顺便说一下怎么设置和修改它。
# 修改 ext4 文件系统的卷标
sudo e2label /dev/nvme0n1p1 data
# 或者使用 tune2fs 命令
sudo tune2fs -L data /dev/nvme0n1p1
注意,设置卷标要确保设备当前没有被挂载,或者以只读方式挂载也可以。被正常读写挂载的分区直接改卷标可能会失败。
为什么UUID比设备名更可靠
在Linux中,设备名如 /dev/sda 是根据内核探测顺序动态分配的。这意味着你加了一块新硬盘或者换了一个SATA接口,设备名就可能发生变化。比如原本的系统盘是 /dev/sda,加了一块新硬盘后变成了 /dev/sdb,但新硬盘被识别成了 /dev/sda。系统从错误的磁盘上启动,后果很严重。
UUID 是文件系统创建时生成的唯一标识,只要文件系统不重新格式化,UUID就不会变。所以在 /etc/fstab(文件系统表,系统启动时自动挂载的依据)中使用UUID而不是设备名,可以避免上述问题。
# 查看当前系统使用的 fstab,看看是不是用UUID挂载的
cat /etc/fstab
好的 fstab 应该是这样的:
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 / ext4 defaults 0 1
UUID=b2c3d4e5-f6a7-8901-bcde-f12345678901 /home ext4 defaults 0 2
而不是这样的:
/dev/sda2 / ext4 defaults 0 1
/dev/sda3 /home ext4 defaults 0 2
第一种写法用UUID,即使盘符漂移也不影响启动。第二种写法用设备名,换个接口就可能出问题。
实际排障案例
有一次接手一台旧服务器,发现 /data 目录挂载不上。跑 df -h 看不到 /data,但 lsblk 能看到一块独立的磁盘和设备。
# 第一步:查看磁盘拓扑
lsblk
# 发现 sdb 磁盘存在但没有分区挂载
# 第二步:查看是否有文件系统
sudo blkid /dev/sdb1
# 发现该分区确实有 ext4 文件系统
# 第三步:检查 /etc/fstab
cat /etc/fstab
# 发现之前的人用 /dev/sdb1 写的挂载,但系统重启后盘符变成了 /dev/sdc
# 第四步:用 blkid 获取正确 UUID 后修改 fstab
sudo blkid /dev/sdb1 -o value -s UUID
# 拿到 UUID 后修改 fstab,把 /dev/sdb1 替换成 UUID
问题就这么解决了。这就是 lsblk 和 blkid 配合使用最为常见的场景。
安全提醒
第一,blkid 命令本身是只读的,不会对系统造成损害。但 e2label 和 tune2fs -L 会修改文件系统的元数据。操作前确认设备名写对了,比如 /dev/sda1 和 /dev/sdb1 只差一个字母,搞错了后果很严重。
第二,修改 /etc/fstab 文件之前一定要备份。写错了fstab可能导致系统启动时无法挂载根文件系统,直接进入紧急模式(emergency mode),需要从救援盘修复。
# 修改 fstab 之前备份
sudo cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d)
第三,不要在已挂载的文件系统上执行 mke2fs 或 mkfs 之类格式化操作。格式化前一定要 df -h 确认当前挂载的是哪个设备。
第四,对U盘、SD卡等可移动设备操作时,要特别小心。很多人曾经把U盘的设备名写错成系统盘,导致系统盘被格式化,数据全部丢失。操作前用 lsblk 确认设备名和容量是核对身份的第一步。
总结
lsblk 和 blkid 是磁盘管理中最高频使用的两个命令。lsblk 帮你快速看到磁盘的"骨架",blkid 则告诉你每个部件的"身份证号"。配合使用,可以在几分钟内全面掌握一台服务器的磁盘布局和文件系统信息。
记住了,写 fstab 永远用UUID,不要用设备名。这一条经验就能帮你避免很多灾难性的启动故障。
相关阅读
- ·
man lsblk:完整的参数和输出列定义 - ·
man blkid:了解支持的所有标识类型 - ·
man fstab:下一篇文章会详细讲解