将现有安装移入(或移出)虚拟机

来自 ArchWiki

本文介绍了如何将您当前的 Arch Linux 安装移入或移出虚拟环境(即 QEMU、VirtualBox、VMware)。虚拟机使用不同的硬件,这需要通过重新生成 initramfs 镜像并可能调整 fstab 来解决——特别是如果它是 SSD

移出虚拟机

移出虚拟环境相对容易。

设置共享文件夹

在虚拟机访客系统和主机之间设置共享文件夹取决于您使用的虚拟机管理程序。因此,请参阅其特定的 wiki 页面或手册。

如果您尚未拥有 ext4 分区,请参阅 文件系统

本文或本节的实际准确性存在争议。

原因: Ext2Fsd 0.66 不支持扩展属性和 ACL。(在 Talk:Moving an existing install into (or out of) a virtual machine 中讨论)

如果您使用的是 Windows,请安装 Ext2Fsd 以便能够挂载 ext 卷。

传输系统

从虚拟机中,打开终端并 传输 系统

# rsync -aAXHSv /* /path/to/shared/folder --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found,/home/*/.gvfs}

这也可以使用 clonezilla 启动盘 或来自随机 Linux live-cd 的 dd 完成。如果您使用的是 Virtualbox,则需要通过 USB(或 SATA 转 USB 电缆)连接目标驱动器,否则请使用外部 USB 驱动器来保存磁盘映像(使用 dd 或 clonezilla)。

Chroot 并重新安装引导加载程序

启动“live”GNU/Linux 发行版,挂载根分区并 chroot 进入它。

重新安装您的引导加载程序或引导管理器:SyslinuxGRUBsystemd-boot。不要忘记更新配置文件:Syslinux 的 syslinux.cfg,Grub 的 grub.cfg,或位于 /boot/loader/entries/ 中的 systemd-boot 引导条目。

注意: 您可能无需重新安装引导加载程序即可直接启动。在使用 chroot 之前尝试一下。这样您就可以(可能)从图形环境重新安装引导加载程序并重新生成 initramfs。

调整 fstab

由于您的整个根目录树已传输到单个分区,请编辑 fstab 文件以反映正确的分区。

使用 blkid 命令检查,因为 lsblk 在 chroot 中不是很有用。

重新生成 initramfs 镜像

由于硬件已更改,当您仍在 chroot 中时,重新生成 initramfs

差不多就是这样了。

您很可能需要设置网络,因为虚拟机可能正在借用主机操作系统的网络设置。请参阅 网络配置

移入虚拟机

虚拟机环境需要稍微多费一些力气。

创建容器

这将创建一个 32 GiB 原始镜像

# fallocate -l 32GiB -o 1024 /media/Backup/backup.img

本文或本节的实际准确性存在争议。

原因: fdisk -l 现在显示 Sectors 列而不是 Blocks。同样的说法适用吗?(在 Talk:Moving an existing install into (or out of) a virtual machine 中讨论)

如果您想创建一个与根分区大小完全相同的镜像,请运行 fdisk -l 并使用 Blocks 列中的值作为 count= 参数。请注意,您将传输整个根目录树,因此包括 /boot/home 文件夹。如果这些文件夹有任何单独的分区,则在创建容器时需要考虑它们。

通过运行您喜欢的 分区工具,对 /media/Backup/backup.img 文件进行分区。在其上创建分区表(例如 msdos),选择 分区方案 并创建分区。

现在加载必要的模块并将其作为环回设备挂载到 /dev/loop5(例如)

# modprobe loop
# losetup --partscan /dev/loop5 /media/Backup/backup.img

然后在分区上创建 文件系统,这些分区将显示为 /dev/loop5p1/dev/loop5p2 等。

传输系统

挂载环回设备并 传输 系统

注意: 如果容器保存在 /mnt/media 之外的其他位置,请不要忘记将其添加到排除列表。
# mount --mkdir /dev/loop5p1 /mnt/Virtual
# rsync -aAXv /* /mnt/Virtual --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found,/home/*/.gvfs}

将容器转换为兼容格式

根据所需的虚拟机选择适当的命令。

要转换为 KVM 容器,请使用 qemu-desktop 以及以下命令行

$ qemu-img convert -c -f raw -O qcow /media/backup.img /media/backup.qcow2

要转换为 VirtualBox 容器,请使用 virtualbox 以及以下命令行

$ VBoxManage convertfromraw --format VDI /media/backup.img /media/backup.vdi

要转换为 VMware 容器,请使用 virtualbox 以及以下命令行

$ VBoxManage convertfromraw --format VMDK /media/backup.img /media/backup.vmdk

Chroot 并重新安装引导加载程序

将容器连接到虚拟机,以及虚拟机虚拟 CD-ROM 中的 Linux LiveCD(例如最新的 Arch Linux ISO),然后启动虚拟机并 chroot 进入它

# mount /dev/sda1 /mnt
# arch-chroot /mnt /bin/bash

重新安装 SyslinuxGRUB。不要忘记更新其配置文件

  • 对于 Syslinux,它应该是 syslinux.cfg 中的 APPEND root=/dev/sda1 ro
  • 对于 GRUB,建议您自动重新生成 grub.cfg

调整 fstab

由于您的整个根目录树已传输到单个分区,请编辑 fstab 文件。如果您愿意,可以使用 UUID 或标签,但这些在多驱动器、多分区配置中更实用(以避免混淆)。目前,对于您的整个系统,/dev/sda1 就足够了。

/etc/fstab
tmpfs                    /tmp      tmpfs     nodev,nosuid          0   0
/dev/sda1                /         ext4      defaults,noatime      0   1

禁用任何与 Xorg 相关的文件

在 Xorg 配置文件之一的 Device 部分中包含 nvidianouveauradeonintel 等条目将阻止其启动,因为您将使用模拟硬件(包括显卡)。因此,建议您移动/重命名或删除以下内容

# mv /etc/X11/xorg.conf /etc/X11/xorg.conf.bak
# mv /etc/X11/xorg.conf.d/10-monitor /etc/X11/xorg.conf.d/10-monitor.bak

重新生成 initramfs 镜像

由于硬件已更改,当您仍在 chroot 中时,重新生成 initramfs 镜像并正确关机

# mkinitcpio -p linux
# exit
# umount -R /mnt
# poweroff

最后,取出 LiveCD(ISO 文件),这样您就不会再次启动到它,然后启动虚拟机。

享受您的新虚拟环境。

故障排除

“mount: special device /dev/loop5p1 does not exist”

使用 losetup --partscan,例如

# losetup --partscan /dev/loop5 /media/Backup/backup.img

这应该为您在环回设备内部创建的每个分区创建设备节点。

“Waiting 10 seconds for device /dev/sda1; ERROR: Unable to find root device '/dev/sda1'”

Waiting 10 seconds for device /dev/sda1 ...
ERROR: Unable to find root device '/dev/sda1'.
You are being dropped to a recovery shell
    Type 'exit' to try and continue booting
sh: cannot access tty; job control turned off
[rootfs /]# _

这很可能意味着您没有像指示的那样运行 poweroff,而是使用“关闭”按钮关闭了虚拟机,这相当于断电。现在您需要重新生成 initramfs 镜像。为此,您可以启动使用 Fallback 条目的虚拟机。如果您没有 Fallback 条目,请按 Tab(对于 Syslinux)或 e(对于 GRUB)并将其重命名为 initramfs-linux-fallback.img。启动后,打开终端并运行

# mkinitcpio -p linux
# poweroff

“Missing operating system. FATAL: INT18: BOOT FAILURE”

  • 您需要安装或重新安装引导加载程序。请参阅 Arch 启动过程#引导加载程序
  • 您正在为 /boot 使用压缩的 Btrfs 文件系统,Syslinux 目前无法从中启动。
  • BIOS 或虚拟机设置中的启动顺序未正确设置。确保包含引导加载程序的驱动器是第一个启动的驱动器。

我被要求输入 root 密码以进行维护

:: Checking Filesystems                        [BUSY]
fsck.ext4: Unable to resolve '...'

这意味着您忘记在 /etc/fstab 中添加驱动器的 UUID、标签或设备名称。每次格式化时(或在本例中,从头开始创建时),UUID 都会有所不同,并且它们可能不匹配。使用 blkid 检查。