将现有安装移入(或移出)虚拟机
本文介绍了如何将您当前的 Arch Linux 安装移入或移出虚拟环境(即 QEMU、VirtualBox、VMware)。虚拟机使用不同的硬件,这需要通过重新生成 initramfs 镜像并可能调整 fstab 来解决——特别是如果它是 SSD。
移出虚拟机
移出虚拟环境相对容易。
在虚拟机访客系统和主机之间设置共享文件夹取决于您使用的虚拟机管理程序。因此,请参阅其特定的 wiki 页面或手册。
如果您尚未拥有 ext4 分区,请参阅 文件系统。
如果您使用的是 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 进入它。
重新安装您的引导加载程序或引导管理器:Syslinux、GRUB 或 systemd-boot。不要忘记更新配置文件:Syslinux 的 syslinux.cfg
,Grub 的 grub.cfg
,或位于 /boot/loader/entries/
中的 systemd-boot 引导条目。
调整 fstab
由于您的整个根目录树已传输到单个分区,请编辑 fstab 文件以反映正确的分区。
使用 blkid
命令检查,因为 lsblk
在 chroot 中不是很有用。
重新生成 initramfs 镜像
由于硬件已更改,当您仍在 chroot 中时,重新生成 initramfs。
差不多就是这样了。
您很可能需要设置网络,因为虚拟机可能正在借用主机操作系统的网络设置。请参阅 网络配置。
移入虚拟机
移入虚拟机环境需要稍微多费一些力气。
创建容器
这将创建一个 32 GiB 原始镜像
# fallocate -l 32GiB -o 1024 /media/Backup/backup.img
如果您想创建一个与根分区大小完全相同的镜像,请运行 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
重新安装 Syslinux 或 GRUB。不要忘记更新其配置文件
- 对于 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 配置文件之一的 Device
部分中包含 nvidia
、nouveau
、radeon
、intel
等条目将阻止其启动,因为您将使用模拟硬件(包括显卡)。因此,建议您移动/重命名或删除以下内容
# 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
检查。