我正在作为 KVM 主机运行 Linux 系统,并创建了一个运行旧 PC 物理磁盘的虚拟机(使用 --import)。该磁盘有多个分区,可双启动多个操作系统,还有一个暂存分区和一些视频数据……我真正想要虚拟化的是该磁盘上的 Linux 系统。我想我了解如何制作整个磁盘的映像,但我真正需要的只是 MBR、暂存区以及保存 / 和 /boot 的分区。有没有办法只将某些分区“提取”到映像中以进行虚拟化?我正在考虑暂时将感兴趣的分区复制到空白磁盘,安装 grub,然后对其进行虚拟化。但也许有更简单的方法来实现我想要的?
亲切的问候,
沃尔夫冈
答案1
假设包含旧 PC 系统的磁盘物理连接到 KVM 主机,您可以执行以下操作:
使用
virsh
或virt-manager
创建一个具有适当大小的磁盘映像文件和包含良好救援 CD 的 ISO 的虚拟机(我使用克隆齐拉或者gparted对于这样的事情。任何好的“实时”系统都应该可以。最好的不是使用任何发行版的安装程序 ISO)。做不是尚未将物理硬盘附加到 VM。
使用 ISO 映像引导系统。根据需要对虚拟磁盘(可能位于
/dev/vda
虚拟机中)进行分区和格式化。将其安装为/target
(以及其他分区,如果有的话,在 下/target
)在 KVM 主机上,使用命令将包含旧系统的物理磁盘连接到 VM
virsh attach-disk
。您的问题中没有足够的详细信息来为您提供近似的命令行,但运行virsh help attach-disk
以获取选项摘要。它最终会变成类似这样的内容:virsh attach-disk vmname /dev/sdX /dev/vdb --targetbus sata
其中
/dev/sdX
是物理磁盘,/dev/vdb
是虚拟机将看到的设备,目标总线将是 sata 或 scsi 甚至 virtio。返回虚拟机,安装要虚拟化的操作系统分区
/source
以及该分区下的任何其他分区。将它们全部安装为只读,以mount -o ro /dev/vdbN /target/XXXXX
防止拼写错误/错误。rsync -a /source/ /target
(尾随/
很/source/
重要)umount
下的一切/source
。你不应该再需要它了。for i in proc dev sys dev/pts ; do mount -o bind /$i /target/$i done
这确保了所有系统伪文件系统
grub-install
以及其他工具(例如lsblk
或blkid
)所需的所有系统伪文件系统都是绑定安装的并且在chroot
我们即将进入下一步的内部可见。chroot /target
编辑
/etc/fstab
以调整挂载条目以使用新的块设备名称(或标签或 UUID)。您可能想在此处更改其他内容,例如网络配置,或者您可能想将这些内容留到稍后基本系统运行时。我建议您保留所做的任何重大更改的副本,以防第一次事情进展不顺利而您必须重试。或者,只需记下您更改的内容,以便您知道在必须重新开始时需要做什么。
grub-install /dev/vda
exit
# 离开 chroot 并返回到救援 CD 映像上的 shell。for i in proc dev/pts dev proc sys; do umount /target/$i ; done
umount
下的一切/target
在 KVM 主机上,使用 分离额外的磁盘
virsh detach-disk
。
您现在应该能够重新启动虚拟机。您可能需要告诉它从硬盘而不是 ISO 映像虚拟“CD-ROM”启动。