![如何将内部磁盘完全可启动备份到外部磁盘?重复 UUID 的问题](https://linux22.com/image/149278/%E5%A6%82%E4%BD%95%E5%B0%86%E5%86%85%E9%83%A8%E7%A3%81%E7%9B%98%E5%AE%8C%E5%85%A8%E5%8F%AF%E5%90%AF%E5%8A%A8%E5%A4%87%E4%BB%BD%E5%88%B0%E5%A4%96%E9%83%A8%E7%A3%81%E7%9B%98%EF%BC%9F%E9%87%8D%E5%A4%8D%20UUID%20%E7%9A%84%E9%97%AE%E9%A2%98.png)
我已经使用 1to1 复制了我的内部磁盘dd
。外部磁盘可引导,但由于磁盘将共享相同的 uuid,因此引导过程实际上将从内部磁盘继续。
如何将内部磁盘完全可启动备份到外部磁盘?
重复的 uuid 似乎会导致从内部磁盘而不是外部磁盘启动。有什么解决方案可以解决这个问题,比如用包裹dd
来解决这个问题吗?
目的:首先备份到外置磁盘,从外置磁盘启动,应用系统升级,重启后测试升级。如果升级成功,内部磁盘也可以升级。
答案1
您最好关闭/拔掉内部磁盘。
但...
实际上,您可以在备份后更改备份驱动器的 UUID。请记住对每个分区都执行此操作。例如/dev/sdb1
:
# Generate a random UUID:
cat /proc/sys/kernel/random/uuid
7a5e6fad-4fa2-4177-b8a6-dfeeeb6289df
# Then use this for the partition UUID
tune2fs -U 7a5e6fad-4fa2-4177-b8a6-dfeeeb6289df /dev/sdb1
然后进行备份...检查以下文件中的旧 UUID 并替换为新的 UUID。您需要替换<distribution>
为您的操作系统:
/etc/fstab
/boot/grub/grub.cfg
/boot/efi/EFI/<distribution>/grub.cfg
更困难的问题是说服您的 BIOS 使用外部 EFI 分区。如果您无法指定要使用的驱动器...您可能需要复制您的 EFI 配置在你的主驱动器上(例如:/boot/efi/EFI/debian/
)/boot/efi/EFI/backup/
并将其安装到您的 BIOS 中。
答案2
不要使用d伊斯克d嗯。为什么,因为如果你有一个 500GB 的分区,只有 1GB 的数据,DD当您真正需要的只是 1GB 时,就会一点一点地抢占 500GB。它还提出了如何将 500GB 逐位应用到大小不完全相同的不同磁盘或分区的问题。一种更好的方法可以解决磁盘 ID 的其他问题,并解决指向错误磁盘 ID 或标签的引导问题
- 您可能无法从
/
当前正在运行的操作系统磁盘的根分区正确捕获数据。因此,您将拥有这个可启动的金子安装的磁盘和其他带有 Linux 操作系统的磁盘将运行该计算机。 安装你的金子磁盘,例如,如果它包含,
- /dev/sdb1 作为 /boot/efi 类型 VFAT
- /dev/sdb2 作为交换
- /dev/sdb3 as / 类型 EXT4
mkdir /mygolddisk_sb1
mkdir /mygolddisk_sb3
mount /dev/sdb1 /mygolddisk_sdb1
mount /dev/sdb3 /mygolddisk_sdb3
现在作为根去和柏油您关心的每个分区;如果分区为 1000 GB 并且您只有 2GB 数据,那么您将仅获得 2GB tar 文件。更容易管理。然而这确实不是使其文件系统独立,也就是说,如果您的根分区是 EXT4,并且您将其解压到除原始文件系统类型之外的新磁盘分区{外部4它可能无法启动。例如,如果原始根文件系统是XFS,则将文件系统放在新磁盘XFS上,如果旧磁盘根分区是EXT2,则将新磁盘根分区设为EXT2。
cd /mygolddisk_sdb1
tar -cf /somewhere_else/mygolddisk_efi_vfat.tar *
cd /mygolddisk_sdb3
tar -cf /somewhere_else/mygolddisk_root_ext4.tar *
挂载新的或用过的空白磁盘;创建分区表(最好是GPT)
mygolddisk_efi_vfat.tar
制作与制作时相同类型的隔断;现在,您可以将此分区设置为任意大小,只要它足够大以容纳数据即可。如果您愿意或需要,请对交换分区执行相同的操作。对于根分区也是如此/
,您现在可以将其大小设置为这个新磁盘的其余部分。你现在最终会得到类似的东西- /dev/sdc1 作为虚拟FAT大小为200MB,
mygolddisk_efi_vfat.tar
为15MB。 - /dev/sdc2 作为 SWAP 为 2GB,可以是旧磁盘上的任何大小
- /dev/sdc3 作为外部4作为新磁盘的剩余大小,可能大于或小于根分区,如下所示金子磁盘,但唯一的要求是它大于
mygolddisk_root_ext4.tar
mkdir /newdisk_Boot_partition
mkdir /newdisk_Root_partition
mount /dev/sdc1 /newdisk_Boot_partition
mount /dev/sdc3 /newdisk_Root_partition
cd /newdisk_Boot_partition
tar -xf /somewhere_else/mygolddisk_efi_vfat.tar .
cd /newdisk_Root_partition
tar -xf /somewhere_else/mygolddisk_root_ext4.tar .
- /dev/sdc1 作为虚拟FAT大小为200MB,
此时,您已经复制了旧的{相关的数据金子} 磁盘。它将是快多了而不是这样做,
dd
因为你没有复制每一点,这是非常浪费的。 它也不会从旧磁盘传输任何文件系统问题。但你剩下的问题是having copied files referencing disk UUID or label of your old disk which is no longer relevant on some new disk
.你只需要了解引导过程,无论是EFI还是GRUB。另外,如果您使用的是与 EFI 相反的 MBR 分区表,那么处理 MBR 会增加必须修改磁盘引导扇区的复杂性,以便引导{未描述,超出范围}。但为了简单起见,使用
EFI
andELILO
作为示例将执行以下操作- 编辑/boot/efi/.../elilo.conf
- 找到指向旧磁盘的磁盘 ID 或标签的条目,并将其更改为新磁盘的磁盘 ID 或标签
- 不要忘记
/etc/fstab
哪个将包含指向旧磁盘的条目,将它们(磁盘 ID、标签、UUID)更改为新磁盘的条目
这是一个简单的 EFI 和 ELILO 设置,这就是需要完成的全部工作。如果您使用 GRUB2 并且有一个
/boot
分区以及一个单独的/boot/efi
分区,那么您将需要专门考虑这些分区并以类似的方式修改必要的 GRUB 文件...只需找到对旧磁盘的任何引用并将其更改为该分区新磁盘的。当您对新磁盘进行分区、格式化和挂载时,您将在其中知道或看到其新标签(因为您制作了它)或其 UUID 或其 scsi id。复制该 UUID 或 scsi-id 或标签来代替旧的 in
/newdisk_Root_partition/etc/fstab
和 in/newdisk_Boot_partition/efi/.../elilo.conf
,或者如果使用 GRUB,则复制到 下的相关文件中/newdisk_Boot_partition
。现在新磁盘将正确启动。- 还知道您是否引用磁盘按名字您可以通过执行以下小技巧来摆脱困境:例如,如果启动分区为 1,根分区为 3,则分别进行所有磁盘引用
/dev/sda1
和/dev/sda3
。仅当该磁盘被命名为sda然后将要如果是的话就会发生仅有的一个连接到计算机的磁盘。因此,当使用错误的 UUID 或 scsi-id 出现问题时,只需将所有内容更改为/dev/sda#并断开所有其他磁盘的连接以使其启动,然后一步一步地修复问题。有以下几种方法可以在引导文件中引用磁盘分区,每种/etc/fstab
方法都有不同的优点和缺点:ELILO
GRUB
按名字,按 ID,按标签,按-uuid, 和旁路。
答案3
事实上我今天早些时候就这么做了!我执行此操作的笔记本电脑使用基于 MBR 的传统 BIOS 启动(ThinkPad X201 平板电脑),但 (u)EFI 和“传统”BIOS 之间的大多数步骤应该相同。我过去在基于 EFI 的 Macintosh 上做过类似的事情。
1. 为新驱动器上的分区指定新的 UUID,以便区分它们。
要更新新磁盘的 UUID,请从旧磁盘启动并运行(对于 ext* 类型分区):
tune2fs -U `uuidgen` /dev/sdb1
…如果/dev/sdb1
是您的新磁盘的partiton-to-re-UUID,并且您在/dev/sda
.
如果它给你一个错误,那么它可能会要求你在重命名之前运行文件系统检查。运行命令tune2fs
告诉您,然后再次运行tune2fs。
对于其他文件系统,您需要弄清楚如何更改 UUID。这里有两个比较常见的:
- btrfs 使用
btrfstune -U `uuidgen` /dev/sdb1
. - 我认为 XFS 使用
xfs_admin -U `uuidgen` /dev/sdb1
,但我对此不是 100% 确定,因为我个人从未使用过 XFS。
对新磁盘上的所有分区重复此操作。
2.编辑新驱动器的/etc/fstab
.
挂载新磁盘的根分区并编辑/etc/fstab
以将旧磁盘的 UUID 替换为新的 UUID。您可以通过运行来检查新的 UUID 是什么blkid
。
3. 在继续之前启动到新驱动器(使用临时的权宜解决方案)
此时,为了临时、一次性引导到新驱动器,您可以在内核参数中指定root=/dev/sdb1
(如果是新磁盘的根分区)。/dev/sdb1
在 GRUB2 中,这就像在 linux 启动项上按“e”并将其附加到以 开头的行末尾一样简单linux
。如果您的整个 Linux 安装在一个分区上(没有单独的主分区等),那么您可以从一开始就执行此操作(在更改 UUID 之前)。
4. 使用新的 fstab 更新 ramdisk,以便将来启动时使用正确的驱动器。
接下来,我们需要实际更新启动的 ramdisk。对于下一步,我强烈推荐如果可能的话,只需删除原始磁盘即可。如果您能做到这一点,那么在更新 grub 时,您可以轻松避免将旧磁盘添加到新磁盘启动菜单中的可用条目中。
无论如何,作为 root,您应该运行(在 debian 和衍生版本上;我相信该命令适用update-initrd
于其他一些版本):
update-initramfs -u
4.5 更新 GRUB 菜单项(也许不是绝对必要的)
我不确定这是否真的需要,我羞于承认。我这样做是因为“它不会造成伤害”,而且它不在我的笔记本电脑上。
grub-install /dev/sdX
(其中 /dev/sdX 是您想要重新安装 grub 引导加载程序的驱动器。不要指定分区,例如 /dev/sdX1 等 - 仅指定设备名称)。
这让我的克隆磁盘在第一次尝试时没有任何问题地启动。当我上次迁移到更大的驱动器时,我过去或多或少以相同的方式完成了这个过程。
您可能还需要在 BIOS/(U)EFI 设置中更改磁盘的启动优先级,以使其在问题仍然存在时自动使用您的磁盘。
答案4
我会在/etc/fstab
.我喜欢这样的系统设置:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck>
LABEL=EFI /boot vfat defaults 0 2
LABEL=SYSTEM / ext4 defaults 0 1
LABEL=DATA /home ext4 defaults 0 2
LABEL=SWAP none swap defaults 0 0
https://wiki.archlinux.org/index.php/fstab#File_system_labels
这使您可以创建克隆而不必担心 UUID 的更改。
然后每次您通过 BIOS 通过外部 HDD 手动启动时