LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 952|回复: 0

uml

[复制链接]
发表于 2003-7-11 15:27:07 | 显示全部楼层 |阅读模式
一、        关于本教程
谁应该学习本教程?
您至少应该是中级 Linux 用户:熟悉从命令行进行工作以及从源代码构建软件;熟悉 Linux 文件系统结构;会挂装设备和文件系统;会管理用户帐户。用户模式 Linux(User-Mode Linux,UML)非常有趣,会给您带来精彩的教学体验;如果您对本教程中的概念理解得够透彻,从而知道如何更深层次地研究它们,那么本教程也同样适合您。
关于作者
Carla Schroder 是管理 PC 方面的自由作家,她为小型企业管理 Linux 和 Windows 系统,并为真正需要的人编写 how-to 教程。她喜爱计算机和高科技,并认为 Linux/开放源码/免费软件是世界上最好的游乐场。1994 年,Carla 发现了计算机和高科技,她的第一台 PC 是 Apple II。通过 DOS/Windows(从 3.1 到 XP),她逐步对计算机有了深入了解。1998 年她发现了 Linux。通过自学,中年女性同样可以成为优秀的计算机专家,Carla 就是一个明证。可以通过 dworks@bratgrrl.com 直接与 Carla 联系,或者使用本教程后面的参考资料形式。


二、用户模式 Linux 是什么?.
UML 概述
Linux 内核具有在用户空间中在其本身上运行的能力。您瞧,立马就是虚拟机。当然,它并非那么简单;主要作者 Jeff Dike 和众多参与者已经为 UML 做了大量工作。
UML 最初旨在作为内核开发人员的工具,以缩短开发周期并降低硬件需求。用户模式 Linux 的每个实例都很安全地被包含着,并无需与硬件直接交互,而且与运行在同一台计算机上的所有其它 UML 实例也无关。这使它可以支持各种测试后即销毁(test-to-destruction)的情况,而不会破坏主机系统或相邻的 VM,而且在出现故障时也不需要重新引导。
UML 的许多用途
UML 是免费的且带有完整的源代码,而用户正不断提出更富有想象的方法来使用它:
•        作为测试新应用程序的沙箱
•        用于安全地测试开发内核
•        作为同时运行不同 Linux 分发版的方法
•        用于创建各类开发环境,其中包含不同编译器、不同库以及不同文件系统
•        用于虚拟联网
•        用于虚拟 Web 托管
•        用于虚拟群集
•        作为最高级的 chroot 禁锢(jail)
•        模拟物理上不存在的硬件和资源



三、安装 UML
开始
安装 UML 需要一台运行 Linux 的计算机、一个 UML 内核以及一个根文件系统。主机操作系统可以是带有 2.2.15 内核或更高内核的任何大多数现代 Linux。(运行命令 uname -a 可以获得内核版本。)我将 UML 安装在两台自己组装的 PC 上:一台是带有 256MB RAM 和 Red Hat 8.0 的 AMD Duron 800;另一台是比较老的系统,带 256MB RAM 运行 Libranet 2.7 的 Celeron 333。我并不想让它看起来有多强大,只要能充分解决一些重要的 UML 问题就可以了。
开始安装的最简单方法就是下载并安装 UML RPM 或 deb 以及预制的文件系统。二者都可以从 UML 项目页上获得(请参阅参考资料)。软件包中包含了内核、文档和实用程序。当然,与所有的 Linux 一样,其中都包含无穷尽的定制选项。我们首先采用简单方法。
警告:UML 的发展非常迅速,因此还有一些方面不太完善。它很成熟,足以在生产环境中使用,但需要稍加学习。内核黑客可能比我们普通人更容易了解它。不必担心,如果象我这样“蹩脚”的系统管理员都可以使用的话,任何人都可以使用它。
基于 RPM 的安装
有一个通用的 UML 内核 RPM,目前是 user_mode_linux-2.4.19.5um-0.i386.rpm(您可以从参考资料中的链接下载它)。总是使用最新的软件包;UML 处于不断改进的状态。要知道其中有哪些文件,使用下面的命令列示软件包文件:

# rpm -ql user_mode_linux

要安装,请运行

# rpm -ivh user_mode_linux-2.4.19.5um-0.i386.rpm

通过运行 /usr/bin/linux 来验证安装。UML 应该在这期间引导,那么当找不到根文件系统时,就发出内核异常的错误。享受这一刻 — UML 让人们看到了他们希望的所有内核异常,同时不会产生破坏性后果。
选择文件系统
预制的文件系统有很多。它们是用 bzip2 压缩的,所以可以期望获得很高的压缩率。例如,root_fs.rh-7.2-full.pristine.20020312.bz2 可以从 170MB 展开到 679MB。这样就形成了完整的 Red Hat 7.2 安装。最小的文件系统是 root_fs_toms1.7.205.bz2,称为 Tom 的根启动。对于不熟悉 Tom 的根启动(其正式拼写应为 tomsrtbt)的那些人来说,它是“一张软盘上最为 GNU/Linux 的”,即它是您曾见过的压缩在一张可引导软盘上的最令人惊异的实用程序集合。
它值得炫耀的一项绝技就是,只使用 tomsrtbt 就可以使一台完全未安装任何东西的“裸机”通过 FTP 构建完整的 Linux 系统。用户模式 Linux 是练习使用 tomsrtbt 的一个绝妙的试验台;您可以在任何机器上磨练您的技能,然后让您的朋友目瞪口呆,对您刮目相看。
一个极佳的压缩选择是 Debian Woody 下载:Debian-3.0r0.ext2,解包后大约为 60MB。它是一个完整的根文件系统,可用于安装开发工具和其它应用程序。一个小问题:UML 需要 devfs,而 Woody 中却没有包含。请参阅 Debian 安装一节,获取如何做的信息。(提示:apt-get……)
注:主机上的大多数 UML 操作都可以以用户的身份执行,而无须 root 身份。这是设计时确定的,以使主机系统有更高的安全性,也更便于使用。
安装文件系统
建立 UML 目录,如下所示:

# mkdir /opt/uml
# chmod 755 /opt/uml

为什么使用 /opt?没有特别的原因,只不过是一个目录,无任何意义。如果您的规划拥有多个用户,那么将共享内容放在 /home 目录中不是个好主意。而应该将它们移到公共目录。chmod 755 赋予每个人读和执行的权限,而只有 root 身份具有写权限。按需调整权限。
解包选中的预制文件系统:

$ bunzip2 root_fs.rh-7.2-full.pristine.20020312.bz2

安装文件系统(续)
bunzip2 将自动删除压缩文件,只保留已解包的文件。有关完整的命令选项信息,请参阅 man bzip2。
创建 /usr/bin/linux 的软链接:

$ ln -s /usr/bin/linux /opt/uml/linux

我的一般做法是创建包含符号链接的命令目录,并将实际的二进制文件和库存储在别处。这导致 UML 产生某些不可预知的行为,这可能与所用的特定 Linux 有关。Libranet 允许我用想用的任何方法进行链接;Red Hat 8 不会从软链接的文件系统引导 UML。我发现,使工作顺利的最可靠方法就是从包含根文件系统的目录引导。

[carla@localhost carla]$ cd /opt/uml
[carla@localhost uml]$ ls -lhs
total 680M
   0 lrwxrwxrwx  1 carla  carla    14 Dec 2 20:52 linux -> /usr/bin/linux
680M -r-xr-xr-x  1 root   carla  679M Dec 2 19:27 root_fs.rh-7.2-full.pristine.20020312

大多数 Linux 的缺省路径中都包含 /usr/bin,所以没有必要使用符号链接(symlink)。为简单起见,将文件系统重命名为 root_fs。缺省情况下 UML 在当前目录中查找 root_fs。
使用UML
引导 UML
要引导一个“崭新”的 UML,所有一切都已准备就绪,输入以下命令:

[carla@localhost uml]$ ./linux

密码和映象选择
RPM 文件系统带有两个内置帐户:root(密码为“root”)和 user(密码为“user”)。如果第一次使用时没有提示您更改密码,那么无论如何修改密码都是一个好主意。按常规方法添加用户:

bash-2.05# useradd alice
bash-2.05# passwd alice
Changing password for user alice
Enter new UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully

可以组合各类根文件系统映象的集合,使它们可用引导选项进行选择。在引导时选择不同映象的方法是通过使用语法 ubd0=rootfs_filename 将文件系统名赋给 ubd0:

$ ./linux ubd0=/some/root/filesystem/image

确保您正在将 UML 引导到一个映象,而不是一个已挂装的文件系统。ubd0 是 UML 的引导设备。ubd 表示已配置的块设备。ubd 是 UML 指定用于 hd、fd、cdrom 和 scd 等的名称。此处是 devfs 的用武之地。/dev 很受限且不灵活,其中夹杂了成百个与实际安装在系统上的设备根本无关的项。devfs 是在运行时创建的虚拟目录,只包含系统上实际存在的块设备的项。ubd 设备极其灵活:您可以将它们映射到分区、目录和卷管理器,也可以映射到硬件设备,而且您可以使用管理控制台 mconsole 从正在运行的 UML 实例装入和卸装设备。
挂装设备
我们运行了一个极佳的 UML 实例,但它相当有限。没有交换分区(swap),没有 CD,没有软盘,也没有联网。看一下 /dev/udb:

bash-2.05# cd /dev/ubd
bash-2.05# ls
0  disc0

这里没有多少事情可以做。在 UML 中添加设备的操作与任何 Linux 中的操作相同:向 /etc/fstab 添加一些项,并在 /mnt 中创建一个目录,或者手工挂装它们。还有一个附加的特定于 UML 的步骤,它将在引导时定义设备:

$ ./linux ubd0=rootfs ubd1=swap ubd2=/dev/cdrom

下面讨论在 UML 内创建文件。在 UML 内手工挂装设备使用一般的“mount”语法,其中 ubdn 定义设备名:

mount /dev/ubd/2 /mnt/cdrom

注意引导选项是 ubdn,而 mount 命令选项是 /ubd/n。
使用稀疏文件创建自由空间
退出 UML。使用普通的 Linux 命令,例如 shutdown -h now。现在,该为 UML 创建一些专门的自由空间以使其在这些空间中运行,方法是通过创建并格式化一个稀疏(sparse)文件。这有点神奇,因为为文件分配了固定大小的空间,而实际并未完全使用该空间。

$ dd if=/dev/zero of=uml_root count=1 bs=1k seek=$[2*1024*1024]
1+0 records in
1+0 records out

我们称之为 uml_root,而不是 root_fs,因为 root_fs 经常作为变量用于 UML 文档。变量是用斜体表示的。
确认文件的创建:

$ ls -lhs
total 12k
12K -rw-r--r--    1 root     root         2.0G Dec 2 12:35 uml_root

看到魔力了吗?一个大小为 2GB 的文件占用了磁盘的 12KB 空间。“s”开关显示了文件真正占用的磁盘空间大小。
任何 Linux 文件格式都将有效。下面以 ext2 格式进行格式化:

$ /sbin/mkfs -t ext2 uml_root

创建自由空间(续)
这部分比较棘手。完成它有多种方法,但下面这种非常有效。我不打算在这里显示输出,只想显示命令。请记住,root_fs 是原始的 UML 文件系统映象。以下命令将它复制到 uml_root 稀疏文件中:

# mkdir /mnt/m1
# mkdir /mnt/m2
# mount -o loop -t ext2  /opt/uml/root_fs  /mnt/m1
# mount -o loop -t ext2 uml_root  /mnt/m2
# cp -a /mnt/m1/* /mnt/m2/

看呀,文件系统!对 /mnt/m1 和 /m2 运行 ls -lhs 进行比较。现在将二者卸装:

# umount /mnt/m1
# umount /mnt/m2

如果您得到“device busy”(设备忙)错误,那么关闭任何可能正在读取文件系统的程序,例如文件管理器和 xterm,并再次尝试卸装。现在以常规方式引导 UML,使之指向崭新的文件系统:

[carla@localhost uml]$ ./linux ubd0=uml_root

感觉到强大功能了吗?撇开其有用性,UML 就是纯粹用于娱乐的。
在 UML 内创建文件系统
文件系统也可以在 UML 内创建,这更惊险,也更有趣。首先,在主机上创建稀疏文件;我称之为 uml_root2。然后引导 UML 会话:

$ ./linux ubd0=uml_root  ubd2=/opt/umltest/uml_root2

以 root 身份运行这些命令:

# /sbin/mkfs -t ext2 /dev/ubd/2
# mount /dev/ubd/2 /mnt
# cp -ax / /mnt

确保使用未指定的设备;ubd1 通常指定给交换分区。休息一会,去散步。如果您的文件系统非常大,那么最后一步将使 CPU 运行几分钟。一切完成时,关闭系统,然后用新的文件系统启动:

$ cd /opt/umltest/
$ linux ubd0=uml_root2

还要处理有关文件创建的各种琐事,由于不存在真正的交换分区,所以我们要创建一个:

# dd if=/dev/zero/ of=swapfs bs=1k count=1 seek=$[512*1024]
# /sbin/mkswap swapfs

在引导时,确保指定 ubd1=swapfs。还可能需要在 UML 会话内运行 swapon 命令:

# /sbin/swapon -a

在 UML 内可以完成文件创建需要的所有琐事。这样就无需在主机上使用 root 特权,并让用户管理 UML 会话,就好像他们在单机系统上进行操作。之所以要在主机上创建类似 2GB 大小的稀疏文件,主要是为了限定用户的磁盘空间。
四、使用多个 UML
嘿,使用 COW
使用单一 UML 是可以的,但是真正的乐趣来自运行许多 UML。一种选择是安装多个隔离且独立的文件系统。另一种选择是即写即备份(Copy-On-Write,简称 COW)。所有用户共享同一个根文件系统,只有数据和对根文件系统所作的用户修改是分开的。一个用户可以创建许多 COW 文件,并同时运行它们。这不适用于测试不同的 Linux 分发版,也不适用于那些对根文件系统进行大量修改的用户。对于一流的内核黑客、虚拟 Web 托管、用于应用程序测试的沙箱或多个用户不需要对根文件系统进行大量修改的任何环境而言,这是相当完美的。
创建 COW 文件系统很简单。将根文件系统设置成只写。

[root@localhost uml] # chmod 444 uml_root

然后用下面这个选项来引导:

[carla@localhost uml] $ ./linux ubd0=/home/carla/uml_root.cow,uml_root

当心空格:逗号两侧都没有空格。这为用户 carla 在主机系统上创建了 .cow 文件,它在 carla 的主目录中。现在不会对原始的 uml_root 文件执行写操作。这称为“备份(backing)”文件。uml_root.cow 中记录了有关用户 carla 的更改。将 COW 文件命名为您喜欢的任何名称。可以从用户的主目录执行下面的登录:

[carla@localhost carla] $ ./linux ubd0=uml_root.cow

COW 文件(续)
让我们看一下节省了多少磁盘空间:

[carla@localhost uml]$ ls -lhs
total 680M
lrwxrwxrwx    1 root     carla          14 Dec  2 20:52 linux -> /usr/bin/linux
-r-xr-xr-x    1 root     carla        679M Dec  2 19:27 uml_root

[carla@localhost carla]$ ls -lhs
total 2.9M
2.9M -rw-r--r--    1 carla    carla        641M Dec  2 22:27 uml_root.cow

我们节省了 677.1MB。即使对于目前的大硬盘而言,这也是相当可观的一块空间。保护原始的备份文件系统很重要;如果发生任何更改,那么 UML 将不会挂装该设备。这意味着不可能通过升级备份系统来升级 COW 文件。使用 uml_moo 实用程序可以将 COW 文件与备份文件合并:

# uml_moo  cow_file  new_backing_file

保留一份原始备份文件的副本,以防该命令产生错误结果。COW 文件可以按照您的希望存储在主机系统的任何地方:

$ ./linux ubd0=/really/odd/file/location/root_fs.cow,root_fs

COW 文件非常适合于重要的测试后即销毁的情况。不必一直执行 fsck 检查,也不必等待重新引导,只要按需删除和重新创建 COW 文件即可。
Mconsole
通过将下述内容添加到引导选项,可以为每个 UML 实例提供一个唯一标识:

umid=foo

例如,当我运行了许多 UML 会话时,我将它们命名为 umid=carla1 和 umid=carla2 等等。这便于对管理控制台进行快速访问,该管理控制台允许用户从主机对正在运行的 UML 会话执行操作:

$ uml_mconsole carla1 command

查看您在主机系统上的主目录。存在一个 .uml 目录,其中存放的都是文件,这些文件的名称都很古怪,且明显都是随机字符。mconsole 总是在引导时被激活。如果用户没有指定 umid,那么它就被赋予一个古怪的随机文件名:

mconsole (version 2) initialized on /home/carla/.uml/HUrvzP/mconsole

mconsole 命令
很明显,找到一个给定了合理名称的命令更简单。mconsole 有一组有限的但很有用的命令。我最喜欢“halt”:

$ uml_mconsole carla1 halt

这是一个作用迅速的 halt,类似于拔出插头。有时那就是它所需要的效果。“reboot”也很强大。
•        “help”显示命令
•        “config”立即向 VM 添加设备,它使用与引导命令行相同的语法:config eth0=tuntap, config eth1=mcast
•        “remove”通过使用设备名来删除设备。例如:remove ubd2
•        “sysrq”调用内核的 SysRq 驱动程序。有关命令选项的信息,请参阅内核树中的 documentation/sysrq.txt。这是内核黑客感兴趣的地方;其他用户随意修改所产生的风险由其自行承担。在 UML 内部无须这样的担心,放心使用吧。
六、联网
传输
预制内核支持虚拟联网。对于定制构建的内核,启用“Network device support”和三种传输。有几种联网传输:
•        ethertap
•        TUN/TAP
•        多点广播
•        切换守护程序(switch daemon)
•        slip
•        slirp
•        pcap
我们将讨论 TUN/TAP、ethertap 和多点广播。TUN/TAP 允许在主机和带有 2.4 内核的虚拟机之间互换信息包。多点广播纯粹是虚拟的,只适用于对 VM 进行联网。Ethertap 适用于在 2.2 和 2.4 内核上进行主机访问,尽管从正规角度来说,它在 2.4 上已经过时了。TUN/TAP 在 2.4 上可以很有效地工作;它提供了更佳的性能和安全性。
ethertap 和 TUN/TAP 都需要两个 IP:一个用于主机,一个用于 UML。主机 IP 充当网关。如果主机已经有一个 IP,那么就用它,或者您觉得合适,就设置一个全新的。内核引导命令类似于:

eth <n> = <transport> , <device> , <ethernet address> , <tap IP address>

Ethertap
我们将主机的 IP 设置为 192.168.1.100。将它添加到 UML 内核引导选项:

eth0=ethertap,tap0,fe:fd:0:0:0:1,192.168.1.100

fe:fd:0:0:0:1 是指定给 UML eth0 的以太网地址,192.168.1.100 是 IP。更简单的方法是忽略 fe:fd:0:0:0:1,而让 uml_net 助手指定一个。这条语句驻留在 /user/bin/uml_net,所以它应该在您的路径中,并自动可用。不要试图手工运行它。警告:uml_net 要求以 root 身份运行,所以可能存在安全性问题。最简单的方法是启动联网并运行,所以有关更多的高级选项信息,请参阅 UML 文档。

eth0=ethertap,tap0,,192.168.1.100

上面就是很简单的方法,其中 uml_net 助手负责主机设置。请注意逗号;所有逗号都是必需的。登录到 UML 后,运行 ifconfig:

# ifconfig eth0 192.168.1.101 up

向主机添加路由:

# route add default gw 192.168.0.1

TUN/TAP
首先,查看 tun.o 模块是否已装入到主机系统的内核中。预制内核将包含它:

# /sbin/lsmod

应该出现一个长列表。左栏是模块。可能如下所示:

Module                  Size  Used by    Not tainted
tun                     5696   0  (unused)

如果其中没有该模块,那么使用 insmod 装入它:

# /sbin/insmod  /filepath/tun.o

它的 UML 内核引导命令语法与 ethertap 相同,但使用的参数更少:

eth0=tuntap,,,192.168.1.100

象 ethertap 那样引导 UML、运行 ifconfig 并添加路由。
需要留心两个潜在的 TUN/TAP 问题:
&#8226;        TUN/TAP 似乎不能在 2.4.3 以及更早版本上工作。升级主机内核或使用 ethertap。
&#8226;        对于已升级的内核,TUN/TAP 可能会出现“File descriptor in bad state(文件描述符处于错误状态)”的故障。这是由于已升级内核的头与最初安装在机器上的内核的头不匹配。修正的办法是要确保 /usr/src/linux 指向正在运行的内核的头。
快速回顾 TUN/TAP:TUN 是一个虚拟的点对点网络驱动程序,它向以太网隧道提供了低级内核支持。TAP 是一个虚拟以太网设备。TUN 使用 IP,TAP 使用以太网,而 TUN/TAP 支持桥接。一个小软件包中具有许多功能。
多点广播
联网 VM 就象吃馅饼那样简单。这要求主机内核中存在多点广播。内核中很可能已经有多点广播了,但如果没有,那么在内核编译期间启用“IP: multicasting”。主机上还需要一个具有多点广播能力的网络设备,象以太网 NIC 以及 eth0。在每个 VM 上,添加下面这个引导选项:

eth0=mcast

登录,然后用常规方式在每个 VM 上配置 eth0:

# ifconfig eth0 192.168.1.112
# ifconfig eth0 192.168.1.113
# ifconfig eth0 192.168.1.114

可用的多点广播参数有:ethX=mcast、hwaddr、mcastgroup、port 和 ttl。mcastgroup 的一个缺省值是 239.192.168.1,它是一个适于本地组织使用的多点广播地址。缺省端口是 1102,生存时间是 1。多点广播 TTL 为 1 意味着信息包将决不会离开本地网段。按需(例如当向多点广播网络添加路由器时)将它更改成更大的数字。
故障
即使最优秀的网络精英也会碰到许多愚蠢的小问题:
&#8226;        确保装入了内核模块。
&#8226;        注意空格和大小写。
&#8226;        主机和虚拟机需要不同的 IP,除非您要设置路由(这当然是可以的),否则它们位于同一子网,使用相同的网掩码。事实上,这是一个很好的练习设置路由的机制。
高级主题
访问主机上的文件
可以挂装和访问主机文件。就如同 UNIX 中的任何东西一样,一切都是文件。确保在 VM 上可以使用 hostfs:

$ cat /proc/filesystems
nodev hostfs
      root-hostfs

预制内核已经包含它。如果它不在内核中,那么重新编译以包含它。运行 mount:

# mount none /mnt/host -t hostfs

如果该命令指出 /mnt/host 不存在,那么 mkdir /mnt/host 并再次运行 mount。瞧,它在那里。要指定子目录:

# mount none /mnt/home -t hostfs -o /home/carla
运行 X
现在我们进行真正的测试,即运行 X。可以直接将 X 客户机连接到主机 X 服务器,但是将之连接到 Xnest 更好。Xnest 是一台 X 服务器,它是主机上的 X 服务器的客户机。(我不知道您怎么样,但我开始感到这个项目就象凡尔赛宫的镜厅那样令人眩目。)换句话说,它充当您的 UML 会话的本地服务器。下载 Xnest,并将它安装到虚拟机上。Debian 用户可以只运行 apt-get install xnest。基于 RPM 的系统可以在 RPMFind 中找到它。安装和设置 Xnest 很简单,所以让我们跳到它在 UML 虚拟机上的工作原理。
Xnest 首先必须连接到主机 X 服务器。在主机机器上,运行指向 VM IP 的命令,并显示:

$ xhost 192.168.1.110:0

在 VM 上:

$ DISPLAY=host :0 Xnest &

调用您最喜爱的窗口管理器。我喜欢 IceWM:

$ DISPLAY= :0 icewm &

即使使用了高效的 Xnest 和轻量级的窗口管理器,运行大量的 X 会话还是会轻易地消耗系统资源。我认为这是购买最新和最好硬件的好理由。毕竟,不堪重负的硬件会导致效率低下、出错且令人生气。
计算系统需求
在引导 UML 之前,以下是 free 对主机系统所作的评测:

$ free
             total       used       free     shared    buffers     cached
Mem:        255408     212692      42716          0       8600     117304
-/+ buffers/cache:      86788     168620
Swap:       522072      33316     488756

在引导 Red Hat 7.2 UML 之后,对主机系统的评测是:

$ free
             total       used       free     shared    buffers     cached
Mem:        255408     245528       9880          0       2844     149584
-/+ buffers/cache:      93100     162308
Swap:       522072      33308     488764

正如您可以看到的,没有运行任何应用程序,它就消耗了几乎 33MB 物理内存。这是一个相当“胖”的文件系统;缺省情况下,它会装入每个可能的服务:squid、sshd、inetd、named、httpd、sendmail、telnet 等,只要您叫得出名的,它都能装入。启动更多 UML 会话、运行庞大版本 Linux 和运行程序,这些都会消耗更多内存。即使 Linux 能有效地管理系统资源,但还是无法取代拥有足够强大的硬件所带来的好处。
从零开始构建内核
不想教真正的程序员要做什么,这里只想介绍一些适用于所有用户的技巧和诀窍。下载最新的 UML 补丁,然后从内核镜像下载匹配的内核。对内核解包。应用补丁:

$ bzcat patch.bz2 | patch -p1

不要将它与 /usr/src/linux 中的主机内核源代码搞混。将它保存在其它目录中。首先测试补丁:

$ bzcat patch.bz2 | patch -p1 --dry-run

如果使用 bzcat 时有问题,那么首先解包补丁,然后尝试 cat:

$ cat patch.bz2 | patch -p1 --dry-run

按常规方法编译,其中有一个重要的附加部分:

$ make xconfig ARCH=um
$ make linux ARCH=um

确保指定了 ARCH=um,因为我们所要的是 UML 体系结构。
UML 构建器(UML Builder)
UML 构建器是一个极佳的安装实用程序,它使用不同 Linux 分发版的本机安装例程将这些分发版安装到 UML。这使运行和升级 Linux 分发版成为可能,就如同它是一个常规的单机安装一样。当前,它支持 17 个分发版。能够添加更多分发版的一流开发人员总是受欢迎的。安装了 UML 构建器后,在主机系统上运行该命令:

# umlbuilder

或者
#umbuilder_gui
以获得漂亮的图形版本。UML 构建器的其它极佳特性是设置 Xnest 和联网。
Debian 安装
我在 Libranet 上测试了 UML,Libranet 构建在 Debian 之上,它是一个绝妙的对用户友好的分发版。它具有非凡的 Debian 稳定性、简化的安装以及大量桌面应用程序的集合。不必在 Debian 主机上运行 Debian 文件系统,我只是想那样做。
首先,更新软件包目录数据库:

# apt-get update

然后运行

# apt-get install user-mode-linux

常用的稳定、测试和不稳定软件包都可使用。/etc/apt/sources.list 中的 Libranet 缺省值是 Woody(稳定)。UML 本身完全是一种具有一定风险的新事物,所以我选择稳定的。或者转至 Debian 站点(相关链接,请参阅参考资料一节)以手工获取软件包。
Debian 安装(续)
apt-get 将执行所有工作,所以坐下来,休息一下。当它完成时,将编译 UML 内核,并且准备运行。要了解您系统上安装了什么,请查看 /var/lib/dpkg/info/,并查找用户模式 linux 和 uml 实用程序。
下载预制的根文件系统,然后就象在基于 RPM 的 Linux 上那样进行安装。有关到两个 Debian 文件系统的链接,请参阅参考资料。(当然,任何文件系统都有效,不必是 Debian。)这其中的一个小问题是 Debian Woody 内核没有将 devfs 与它们打包在一起,而 UML 需要 devfs。
在 VM 中设置联网,然后:

# apt-get install devfsd

不管有没有 devfs,它都将以常规方式引导,并在您的屏幕上弹出六个虚拟控制台,等待登录:

Debian GNU/Linux 3.0 (none) tty1
(none) login:

Debian 文件系统与其它文件系统稍有不同。它们不带有两个内置的“root”和“user”帐户。只要输入 root 并敲击 Enter 键,您就登录了。它不会向您唠叨要求您完成正确操作;在做其它任何操作之前,一定要添加用户帐户(adduser)并为 root 提供密码(passwd)。不使用 devfs 也可以运行 UML,但是那意味着您必须在 /dev/udb 中创建和制作项。还必须编辑 /etc/fstab 和 /etc/inittab。
结束语、参考资料和反馈
结束语
用户模式 Linux 一直在不断修改,但这不会影响您,您还是可以有一个良好的开始。请访问参考资料一节和用户模式 Linux 主页,以获取大量额外的极佳信息。请访问邮件列表和 IRC 频道,以获取帮助,并和其他 UML 用户一起交流。请注意 UML 标题版的 Help! 一章,并利用各种机会为这个极佳的项目作贡献。
参考资料
以下是您可能觉得有用的一些参考资料:
&#8226;        从 SourceForge 的 UML 主页获得有关 UML 的更多信息。
&#8226;        您可以从 Libranet 站点上下载 Libranet,它是一个基于 Debian 的对用户友好的分发版。
&#8226;        “Tom's floppy, which has a root filesystem and is also bootable(Tom 的软盘,其中有根文件系统,还可以引导)”(Tomsrtbt)是一个有用的实用程序集,所有一切都在一张可引导的软盘上。
&#8226;        UML 构建器是一个允许您安装基于 RPM 的 Linux 分发版的工具,该分发版用于 UML。
&#8226;        SourceForge 提供了有关虚拟的点对点(TUN)和以太网(TAP)设备的更多信息。
&#8226;        在 xfree86.org 上获取有关 Xnest 的更多信息。您可以从 rpmfind.net 下载 Xnest RPM。
&#8226;        Linux 内核归档是 Linux 内核源代码的主要站点。
&#8226;        在 debian.org 上可以下载 Debian UML 内核以及实用程序。您还可以找到两个 Debian 文件系统。
&#8226;        VMware 是一种类似的技术,它允许用户在独立的分区运行多个操作系统。获取更多有关在 IBM xSeries 服务器上运行 VMware ESX 服务器的信息。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表