更新2017-01-25

更新2017-01-25

我在 VMware 中有一个 Fedora 客户操作系统。我想扩展/boot分区,因此我向该虚拟机添加另一个虚拟磁盘,并尝试克隆该磁盘。

之后dd if=/dev/sda1 of=/dev/sdb1blkid报告/dev/sda1/dev/sdb1具有相同的 UUID/GUID。

奇怪的是,宇宙中有两个相同的 UUID,如何将其中一个更改为另一个 UUID 值?


更新2017-01-25

主题变了,这里的 UUID 是指文件系统 UUID,而不是分区 UUID。

由于它是文件系统 UUID,因此需要文件系统特定的实用程序来更改 UUID,或使用十六进制编辑器修改磁盘上的原始数据(危险,不推荐,除非你知道自己在做什么)。

答案1

要生成随机的新 UUID,可以使用:

$ uuidgen

实际更改 UUID 取决于文件系统。

假设 ext 系列文件系统

# tune2fs -U <output of uuidgen> /dev/sdb1

或者,如果您确信 uuidgen 能够正常工作:

# tune2fs -U $(uuidgen) /dev/sdb1

假设 btrfs 文件系统

# btrfstune -U $(uuidgen) /dev/sdb1

UUID 存储在超级块中,因此文件系统的逐字节副本将具有相同的 UUID。

答案2

除了ext2 / ext3 / ex4和xfs之外,您还可以更改以下文件系统或块设备的UUID或GPT分区的PARTUUID。

交换

swaplabel -U $NEW_UUID

软件 RAID(md raid)

对于 MD RAID,必须先停止 RAID,然后在重新组装时更新 UUID。因此,如果您的 RAID 挂载到/,您无法停止它,您需要在离线模式下更新 UUID - 使用 Live CD/USB 来完成此操作。

  1. mdadm --stop $RAID_DEVICE
  2. mdadm --assemble $RAID_DEVICE --update=uuid --uuid=$NEW_UUID $MEMBER_DEVICES...

例子:

  1. mdadm --stop /dev/md127
  2. mdadm --assemble /dev/md127 --update=uuid --uuid=2A1D2A1D-2A1D-2A1D-2A1D-2A1D2A1D2A1D /dev/sda2 /dev/sdb2

UUID 更新后,您可能需要更新grub.cfgrd.md.uuid=$NEW_UUIDlinux/linuxefi/linux16命令行中)和/或fstab和/或mdadm.conf和/或update-initramfs(Debian 系列)和/或dracut --force(Red Hat 系列),以便下次可以成功启动。

LUKS(密码设置)

cryptsetup luksUUID --uuid=$NEW_UUID $LUKS_DEVICE

例子:

cryptsetup luksUUID --uuid=e0c0e0c0-e0c0-e0c0-e0c0-e0c0e0c0e0c0 ~/encrypted-LUKS.loop

NTFS文件系统

ntfslabel实用性(感谢NTFS-3G) 更改 NTFS 文件系统的 UUID。看abchk1234 的回答

如果您想更改 NTFS 文件系统的整个 UUID 而不是--new-half-serial,请使用该--new-serial选项。

例子:

ntfslabel --new-serial=1122334455667788 /dev/sda3

FAT/exFAT 文件系统

这是另一个故事,目前没有实用程序可以修改这些文件系统的文件系统 UUID(看赖克哈特的回答--mlabel工具),但我们可以修改磁盘上的原始数据来做到这一点。

警告,修改磁盘上的原始数据是危险的,如果不小心操作,可能会丢失数据。

以下是使用 修改磁盘上的原始数据的详细步骤hexedit

  1. blkid,将文件系统的UUID写在纸上,或者记住它。 FAT/exFAT的UUID字符串看起来像1122-3344,NTFS的UUID字符串看起来像1122334455667788

  2. 使用hexedit打开分区设备

    hexedit <partition device such as /dev/sda1>

  3. /,倒序输入 UUID(如果blkid报出1234-ABCD,则搜索CDAB3412),即可搜索磁盘上的 UUID 数据。

  4. 找到 UUID 后,更改它们,按F2保存并退出。

  5. blkid验证 UUID。

  6. 一旦 UUID 被修改,您可能需要更新grub.cfg和/或fstab以便下次可以成功启动。

  7. 执行fsck <partition device such as /dev/sda1>并看到一个“引导扇区与其备份之间存在差异”信息。为了解决这个问题,选择“1)将原始文件复制到备份”,如果你被问到“执行更改?(y/n)”你按y.


GPT 分区的 PARTUUID

一个小故事:我从来没有想过我需要触摸GPT分区的PARTUUID,直到现在,当我尝试将Windows从小磁盘迁移到大磁盘时,Windows无法在大磁盘上启动,甚至无法自动修复。原因是,对于 Windows + UEFI,将 NTFS 文件系统的 UUID 更改为原始 UUID 是不够的,还需要更改 GPT 分区的 PARTUUID - PARTUUID 很重要。 (将PARTUUID更改为原来的后,Windows成功从大磁盘启动。)

已经有答案在askubuntu.com展示如何使用gdisk实用程序更改 GPT 分区的 PARTUUID。

util-linux的当前版本fdisk(编辑时 Fedora 32 存储库中为 2.35.2)也可以在专家模式下做到这一点,事实上,从实用程序Linux v2.23、fdisk 已启用 GPT。

以下是使用 util-linux 实用程序更改 PARTUUID 的示例fdisk

# truncate -s 200M /tmp/file-as-a.disk 

# LANG=en_US.UTF-8 fdisk /tmp/file-as-a.disk 

Welcome to fdisk (util-linux 2.35.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xc0fc8503.

Command (m for help): g
Created a new GPT disklabel (GUID: 4CD23B97-80C5-BD42-8466-1B9476653A92).

Command (m for help): n
Partition number (1-128, default 1): 
First sector (2048-409566, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-409566, default 409566): 

Created a new partition 1 of type 'Linux filesystem' and of size 199 MiB.

Command (m for help): i
Selected partition 1
         Device: /tmp/file-as-a.disk1
          Start: 2048
            End: 409566
        Sectors: 407519
           Size: 199M
           Type: Linux filesystem
      Type-UUID: 0FC63DAF-8483-4772-8E79-3D69D8477DE4
           UUID: 7265D7C3-6277-DE4B-956C-41E3BFFF8E0D

Command (m for help): w
The partition table has been altered.
Syncing disks.

# LANG=en_US.UTF-8 fdisk /tmp/file-as-a.disk 

Welcome to fdisk (util-linux 2.35.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): x

Expert command (m for help): m

Help (expert commands):

  GPT
   i   change disk GUID
   n   change partition name
   u   change partition UUID
   l   change table length
   M   enter protective/hybrid MBR

   A   toggle the legacy BIOS bootable flag
   B   toggle the no block IO protocol flag
   R   toggle the required partition flag
   S   toggle the GUID specific bits

  Generic
   p   print the partition table
   v   verify the partition table
   d   print the raw data of the first sector from the device
   D   print the raw data of the disklabel from the device
   f   fix partitions order
   m   print this menu

  Save & Exit
   q   quit without saving changes
   r   return to main menu


Expert command (m for help): u
Selected partition 1

New UUID (in 8-4-4-4-12 format): 11223344-5566-7788-9900-AABBCCDDEEFF

Partition UUID changed from 7265D7C3-6277-DE4B-956C-41E3BFFF8E0D to 11223344-5566-7788-9900-AABBCCDDEEFF.

Expert command (m for help): w
w: unknown command

Expert command (m for help): r

Command (m for help): w

The partition table has been altered.
Syncing disks.

# losetup --partscan /dev/loop101 /tmp/file-as-a.disk

# blkid /dev/loop101*
/dev/loop101: PTUUID="4cd23b97-80c5-bd42-8466-1b9476653a92" PTTYPE="gpt"
/dev/loop101p1: PARTUUID="11223344-5566-7788-9900-aabbccddeeff"

答案3

使用:

tune2fs -U random /dev/sdb1

如果它是一个分机文件系统,或

xfs_admin -U generate /dev/sdb1

如果它是一个xfs文件系统。


第二个分区具有相同 UUID 的原因是因为dd只是将数据从一个文件复制到另一个文件 ( dd if=/dev/sda1 of=/dev/sdb1= cat /dev/sda1 > /dev/sdb1);dd不知道分区是什么,也不知道如何生成 UUID,因此它只是按原样复制所有数据,包括 UUID,它存储在分区开头附近的 filysystem 超级块中。


顺便说一句,
我也认为UUID(通用唯一标识符)是一个奇怪的名字。它应该被称为 PGUID(可能的全局唯一标识符),或者甚至更好,只是 ARLN(合理的大数字)。

答案4

对于 XFS,请使用:xfs_admin -U <uuid> <device>

用于xfs_admin -u <device>查看 UUID(注意要查看的小写选项,与要设置的大写选项)。 U&L 上的另一篇文章指出了blkid用于查看系统上全部或部分 UUID 的命令。

相关内容