构建UML实例

在任何发行版中都没有UML安装程序。虽然您可以使用现成的安装介质来使用虚拟化包将其安装到空白VM中,但是没有相应的UML。您必须在主机上使用适当的工具来构建可行的文件系统映像。

这在Debian上非常简单——你可以使用debootstrap。在OpenWRT上也很容易——构建过程可以构建UML映像。所有其他发行版- YMMV。

创建一个映像

创建一个16G的磁盘映像。操作系统最初将只分配一个块,并在UML编写时分配更多块。从内核版本4.19开始,UML完全支持TRIM(通用闪存驱动器)。在UML映像中使用TRIM,通过指定discard作为挂载选项,或者通过运行tune2fs -o discard /dev/ubdXX,将要求UML把未使用的块返回给操作系统。

dd if=/dev/zero of=disk_image_name bs=1 count=1 seek=16G

将映像格式化并挂载

# mkfs.ext4 ./disk_image_name && mount ./disk_image_name /mnt

在挂载的文件系统上创建一个最小的操作系统安装:

# debootstrap buster /mnt http://deb.debian.org/debian

debootstrap不设置root密码、fstab、主机名或任何与网络相关的东西。这要由用户来操作。

chroot /mnt
passwd
exit

编辑关键的系统文件

UML块设备称为ubds。debootstrap创建的fstab将是空的,它需要一个根文件系统的条目:

/dev/ubd0   ext4    discard,errors=remount-ro  0       1

映像主机名将被设置为与创建映像的主机相同。改变它是一个好主意,以避免“哦,倒霉,我重新启动了错误的机器”。

UML支持两类网络设备——老旧的uml_net设备,它们计划被淘汰。这些被称为ethX。它还支持较新的矢量IO设备,这些设备的速度要快得多,并支持一些标准的虚拟网络封装,如以太网over GRE和以太网over L2TPv3。这些被称为vec0。

/etc/network/interfaces将需要如下条目:

# legacy UML network devices
auto eth0
iface eth0 inet dhcp

# vector UML network devices
auto vec0
iface vec0 inet dhcp

我们现在有了一个UML映像,它几乎可以运行了,我们所需要的只是一个UML内核和模块。

大多数发行版都有UML包。即使您打算使用自己的内核,用现有的内核测试映像也总是一个好的开始。这些包附带了一组模块,这些模块应该复制到目标文件系统中。位置依赖于分布。对于Debian,这些模块位于/usr/lib/uml/modules下将这个目录的内容递归地复制到挂载的UML文件系统中:

cp -rax /usr/lib/uml/modules /mnt/lib/modules

如果你已经编译了自己的内核,你需要使用通常的” install modules to a location “过程,运行:

# make INSTALL_MOD_PATH=/mnt/lib/modules modules_install

这将把模块安装到/mnt/lib/modules/$(KERNELRELEASE)中。要指定完整的模块安装路径,使用:

# make MODLIB=/mnt/lib/modules modules_install