我尝试将整个系统复制到新媒体。与现有布局一样,我想使用“所有内容都在一个分区中”的方法。
这是我尝试过的方法:
- 使用 gdisk 创建分区表和一个单个分区(还创建保护性 MBR)
- 在该分区上创建文件系统(ext4)
- 安装它
- 将旧的 / rsync 到目标分区(不包括 /sys、/proc 等挂载)
- 删除旧媒体
- 使用“超级 Grub2 磁盘”启动新系统
- grub-install(在整个磁盘上)
- 重启
一开始,它看起来好像能正常工作,但 grub-install 似乎损坏了文件系统。这可以通过启动救援系统并执行 fsck 来修复,但之后 grub 就坏了。再次修复 grub 会再次损坏文件系统。
所以我可以在损坏的文件系统和损坏的 grub 之间来回切换。
经过一番研究,我了解到 grub 将其早期阶段存储在第一个分区之前的可用空间中,但第 2 阶段应该是一个普通文件。创建分区时,我使用了 gdisk 建议的默认值。再次查看分区表,分区前有一些可用空间。我真的不明白为什么我的方法失败了。
Linux 安装程序如何处理这个问题以及我如何手动复制它?
编辑:
看来我的问题过于笼统了……
我的实际用例是将虚拟机从 vmware 迁移到 KVM/Quemu/libvirt/virt-manager。不幸的是,我无法直接转换磁盘映像,因为它是一个分块映像,并且 vmware-diskmanager 无法将其转换为单文件映像,而将其转换为 qcow2 映像则需要这样做。因此,rsync 方法已经是 Plan B。我还省略了目标 VM 正在运行实时 CD 映像,以便拥有一个正常工作的 rsync“接收器”。
旧 VM 和新 VM 都是基于 BIOS 的(不是 EFI)。但没有单独的 bios_grub 分区。相反,单个大分区被标记为 bios_grub。以下是显示的分区列表gdisk
:
Number Start (sector) End (sector) Size Code Name
1 2048 25163775 12.0 GiB 8300
是的,我grub-install
对整个磁盘都进行了这样的操作。
我可以再次执行该过程并创建一个单独的 bios_grub 分区,但我仍然想了解 Linux 安装程序如何在没有 bios_grub 分区的情况下做到这一点。
我做了一些实验,创建了一个新的虚拟机并在其上安装了 Debian。我选择了“全部在一个分区上”选项,结果看起来像上面的分区列表。我还检查了安装程序是否创建了一个 GPT 分区表,尽管虚拟机在 BIOS 模式下运行。
答案1
经过一番研究,我了解到 grub 将其早期阶段存储在第一个分区之前的可用空间中,但第 2 阶段应该是一个普通文件。
这仅适用于 BIOS 模式启动,并且仅适用于使用 MBR 分区的情况。GRUB 内核(又称“核心映像”)在第一个分区之前安装,并构建了足够的模块,以便使用 grub.cfg + 模块文件找到您的 /boot 分区。
(GRUB 2 中没有“阶段”;这个术语在仅限 BIOS 的 GRUB 0.x 中更常见。因此,如果您看到提到“阶段 1.5”或“阶段 2”,那么您正在阅读过时的文本 - 当前架构仅将事物分为核心映像和模块,就像 Linux 内核的工作方式一样。)
对于 BIOS/GPT,可用空间不再使用,部分原因是通用技术标准就在那里。相反,grub-install 需要一个专用的迷你分区(未格式化)来保存核心映像。从技术上讲可以避免这种情况,但这只会使过程更加混乱;该分区的目的是避免您遇到的问题。
UEFI 启动过程完全不同;固件本身不再使用 440 字节的启动扇区,而是从“EFI 系统分区”加载一个文件作为引导加载程序,该文件足够大,可以包含整个 GRUB 核心映像。(这通常是或文件grubx64.efi
。bootx64.efi
)在这种启动模式下,EFI 系统分区不再是 GRUB 特有的东西,但仍然是必需的,并且它必须是 FAT32 分区。
一开始,它看起来好像能正常工作,但 grub-install 似乎损坏了文件系统。这可以通过启动救援系统并执行 fsck 来修复,但之后 grub 就坏了。再次修复 grub 又损坏了文件系统。
感觉好像您将引导加载程序安装到了错误的位置;也许是安装到了 sda1 而不是 sda:或者您安装了两个重叠的文件系统。
在正常操作中,grub-install 永远不会以绕过文件系统的方式将任何内容写入您的“根文件系统”分区;它最多只是使用标准文件操作将文件复制到 /boot/grub。
Linux 安装程序如何处理这个问题以及我如何手动复制它?
他们不会尝试将所有内容都放在一个分区中;他们会在需要时创建 EFI 系统分区。
首先确定要使用的启动方法。(大多数 PC 都采用 UEFI 样式的固件,但这种固件越来越不支持 BIOS 启动模式。)然后创建该启动模式所需的分区;如果需要 EFI 分区,请将其设置为挂载在 /efi 或类似位置。
为 BIOS 安装 GRUB 时,请将整个磁盘指定为设备。为 UEFI 安装时,不要指定任何设备,但要指定--efi-directory=
(如果您的救援系统本身不是以 EFI 模式启动的,--removable
也请添加该选项)。
您不需要使用 Super Grub2 Disk 进行启动;您可以从用来 rsync 所有内容的系统进行 chroot 和 grub-install。