我正在尝试将 Linux 系统备份到 IMG 文件,然后可以在 QEMU 中启动并运行该文件。
笔记:我已经在 Lubuntu 和tiny core linux 上进行了测试。
我遵循的过程是:
- 我有 2 个硬盘,
sda
并且sdb
- 分区
sdb1
并挂载sdb1
分区/mnt/sdb
dd
一个空文件,大小为sda
挂载sdb
目录中的 IMG 文件。dd if=/dev/zero of=/mnt/sdb/disk.img bs=x count=1
- x 的大小sda
- 然后,我使用
fdisk
onsda
将磁盘布局输出到脚本文件,然后将其加载到disk.img
文件中 - 然后挂载并复制内容-losetup -P -f disk.img
找到循环设备
例如 /dev/loop36 0 0 0 0 /mnt/sdb/disk.img 0 512
在循环设备的第一个分区上创建文件系统 -
mkfs.ext2 /dev/loop36p1
- 安装分区循环设备 -
mount /dev/loop36p1 /mnt/img
- 然后复制引导扇区 -
dd if=/dev/sda of=disk.img bs=512 count=1 conv=notrunc
最后我使用 rsync 将文件系统复制到
/mnt/img
目录,我在这方面取得了不同程度的成功。使用:$ rsync -aHxv / \ --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \ /mnt/img
我已经使用 Lubuntu 尝试了如上所示的确切过程,该rsync
命令有效,但是当我尝试在 QEMU 中运行 IMG 时,它在从硬盘启动时挂起。
当在 tcl 中尝试上述过程时 -rsync
命令失败,当我尝试在 QEMU 中启动时,它说没有可启动设备。
有人对此有什么建议吗?或者曾经做过类似的事情并有更好的方法来实现目标?
答案1
复制引导扇区时,您还复制了其中的分区表。根据 fdisk 的版本以及对原始文件
sda
和映像文件进行分区时使用的确切选项,分区限制可能会或可能不会完全相同。如果不是...您的循环挂载使用您fdisk
创建的分区偏移量,但在启动时,VM 将使用从原始sda
.您复制了 MBR with ,但复制了with
dd
的内容。 MBR 包括块级偏移量,用于识别其他引导加载程序组件(或GRUB Legacy)的位置。在基于 的复制之后,这些文件不太可能完全相同地位于相同的块位置。/boot
rsync
<filesystem>_stage1.5
stage2
rsync
您可能完全错过了引导加载程序的某些部分。 GRUB Legacy 可以将其自身的一部分嵌入到分区的开头,即某个区域中文件系统之外; GRUB2 几乎总是将其大部分核心映像写入 MBR 之后的磁盘块,但是在第一个分区开始之前。仅复制磁盘的前 512 个字节仅获得传统的 MBR,但会丢失这些内容。我认为这是您启动失败的最可能原因。
根据您计划的虚拟化方法,您可能应该使用mount --bind /dev /mnt/img/dev
and 类似的/proc
和/sys
,然后chroot
进入映像环境并使用它grub-install
以正确的块偏移将引导加载程序正确重写到映像文件中。
另一种可能的方法是以单用户模式启动原始系统,或者以其他方式停止原始系统上尽可能多的守护进程(即静默系统),然后将dd
整个系统磁盘作为单个操作放入映像中。这样,您fsck
在第一次引导生成的映像时当然必须运行,但您可以避免 MBR 和引导加载程序的所有复杂性。