我在 VMware 中有一个 Fedora 客户操作系统。我想扩展/boot
分区,因此我向该虚拟机添加另一个虚拟磁盘,并尝试克隆该磁盘。
之后dd if=/dev/sda1 of=/dev/sdb1
,blkid
报告/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 来完成此操作。
mdadm --stop $RAID_DEVICE
mdadm --assemble $RAID_DEVICE --update=uuid --uuid=$NEW_UUID $MEMBER_DEVICES...
例子:
mdadm --stop /dev/md127
mdadm --assemble /dev/md127 --update=uuid --uuid=2A1D2A1D-2A1D-2A1D-2A1D-2A1D2A1D2A1D /dev/sda2 /dev/sdb2
UUID 更新后,您可能需要更新grub.cfg
(rd.md.uuid=$NEW_UUID
在linux/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
。
blkid
,将文件系统的UUID写在纸上,或者记住它。 FAT/exFAT的UUID字符串看起来像1122-3344
,NTFS的UUID字符串看起来像1122334455667788
。使用hexedit打开分区设备
hexedit <partition device such as /dev/sda1>
按/,倒序输入 UUID(如果
blkid
报出1234-ABCD
,则搜索CDAB3412
),即可搜索磁盘上的 UUID 数据。找到 UUID 后,更改它们,按F2保存并退出。
blkid
验证 UUID。一旦 UUID 被修改,您可能需要更新
grub.cfg
和/或fstab
以便下次可以成功启动。执行
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 的命令。