blkid输出的uuid才是真实、完整的详细值,因其直接读取文件系统superblock中写死的128位原始值(36字符格式),不截断、不转换;其他命令如lsblk、tune2fs等或依赖缓存、或限于特定文件系统、或字段可能为空,均无法替代blkid的权威性。

直接用 blkid 查,输出的就是真实、完整的 UUID 字符串,带引号、无截断、不省略任何字符——这是唯一能保证看到“详细值”的方式。
为什么 blkid 输出的才是真正的详细 UUID
UUID 是文件系统 superblock 里存的原始 128 位值,以 36 字符格式(8-4-4-4-12)写死在磁盘上。blkid 直接读这个字段,不做任何转换或截断。其他命令要么依赖缓存(如 udevadm),要么只对特定文件系统有效(如 tune2fs),要么只显示部分字段(如 lsblk -f 的 UUID 列可能为空)。
-
blkid /dev/sda1输出形如/dev/sda1: UUID="a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8" TYPE="ext4"—— 引号内的全部内容就是你要的“详细值” - 若只要纯字符串(比如给脚本用),加
-s UUID -o value:blkid /dev/sda1 -s UUID -o value,输出就是a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8,无引号、无空格、无换行 - 普通用户可运行;遇到
Permission denied(常见于 LVM 或加密卷),加sudo即可,不是权限缺陷,是设备节点访问控制所致
lsblk -f 看到的 UUID 为什么有时是空的
lsblk -f 显示的 UUID 实际是从 udev 数据库取的,不是实时读盘。它适合看挂载拓扑,但不适合查“详细值”。
- 未挂载 + 无 LABEL 的分区,
lsblk -f的 UUID 列常为空白,即使blkid能清楚显示 - 热插拔新硬盘后,udev 可能几秒内没完成扫描,此时
lsblk -f还看不到 UUID,而blkid立刻能读到 -
lsblk -J -o NAME,UUID输出 JSON,字段名是"uuid",但值仍受 udev 缓存影响,不能替代blkid的权威性
别拿 tune2fs 或 dumpe2fs 当通用方案
这两个命令只认 ext2/3/4,对 xfs、btrfs、vfat、swap 分区直接失败,强行执行会报错或静默无输出。
-
tune2fs -l /dev/sda1 | grep UUID成功时输出Filesystem UUID: a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8,但注意:冒号后有空格,且字段名固定,脚本提取不如blkid -s UUID -o value干净 -
dumpe2fs /dev/sda1 | grep UUID输出冗长,含大量调试信息,人工核对还行,自动化解析容易误匹配 - 执行时报
Bad magic number in super-block,说明根本不是 ext 系,立刻停手,换blkid
真正容易被忽略的一点:UUID 是文件系统层属性,不是设备层。一块刚分完区还没 mkfs 的盘,blkid 就不会输出 UUID 字段——这不是命令失效,而是那里本来就没有值。先确认 file -s /dev/sdb1 返回的是 ext4 filesystem data 这类结果,再查 UUID 才有意义。











