初学者的用户模式 Linux - 设置和第一个虚拟机

为什么再写一个 UML 教程?

这不是第一个 UML 教程 — 互联网上有数百个公开可用的教程。然而,它们似乎没有一个满足我的要求:

你需要什么?

构建 UML

有关构建 UML 的扩展信息,请参考这篇优秀文章。但请记住,该文章编译 32 位 UML,基本上不

构建 UML 的替代方案是从系统维护者安装二进制文件(例如在 Ubuntu 上 sudo apt-get install user-mode-linux)。然而,二进制文件有些臃肿(我的情况下 6.4 兆字节对比 2.2 兆字节),而且通常完全不是最新的。

用户模式 Linux 代码几年前已合并到主线 Linux 内核中,所以我们只需要使用正确的配置选项编译最新的内核。

build_mini_kernel.sh
cat > mini.config << 'EOF' &&
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_BINFMT_ELF=y
CONFIG_HOSTFS=y
CONFIG_LBD=y
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_STDERR_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_EXT2_FS=y
CONFIG_MODULES=y
CONFIG_INOTIFY_USER=y
CONFIG_NET=y
CONFIG_UNIX=y
CONFIG_EXT3_FS=m
CONFIG_EXT4_FS=m
EOF
make ARCH=um allnoconfig KCONFIG_ALLCONFIG=mini.config
make ARCH=um -j4 all modules

第一个基本 UML 虚拟机

从现在起,我们假设你当前在要创建第一个虚拟机的目录中。目前,此目录应仅包含 linux 可执行文件。

你可以用 UML 做的最简单的事情是使用主机 Linux 安装进行一些初步实验。以普通用户(不是 root!)执行:

run_uml_basic.sh
./linux rootfstype=hostfs rw init=/bin/bash quiet

你应该进入命令提示符。UML 默认相当冗长(即使使用 quiet 内核选项),但要点是内核不使用任何真正的初始化,只是启动 /bin/bash。你现在可以 cdls 浏览你的系统,但这毕竟毫无意义,所以按 Ctrl+D 退出 UML。

以这种方式退出时,UML 会失败并显示内核错误。这不异常,考虑到我们没有使用真正的 init 等正确启动虚拟机。某些 shell(例如 zsh)在退出 UML 后会搞乱格式,使用 reset 命令修复。

使用 debootstrap 设置虚拟机

现在我们可以设置一个适当的最小安装。此示例使用 Debian Wheezy。如果你想使用其他发行版,修改发行版名称和镜像应该足够了

  1. 确保你已安装 debootstrap(在 Ubuntu 上 sudo apt-get install debootstrap
  2. 以 root 身份执行此命令(debootstrap 不以非 root 运行)将最小 Debian wheezy 安装到 wheezy-uml 目录
debootstrap_wheezy.sh
debootstrap --arch amd64 --variant minbase wheezy wheezy-uml http://mirror.switch.ch/ftp/mirror/debian
  1. 这需要一些时间。喝杯咖啡之类的以免无聊。
  2. 整个 wheezy-uml 树的文件所有者是 root,但 UML 以非 root 执行时应有写权限。用此命令修复:
chown_wheezy.sh
chown -R $USER:$USER wheezy-uml
  1. 启动 UML 虚拟机
run_wheezy_uml.sh
./linux rootfstype=hostfs rootflags=$(pwd)/wheezy-uml init=/bin/bash rw mem=128M

如果你现在查看 UML 中的文件系统树,可以看到它不是你的主机文件系统。此外,你还可以在任何地方编辑文件。

然而,非 root hostfs 方法有一些权限问题 - 文件系统将你的用户和组 ID(通常第一个创建的用户为 1000)列为 wheezy-uml 树的所有者,

想要更多 UML?

最初这被计划为多部分系列。然而,自从写这篇文章以来,Docker 等工具出现了,使得从头构建一切大多不必要。LXC(Docker 使用的)似乎也有显著优势。至于我的用例,对其他似乎没有明显优势,我目前没有继续该系列的计划。


Check out similar posts by category: Container, Linux