初学者的用户模式 Linux - 设置和第一个虚拟机
为什么再写一个 UML 教程?
这不是第一个 UML 教程 — 互联网上有数百个公开可用的教程。然而,它们似乎没有一个满足我的要求:
- 我所有的计算机和服务器(= UML 主机)都运行在 x86_64 上,而不是 i386。
- 使用最新(自编译)的 UML 版本,以便你可以使用最新功能
- 一套简单的脚本。按正确顺序执行即可启动运行 - 无需编辑配置文件等
- 不应需要 root(不考虑 debootstrap)—> 没有 /mnt 挂载或类似操作
- 没有占用主机空间并限制 UML 虚拟机资源的讨厌文件系统镜像。HostFS 消除了所有这些缺点 - 如果你想限制虚拟机空间,使用配额。
- 没有全局状态(例如挂载到 /mnt),你应该能够通过在另一个目录中执行设置脚本并发启动另一个虚拟机。
- 逐步说明,尽可能自动化和可移植,但仍然为人类阅读而制作。
- 没有冗长的技术谈话。有参考文档供技术谈话使用。教程应该告诉你如何让它工作,而不是为什么它工作。
你需要什么?
- 任何最新的 Linux 计算机 - 我在测试时使用 Ubuntu 13.04(包安装说明仅针对 Ubuntu/Debian 列出),但如果你对发行版有一定了解,在任何地方运行都不难。
- 如果你找不到此处引用工具的可靠信息,你可能对系统了解不够,根本无法使用 UML。
- 大量时间
构建 UML
有关构建 UML 的扩展信息,请参考这篇优秀文章。但请记住,该文章编译 32 位 UML,基本上不
构建 UML 的替代方案是从系统维护者安装二进制文件(例如在 Ubuntu 上 sudo apt-get install user-mode-linux)。然而,二进制文件有些臃肿(我的情况下 6.4 兆字节对比 2.2 兆字节),而且通常完全不是最新的。
用户模式 Linux 代码几年前已合并到主线 Linux 内核中,所以我们只需要使用正确的配置选项编译最新的内核。
- 从 http://kernel.org 下载最新的内核源代码并解压。撰写本文时,Linux 3.10.0 是最新版本。
- 在内核源目录(例如 linux-3.10)中执行此命令集创建最小配置(详情参见此文章)并开始构建:
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- 构建完成后(通常约需 45 秒),内核源目录(例如 linux-3.10)中的 linux 文件包含 UML 可执行文件。将其放在你想创建第一个虚拟机的目录中(例如 ~/uml)
- 此内核配置原生支持 EXT2,但其他文件系统和/或功能可以动态加载。
第一个基本 UML 虚拟机
从现在起,我们假设你当前在要创建第一个虚拟机的目录中。目前,此目录应仅包含 linux 可执行文件。
你可以用 UML 做的最简单的事情是使用主机 Linux 安装进行一些初步实验。以普通用户(不是 root!)执行:
./linux rootfstype=hostfs rw init=/bin/bash quiet你应该进入命令提示符。UML 默认相当冗长(即使使用 quiet 内核选项),但要点是内核不使用任何真正的初始化,只是启动 /bin/bash。你现在可以 cd 和 ls 浏览你的系统,但这毕竟毫无意义,所以按 Ctrl+D 退出 UML。
以这种方式退出时,UML 会失败并显示内核错误。这不异常,考虑到我们没有使用真正的 init 等正确启动虚拟机。某些 shell(例如 zsh)在退出 UML 后会搞乱格式,使用 reset 命令修复。
使用 debootstrap 设置虚拟机
现在我们可以设置一个适当的最小安装。此示例使用 Debian Wheezy。如果你想使用其他发行版,修改发行版名称和镜像应该足够了
- 确保你已安装 debootstrap(在 Ubuntu 上 sudo apt-get install debootstrap)
- 以 root 身份执行此命令(debootstrap 不以非 root 运行)将最小 Debian wheezy 安装到 wheezy-uml 目录
debootstrap --arch amd64 --variant minbase wheezy wheezy-uml http://mirror.switch.ch/ftp/mirror/debian- 这需要一些时间。喝杯咖啡之类的以免无聊。
- 整个 wheezy-uml 树的文件所有者是 root,但 UML 以非 root 执行时应有写权限。用此命令修复:
chown -R $USER:$USER wheezy-uml- 启动 UML 虚拟机
./linux rootfstype=hostfs rootflags=$(pwd)/wheezy-uml init=/bin/bash rw mem=128M如果你现在查看 UML 中的文件系统树,可以看到它不是你的主机文件系统。此外,你还可以在任何地方编辑文件。
然而,非 root hostfs 方法有一些权限问题 - 文件系统将你的用户和组 ID(通常第一个创建的用户为 1000)列为 wheezy-uml 树的所有者,
想要更多 UML?
最初这被计划为多部分系列。然而,自从写这篇文章以来,Docker 等工具出现了,使得从头构建一切大多不必要。LXC(Docker 使用的)似乎也有显著优势。至于我的用例,对其他似乎没有明显优势,我目前没有继续该系列的计划。