Linux磁盘UUID查询:blkid命令实战指南

Linux磁盘UUID查询:blkid命令实战指南 在实际的 Linux 磁盘管理中blkid 是最常用来查看磁盘 UUID 的命令。很多运维脚本、挂载配置、重启排障都离不开它的输出。标题里的“磁盘 uid 号”对应到 Linux 术语里就是 UUIDUniversally Unique Identifier通用唯一标识符。理解 blkid 为什么重要关键在于理解 Linux 磁盘设备名和真实标识之间的关系设备名可能变化而文件系统创建出来的 UUID 在正常情况下是全局唯一的。本文会从 blkid 的基本原理讲起覆盖安装确认、常用参数、fstab 配置、常见排查和 UUID 修改风险最终让读者能在真实服务器上独立用 blkid 完成磁盘标识查询和挂载排障。1. 先理解磁盘设备名、UUID、PARTUUID 和 LABEL 的区别1.1 Linux 磁盘为什么不能只看 /dev/sdXLinux 下最常用的磁盘设备名是/dev/sda、/dev/sdb、/dev/sdc分区则叫/dev/sda1、/dev/sdb2。它们由内核在系统启动或设备接入时根据识别顺序分配。这个顺序受总线扫描、驱动加载、硬件枚举甚至热插拔环境影响不是绝对稳定的。举个实际例子服务器有 sda、sdb 两块盘/dev/sda是系统盘/dev/sdb是数据盘。如果某一台机器在开机时没有正常识别到某块盘或者新接入了一块容量更大的硬盘下一块盘就可能变成 sdb原来的 sdb 变成 sdc。此时如果/etc/fstab里写的是/dev/sdb1系统重启后很可能挂载到错误设备甚至直接挂载失败。UUID 的作用就在这里它是在文件系统创建时生成的一组 128 位随机标识符写入文件系统的超级块中。只要不人为修改这个值在磁盘的生命周期内不会改变。因此操作系统和运维脚本都更信任 UUID而不是依赖设备名的稳定性。1.2 四种常见标识符的关系标识符生成位置是否全局唯一是否随设备名变化常见用途/dev/sda1内核根据识别顺序分配不唯一会变临时操作、查看分区状态UUID创建文件系统时写入超级块通常唯一不变fstab 挂载、恢复备份、日志识别PARTUUID分区表项自带通常唯一不变fstab 中 GPT 分区引用、systemd 设备识别LABEL创建文件系统时指定可重复不变移动存储识别、人工记忆blkid命令输出里经常会同时看到UUID和PARTUUID。UUID是文件系统层级的标识例如 ext4、xfs、swap 分区都有PARTUUID是分区表层级的标识即使分区里还没有文件系统它也可能存在。排查磁盘问题时先确认自己需要的是哪种标识避免选错。1.3 不要弄混 UUID 和 UID标题里说的“磁盘 uid 号”如果直译成 Linux 术语容易和系统里的 UIDUser Identifier用户 ID混淆。UUID 是磁盘或分区的全局唯一标识UID 是 Linux 系统为每个用户分配的数字编号保存在/etc/passwd中。概念全称作用对象查看命令UUIDUniversally Unique Identifier磁盘、分区、文件系统blkidUIDUser Identifier系统用户id、getent passwdPARTUUIDPartition UUID分区表项blkid、lsblk -o PARTUUID看用户信息时不要跑到 blkid 里找看磁盘标识时也不要用id命令。两者虽然名字相近但所属体系完全不同。实际项目中经常有新手把 fstab 里的 UUID 配置写成用户 UID导致开机进入紧急模式这类错误需要重点避免。2. 环境准备确认 blkid 已安装并具备执行权限2.1 blkid 属于 util-linux 工具集blkid 不是独立软件而是 util-linux 项目提供的一个命令行工具。util-linux 是最基础的 Linux 系统工具集之一包含 mount、fdisk、mkfs、lsblk、findmnt、kill 等常见命令。绝大多数发行版默认安装因此大多数情况下不需要额外配置就能使用。需要说明的是blkid 有两套常见实现util-linux 自带的/usr/sbin/blkide2fsprogs 中的 libblkid 库辅助命令在标准发行版中/sbin/blkid或/usr/sbin/blkid一般通过 util-linux 提供。使用前建议先确认命令来源和版本避免在定位问题时使用到非标准别名或自定义脚本。2.2 安装确认方式推荐用下面一组命令检查环境和版本which blkid blkid -V正常输出示例/sbin/blkid blkid from util-linux 2.37.4 (libblkid 2.37.0, 19-Feb-2023)如果系统提示找不到 blkid可以按发行版安装# Debian / Ubuntu sudo apt update sudo apt install util-linux # RHEL / CentOS / Rocky Linux sudo yum install util-linux # openSUSE sudo zypper install util-linux # Arch Linux sudo pacman -S util-linux安装完成后重新执行blkid -V确认版本。这里要注意不同版本的 blkid 输出格式和部分参数行为会有差异参考本文命令时建议对照自己系统的blkid -V输出。2.3 普通用户与 root 的权限差异blkid 需要读取磁盘的设备节点和块设备信息同时要读取内核提供的/sys/block、/proc/partitions等接口。普通用户可以执行二进制文件但部分信息可能看不到或者在读取设备时被权限限制挡住。最稳妥的做法是使用 root 或 sudo 执行sudo blkid如果是普通用户直接运行blkid在某些系统上可能只输出空结果或部分内容。这不是命令坏了而是权限不足。排查磁盘信息时养成加 sudo 的习惯可以减少误判。3. blkid 的常用用法从查 UUID 到脚本化识别设备3.1 不带参数查询所有块设备直接在终端执行sudo blkid典型输出/dev/sda1: UUID6b93a60f-3d40-4d2f-80f2-6f09f7a14e8a TYPEext4 PARTUUIDc3f5a9b0-01 /dev/sda2: UUID0f31b7ce-632b-4dd1-8f06-6f2bebc2c1a2 TYPEswap PARTUUIDc3f5a9b0-02 /dev/sdb1: LABELdata UUIDa9f1b4c4-70e8-463d-9d4d-3e9c2a7a0f10 TYPExfs PARTUUID1e8bd4f3-01每个KEYVALUE字段的含义UUID文件系统 UUID用于挂载和标识。TYPE文件系统类型比如 ext4、xfs、swap、vfat。LABEL文件系统标签可手动指定方便人工识别。PARTUUID分区表项 UUIDGPT 分区通常有。PTTYPE分区表类型例如 gpt、dos。3.2 指定设备查询如果只关心某一块分区直接指定设备路径sudo blkid /dev/sdb1这种方式适合脚本场景。设备不存在时会提示/dev/sdb1: No such file or directory遇到这个提示先用lsblk或fdisk -l查看实际设备名确认是不是设备名发生了变化。3.3 常用参数速查参数作用示例-s UUID只显示指定字段sudo blkid -s UUID /dev/sda1-o device只输出设备路径sudo blkid -s UUID -o device /dev/sda1-o export输出可被 shell 解析的键值对sudo blkid -o export /dev/sda1-o list以列表方式显示全部设备sudo blkid -o list-p绕过缓存低层探测超级块sudo blkid -p /dev/sdb1-c /dev/null不使用缓存文件sudo blkid -c /dev/null /dev/sdb1-U UUID用 UUID 反查设备路径sudo blkid -U 6b93a60f-3d40-4d2f-80f2-6f09f7a14e8a-L LABEL用 LABEL 反查设备路径sudo blkid -L data-g垃圾回收并刷新缓存sudo blkid -g其中-U和-L在脚本里非常实用。比如你想在不知道设备名的情况下根据 UUID 找到设备device$(sudo blkid -U 6b93a60f-3d40-4d2f-80f2-6f09f7a14e8a) echo $device输出/dev/sda1这样即使设备名从 sda 变成 sdb脚本仍然能定位到正确分区。3.4 脚本场景下更推荐 lsblk 配合 blkid虽然 blkid 可以输出原始键值对但-o list的可读性更好sudo blkid -o list这种输出会按设备列出文件系统、UUID、挂载点等字段。如果只是快速查看设备树lsblk更合适lsblk -f输出中会包含 FSTYPE、UUID、MOUNTPOINTS 三列。blkid 的优势在于支持按 UUID 反查设备、低层探测文件系统超级块以及处理缓存问题。日常使用时可以组合起来先用 lsblk 看结构再用 blkid 精确获取 UUID 和类型。4. 实战用 blkid 获取新分区 UUID 并配置 /etc/fstab4.1 为什么 fstab 推荐使用 UUID 而不是设备名/etc/fstab是系统启动时挂载文件系统的核心配置文件。传统写法是写设备路径/dev/sdb1 /data ext4 defaults 0 2这种写法的问题是设备名不稳定。假设维护人员在机器上额外接了一块启动盘原来的 sdb 可能变成 sdc配置就会失效。更严重的是如果系统同时接入多块相同型号的磁盘内核无法保证每次识别的顺序一致存在挂载到错误磁盘的风险。推荐写法是用 UUIDUUIDa9f1b4c4-70e8-463d-9d4d-3e9c2a7a0f10 /data xfs defaults 0 2使用 UUID 之后除非有人修改文件系统超级块否则挂载关系不会因为设备名变化而改变。4.2 准备一块新磁盘并创建文件系统以下操作假设系统里有一块空磁盘/dev/sdb目标是把它的第一个分区挂载到/data。先查看磁盘结构sudo lsblk输出中/dev/sdb没有子分区说明是裸盘。创建分区sudo fdisk /dev/sdb在 fdisk 交互界面依次输入n # 新建分区 p # 主分区 1 # 分区号 回车 # 起始扇区默认 回车 # 结束扇区默认 w # 写盘并退出分区完成后格式化sudo mkfs.ext4 /dev/sdb1如果是 CentOS/Rocky 等习惯 xfs 的环境可改为sudo mkfs.xfs /dev/sdb1格式化完成后先不急着挂载用 blkid 获取新分区的 UUIDsudo blkid /dev/sdb1输出示例/dev/sdb1: UUID2c7b0c4e-15ca-4e72-9f42-03c094ca6402 TYPExfs4.3 建立挂载点并写入 fstab创建挂载目录sudo mkdir -p /data编辑/etc/fstabsudo vim /etc/fstab在文件末尾加入一行UUID2c7b0c4e-15ca-4e72-9f42-03c094ca6402 /data xfs defaults 0 2字段含义按顺序是要挂载的源设备标识。挂载点。文件系统类型。挂载选项defaults表示使用 rw、suid、dev、exec、auto、nouser、async 等默认组合。是否使用 dump 备份0表示不备份。fsck 检查顺序根文件系统通常为1其他分区为2不需要检查的写0。写完后不要直接重启先验证配置是否正确sudo mount -a再用findmnt确认挂载结果findmnt /data正常输出TARGET SOURCE FSTYPE OPTIONS /data /dev/sdb1 xfs rw,relatime,attr2,inode64,logbufs8,logbsize32k,noquota如果mount -a没报错且findmnt能看到/data说明 fstab 配置正确。这种方式比直接重启验证安全得多。4.4 swap 分区同样依赖 UUIDswap 分区在 fstab 中的写法也建议使用 UUIDUUID0f31b7ce-632b-4dd1-8f06-6f2bebc2c1a2 none swap sw 0 0启用 swap 可以用sudo swapon -a查看当前 swap 设备swapon --show这里要注意swap 分区格式化后同样会生成 UUID不需要额外配置。blkid 看到的 TYPE 是swap可以用blkid -s UUID /dev/sda2获取精确 UUID。5. blkid 查不到磁盘信息时的排查链路5.1 从现象倒推原因的顺序实际项目里经常出现类似报错“blkid 看不到新接的盘”“blkid 查出来的 UUID 是空的”“刚 mkfs 完 blkid 不显示”。遇到这类问题先按下面的链路排查是否使用了 sudo权限是否足够。设备节点是否存在lsblk能不能看到。分区是否还没来得及刷新是不是缓存问题。内核是否已经识别到文件系统。文件系统类型是否存在已知兼容性问题。排查顺序越往前越容易处理不要一开始就怀疑驱动或硬件。5.2 常见现象和对应处理现象可能原因检查方式处理建议普通用户运行 blkid 输出为空权限不足sudo blkid对比使用 root 或加入相关权限组指定设备提示 No such file or directory设备节点不存在或设备名变化lsblk、fdisk -l用真实设备名替换新建分区后 blkid 无输出分区表或缓存未刷新sudo blkid -g、sudo blkid -p执行sudo partprobe或重启 udevblkid 能看到设备但看不到 TYPE分区内没有文件系统sudo file -s /dev/sdb1执行 mkfs 格式化系统刚识别的新磁盘不出现内核未扫描lsblk、dmesg查看 dmesg 尾部必要时重新触发设备扫描多路径或虚拟化环境输出混乱底层磁盘被多个路径引用multipath -ll使用/dev/mapper路径查询5.3 强制刷新 blkid 缓存blkid 为了提高性能会维护一个缓存文件。常见缓存位置有/run/blkid/blkid.tab/etc/blkid/blkid.tab/var/lib/blkid/blkid.tab当磁盘刚格式化或重新分区但缓存还没有同步时直接运行 blkid 可能看不到最新信息。这时可以sudo blkid -g sudo udevadm settle sudo blkidblkid -g会执行垃圾回收并清理过期缓存。udevadm settle会等待内核处理完设备事件。如果仍不显示可以绕过缓存做底层探测sudo blkid -p /dev/sdb1-p参数会让 blkid 直接扫描设备超级块而不是读取缓存。这种模式在磁盘刚格式化完但缓存未更新时最有效。5.4 使用其他工具交叉验证blkid 不是唯一的磁盘信息查看工具交叉验证可以快速判断问题是否出在 blkid 本身。查看文件系统和 UUIDlsblk -f查看指定分区的文件系统详情sudo file -s /dev/sdb1查看 ext4 超级块中的 UUIDsudo tune2fs -l /dev/sdb1 | grep UUID查看 xfs 超级块中的 UUIDsudo xfs_admin -u /dev/sdb1查看原始分区表信息sudo fdisk -l /dev/sdb如果 blkid 查不到但lsblk -f或tune2fs -l能看到 UUID说明多半是 blkid 缓存问题或版本兼容问题。如果其他工具也看不到问题更可能在文件系统或设备识别层。6. 修改 UUID 的风险与正确姿势6.1 什么情况下需要修改 UUID大多数情况下不需要修改磁盘 UUID。但以下场景会用到磁盘克隆或镜像恢复后新旧磁盘 UUID 完全一致导致系统无法区分。从虚拟机模板克隆出的多台服务器数据盘 UUID 相同fstab 会冲突。需要按固定规则分配可识别的 UUID方便批量管理。文件系统损坏后重建时需要恢复原有 UUID 以保持 fstab 和备份脚本不变。这里要特别强调修改根分区或正在使用的分区的 UUID存在导致系统无法启动的风险。操作前必须确认修改对象并且做好回滚准备。6.2 ext4 系列修改方法查看当前 UUIDsudo blkid /dev/sdb1修改为指定 UUIDsudo tune2fs /dev/sdb1 -U 550e8400-e29b-41d4-a716-446655440000修改为随机生成的新 UUIDsudo tune2fs /dev/sdb1 -U random修改前先备份原始 UUIDsudo blkid /dev/sdb1 /root/disk-uuid-backup-$(date %F).txt如果之后要恢复原本的 UUIDsudo tune2fs /dev/sdb1 -U 原有UUID值6.3 xfs 系列修改方法xfs 文件系统使用xfs_adminsudo xfs_admin -U 550e8400-e29b-41d4-a716-446655440000 /dev/sdb1生成随机 UUIDsudo xfs_admin -U generate /dev/sdb1查看当前 UUIDsudo xfs_admin -u /dev/sdb1需要注意xfs_admin 操作时最好保证文件系统处于卸载状态或只读状态。正在写入的挂载点直接修改 UUID可能导致数据不一致。6.4 修改 UUID 后必须执行的检查和回滚方案修改完 UUID 后第一件事不是重启而是更新所有引用旧 UUID 的配置grep -r 旧UUID /etc/fstab /etc/grub.d/ /boot 2/dev/null最常见的坑是/etc/fstab里还写着旧值。修改后必须同步# 用新的 UUID 替换 fstab 中的旧值 sudo sed -i s/旧UUID/新UUID/g /etc/fstab然后验证sudo mount -a findmnt /data对于根分区还需要检查引导配置是否引用了 UUID。不同发行版处理方式不同例如 GRUB 的配置文件、initramfs 中都可能固化 UUID。最稳妥的流程是完整备份 fstab 和关键配置。修改 UUID。同步修改 fstab。重建 initramfs系统盘场景。确认mount -a通过。再执行重启验证。如果重启后进入紧急模式常见报错是找不到根设备。此时需要用系统安装介质进入救援环境把 fstab 或 grub 配置改回旧 UUID 或设备路径再重新生成 initramfs。6.5 修改 UUID 的高风险操作清单操作对象风险等级注意事项未挂载的数据分区较低同步修改 fstab 即可正在挂载的数据分区中建议先卸载再修改swap 分区中修改后需同步 fstab 并执行 swapon -a根分区 /高必须重建 initramfs并准备救援盘/boot 分区高引导加载依赖 UUID操作不当会导致无法启动多路径或 LVM 逻辑卷中确认最终识别路径后再操作7. 生产环境中的磁盘 UUID 最佳实践清单7.1 新磁盘上线时的标准检查顺序在服务器上接入新磁盘时推荐按以下顺序操作用lsblk确认设备结构。用lsscsi或设备型号确认盘位避免误操作已有数据盘。分区后用mkfs格式化。用sudo blkid /dev/sdX1获取 UUID。写入/etc/fstab前先备份原文件。执行mount -a验证再确认挂载点内容。这样可以避免直接重启后才发现挂载配置错误。7.2 日常排障的组合命令最常用的组合是sudo blkid lsblk -f findmntblkid提供文件系统 UUID、TYPE、LABEL。lsblk -f提供设备和挂载点结构。findmnt提供实际挂载状态。当 fstab 挂载异常时还可以使用sudo findmnt --verify --verbose这个命令会逐一校验 fstab 中的配置并给出错误行比人工阅读 fstab 快得多。7.3 学习环境与生产环境的差异在学习环境比如虚拟机里设备名通常稳定使用/dev/sdb1直接挂载也能通过。但生产环境必须考虑以下因素云厂商的块存储设备名可能在重启后变化。物理机的磁盘顺序受 BIOS、驱动、背板顺序影响。多块盘同时接入时枚举顺序无法保证。系统升级或内核更新可能改变设备路径。多路径存储场景下/dev/sdX与/dev/mapper/mpathX混用容易出错。所以生产环境的 fstab、监控脚本、备份脚本、Ansible 等自动化工具只要涉及持久化磁盘标识都建议统一使用 UUID 或 PARTUUID。对于 LVM 环境虽然逻辑卷路径/dev/mapper/vg-data相对稳定但在某些系统初始化阶段LVM 设备可能尚未完全激活。此时使用UUID或者PARTUUID更为稳妥。7.4 几个具体建议不要把/etc/fstab里的设备路径和 UUID 混用。要么统一 UUID要么统一设备路径混用会增加排查难度。自动化脚本中不要直接解析blkid的全部输出优先使用-s UUID -o value提取精确值避免字段顺序变化导致取错内容。克隆虚拟机后第一时间修改非系统盘的 UUID避免多台机器出现相同标识。修改 UUID 前记录旧值同时保存一个 fstab 备份放在不依赖该磁盘的位置。监控系统不要用 UUID 作为唯一指标维度还需要结合挂载点和设备类型方便异常时快速定位。对应用层而言更稳定的做法是使用 mountpoint 或 systemd mount 单元而不是直接依赖裸设备标识。7.5 扩展方向LVM、多路径与云盘blkid 虽然能识别大多数常见文件系统但在 LVM、多路径和云盘场景中输出可能不完全覆盖底层设备信息。这时需要结合其他命令sudo pvs sudo lvs sudo vgs sudo multipath -ll例如 LVM 逻辑卷的实际路径可能是/dev/mapper/vg_data-lv_data使用 blkid 查看时sudo blkid /dev/mapper/vg_data-lv_data它仍然会输出 UUID 和 TYPE但这个 UUID 是文件系统层面的和底层 PV 的物理卷 UUID 不同。不要把两者混淆。云盘环境还要注意部分云厂商的控制台和设备属性会动态变化重启实例或迁移存储节点后/dev/sdX可能整体变化。此时更应该依赖 fstab 中的 UUID 持久化挂载关系并配合厂商的持久化设备名策略一起使用。回到本文开头的问题blkid查看磁盘 UUID是 Linux 磁盘管理中风险最低、重复度最高也是最值得养成肌肉记忆的操作。理解了设备名和文件系统标识的区别再配合lsblk、findmnt、tune2fs等工具大多数磁盘挂载和识别问题都能快速定位。下一步建议新读者在一台虚拟机里完成一次完整的“分区 - 格式化 - blkid 获取 UUID - 写入 fstab - mount -a 验证”流程。这个流程跑通一次之后再看生产环境的磁盘问题会清晰很多。