User-mode Linux

出自 ArchWiki

本条目或章节的事实准确性存在争议。

User-mode-Linux (UML) 是一种在 Linux 内部作为普通进程运行 Linux 的方法。请查阅 [1] 以深入了解 UML 是什么以及它是如何工作的。

为什么要使用 UML?

运行 UML 是同时运行多个 (Arch-)Linux 实例的安全方法。单个进程彼此隔离,这使得在同一台机器上安全地运行例如测试实例和生产实例成为可能。如果测试实例内部出现问题,它不会干扰宿主机 Linux 或生产实例。

HOWTO(操作指南)

有三种方法:

  • 使用带有 vde2 网络的 hostfs (所有 UML 使用相同的文件系统)
  • 使用带有 tap 网络的 rootfs (需要构建镜像)
  • 使用 Marionnet

通过 hostfs + vde2 设置

Hostfs 意味着以只读模式使用宿主机的文件系统。

所需软件包

启动脚本

  • 下载 https://pastebin.com/qDE0D7Lk 脚本为 2vm.bash
  • 使用普通用户启动 2vm.bash (有两个虚拟机,命名为 'C1' 和 'C2')
  • 修改 2vm.bash 以符合您的要求

通过 rootfs + tap 设置

所需软件包

构建 rootfs 镜像

1.) 首先,您必须创建一个单独的大文件,您将在其中安装 Arch Linux。此命令创建一个 1 GiB 的单个文件,仅包含零,这对于基本的 Arch Linux 安装应该足够了。

dd if=/dev/zero of=rootfs bs=1M count=1024

fallocate -l 1GiB ./rootfs

2.) 在构建过程之后,您必须格式化 root 文件系统镜像

mke2fs -F rootfs

3.) 在格式化文件后,您必须挂载它。以 root 身份执行以下命令即可完成此操作 (您还必须使用 modprobe 加载 loop 模块)

mount -o loop rootfs /mnt

4.) 现在可以开始安装基本系统了

mkdir -p /mnt/var/lib/pacman
pacman -Sy base -r /mnt
cd /mnt/dev
mknod --mode=660 ubd0 b 98 0
chown root:disk ubd0

5.) 在可以使用 user-mode-Linux 启动系统之前,必须自定义 Arch 基本系统中的一些文件。将此行添加到 /mnt/etc/fstab

/dev/ubd0 / ext2 defaults 0 0

6.) 现在卸载文件系统。

警告: 如果您在挂载的文件系统 (例如 /mnt) 运行时更改了任何内容,则可能会导致虚拟机内部的文件系统严重损坏并杀死它!
umount /mnt

7.) 下一步是设置网络。因此,您创建一个所谓的 tun 设备 (有关 tun/tap 的更多信息,请访问 UML 操作指南),并为其分配一个 IP 地址。以下行加载必要的 tun 模块,创建一个可由 users 组读取的 tun/tap 设备,并使用给定的 IP 地址对其进行设置。为了安全起见,您应该考虑创建一个特定的 UML 组,该组对网络设备具有读取权限。

modprobe tun
ip tuntap add tap0 mode tap group users
chown root:users /dev/net/tun
ip addr add 192.168.0.100/24 dev tap0

8.) 现在您可以启动镜像了。

要使用网络,您必须向 UML 内核声明正确的设备。(请注意,运行 UML 命令的用户需要有足够的权限来访问 tun 设备!)

vmlinux ubd0=rootfs eth0=tuntap,,,192.168.0.100

eth0 的选项 (,,,) 意味着:

eth0=transportmode,tuntap device,MAC address,hostip

其中 transportmode 在此示例中为 'tuntap';tuntap 设备是上面配置的设备;MAC 地址是 UML 系统中 eth0 设备应获得的 MAC 地址;hostip 是宿主机系统中 tuntap 设备获得的 IP 地址。这应该是您的主机本地网络中未使用的 IP 地址。设备和 MAC 地址是可选的,如果未提供,则会“猜测”。

示例

eth0=tuntap,tap0,3f:2a:bb:00:00:00,192.168.0.100

其他重要选项包括 mem,用于指定访客系统应能够使用的 RAM 量 (默认为仅 16MB);con 用于配置虚拟终端和 ubdb、ubdc、… 用于挂载其他文件系统。

无头示例

 vmlinux ubd0=rootfs eth0=tuntap,,,192.168.0.100 mem=128M con=pty

9) 如果没有出现登录提示,而是看到类似 Virtual console 1 assigned device '/dev/pts/4 的内容,请在另一个终端中使用 screen 打开虚拟控制台并按 Enter 键

screen /dev/pts/4

10) 在 UML 系统中,您可以手动配置网络

ip link set dev eth0 up
ip addr add 192.168.0.200/24  broadcast + dev eth0
ip route add default via 192.168.0.100
echo 'nameserver 1.1.1.1' > /etc/resolv.conf

网关是您在第 8 步中指定的地址;本地地址应该是您网络中另一个未使用的地址。

Marionnet

Marionnet 是一个用于虚拟网络的免费应用程序。要使用,您必须安装 uml_utilitiesAUR,并查看 https://bugs.launchpad.net/marionnet/+bug/1580349

用法

管理控制台

使用 {[ic|uml_mconsole}} 您可以管理正在运行的 UML 系统

uml_mconsole socket-name

您可以在 ~/.uml/ 文件夹中看到 UML 系统的套接字名称 – 也称为 UMID

$ ls -l ~/.uml/
drwxr-xr-x 1 michi users 16 11. Apr 19:52 I0KaOj
drwxr-xr-x 1 michi users 16 11. Apr 19:14 LrPv03
drwxr-xr-x 1 michi users 16 11. Apr 19:31 o8X27c

您也可以在启动时使用 umid 选项指定它。

使用 uml_mconsole,您可以执行重启/停止系统、添加/删除存储设备或向系统发送特殊按键组合 (sysrq, Ctrl-alt-del) 等操作。