基本思想是这样的:运行另一个 Linux 安装,就像在 VirturalBox 或 VM ware 中一样。
使用“chroot”,我可以做类似的事情。例如,我可以挂载安装 Arch Linux 的分区,然后 chroot 到该分区。然后我可以执行一些命令。
但是也有很多限制,比如“pacman -Syu”就不能正常工作(可能我理解错了)。
有没有更好的方法来完成类似的工作?
答案1
为了使 chroot 工作,您还需要绑定内核文件系统,例如 procfs、sysfs 和 /dev。
为此,通常在 chrooting 之前执行:
cd /path/to/chroot/destination
mount -o bind /proc proc
mount -o bind /sys sys
mount -o bind /dev dev
然后你才能 chroot 到/path/to/chroot/destination
。
但是,这并不等同于在虚拟机下运行 Linux,因为它没有自己的内核。您可以使用另外两层隔离,一个是LXC 容器(也没有自己的内核),一个是实际虚拟机。
两者都可以通过 libvirt 进行管理,我建议你看一下 libvirt,qemu 驱动程序和lxc 驱动程序。
使用 libvirt,您还可以将主机文件系统挂载为客户文件系统(请参阅域配置¹)。但是,一般来说,将整个分区交给 libvirt 并让它完成其余工作可能更明智。这样做有一个限制,即在虚拟机运行时您无法直接从主机系统访问文件²。
一个简单的示例配置是:
<domain type='qemu'> <!-- if you have kvm, put kvm here instead of qemu -->
<name>my_fancy_vm</name>
<memory unit='KiB'>524288</memory>
<vcpu placement='static'>1</vcpu>
<features>
<acpi/>
<apic/>
</features>
<os>
<type arch='x86_64' machine='pc-i440fx-1.6'>hvm</type>
<boot dev='cdrom' />
<boot dev='hd' />
</os>
<cpu mode='custom'>
<model>kvm64</model>
</cpu>
<pm>
<suspend-to-mem enabled='no' />
<suspend-to-disk enabled='no' />
</pm>
<devices>
<!-- for kvm, you have to put /usr/bin/qemu-kvm here -->
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<!-- to directly use a filesystem here, please see the documentation -->
<disk type='block' device='disk'>
<driver name='qemu' type='raw' />
<target dev='vda' bus='virtio' />
<source dev='/dev/partition_used_by_the_other_linux' />
</disk>
<serial type='pty'>
<target port='0' />
</serial>
<console type='pty'>
<target type='serial' port='0' />
</console>
</devices>
<seclabel type='none' />
</domain>
如果有多个分区要使用,请通过复制该disk
部分来创建多个分区。有关更多详细信息,请参阅域 XML 格式。它还包含有关如何设置网络的信息。
设置域后,您可以在 libvirt 中使用以下命令定义它:
virsh define path/to/domain.xml
并以如下内容开始:
virsh start my_fancy_vm # that is the name chosen in the xml
要连接到 xml 中定义的虚假串行控制台,您可以使用:
virsh console my_fancy_vm
请注意,可能什么都没有显示出来——您可能需要配置 archlinux 才能使用它。对于 lxc 客户机,可能有一种比绑定控制台获取 shell 更简单的方法,但我还没有尝试过。不过,有使用 libvirt 和 lxc 的教程。
- 如果您不知道的话,一个域就是一台虚拟机。
- 嗯,你可以,但你真的不应该。当然,你可以通过 sshfs 将其挂载到客户机上。