我正在研究 Linux 下的分区,从 sfdisk 开始。如果我将分区表从一个驱动器复制到另一个驱动器,它将复制每个分区的设备 UUID 和 PTUUID,但如果我要创建新设备,我可以为 GPT 驱动器指定 UUID,但不能为 MBR 驱动器指定 UUID。这让我认为 UUID 和 PTUUID 对于 MBR 驱动器来说不是必需的。那是什么情况呢?
如果我需要驱动器的 UUID 以及分区的 PTUUID,我该如何手动完成呢?我看到 sfdisk 允许我为 GPT 设备指定 UUID,但只能为 MBR 设备指定标签。如何为 MBR 创建 UUID?如何确保分区 PTUUID 是基于该设备 UUID 创建的?我不知道如何为设备创建主 UUID,或者如何根据它为分区创建 PTUUID。
答案1
我假设您的意思是“磁盘的 PTUUID 和分区的 PARTUUID”,因为不存在“分区的 PTUUID”之类的东西。
回答你的问题标题:不,PTUUID 和 PARTUUID 对于 MBR 来说并不重要,因为 MBR 是在 20 世纪 80 年代开发的,当时 128 位 UUID 的概念还不常见。 MBR 分区表中的单个主分区条目只有 16 个字节:为每个分区再添加 16 个字节用于一个长标识符的想法在当时被认为是一种疯狂的空间浪费。由于主 MBR 分区表必须与实际引导记录代码放入同一个 512 字节磁盘块中,因此实际上也没有任何空间可以在以后添加它。
您可能已经注意到,真正的 UUID 往往采用 12345678-9abc-def0-1234-56789abcdef0 格式,但在 MBR 分区磁盘上,PTUUID 和 PARTUUID(如果确实报告)都是短得多的字符串:PTUUID 可能分别是 12345678 和 PARTUUID 12345678-01?
这是因为 MBR 分区磁盘的 PTUUID 和 PARTUUID 所显示的标识符不是真正的 UUID。它们基于 32 位磁盘标识符,该标识符由 Windows NT 3.5 首次添加到 MBR 中。它最初被称为“Windows 磁盘签名”,但我猜“磁盘标识符”是一个更与供应商中立的术语。由于 Windows NT 3.5 之前的操作系统没有这样的磁盘标识符,因此必须将其视为可选标识符,这与 GPT 分区磁盘不同,在 GPT 分区磁盘上,PTUUID 和 PARTUUID 是分区方案的强制部分。
MBR 分区磁盘的“PTUUID 字符串”本身就是 32 位磁盘标识符,“PARTUUID”是通过简单地在末尾添加破折号和两位数的分区号从中派生出来的。这些字符串不满足真实 UUID 的规范,因为它们不够长,无法确保唯一性,并且不是使用相同的规则创建的。它们是真实 UUID 的最佳替代品。
当您开始在完全未使用的磁盘上创建新的 MBR 分区表时,现代 Linuxfdisk
会包含以下初始消息:
Device does not contain a recognized partition table.
Created a new DOS (MBR) disklabel with disk identifier 0x1234abcd.
Command (m for help):
因此,当创建新的 MBR 分区表时,它会自动为您创建一个磁盘标识符。该磁盘的“PTUUID”将为 1234abcd,第一个分区的“PARTUUID”将为 1234abcd-01。
要更改 MBR 磁盘的现有磁盘标识符,您可以使用Philip Couling 提到的方法,或者您可以为该磁盘sfdisk --disk-id
启动足够现代的 Linux 版本,输入以下内容fdisk
x
专家命令菜单i
,然后输入更改磁盘标识符行动。
更改 MBR 分区磁盘上的磁盘标识符/PTUUID 必然也会更改所有 PARTUUID,因为它们都来自同一个磁盘标识符。
如果分区内的文件系统blkid
还支持 UUID,由 Linux 工具(如和lsblk
)显示UUID
。它的格式和存在取决于文件系统类型:对于 FAT 系列的文件系统,您可以看到一个简短的标识符,例如,UUID=1A2B-3C4D
而不是真正的 128 位 UUID。这真的是FAT卷序列号(也称为卷 ID) 在创建文件系统时分配。要更改此设置,请使用特定于文件系统的工具,例如tune2fs -U
针对 ext2/ext3/ext4 文件系统、xfs_admin -U
XFS 或mlabel -N
FAT 系列文件系统。
答案2
这让我认为 UUID 和 PTUUID 对于 MBR 驱动器来说不是必需的。
这基本上是正确的。分区表本身上的 PTUUID 对 MBR 本身没有任何作用,但它由系统使用。它根本没有分区上的 PARTUUID,只有它们在表中的位置。
如果我需要驱动器的 UUID 以及分区的 PTUUID,我该如何手动完成呢?我看到 sfdisk 允许我为 GPT 设备指定 UUID,但只能为 MBR 设备指定标签。
实际上确实sfdisk
允许您设置“disk-id”。 MBR 分区 UUID 只是磁盘 ID 后跟表中的位置。因此,如果我将磁盘 ID 设置为12345
第一个 PARTUUID 将是12345-1
.看sfdisk 手册:
--disk-id device [id] Change the disk identifier. If id is not specified, then print the current identifier. The identifier is UUID for GPT or unsigned integer for MBR.
背景
Linux 使用的命名约定错误地使用了术语“UUID”,这是非常具有误导性的。 U普遍地U尼克ID实体词是一种非常具体的标准化唯一标识符格式,具有严格标准化的生成规则,具体取决于版本嵌入到每个 ID 中。为了避免混淆,我将避免将首字母缩略词“UUID”用于 Linux 分区以外的任何用途:
Linux 的命名约定是:
- “PTUUID”是分区表本身嵌入表中的唯一标识符。 GPT 为此使用通用唯一标识符,而 MBR 则不然。然而,MBR 确实有一个短的 PTUUID,因为人类不擅长为其驱动器选择唯一的名称。
- “PARTUUID”是分区表内分区的唯一标识符。
- MBR 不记录任何此类 ID。但它最多只有 4 个分区。因此,按照惯例,分区可以通过它们在表中的位置(1、2、3、4)轻松引用。因此,要识别系统上的 MBR 分区,您需要 MBR 表的 PTUUID 和表中的位置。例如,在我的虚拟机上,我有一个
ee7273d0
带分区的驱动器ee7273d0-1
。这可以在 下找到/dev/disk/by-partuuid/ee7273d0-1
。 - GPT 确实记录了这些并为它们使用通用唯一标识符。因此,由于通用唯一标识符的严格规则,不需要 PTUUID 来标识分区:只要正确生成,它们将始终是唯一的。
- MBR 不记录任何此类 ID。但它最多只有 4 个分区。因此,按照惯例,分区可以通过它们在表中的位置(1、2、3、4)轻松引用。因此,要识别系统上的 MBR 分区,您需要 MBR 表的 PTUUID 和表中的位置。例如,在我的虚拟机上,我有一个
- “UUID”是嵌入在文件系统、LUKS 标头或 LVM 物理卷等中的唯一标识符。未格式化的分区不会有,同样,具有分离标头的 LUKS 加密驱动器也不会有。
- ext4 文件系统使用通用唯一标识符作为其 UUID
- FAT 和 FAT32 使用更短的 ID,可能与某个地方的另一个驱动器相同。
- LVM 似乎没有使用通用唯一标识符,但它的 ID 非常长且随机,与另一个驱动器发生冲突的风险可以忽略不计。