创建linux系统的raw img文件

创建linux系统的raw img文件

我正在尝试将 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
  • 然后,我使用fdiskonsda将磁盘布局输出到脚本文件,然后将其加载到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 ,但复制了withdd的内容。 MBR 包括块级偏移量,用于识别其他引导加载程序组件(或GRUB Legacy)的位置。在基于 的复制之后,这些文件不太可能完全相同地位于相同的块位置。/bootrsync<filesystem>_stage1.5stage2rsync

  • 您可能完全错过了引导加载程序的某些部分。 GRUB Legacy 可以将其自身的一部分嵌入到分区的开头,即某个区域中文件系统之外; GRUB2 几乎总是将其大部分核心映像写入 MBR 之后的磁盘块,但是在第一个分区开始之前。仅复制磁盘的前 512 个字节仅获得传统的 MBR,但会丢失这些内容。我认为这是您启动失败的最可能原因。

根据您计划的虚拟化方法,您可能应该使用mount --bind /dev /mnt/img/devand 类似的/proc/sys,然后chroot进入映像环境并使用它grub-install以正确的块偏移将引导加载程序正确重写到映像文件中。

另一种可能的方法是以单用户模式启动原始系统,或者以其他方式停止原始系统上尽可能多的守护进程(即静默系统),然后将dd整个系统磁盘作为单个操作放入映像中。这样,您fsck在第一次引导生成的映像时当然必须运行,但您可以避免 MBR 和引导加载程序的所有复杂性。

相关内容