blkid 是最直接、最可靠的方式,它读取文件系统 superblock 元数据,不依赖挂载、无需提前配置,支持 ext4/xfs/btrfs/vfat/swap 等主流类型;其他命令如 tune2fs 仅限 ext 系,/dev/disk/by-uuid/ 只是 udev 缓存符号链接,无法替代 blkid 的权威性。

blkid 是最直接、最可靠的方式,它读取文件系统 superblock 元数据,不依赖挂载、无需提前配置,且支持 ext4/xfs/btrfs/vfat/swap 等主流类型。其他命令要么有文件系统限制(如 tune2fs 只能查 ext 系),要么只是符号链接缓存(如 /dev/disk/by-uuid/),不能替代 blkid 的权威性。
用 blkid 查所有分区 UUID(推荐首选)
这是日常运维和脚本中最常用、最稳妥的方法。输出格式统一,字段明确,可直接用于 /etc/fstab 或自动化部署。
- 运行
sudo blkid:列出所有已识别块设备的UUID=、TYPE=、LABEL=,未格式化的裸分区不会出现 - 只看 UUID 字段:
sudo blkid -s UUID,省去冗余信息,适合人工快速扫视 - 提取纯字符串(无引号、无前缀):
sudo blkid /dev/nvme0n1p2 -s UUID -o value,方便脚本变量赋值 - 注意权限:普通用户执行时,LVM 逻辑卷或加密设备可能报
Permission denied;加sudo即可解决,但常规 SATA/NVMe 分区通常不需要
通过 /dev/disk/by-uuid/ 反查设备路径
这个目录是 udev 维护的符号链接集合,名字就是 UUID,指向真实设备节点。它不读 superblock,只反映内核当前识别到的映射关系,适合“已知 UUID,想确认对应哪个 /dev/xxx”。
- 运行
ls -l /dev/disk/by-uuid/,输出形如127386cd-a14d-4346-b914-eb11c6a40303 -> ../../sdd4 - 链接存在 ≠ 文件系统完好:如果设备已拔出、损坏或未初始化,链接可能残留但实际不可访问
- 修改过 UUID 后会滞后:比如刚用
tune2fs -U random改完,这里不会立刻更新,需等 udev 重载或重启 - 不能用来判断 UUID 是否真实存在——它只是缓存,不是真相来源
用 findfs 根据 UUID 定位设备
当你只有 UUID 字符串(比如从 /etc/fstab 里复制的),需要反向找出它属于哪块盘,findfs 比 grep 扫 blkid 输出更精准,尤其在多路径或 LVM 场景下。
- 运行
sudo findfs UUID=127386cd-a14d-4346-b914-eb11c6a40303,直接输出匹配的设备路径,如/dev/sdd4 - 失败时返回非零退出码,适合写进检查脚本做断言:
if ! findfs UUID=... > /dev/null; then echo "not found"; fi - 不支持模糊匹配或通配符,必须输入完整、正确的 UUID 字符串
别把其他 UUID 当成磁盘分区 UUID
Linux 里叫 “UUID” 的东西不止一种,混淆会导致 fstab 挂载失败、cloud-init 配置错绑、甚至系统启动卡住。
-
cat /sys/class/dmi/id/product_uuid:这是主板 SMBIOS UUID,代表物理机器,跟磁盘无关 -
cat /etc/machine-id:systemd 生成的逻辑系统 ID,用于服务发现,不是分区标识 -
df -h或mount输出里没有 UUID 字段:它们只显示挂载点和使用率,findmnt -o SOURCE,TARGET,UUID才行 -
lsblk -f显示为空:说明该分区没创建文件系统(file -s /dev/sdc1会返回data而非ext4),不是命令失效
/etc/fstab 或配置 Oracle ASM),唯一可信的就是文件系统层的 UUID —— 它由 mkfs 创建,固化在 superblock 里,只要不重格式化就不会变。而 blkid 是唯一能直接、实时、跨文件系统读取它的工具。其他方法都是间接、缓存或受限的补充手段。











