我使用 Clonezilla 将安装了 OpenSUSE Tumbleweed 的 Btrfs 驱动器克隆到更大的驱动器,我什至尝试过逐个扇区执行此操作。然而,尽管该过程似乎每次都已成功完成,但当我尝试从新驱动器启动时,会出现 Ubuntu GRUB,当然什么也没有加载。我假设 Ubuntu 菜单来自 Clonezilla 本身,但为什么 Clonezilla 不完全相同地复制所有内容呢?
另外,我无法从 OpenSUSE 挂载新驱动器。在分区管理器中可以看到该驱动器,但没有可用的安装选项。
有人可以澄清是什么导致驱动器克隆无法启动,甚至无法安装吗?我认为 Btrfs 有一些特殊的细节,但我不知道为什么逐扇区克隆不会产生所有内容的相同副本,从而使磁盘可引导和可安装。希望得到一些帮助。
更新:我能够在以下帮助下使分区可安装`mount` 错误:`系统调用失败:文件存在。`但我仍然无法从中启动。此外,由于某种原因/home/
,尽管副本据称相同,但新磁盘上没有用户目录。
答案1
好的,所以根据你的lsblk
输出和你的/etc/fstab
,您基本上拥有一个btrfs
除 EFI 系统分区之外的全系统。
请注意,单个btrfs
文件系统可以扩展到单个分区之外,甚至可以扩展到多个磁盘:由于您的lsblk
输出没有说明您的/dev/sdc
用途,因此它可能会用作btrfs
包含/home
子卷的您的扩展。这可能可以解释为什么它不在克隆上,或者也许您只是未能挂载所有不同的子卷。您可以用来btrfs filesystem show
查看哪些设备/分区属于每个已安装的btrfs
文件系统。
btrfstune -m /dev/sdb3
当您按照您链接的其他问题的评论中提到的方式运行时,它更改了克隆文件系统的 UUID,因此/etc/fstab
克隆文件系统上的 UUID 条目不再正确。您必须在/etc/fstab
克隆的文件中修复它们,也可能在其 GRUB 配置和/或 initramfs 中修复它们。您可以用来lsblk -o +UUID
查看新的文件系统UUID。该 UUID 由 GRUB 和 Linux 内核使用,但不由 UEFI 固件使用。它存储在文件系统元数据中。
你必须这样做:
mount /dev/sdb3 /mnt
mount -o subvol=/@/boot/grub2/x86_64-efi /dev/sdb3 /mnt/boot/x86_64-efi
mount /dev/sdb1 /mnt/boot/efi
进而:
编辑
/mnt/etc/fstab
以替换引用 btrfs 文件系统的每一行上的文件系统 UUID编辑
/mnt/boot/grub/grub.cfg
(或者可能/mnt/boot/efi/EFI/opensuse/grub.cfg
取决于 OpenSuSE 放置其实际 GRUB 配置的位置)以替换内核引导选项行上的文件系统 UUID- 编辑
/mnt/etc/default/grub
以替换文件系统 UUID,以便在安装内核更新或因其他原因重新生成 GRUB 配置时旧 UUID 不会意外返回 - 也许完全重新创建你的 initramfs 文件
如果发现需要重新创建 initramfs 文件(如果它完全依赖内核启动参数来查找根文件系统,则可能没有必要),此时您可以这样做:
mount -t proc none /mnt/proc
mount -t sysfs none /mnt/sys
mount -o bind /dev /mnt/dev
chroot /mnt /bin/bash
mkinitrd # or whatever is the appropriate command for OpenSuSE
exit
- 最后卸载你安装的所有东西
要使系统实际从克隆磁盘启动,您需要为其定义一个 UEFI 启动变量。从你的efibootmgr -v
输出,OpenSuSE启动项是指EFI系统分区分区UUID。这是一个单独的 UUID,仅由 UEFI 固件使用。它存储在GPT分区表中。
Boot0000* opensuse-secureboot HD(1,GPT,e099a79f-8b66-412d-89ae-a4869876f500,0x800,0x100000)/File(\EFI\opensuse\shim.efi)
您可以使用 查看分区 UUID lsblk -o +PARTUUID
。
拥有两个具有相同分区 UUID 的磁盘可能会混淆您的系统固件,或者固件可能只是选择具有匹配 UUID 的第一个磁盘。如果您计划将两个磁盘保留在同一台计算机中,则可能必须使用更改分区 UUID sgdisk --partition-guid=1:R /dev/sdb
(此命令将为 上的分区 #1 生成新的随机分区 UUID /dev/sdb
)。
完成后,您需要为克隆磁盘创建一个新的 UEFI 引导变量。其命令类似于efibootmgr -c -d /dev/sdb -l \\EFI\\opensuse\\shim.efi -L opensuse-clone
.注意双反斜杠,因为反斜杠是 shell 的特殊转义字符; ESP 文件系统是 FAT32,因此 UEFI 固件使用 MS-DOS/Windows 样式的反斜杠作为路径分隔符,而不是 Unix 样式的正斜杠。有用的是,此命令将自动从指定驱动器读取分区 UUID,因此您无需键入它。
(您可能需要使用efibootmgr -B -b XXXX
其中 XXXX 是您过去安装的 Linux 之一的 BootXXXX 编号,以清除系统 NVRAM 中过时的 UEFI 引导变量。)
但是,如果您计划将磁盘移动到另一台计算机,则无需更改分区 UUID,但应在作为克隆磁盘接收方的系统上创建 UEFI 引导变量。您可以使用一些 Linux Live 启动介质来执行此操作,但请确保专门从该介质启动UEFI 风格,否则您将无法访问 UEFI 启动变量。
或者,如果您需要克隆磁盘在任何 UEFI 系统上可启动而无需进行任何重大准备,则应在\EFI\Boot\bootx64.efi
克隆磁盘 ESP 分区上的回退/可移动媒体启动加载程序路径处设置 UEFI 启动加载程序的副本。不幸的是,我手头没有 OpenSuSE UEFI 引导加载程序的确切设置信息,因此我无法为您提供确切的步骤。
要访问克隆磁盘上的 ESP,您必须首先安装它,例如:
mount /dev/sdb1 /mnt
然后您可以将后备引导加载程序放置在,它现在对应于UEFI 固件使用的/mnt/EFI/BOOT/bootx64.efi
DOS 样式路径名。\EFI\BOOT\bootx64.efi