PARTUUID

问题

blkid 的输出里有 UUID 和 PARTUUID,为何需要两套 ID?

分析

  • PARTUUID 是分区表级 UUID (Universally Unique Identifier),是 GPT (GUID Partition Table) 硬盘上所有分区的标准特性。因为它是从分区表中检索的,所以访问它时不需要对分区的实际内容做任何假设。即不需要理会分区的文件系统是哪种格式,比如 btrfs、ext4、FAT、NTFS 等。如果分区是使用某种未知加密方法加密的,则 PARTUUID 可能是该分区唯一可访问的唯一标识符。

  • UUID 是一个文件系统级别的 UUID,它从分区内的文件系统元数据中检索。只有当文件系统类型已知并可读时,才能读取它。

  • UUID 适用于所有层(块设备、分区、raid、luks、lvm),PARTUUID 仅适用于 GPT 分区。

解决

GPT 是 UEFI 的规范。Linux 诞生时,UEFI 尚未诞生,所以是先用 UUID,后用 PARTUUID。

UUID 的应用场景:

  • 默认情况下,/etc/fstab 里用的是 UUID,比如安装 Debian 12 时就写入 UUID,而不是 PARTUUID。

  • MBR 硬盘没有 PARTUUID,只能用 UUID。

PARTUUID 的应用场景:

  • efibootmgr -v 查看 EFI 启动信息,可以发现 EFI 使用 PARTUUID。

额外

UUID 的缺点是必须扫描所有设备的内容才能找到它们,毕竟 UUID 可以在任何地方。使用 PARTUUID,则只需检查分区表,因此更容易/更高效(但是需要有大量的块设备才能看出差别)。

通过 PARTUUID 挂载可以在没有 initramfs 的情况下工作,因此如果您想制作一个无 initrd 的系统,请使用 PARTUUID。

ext4 分区可以用 sudo tune2fs -U <UUID> device 修改 UUID,重新格式化、转换文件系统格式也可能导致 UUID 改变,所以实际上 /etc/fstab 里用 PARTUUID 更好一点点,除非您还在使用 MBR 磁盘。

如果您使用微信,也可以关注公众号 UMU618,在公众号文章里评论。