运行 UML¶
本节假设主机上已经安装了发行版中的用户模式linux包或自定义构建的内核。
它们将一个名为linux的可执行文件添加到系统中。这是UML内核。它可以像任何其他可执行文件一样运行。它将使用大多数普通linux内核参数作为命令行参数。此外,它还需要一些特定于uml的参数,以便做一些有用的事情。
参数¶
内存参数¶
mem=int[K,M,G],内存量。缺省以字节为单位。它还将接受K、M或G限定词。
ubdX[s,d,c,t],虚拟磁盘规格。这并不是强制性的,但在几乎所有情况下都可能需要这样做,以便我们可以指定根文件系统。最简单的映像规范是文件系统的映像文件的名称(使用创建映像中描述的方法之一创建)。
UBD设备支持写时拷贝(COW)。更改保存在一个单独的文件中,可以丢弃该文件,允许回滚到原始映像。如果需要COW,则将UBD映像指定为:cow_file,master_image。例子:ubd0 = Filesystem.cow Filesystem.img
UBD设备可以设置为使用同步IO。任何写操作都会立即刷新到磁盘。这是通过在ubdX规范后面添加s来完成的。
UBD对指定为单个文件名的设备执行一些启发式操作,以确保没有将COW文件指定为映像。要关闭它们,在ubdX之后使用d标志。
UBD支持TRIM——要求主机操作系统回收映像中任何未使用的块。要关闭它,请在ubdX之后指定t标志。
root=<根设备>-最有可能的是/dev/ubd0(这是一个Linux文件系统映像)
重要可选参数¶
如果UML作为“linux”运行,没有额外的参数,它将尝试为映像中配置的每个控制台启动一个xterm(在大多数linux发行版中最多6个)。每个控制台都在一个xterm中启动。这使得在带有GUI的主机上使用UML变得既漂亮又容易。然而,如果要将UML用作测试工具或在纯文本环境中运行,那么这是错误的方法。
为了改变这种行为,我们需要指定一个替代控制台,并将其连接到支持的“线路”通道之一。为此,我们需要映射一个控制台,以使用与默认xterm不同的东西。
将控制台号1转移到stdin/stdout的示例:
con1=fd:0,fd:1
UML支持使用以下语法指定的各种串行行通道
conX = channel_type:选项(channel_type:选项)
如果通道规格包含以逗号分隔的两部分,则第一部分为输入,第二部分为输出。
空通道-丢弃所有输入或输出。示例con=null将默认将所有控制台设置为空。
fd通道-使用文件描述符编号进行输入/输出。例如:con1 = fd: 0, fd: 1。
端口通道-在TCP端口号上启动telnet服务器。例子:con1 =端口:4321。主机必须有“/usr/sbin/in”目录telnetd(通常是telnetd包的一部分)和来自UML实用工具的端口帮助器(请参阅下面关于xterm通道的信息)。UML在客户端连接之前不会启动。
pty和pts通道—使用系统pty/pts。
tty通道-绑定到现有的系统tty。示例:con1=/dev/tty8将使UML使用主机第8个控制台(通常未使用)。
xterm通道(这是默认的)在该通道上打开一个xterm并将IO定向到它。注意,为了使xterm工作,主机必须安装UML发行包。这通常包含端口帮助器和UML与xterm通信所需的其他实用程序。或者,这些需要从源代码编译和安装。适用于控制台的所有选项也适用于UML串行行,这些串行行在UML中表示为ty。
开始运行 UML¶
linux mem=2048M umid=TEST \
ubd0=Filesystem.img \
vec0:transport=tap,ifname=tap0,depth=128,gro=1 \
root=/dev/ubda con=null con0=null,fd:2 con1=fd:0,fd:1
这将运行一个具有2048M RAM的实例,并尝试使用名为Filesystem的映像文件作为根系统。它将使用tap0连接到主机。除了con1之外的所有控制台都将被禁用,控制台1将使用标准输入/输出,使其出现在启动时的同一终端中。
登录¶
如果您在生成映像时没有设置密码,那么您将不得不关闭UML实例,挂载映像,chroot到它并设置它——正如生成映像部分所描述的那样。如果已设置密码,则直接登录即可。
UML管理控制台¶
除了使用正常的系统管理工具从“内部”管理映像之外,还可以使用UML管理控制台执行许多低级操作。UML管理控制台是运行中的UML实例上的内核的低级接口,有点像i386的SysRq接口。由于UML下有一个成熟的操作系统,因此比SysRq机制有更大的灵活性。
你可以用mconsole界面做很多事情:
获取内核版本
添加和删除设备
暂停或重新启动计算机
发送SysRq命令
暂停并恢复UML
检查在UML中运行的过程
检查UML内部/过程状态
您需要mconsole客户端(uml_mconsole),它是大多数Linux发行版中可用的UML工具包的一部分。
您还需要在UML内核中启用CONFIG_MCONSOLE(在‘General Setup’下)。当你启动UML时,你会看到这样一行:
mconsole initialized on /home/jdike/.uml/umlNJ32yL/mconsole
如果你在UML命令行上指定一个唯一的机器id,例如umid=debian,你会看到下面的内容:
mconsole initialized on /home/jdike/.uml/debian/mconsole
该文件是uml_mconsole将用于与UML通信的套接字。使用umid或完整路径作为参数运行它:
uml_mconsole debian
或者
uml_mconsole /home/jdike/.uml/debian/mconsole
你会得到一个提示,你可以运行以下命令之一:
version
help
halt
reboot
config:config向虚拟机添加一个新设备。大多数UML设备驱动程序都支持这一点。它接受一个参数,即要添加的设备,其语法与内核命令行相同
remove:删除指定设备
sysrq:该命令接受一个参数,即一个字母。它调用通用内核的SysRq驱动程序,该驱动程序执行该参数所调用的任何操作。请参阅您最喜欢的内核树中的Linux Magic System Request Key Hacks中的SysRq文档,了解哪些字母是有效的以及它们的作用。
help
cad:这会调用正在运行的映像中的ctrl-alt-del操作。这最终会做什么取决于init, systemd等。通常,它会重新启动机器。
stop:这将UML置于读取mconsole请求的循环中,直到收到’go’ mconsole命令。这是一个非常有用的调试/快照工具。
go:这将在被“停止”命令暂停后恢复UML。请注意,当UML恢复时,TCP连接可能已经超时,如果UML暂停了很长一段时间,那么crond可能会有点疯狂,运行之前没有执行的所有作业。
proc:它接受一个参数——/proc中被打印到mconsole标准输出的文件的名称
stack:它接受一个参数——进程的pid号。它的堆栈被打印到标准输出。