来自blkid和mdadm的UUID之间的区别?


26

有人可以解释blkid和所报告的UUID之间的区别mdadm吗?例如,在我们的一个CentOS系统上:

[root@server ~]# blkid | grep /dev/md1
/dev/md1: UUID="32cb0a6e-8148-44e9-909d-5b23df045bd1" TYPE="ext4"

[root@server ~]# mdadm --detail /dev/md1 | grep UUID
UUID : f204c558:babf732d:85bd7296:bbfebeea

它们为何不同,我们将如何更改其使用的UUID mdadm

我了解我们将用于tune2fs更改分区的UUID(这将更改所返回的内容blkid),但不确定如何更改mdadm用途。

Answers:


23

第一个报告md块设备上ext4文件系统的UUID 。它有助于系统在系统上可用的文件系统中唯一地标识文件系统。它存储在文件系统的结构中,即存储在md设备上的数据中。

第二个是RAID设备的UUID。它有助于md子系统唯一地标识该特定RAID设备。特别是,它有助于识别属于RAID阵列的所有块设备。它存储在数组的元数据中(在每个成员上)。数组成员还具有自己的UUID(在md系统中,如果它们是GPT分区(其本身将存储在GPT分区表中)或LVM卷,则它们也可能具有分区UUID)。

blkid有点误导,因为它返回的是设备上存储的结构的ID(对于大多数文件系统,LVM成员和交换设备,它所知道的那种结构)。另请注意,具有结构具有相同UUID(例如LVM快照)的块设备并不少见。块设备可以包含任何东西,包括结构不包含UUID的东西。

因此,作为示例,您可能有一个具有3个驱动器且具有GPT分区的系统。这些驱动器可能具有一个全球通用名称,可以唯一标识它。假设3个驱动器已分区为一个分区(/dev/sd[abc]1)。每个分区将在GPT分区表中存储一个GPT UUID。

如果这些分区组成一个md RAID5阵列。每个将获得一个md UUID作为RAID成员,而该阵列将获得一个UUID作为md RAID设备。

/dev/md0可以用MSDOS或GPT型分区被进一步划分。例如,我们可以有一个/dev/md0p1带有GPT UUID 的分区(存储在GPT分区表中,该表存储在/ dev / md0的数据中)。

反过来,这可能是LVM的物理卷。这样,它将获得PV UUID。该卷组还将具有一个VG UUID。

在该卷组中,您将创建逻辑卷,每个逻辑卷都有一个LV UUID。

在其中一个LV(如/dev/VG/LV)上,您可以制作一个ext4文件系统。该文件系统将获得ext4 UUID。

blkid /dev/VG/LV会为您获取该文件系统的(ext4)UUID。但是作为VG卷中的一个分区,它也将获得一个分区UUID(某些分区方案(如MSDOS / MBR没有UUID))。该卷组由成员PV组成,后者本身就是其他块设备。blkid /dev/md0p1会给您PV UUID。它还在的GPT表中具有分区UUID /dev/md0/dev/md0本身是由其他块设备制成的。blkid /dev/sda1将返回raid成员UUID。它还在的GPT表中具有分区UUID /dev/sda


我们将如何更改RAID设备使用的UUID mdadm?我们只是重新镜像了服务器,而UUID却不同,因此我们想还原以前的UUID,这样就无需更改所有配置文件。从本质上讲,它/dev/md0具有一个新的UUID,我们希望将其返回到旧的UUID(从备份中识别),因此系统可以启动而无需进行进一步更改。
克里斯

@ Chris,MD UUID(请参阅man mdadm)或ext4 UUID(请参阅man tune2fs)?有关查找根文件系统或基于initramfs中存储的mdadm.conf组装RAID阵列的引导问题?无论哪种方式,对我来说更新mdadm.conf或fstab / grub.cfg都比与UUID混合起来更简单。
斯特凡Chazelas

MD UUID-我们从备份中还原了服务器。您知道如何更新RAID设备的UUID吗?我在手册页中看不到该信息。我们正试图找出最简单的方法使其正常工作(测试还原过程)。
克里斯

@Chris,您应该为此提出另一个问题。
斯特凡Chazelas

@Chris:您希望UUID有所不同。如果mdadm看到多个磁盘,即使它们是不同的RAID,也认为它们属于同一RAID(由于UUID冲突),那么您将遇到真正的问题。
弗罗斯特斯2014年

4

已经说明了不同的UUID。不仅文件系统具有它们。仅有UUID用于不同的事物:RAID阵列,设备,分区,LUKS容器,LVM PV的...以及最后的文件系统。

我个人讨厌的是,即使是那些UUID的格式化方式也不同。

blkid:

# blkid /dev/sda1
/dev/sda1: 
UUID="d8b8b4e5-e47b-2e45-2093-cd36f654020d"
UUID_SUB="3c3e6eac-2139-3f7a-16b7-57280934d88e"
PARTUUID="6a89cedf-69e1-40db-b08c-1c8e45af59f5" 

mdadm:

# mdadm --examine /dev/sda1 | grep UUID
     Array UUID : d8b8b4e5:e47b2e45:2093cd36:f654020d
    Device UUID : 3c3e6eac:21393f7a:16b75728:0934d88e

如您所见,它们是相同的UUID,但blkid使用破折号打印它们,-mdadm使用冒号打印:。所以,你得d8b8b4e5-e47b-2e45-2093-cd36f654020dd8b8b4e5:e47b2e45:2093cd36:f654020d

非常烦人,特别是如果您想在脚本中使用UUID。如何从一种格式转换为另一种格式并不明显。


s /:/-/ g怎么样,反之亦然?;)
ThiefMaster 2014年

实际上,这里只是冒号:或破折号-,因此人类可以分块读取较长的UUID,而不会迷失在中间的某个地方。UUID实际上是一个二进制数,没有破折号或冒号。它在Linux中以无符号字符数组形式实现:unsigned char uuid_out[16]。显然,UUID规范也对变体和版本有所了解,我们可以通过将最高有效字节设置uuid_out[6]为4来实现
TrinitronX

-1

上面的“ 32cb0a6e-8148-44e9-909d-5b23df045bd1”上方的blkid UUID是正确的,这是操作系统将用来查找RAID阵列的UUID。

mdadm拥有自己的“内部” UUID,操作系统不会直接使用它,而是您在mdadm.conf文件中使用的UUID,例如:

“ ARRAY / dev / md1级别= raid1 num-devices = 2 uuid = f204c558:babf732d:85bd7296:bbfebeea”

mdadm与blkid和OS可以识别的UUID分开时,不应调用任何UUID。也许应该将其称为mduuid或其他名称以避免混淆。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.