背景:主机操作系统是 Azure Oracle Linux 7.8 实例,其操作系统磁盘通过/dev/sda
条目挂载。 /dev/sda2
(/
) 是btrfs
。我有另一个 Azure Oracle Linux 7.8 实例已损坏,因此我想附加其磁盘进行调试。连接到我的主机操作系统后,因为附加的磁盘来自同一个 Oracle Linux 7.8 映像,所以它的 UUID 与我的主机相同,并且它似乎会在安装时造成一些混乱/损坏。以下是lsblk
Azure 完成附加图像后的输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 4G 0 disk
└─sdb1 8:17 0 4G 0 part /mnt
sr0 11:0 1 628K 0 rom
fd0 2:0 1 4K 0 disk
sdc 8:32 0 50G 0 disk
├─sdc15 8:47 0 495M 0 part
├─sdc2 8:34 0 49G 0 part / <--- isn't really sdc2, its mounted from sda2
├─sdc14 8:46 0 4M 0 part
└─sdc1 8:33 0 500M 0 part
sda 8:0 0 100G 0 disk
├─sda2 8:2 0 99G 0 part
├─sda14 8:14 0 4M 0 part
├─sda15 8:15 0 495M 0 part /boot/efi
└─sda1 8:1 0 500M 0 part /boot
您可以看到它认为 root/
是通过 挂载的/dev/sdc2
,但该磁盘 ( /dev/sdc
) 实际上只是刚刚附加。我只能假设 UUID 冲突导致了这种情况(可能是其他原因吗?),但现在我无法安装真实/附加的磁盘/dev/sdc2
来调试该磁盘,因为系统认为它已经安装了。
在附加磁盘时是否有办法防止这种情况发生?
答案1
btrfstune
您可以在挂载磁盘(或先卸载磁盘)之前更改 btrfs UUID 。
# first show the existing UUID (and keep for later)
sudo blkid /dev/sdc2
# change to a new UUID
sudo btrfstune -M $(uuidgen) /dev/sdc2
另请参阅-U
,但-M
应该足够了。您稍后可以使用相同的方法恢复原始 uuid(代替 uuidgen)。
在尝试此操作之前请先进行备份。
答案2
我认为这是不可能的。如果系统中存在多个具有重复 UUID 的 BTRFS 文件系统,则无法在没有数据损坏风险的情况下使用它们 -https://btrfs.wiki.kernel.org/index.php/Gotchas
您需要先隐藏一个设备,例如从 SCSI 中删除
echo 1 > /sys/block/sde/device/delete
,更改另一个设备上的 UUID,然后恢复第一个设备,echo "- - -" > /sys/class/scsi_host/host0/scan
但您无法执行此操作,因为您已将 BTRFS 挂载为根文件系统。我认为你必须连接到不同的机器(避免 UUID 冲突)。