问题
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 磁盘。