Gentoo Linux 开发者的用户模式 Linux 测试系统指南 Grant Goodyear John Davis Sven Vermeulen Benny Chuang Zhang Liqiang 本指南揭示了 Gentoo Linux 开发者如何设置用户模式 linux,来测试有潜在系统破坏的改变。 0.8 2004年8月31日 获得用户模式 用户模式 Linux

正如用户模式 linux 网站 (http://用户模式-linux.sourceforge.net) 所述, 用户模式 linux 允许用户“自包含运行 Linux”。特别的, 用户模式 linux 提供了虚拟机,用户可以在上面“运行毛病软件, 尝试新的 Linux 内核或发布,在 Linux 内部敲敲打打,全都不会使你的主要 Linux 冒风险。” 对于 Gentoo 核心软件包,比如 sys-apps/baselayout 或是 sys-libs/glibc 的改变 有潜在的系统破坏性或是使它无法引导;通过用户模式 linux 我们可以测试这些改变而不用担心破坏现存的系统。

安装用户模式 linux 与一般的内核安装本质上是相同的 首先安装内核源码(加入用户模式 linux 恰当补丁), 然后以通常的习惯配置用户模式 linux 内核:

# emerge sys-kernel/usermode-sources
# cd /usr/src/uml/linux
# make menuconfig ARCH=um
# make linux ARCH=um
# cp linux /usr/local/bin/linux
ARCH=um 参数是非常重要的!

确保 /usr/local/bin 在你的搜索路径内。 编辑文件/etc/env.d/00basic,使PATH变量包含/usr/local/bin, 再运行env-update

# nano -w /etc/env.d/00basic
# env-update
# source /etc/profile
为了使用户模式 linux 内核恰当的引导 Gentoo 系统, 内核能配置为缺省自动加载 /dev (devfs)。 同样,你也要肯定确保你内核编译中有 tmpfs(虚拟内存文件系统), 因为缺省的 Gentoo linux引导脚本 在一个小的 tmpfs 分区存储他们的信息。 (用户模式linux 的网站上的二进制内核包含自动加载/dev, 同时他们编译了 tmpfs;还是不要麻烦他们了。)

我强烈建议阅读用户模式 linux 文档, but the 不过基本的观点就是运行 /usr/local/bin/linux 程序, 引导用户模式内核并且试着带起存储在文件 root_fs 中的系统, 位于恰当的工作目录。

安装用户模式 linux 工具也不会有伤害的。

# emerge sys-apps/usermode-utilities

这些工具会简化用户模式 linux 虚拟系统和宿主系统 之间的网络(在各种事情中)。

创建 root_fs
制造 Gentoo chroot

用户模式 linux所需的 root_fs 文件 是一个包含整个 Gentoo Linux 文件系统的单独文件。 要生成这个文件,你需要在宿主内核(非用户模式) 使用 Loopback 设备支持。

生成 root_fs 文件本身会是我们的最后一步。 首先,我们会在一般的 chroot 生成 Gentoo 文件系统。 我们需要可用的 stage 压缩包, 可以单独下载,从 liveCD 中解出,从 liveCD .iso 文件中解出。

# mkdir /mnt/loop
# mount -o loop /path/to/build-<TAB>.iso /mnt/loop

设置 chroot 与一般 Gentoo Linux 的建造基本一致。

# mkdir /mnt/gentoo
# cd /mnt/gentoo
# tar xvjpf /path/to/build-<TAB>.tar.bz2

接着卸载 .iso。你不再需要它了。

Bootstrap 并且建造系统。跟随安装指导就好了:)

增加任何你想要得到的软件包。随意给你的虚拟 Gentoo 系统一个主机名,如果你愿意的话。在 /etc/fstab 中,你需要 /dev/ROOT/dev/ubd/0, 一种 ext2,ext3,或 reiserfs 文件系统类型。设置 /dev/SWAP/dev/ubd/1,和注释掉的 /dev/BOOT

在此,记得设置你的 root 密码。

# passwd

退出 chroot,卸载所有绑定加载, tar 起新的 Gentoo 发布,并清理。

# cd /mnt/gentoo
# tar cvjpf ~/gentoo.tbz2 *
# cd
# rm -rf /mnt/gentoo
建造 <path>root_fs</path>

我们的 Gentoo chroot 尺寸大约 300 MB, 所以 root_fs 大致需要那个大小。 我们会选取 0.5 GB 作为合理的大小。

# dd if=/dev/zero of=root_fs seek=500 count=1 bs=1M
# mke2fs -F root_fs
# mount -o loop root_fs /mnt/loop
# tar xvjpf gentoo.tbz2 -C /mnt/loop
# umount /mnt/loop

有0.5 GB 的交换空间也不错。

# dd if=/dev/zero of=swap_fs seek=500 count=1 bs=1M
# mkswap -f swap_fs

现在看看是否工作!

# linux ubd0=root_fs ubd1=swap_fs
用户模式 linux 使用 xterms 作为引导时的虚拟控制台, 所以你需要确保你运行用户模式 linux 的终端 $DISPLAY 设置恰当。 (需要恰当的 xhost/xauth 权限)。

运气好的话你应该能够登录你的用户模式 linux Gentoo 系统。 这个用户模式 Gentoo linux 版本和完全功能的差距仅仅是虚拟机器到宿主机器的网络。

网络

感谢 Martin Schlemmer (Azarah),我现在知道了 如何在用户模式系统内使用网络。 思想是我们建立一个包含用户模式系统和宿主系统的私有网络, 然后用户模式系统把所有的通信包都路由到宿主系统, 它再将包发送到网上。 确保宿主内核有 Networking --> IP: Netfilter Configuration --> IP tables support --> Full NAT --> MASQUERADE target support 和 Network Device Support --> Ethertap network tap 编译为模块;然后在宿主机器上这样操作:

# modprobe tun
# modprobe iptable_nat
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# echo 1 > /proc/sys/net/ipv4/ip_forward

iptables 那行在我们用户模式系统和互联网之间设置 IP 伪装 (在我们这里通过 eth0 )。echo 那行启动私有网络和缺省网管界面之间的包转发 (我们这是 eth0)。

现在开动用户模式系统,来看看网络是否已经起作用了。

# linux ubd0=root_fs ubd1=swap_fs eth0=ethertap,tap0,,192.168.0.254
(登录到用户模式系统)
# ifconfig eth0 192.168.0.1 up
# ping -c 2 192.168.0.254
PING 192.168.0.254 (192.168.0.254): 56 octets data
64 octets from 192.168.0.254: icmp_seq=0 ttl=255 time=0.8 ms
64 octets from 192.168.0.254: icmp_seq=1 ttl=255 time=0.6 ms

--- 192.168.0.254 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.7/0.8 ms
route add default gw 192.168.0.254
netstat -rn
Kernel IP routing table
Destination  Gateway        Genmask        Flags MSS Window irtt Iface
192.168.0.0  0.0.0.0        255.255.255.0  U      40 0         0 eth0
0.0.0.0      192.168.0.254  0.0.0.0        UG     40 0         0 eth0
scp user@192.168.0.254:/etc/resolv.conf /etc/resolv.conf (如果需要)
ping -c 2 www.gentoo.org
PING www.gentoo.org (207.170.82.202): 56 octets data
64 octets from 207.170.82.202: icmp_seq=0 ttl=240 time=119.6 ms
64 octets from 207.170.82.202: icmp_seq=1 ttl=240 time=92.0 ms

--- www.gentoo.org ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 92.0/105.8/119.6 ms

在用户模式系统中,我们把私有 IP 地址192.168.0.1分配给用户模式的 eth0 界面, 并启动界面。宿主主机的私有 IP 是192.168.0.254,我们 ping 它,以确定我们的网络确实已经起来了。 route 那行增加一个缺省网关,即我们的宿主主机。 我们用 scp 拿回一个可以工作的 /etc/resolv.conf(如果必要), 我们 ping www.gentoo.org来确定我们用户模式系统域名解析(一般互联网访问)工作正常。 现在用户模式系统可以完全 emerge 了。

测试 .iso

也许 Gentoo Linux 测试的真实意图是P 从用户模式 linux 引导 .iso, 并且在用户模式 linux 虚拟系统完全安装 Gentoo。

引导 .iso或者从.iso 取得 initrd,巧妙直接。

# mount -o loop /path/to/build-<TAB>.iso /mnt/loop
# cp /mnt/loop/isolinux/rescue.gz .
# linux load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=22000 \
> initrd=rescue.gz root=/dev/ram0 ubd0=root_fs ubd1=swap_fs \
> ubd2=/dev/cdroms/cdrom0 eth0=ethertap,tap0,,192.168.0.254

现在你基本上可以按部就班的遵从 Gentoo 安装文档, 即使你需要知道根文件系统是 /dev/ubd/0,交换“分区”会是 /dev/ubd/1,CD 光驱会是 /dev/ubd/2

资源
  • 桥接UML
  • UML 主页
  • Caker 的 UML 笔记
  • UML 邮件列表保存档