1 .. SPDX-License-Identifier: GPL-2.0
13 Welcome to User Mode Linux
15 User Mode Linux is the first Open Source virtualization platform (first
16 release date 1991) and second virtualization platform for an x86 PC.
18 How is UML Different from a VM using Virtualization package X?
19 ==============================================================
21 We have come to assume that virtualization also means some level of
22 hardware emulation. In fact, it does not. As long as a virtualization
23 package provides the OS with devices which the OS can recognize and
24 has a driver for, the devices do not need to emulate real hardware.
25 Most OSes today have built-in support for a number of "fake"
26 devices used only under virtualization.
27 User Mode Linux takes this concept to the ultimate extreme - there
28 is not a single real device in sight. It is 100% artificial or if
29 we use the correct term 100% paravirtual. All UML devices are abstract
30 concepts which map onto something provided by the host - files, sockets,
33 The other major difference between UML and various virtualization
34 packages is that there is a distinct difference between the way the UML
35 kernel and the UML programs operate.
36 The UML kernel is just a process running on Linux - same as any other
37 program. It can be run by an unprivileged user and it does not require
38 anything in terms of special CPU features.
39 The UML userspace, however, is a bit different. The Linux kernel on the
40 host machine assists UML in intercepting everything the program running
41 on a UML instance is trying to do and making the UML kernel handle all
43 This is different from other virtualization packages which do not make any
44 difference between the guest kernel and guest programs. This difference
45 results in a number of advantages and disadvantages of UML over let's say
46 QEMU which we will cover later in this document.
49 Why Would I Want User Mode Linux?
50 =================================
53 * If User Mode Linux kernel crashes, your host kernel is still fine. It
54 is not accelerated in any way (vhost, kvm, etc) and it is not trying to
55 access any devices directly. It is, in fact, a process like any other.
57 * You can run a usermode kernel as a non-root user (you may need to
58 arrange appropriate permissions for some devices).
60 * You can run a very small VM with a minimal footprint for a specific
61 task (for example 32M or less).
63 * You can get extremely high performance for anything which is a "kernel
64 specific task" such as forwarding, firewalling, etc while still being
65 isolated from the host kernel.
67 * You can play with kernel concepts without breaking things.
69 * You are not bound by "emulating" hardware, so you can try weird and
70 wonderful concepts which are very difficult to support when emulating
71 real hardware such as time travel and making your system clock
72 dependent on what UML does (very useful for things like tests).
79 * The syscall interception technique used by UML makes it inherently
80 slower for any userspace applications. While it can do kernel tasks
81 on par with most other virtualization packages, its userspace is
82 **slow**. The root cause is that UML has a very high cost of creating
83 new processes and threads (something most Unix/Linux applications
86 * UML is strictly uniprocessor at present. If you want to run an
87 application which needs many CPUs to function, it is clearly the
90 ***********************
91 Building a UML instance
92 ***********************
94 There is no UML installer in any distribution. While you can use off
95 the shelf install media to install into a blank VM using a virtualization
96 package, there is no UML equivalent. You have to use appropriate tools on
97 your host to build a viable filesystem image.
99 This is extremely easy on Debian - you can do it using debootstrap. It is
100 also easy on OpenWRT - the build process can build UML images. All other
106 Create a sparse raw disk image::
108 # dd if=/dev/zero of=disk_image_name bs=1 count=1 seek=16G
110 This will create a 16G disk image. The OS will initially allocate only one
111 block and will allocate more as they are written by UML. As of kernel
112 version 4.19 UML fully supports TRIM (as usually used by flash drives).
113 Using TRIM inside the UML image by specifying discard as a mount option
114 or by running ``tune2fs -o discard /dev/ubdXX`` will request UML to
115 return any unused blocks to the OS.
117 Create a filesystem on the disk image and mount it::
119 # mkfs.ext4 ./disk_image_name && mount ./disk_image_name /mnt
121 This example uses ext4, any other filesystem such as ext3, btrfs, xfs,
122 jfs, etc will work too.
124 Create a minimal OS installation on the mounted filesystem::
126 # debootstrap buster /mnt http://deb.debian.org/debian
128 debootstrap does not set up the root password, fstab, hostname or
129 anything related to networking. It is up to the user to do that.
131 Set the root password -t he easiest way to do that is to chroot into the
138 Edit key system files
139 =====================
141 UML block devices are called ubds. The fstab created by debootstrap
142 will be empty and it needs an entry for the root file system::
144 /dev/ubd0 ext4 discard,errors=remount-ro 0 1
146 The image hostname will be set to the same as the host on which you
147 are creating it image. It is a good idea to change that to avoid
148 "Oh, bummer, I rebooted the wrong machine".
150 UML supports two classes of network devices - the older uml_net ones
151 which are scheduled for obsoletion. These are called ethX. It also
152 supports the newer vector IO devices which are significantly faster
153 and have support for some standard virtual network encapsulations like
154 Ethernet over GRE and Ethernet over L2TPv3. These are called vec0.
156 Depending on which one is in use, ``/etc/network/interfaces`` will
159 # legacy UML network devices
163 # vector UML network devices
167 We now have a UML image which is nearly ready to run, all we need is a
168 UML kernel and modules for it.
170 Most distributions have a UML package. Even if you intend to use your own
171 kernel, testing the image with a stock one is always a good start. These
172 packages come with a set of modules which should be copied to the target
173 filesystem. The location is distribution dependent. For Debian these
174 reside under /usr/lib/uml/modules. Copy recursively the content of this
175 directory to the mounted UML filesystem::
177 # cp -rax /usr/lib/uml/modules /mnt/lib/modules
179 If you have compiled your own kernel, you need to use the usual "install
180 modules to a location" procedure by running::
182 # make install MODULES_DIR=/mnt/lib/modules
184 At this point the image is ready to be brought up.
186 *************************
187 Setting Up UML Networking
188 *************************
190 UML networking is designed to emulate an Ethernet connection. This
191 connection may be either a point-to-point (similar to a connection
192 between machines using a back-to-back cable) or a connection to a
193 switch. UML supports a wide variety of means to build these
194 connections to all of: local machine, remote machine(s), local and
195 remote UML and other VM instances.
198 +-----------+--------+------------------------------------+------------+
199 | Transport | Type | Capabilities | Throughput |
200 +===========+========+====================================+============+
201 | tap | vector | checksum, tso | > 8Gbit |
202 +-----------+--------+------------------------------------+------------+
203 | hybrid | vector | checksum, tso, multipacket rx | > 6GBit |
204 +-----------+--------+------------------------------------+------------+
205 | raw | vector | checksum, tso, multipacket rx, tx" | > 6GBit |
206 +-----------+--------+------------------------------------+------------+
207 | EoGRE | vector | multipacket rx, tx | > 3Gbit |
208 +-----------+--------+------------------------------------+------------+
209 | Eol2tpv3 | vector | multipacket rx, tx | > 3Gbit |
210 +-----------+--------+------------------------------------+------------+
211 | bess | vector | multipacket rx, tx | > 3Gbit |
212 +-----------+--------+------------------------------------+------------+
213 | fd | vector | dependent on fd type | varies |
214 +-----------+--------+------------------------------------+------------+
215 | tuntap | legacy | none | ~ 500Mbit |
216 +-----------+--------+------------------------------------+------------+
217 | daemon | legacy | none | ~ 450Mbit |
218 +-----------+--------+------------------------------------+------------+
219 | socket | legacy | none | ~ 450Mbit |
220 +-----------+--------+------------------------------------+------------+
221 | pcap | legacy | rx only | ~ 450Mbit |
222 +-----------+--------+------------------------------------+------------+
223 | ethertap | legacy | obsolete | ~ 500Mbit |
224 +-----------+--------+------------------------------------+------------+
225 | vde | legacy | obsolete | ~ 500Mbit |
226 +-----------+--------+------------------------------------+------------+
228 * All transports which have tso and checksum offloads can deliver speeds
229 approaching 10G on TCP streams.
231 * All transports which have multi-packet rx and/or tx can deliver pps
232 rates of up to 1Mps or more.
234 * All legacy transports are generally limited to ~600-700MBit and 0.05Mps
236 * GRE and L2TPv3 allow connections to all of: local machine, remote
237 machines, remote network devices and remote UML instances.
239 * Socket allows connections only between UML instances.
241 * Daemon and bess require running a local switch. This switch may be
242 connected to the host as well.
245 Network configuration privileges
246 ================================
248 The majority of the supported networking modes need ``root`` privileges.
249 For example, in the legacy tuntap networking mode, users were required
250 to be part of the group associated with the tunnel device.
252 For newer network drivers like the vector transports, ``root`` privilege
253 is required to fire an ioctl to setup the tun interface and/or use
254 raw sockets where needed.
256 This can be achieved by granting the user a particular capability instead
257 of running UML as root. In case of vector transport, a user can add the
258 capability ``CAP_NET_ADMIN`` or ``CAP_NET_RAW``, to the uml binary.
259 Thenceforth, UML can be run with normal user privilges, along with
264 # sudo setcap cap_net_raw,cap_net_admin+ep linux
266 Configuring vector transports
267 ===============================
269 All vector transports support a similar syntax:
271 If X is the interface number as in vec0, vec1, vec2, etc, the general
272 syntax for options is::
274 vecX:transport="Transport Name",option=value,option=value,...,option=value
279 These options are common for all transports:
281 * ``depth=int`` - sets the queue depth for vector IO. This is the
282 amount of packets UML will attempt to read or write in a single
283 system call. The default number is 64 and is generally sufficient
284 for most applications that need throughput in the 2-4 Gbit range.
285 Higher speeds may require larger values.
287 * ``mac=XX:XX:XX:XX:XX`` - sets the interface MAC address value.
289 * ``gro=[0,1]`` - sets GRO on or off. Enables receive/transmit offloads.
290 The effect of this option depends on the host side support in the transport
291 which is being configured. In most cases it will enable TCP segmentation and
292 RX/TX checksumming offloads. The setting must be identical on the host side
293 and the UML side. The UML kernel will produce warnings if it is not.
294 For example, GRO is enabled by default on local machine interfaces
295 (e.g. veth pairs, bridge, etc), so it should be enabled in UML in the
296 corresponding UML transports (raw, tap, hybrid) in order for networking to
299 * ``mtu=int`` - sets the interface MTU
301 * ``headroom=int`` - adjusts the default headroom (32 bytes) reserved
302 if a packet will need to be re-encapsulated into for instance VXLAN.
304 * ``vec=0`` - disable multipacket io and fall back to packet at a
310 * ``ifname=str`` Transports which bind to a local network interface
311 have a shared option - the name of the interface to bind to.
313 * ``src, dst, src_port, dst_port`` - all transports which use sockets
314 which have the notion of source and destination and/or source port
315 and destination port use these to specify them.
317 * ``v6=[0,1]`` to specify if a v6 connection is desired for all
318 transports which operate over IP. Additionally, for transports that
319 have some differences in the way they operate over v4 and v6 (for example
320 EoL2TPv3), sets the correct mode of operation. In the absense of this
321 option, the socket type is determined based on what do the src and dst
322 arguments resolve/parse to.
329 vecX:transport=tap,ifname=tap0,depth=128,gro=1
331 This will connect vec0 to tap0 on the host. Tap0 must already exist (for example
332 created using tunctl) and UP.
334 tap0 can be configured as a point-to-point interface and given an ip
335 address so that UML can talk to the host. Alternatively, it is possible
336 to connect UML to a tap interface which is connected to a bridge.
338 While tap relies on the vector infrastructure, it is not a true vector
339 transport at this point, because Linux does not support multi-packet
340 IO on tap file descriptors for normal userspace apps like UML. This
341 is a privilege which is offered only to something which can hook up
342 to it at kernel level via specialized interfaces like vhost-net. A
343 vhost-net like helper for UML is planned at some point in the future.
345 Privileges required: tap transport requires either:
347 * tap interface to exist and be created persistent and owned by the
348 UML user using tunctl. Example ``tunctl -u uml-user -t tap0``
350 * binary to have ``CAP_NET_ADMIN`` privilege
357 vecX:transport=hybrid,ifname=tap0,depth=128,gro=1
359 This is an experimental/demo transport which couples tap for transmit
360 and a raw socket for receive. The raw socket allows multi-packet
361 receive resulting in significantly higher packet rates than normal tap
363 Privileges required: hybrid requires ``CAP_NET_RAW`` capability by
364 the UML user as well as the requirements for the tap transport.
371 vecX:transport=raw,ifname=p-veth0,depth=128,gro=1
374 This transport uses vector IO on raw sockets. While you can bind to any
375 interface including a physical one, the most common use it to bind to
376 the "peer" side of a veth pair with the other side configured on the
379 Example host configuration for Debian:
381 **/etc/network/interfaces**::
384 iface veth0 inet static
386 netmask 255.255.255.252
387 broadcast 192.168.4.3
388 pre-up ip link add veth0 type veth peer name p-veth0 && \
391 UML can now bind to p-veth0 like this::
393 vec0:transport=raw,ifname=p-veth0,depth=128,gro=1
396 If the UML guest is configured with 192.168.4.2 and netmask 255.255.255.0
397 it can talk to the host on 192.168.4.1
399 The raw transport also provides some support for offloading some of the
400 filtering to the host. The two options to control it are:
402 * ``bpffile=str`` filename of raw bpf code to be loaded as a socket filter
404 * ``bpfflash=int`` 0/1 allow loading of bpf from inside User Mode Linux.
405 This option allows the use of the ethtool load firmware command to
408 In either case the bpf code is loaded into the host kernel. While this is
409 presently limited to legacy bpf syntax (not ebpf), it is still a security
410 risk. It is not recommended to allow this unless the User Mode Linux
411 instance is considered trusted.
413 Privileges required: raw socket transport requires `CAP_NET_RAW`
421 vecX:transport=gre,src=$src_host,dst=$dst_host
424 This will configure an Ethernet over ``GRE`` (aka ``GRETAP`` or
425 ``GREIRB``) tunnel which will connect the UML instance to a ``GRE``
426 endpoint at host dst_host. ``GRE`` supports the following additional
429 * ``rx_key=int`` - GRE 32 bit integer key for rx packets, if set,
430 ``txkey`` must be set too
432 * ``tx_key=int`` - GRE 32 bit integer key for tx packets, if set
433 ``rx_key`` must be set too
435 * ``sequence=[0,1]`` - enable GRE sequence
437 * ``pin_sequence=[0,1]`` - pretend that the sequence is always reset
438 on each packet (needed to interoperate with some really broken
441 * ``v6=[0,1]`` - force IPv4 or IPv6 sockets respectively
443 * GRE checksum is not presently supported
445 GRE has a number of caveats:
447 * You can use only one GRE connection per ip address. There is no way to
448 multiplex connections as each GRE tunnel is terminated directly on
451 * The key is not really a security feature. While it was intended as such
452 it's "security" is laughable. It is, however, a useful feature to
453 ensure that the tunnel is not misconfigured.
455 An example configuration for a Linux host with a local address of
456 192.168.128.1 to connect to a UML instance at 192.168.129.1
458 **/etc/network/interfaces**::
461 iface gt0 inet static
463 netmask 255.255.255.0
466 pre-up ip link add gt0 type gretap local 192.168.128.1 \
467 remote 192.168.129.1 || true
468 down ip link del gt0 || true
470 Additionally, GRE has been tested versus a variety of network equipment.
472 Privileges required: GRE requires ``CAP_NET_RAW``
474 l2tpv3 socket transport
475 -----------------------
477 _Warning_. L2TPv3 has a "bug". It is the "bug" known as "has more
478 options than GNU ls". While it has some advantages, there are usually
479 easier (and less verbose) ways to connect a UML instance to something.
480 For example, most devices which support L2TPv3 also support GRE.
484 vec0:transport=l2tpv3,udp=1,src=$src_host,dst=$dst_host,srcport=$src_port,dstport=$dst_port,depth=128,rx_session=0xffffffff,tx_session=0xffff
486 This will configure an Ethernet over L2TPv3 fixed tunnel which will
487 connect the UML instance to a L2TPv3 endpoint at host $dst_host using
488 the L2TPv3 UDP flavour and UDP destination port $dst_port.
490 L2TPv3 always requires the following additional options:
492 * ``rx_session=int`` - l2tpv3 32 bit integer session for rx packets
494 * ``tx_session=int`` - l2tpv3 32 bit integer session for tx packets
496 As the tunnel is fixed these are not negotiated and they are
497 preconfigured on both ends.
499 Additionally, L2TPv3 supports the following optional parameters
501 * ``rx_cookie=int`` - l2tpv3 32 bit integer cookie for rx packets - same
502 functionality as GRE key, more to prevent misconfiguration than provide
505 * ``tx_cookie=int`` - l2tpv3 32 bit integer cookie for tx packets
507 * ``cookie64=[0,1]`` - use 64 bit cookies instead of 32 bit.
509 * ``counter=[0,1]`` - enable l2tpv3 counter
511 * ``pin_counter=[0,1]`` - pretend that the counter is always reset on
512 each packet (needed to interoperate with some really broken
515 * ``v6=[0,1]`` - force v6 sockets
517 * ``udp=[0,1]`` - use raw sockets (0) or UDP (1) version of the protocol
519 L2TPv3 has a number of caveats:
521 * you can use only one connection per ip address in raw mode. There is
522 no way to multiplex connections as each L2TPv3 tunnel is terminated
523 directly on the UML instance. UDP mode can use different ports for
526 Here is an example of how to configure a linux host to connect to UML
529 **/etc/network/interfaces**::
532 iface l2tp1 inet static
533 address 192.168.126.1
534 netmask 255.255.255.0
535 broadcast 192.168.126.255
537 pre-up ip l2tp add tunnel remote 127.0.0.1 \
538 local 127.0.0.1 encap udp tunnel_id 2 \
539 peer_tunnel_id 2 udp_sport 1706 udp_dport 1707 && \
540 ip l2tp add session name l2tp1 tunnel_id 2 \
541 session_id 0xffffffff peer_session_id 0xffffffff
542 down ip l2tp del session tunnel_id 2 session_id 0xffffffff && \
543 ip l2tp del tunnel tunnel_id 2
546 Privileges required: L2TPv3 requires ``CAP_NET_RAW`` for raw IP mode and
547 no special privileges for the UDP mode.
549 BESS socket transport
550 ---------------------
552 BESS is a high performance modular network switch.
554 https://github.com/NetSys/bess
556 It has support for a simple sequential packet socket mode which in the
557 more recent versions is using vector IO for high performance.
561 vecX:transport=bess,src=$unix_src,dst=$unix_dst
563 This will configure a BESS transport using the unix_src Unix domain
564 socket address as source and unix_dst socket address as destination.
566 For BESS configuration and how to allocate a BESS Unix domain socket port
567 please see the BESS documentation.
569 https://github.com/NetSys/bess/wiki/Built-In-Modules-and-Ports
571 BESS transport does not require any special privileges.
573 Configuring Legacy transports
574 =============================
576 Legacy transports are now considered obsolete. Please use the vector
583 This section assumes that either the user-mode-linux package from the
584 distribution or a custom built kernel has been installed on the host.
586 These add an executable called linux to the system. This is the UML
587 kernel. It can be run just like any other executable.
588 It will take most normal linux kernel arguments as command line
589 arguments. Additionally, it will need some UML specific arguments
590 in order to do something useful.
598 * ``mem=int[K,M,G]`` - amount of memory. By default bytes. It will
599 also accept K, M or G qualifiers.
601 * ``ubdX[s,d,c,t]=`` virtual disk specification. This is not really
602 mandatory, but it is likely to be needed in nearly all cases so we can
603 specify a root file system.
604 The simplest possible image specification is the name of the image
605 file for the filesystem (created using one of the methods described
606 in `Creating an image`_)
608 * UBD devices support copy on write (COW). The changes are kept in
609 a separate file which can be discarded allowing a rollback to the
610 original pristine image. If COW is desired, the UBD image is
611 specified as: ``cow_file,master_image``.
612 Example:``ubd0=Filesystem.cow,Filesystem.img``
614 * UBD devices can be set to use synchronous IO. Any writes are
615 immediately flushed to disk. This is done by adding ``s`` after
616 the ``ubdX`` specification
618 * UBD performs some euristics on devices specified as a single
619 filename to make sure that a COW file has not been specified as
620 the image. To turn them off, use the ``d`` flag after ``ubdX``
622 * UBD supports TRIM - asking the Host OS to reclaim any unused
623 blocks in the image. To turn it off, specify the ``t`` flag after
626 * ``root=`` root device - most likely ``/dev/ubd0`` (this is a Linux
629 Important Optional Arguments
630 ----------------------------
632 If UML is run as "linux" with no extra arguments, it will try to start an
633 xterm for every console configured inside the image (up to 6 in most
634 linux distributions). Each console is started inside an
635 xterm. This makes it nice and easy to use UML on a host with a GUI. It is,
636 however, the wrong approach if UML is to be used as a testing harness or run
637 in a text-only environment.
639 In order to change this behaviour we need to specify an alternative console
640 and wire it to one of the supported "line" channels. For this we need to map a
641 console to use something different from the default xterm.
643 Example which will divert console number 1 to stdin/stdout::
647 UML supports a wide variety of serial line channels which are specified using
650 conX=channel_type:options[,channel_type:options]
653 If the channel specification contains two parts separated by comma, the first
654 one is input, the second one output.
656 * The null channel - Discard all input or output. Example ``con=null`` will set
657 all consoles to null by default.
659 * The fd channel - use file descriptor numbers for input/out. Example:
662 * The port channel - listen on tcp port number. Example: ``con1=port:4321``
664 * The pty and pts channels - use system pty/pts.
666 * The tty channel - bind to an existing system tty. Example: ``con1=/dev/tty8``
667 will make UML use the host 8th console (usually unused).
669 * The xterm channel - this is the default - bring up an xterm on this channel
670 and direct IO to it. Note, that in order for xterm to work, the host must
671 have the UML distribution package installed. This usually contains the
672 port-helper and other utilities needed for UML to communicate with the xterm.
673 Alternatively, these need to be complied and installed from source. All
674 options applicable to consoles also apply to UML serial lines which are
675 presented as ttyS inside UML.
683 # linux mem=2048M umid=TEST \
684 ubd0=Filesystem.img \
685 vec0:transport=tap,ifname=tap0,depth=128,gro=1 \
686 root=/dev/ubda con=null con0=null,fd:2 con1=fd:0,fd:1
688 This will run an instance with ``2048M RAM``, try to use the image file
689 called ``Filesystem.img`` as root. It will connect to the host using tap0.
690 All consoles except ``con1`` will be disabled and console 1 will
691 use standard input/output making it appear in the same terminal it was started.
696 If you have not set up a password when generating the image, you will have to
697 shut down the UML instance, mount the image, chroot into it and set it - as
698 described in the Generating an Image section. If the password is already set,
701 The UML Management Console
702 ============================
704 In addition to managing the image from "the inside" using normal sysadmin tools,
705 it is possible to perform a number of low level operations using the UML
706 management console. The UML management console is a low-level interface to the
707 kernel on a running UML instance, somewhat like the i386 SysRq interface. Since
708 there is a full-blown operating system under UML, there is much greater
709 flexibility possible than with the SysRq mechanism.
711 There are a number of things you can do with the mconsole interface:
713 * get the kernel version
714 * add and remove devices
715 * halt or reboot the machine
716 * Send SysRq commands
717 * Pause and resume the UML
718 * Inspect processes running inside UML
719 * Inspect UML internal /proc state
721 You need the mconsole client (uml\_mconsole) which is a part of the UML
722 tools package available in most Linux distritions.
724 You also need ``CONFIG_MCONSOLE`` (under 'General Setup') enabled in the UML
725 kernel. When you boot UML, you'll see a line like::
727 mconsole initialized on /home/jdike/.uml/umlNJ32yL/mconsole
729 If you specify a unique machine id one the UML command line, i.e.
730 ``umid=debian``, you'll see this::
732 mconsole initialized on /home/jdike/.uml/debian/mconsole
735 That file is the socket that uml_mconsole will use to communicate with
736 UML. Run it with either the umid or the full path as its argument::
738 # uml_mconsole debian
742 # uml_mconsole /home/jdike/.uml/debian/mconsole
745 You'll get a prompt, at which you can run one of these commands:
764 This command takes no arguments. It prints the UML version::
767 OK Linux OpenWrt 4.14.106 #0 Tue Mar 19 08:19:41 2019 x86_64
770 There are a couple actual uses for this. It's a simple no-op which
771 can be used to check that a UML is running. It's also a way of
772 sending a device interrupt to the UML. UML mconsole is treated internally as
778 This command takes no arguments. It prints a short help screen with the
779 supported mconsole commands.
785 These commands take no arguments. They shut the machine down immediately, with
786 no syncing of disks and no clean shutdown of userspace. So, they are
787 pretty close to crashing the machine::
795 "config" adds a new device to the virtual machine. This is supported
796 by most UML device drivers. It takes one argument, which is the
797 device to add, with the same syntax as the kernel command line::
799 (mconsole) config ubd3=/home/jdike/incoming/roots/root_fs_debian22
804 "remove" deletes a device from the system. Its argument is just the
805 name of the device to be removed. The device must be idle in whatever
806 sense the driver considers necessary. In the case of the ubd driver,
807 the removed block device must not be mounted, swapped on, or otherwise
808 open, and in the case of the network driver, the device must be down::
810 (mconsole) remove ubd3
815 This command takes one argument, which is a single letter. It calls the
816 generic kernel's SysRq driver, which does whatever is called for by
817 that argument. See the SysRq documentation in
818 Documentation/admin-guide/sysrq.rst in your favorite kernel tree to
819 see what letters are valid and what they do.
824 This invokes the ``Ctl-Alt-Del`` action in the running image. What exactly
825 this ends up doing is up to init, systemd, etc. Normally, it reboots the
831 This puts the UML in a loop reading mconsole requests until a 'go'
832 mconsole command is received. This is very useful as a
833 debugging/snapshotting tool.
838 This resumes a UML after being paused by a 'stop' command. Note that
839 when the UML has resumed, TCP connections may have timed out and if
840 the UML is paused for a long period of time, crond might go a little
841 crazy, running all the jobs it didn't do earlier.
846 This takes one argument - the name of a file in /proc which is printed
847 to the mconsole standard output
852 This takes one argument - the pid number of a process. Its stack is
853 printed to a standard output.
859 Sharing Filesystems between Virtual Machines
860 ============================================
862 Don't attempt to share filesystems simply by booting two UMLs from the
863 same file. That's the same thing as booting two physical machines
864 from a shared disk. It will result in filesystem corruption.
866 Using layered block devices
867 ---------------------------
869 The way to share a filesystem between two virtual machines is to use
870 the copy-on-write (COW) layering capability of the ubd block driver.
871 Any changed blocks are stored in the private COW file, while reads come
872 from either device - the private one if the requested block is valid in
873 it, the shared one if not. Using this scheme, the majority of data
874 which is unchanged is shared between an arbitrary number of virtual
875 machines, each of which has a much smaller file containing the changes
876 that it has made. With a large number of UMLs booting from a large root
877 filesystem, this leads to a huge disk space saving.
879 Sharing file system data will also help performance, since the host will
880 be able to cache the shared data using a much smaller amount of memory,
881 so UML disk requests will be served from the host's memory rather than
882 its disks. There is a major caveat in doing this on multisocket NUMA
883 machines. On such hardware, running many UML instances with a shared
884 master image and COW changes may caise issues like NMIs from excess of
885 inter-socket traffic.
887 If you are running UML on high end hardware like this, make sure to
888 bind UML to a set of logical cpus residing on the same socket using the
889 ``taskset`` command or have a look at the "tuning" section.
891 To add a copy-on-write layer to an existing block device file, simply
892 add the name of the COW file to the appropriate ubd switch::
894 ubd0=root_fs_cow,root_fs_debian_22
896 where ``root_fs_cow`` is the private COW file and ``root_fs_debian_22`` is
897 the existing shared filesystem. The COW file need not exist. If it
898 doesn't, the driver will create and initialize it.
903 UML has TRIM support which will release any unused space in its disk
904 image files to the underlying OS. It is important to use either ls -ls
905 or du to verify the actual file size.
910 Any changes to the master image will invalidate all COW files. If this
911 happens, UML will *NOT* automatically delete any of the COW files and
912 will refuse to boot. In this case the only solution is to either
913 restore the old image (including its last modified timestamp) or remove
914 all COW files which will result in their recreation. Any changes in
915 the COW files will be lost.
917 Cows can moo - uml_moo : Merging a COW file with its backing file
918 -----------------------------------------------------------------
920 Depending on how you use UML and COW devices, it may be advisable to
921 merge the changes in the COW file into the backing file every once in
924 The utility that does this is uml_moo. Its usage is::
926 uml_moo COW_file new_backing_file
929 There's no need to specify the backing file since that information is
930 already in the COW file header. If you're paranoid, boot the new
931 merged file, and if you're happy with it, move it over the old backing
934 ``uml_moo`` creates a new backing file by default as a safety measure.
935 It also has a destructive merge option which will merge the COW file
936 directly into its current backing file. This is really only usable
937 when the backing file only has one COW file associated with it. If
938 there are multiple COWs associated with a backing file, a -d merge of
939 one of them will invalidate all of the others. However, it is
940 convenient if you're short of disk space, and it should also be
941 noticeably faster than a non-destructive merge.
943 ``uml_moo`` is installed with the UML distribution packages and is
944 available as a part of UML utilities.
949 If you want to access files on the host machine from inside UML, you
950 can treat it as a separate machine and either nfs mount directories
951 from the host or copy files into the virtual machine with scp.
952 However, since UML is running on the host, it can access those
953 files just like any other process and make them available inside the
954 virtual machine without the need to use the network.
955 This is possible with the hostfs virtual filesystem. With it, you
956 can mount a host directory into the UML filesystem and access the
957 files contained in it just as you would on the host.
961 Hostfs without any parameters to the UML Image will allow the image
962 to mount any part of the host filesystem and write to it. Always
963 confine hostfs to a specific "harmless" directory (for example ``/var/tmp``)
964 if running UML. This is especially important if UML is being run as root.
969 To begin with, make sure that hostfs is available inside the virtual
972 # cat /proc/filesystems
974 ``hostfs`` should be listed. If it's not, either rebuild the kernel
975 with hostfs configured into it or make sure that hostfs is built as a
976 module and available inside the virtual machine, and insmod it.
979 Now all you need to do is run mount::
981 # mount none /mnt/host -t hostfs
983 will mount the host's ``/`` on the virtual machine's ``/mnt/host``.
984 If you don't want to mount the host root directory, then you can
985 specify a subdirectory to mount with the -o switch to mount::
987 # mount none /mnt/home -t hostfs -o /home
989 will mount the hosts's /home on the virtual machine's /mnt/home.
991 hostfs as the root filesystem
992 -----------------------------
994 It's possible to boot from a directory hierarchy on the host using
995 hostfs rather than using the standard filesystem in a file.
996 To start, you need that hierarchy. The easiest way is to loop mount
997 an existing root_fs file::
999 # mount root_fs uml_root_dir -o loop
1002 You need to change the filesystem type of ``/`` in ``etc/fstab`` to be
1003 'hostfs', so that line looks like this::
1005 /dev/ubd/0 / hostfs defaults 1 1
1007 Then you need to chown to yourself all the files in that directory
1008 that are owned by root. This worked for me::
1010 # find . -uid 0 -exec chown jdike {} \;
1012 Next, make sure that your UML kernel has hostfs compiled in, not as a
1013 module. Then run UML with the boot device pointing at that directory::
1015 ubd0=/path/to/uml/root/directory
1017 UML should then boot as it does normally.
1022 Hostfs does not support keeping track of host filesystem changes on the
1023 host (outside UML). As a result, if a file is changed without UML's
1024 knowledge, UML will not know about it and its own in-memory cache of
1025 the file may be corrupt. While it is possible to fix this, it is not
1026 something which is being worked on at present.
1031 UML at present is strictly uniprocessor. It will, however spin up a
1032 number of threads to handle various functions.
1034 The UBD driver, SIGIO and the MMU emulation do that. If the system is
1035 idle, these threads will be migrated to other processors on a SMP host.
1036 This, unfortunately, will usually result in LOWER performance because of
1037 all of the cache/memory synchronization traffic between cores. As a
1038 result, UML will usually benefit from being pinned on a single CPU
1039 especially on a large system. This can result in performance differences
1040 of 5 times or higher on some benchmarks.
1042 Similarly, on large multi-node NUMA systems UML will benefit if all of
1043 its memory is allocated from the same NUMA node it will run on. The
1044 OS will *NOT* do that by default. In order to do that, the sysadmin
1045 needs to create a suitable tmpfs ramdisk bound to a particular node
1046 and use that as the source for UML RAM allocation by specifying it
1047 in the TMP or TEMP environment variables. UML will look at the values
1048 of ``TMPDIR``, ``TMP`` or ``TEMP`` for that. If that fails, it will
1049 look for shmfs mounted under ``/dev/shm``. If everything else fails use
1050 ``/tmp/`` regardless of the filesystem type used for it::
1052 mount -t tmpfs -ompol=bind:X none /mnt/tmpfs-nodeX
1053 TEMP=/mnt/tmpfs-nodeX taskset -cX linux options options options..
1055 *******************************************
1056 Contributing to UML and Developing with UML
1057 *******************************************
1059 UML is an excellent platform to develop new Linux kernel concepts -
1060 filesystems, devices, virtualization, etc. It provides unrivalled
1061 opportunities to create and test them without being constrained to
1062 emulating specific hardware.
1064 Example - want to try how linux will work with 4096 "proper" network
1067 Not an issue with UML. At the same time, this is something which
1068 is difficult with other virtualization packages - they are
1069 constrained by the number of devices allowed on the hardware bus
1070 they are trying to emulate (for example 16 on a PCI bus in qemu).
1072 If you have something to contribute such as a patch, a bugfix, a
1073 new feature, please send it to ``linux-um@lists.infradead.org``
1075 Please follow all standard Linux patch guidelines such as cc-ing
1076 relevant maintainers and run ``./sripts/checkpatch.pl`` on your patch.
1077 For more details see ``Documentation/process/submitting-patches.rst``
1079 Note - the list does not accept HTML or attachments, all emails must
1080 be formatted as plain text.
1082 Developing always goes hand in hand with debugging. First of all,
1083 you can always run UML under gdb and there will be a whole section
1084 later on on how to do that. That, however, is not the only way to
1085 debug a linux kernel. Quite often adding tracing statements and/or
1086 using UML specific approaches such as ptracing the UML kernel process
1087 are significantly more informative.
1092 When running UML consists of a main kernel thread and a number of
1093 helper threads. The ones of interest for tracing are NOT the ones
1094 that are already ptraced by UML as a part of its MMU emulation.
1096 These are usually the first three threads visible in a ps display.
1097 The one with the lowest PID number and using most CPU is usually the
1098 kernel thread. The other threads are the disk
1099 (ubd) device helper thread and the sigio helper thread.
1100 Running ptrace on this thread usually results in the following picture::
1102 host$ strace -p 16566
1103 --- SIGIO {si_signo=SIGIO, si_code=POLL_IN, si_band=65} ---
1104 epoll_wait(4, [{EPOLLIN, {u32=3721159424, u64=3721159424}}], 64, 0) = 1
1105 epoll_wait(4, [], 64, 0) = 0
1106 rt_sigreturn({mask=[PIPE]}) = 16967
1107 ptrace(PTRACE_GETREGS, 16967, NULL, 0xd5f34f38) = 0
1108 ptrace(PTRACE_GETREGSET, 16967, NT_X86_XSTATE, [{iov_base=0xd5f35010, iov_len=832}]) = 0
1109 ptrace(PTRACE_GETSIGINFO, 16967, NULL, {si_signo=SIGTRAP, si_code=0x85, si_pid=16967, si_uid=0}) = 0
1110 ptrace(PTRACE_SETREGS, 16967, NULL, 0xd5f34f38) = 0
1111 ptrace(PTRACE_SETREGSET, 16967, NT_X86_XSTATE, [{iov_base=0xd5f35010, iov_len=2696}]) = 0
1112 ptrace(PTRACE_SYSEMU, 16967, NULL, 0) = 0
1113 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_TRAPPED, si_pid=16967, si_uid=0, si_status=SIGTRAP, si_utime=65, si_stime=89} ---
1114 wait4(16967, [{WIFSTOPPED(s) && WSTOPSIG(s) == SIGTRAP | 0x80}], WSTOPPED|__WALL, NULL) = 16967
1115 ptrace(PTRACE_GETREGS, 16967, NULL, 0xd5f34f38) = 0
1116 ptrace(PTRACE_GETREGSET, 16967, NT_X86_XSTATE, [{iov_base=0xd5f35010, iov_len=832}]) = 0
1117 ptrace(PTRACE_GETSIGINFO, 16967, NULL, {si_signo=SIGTRAP, si_code=0x85, si_pid=16967, si_uid=0}) = 0
1118 timer_settime(0, 0, {it_interval={tv_sec=0, tv_nsec=0}, it_value={tv_sec=0, tv_nsec=2830912}}, NULL) = 0
1120 clock_nanosleep(CLOCK_MONOTONIC, 0, {tv_sec=1, tv_nsec=0}, NULL) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
1121 --- SIGALRM {si_signo=SIGALRM, si_code=SI_TIMER, si_timerid=0, si_overrun=0, si_value={int=1631716592, ptr=0x614204f0}} ---
1122 rt_sigreturn({mask=[PIPE]}) = -1 EINTR (Interrupted system call)
1124 This is a typical picture from a mostly idle UML instance
1126 * UML interrupt controller uses epoll - this is UML waiting for IO
1129 epoll_wait(4, [{EPOLLIN, {u32=3721159424, u64=3721159424}}], 64, 0) = 1
1131 * The sequence of ptrace calls is part of MMU emulation and runnin the
1133 * ``timer_settime`` is part of the UML high res timer subsystem mapping
1134 timer requests from inside UML onto the host high resultion timers.
1135 * ``clock_nanosleep`` is UML going into idle (similar to the way a PC
1136 will execute an ACPI idle).
1138 As you can see UML will generate quite a bit of output even in idle.The output
1139 can be very informative when observing IO. It shows the actual IO calls, their
1140 arguments and returns values.
1145 You can run UML under gdb now, though it will not necessarily agree to
1146 be started under it. If you are trying to track a runtime bug, it is
1147 much better to attach gdb to a running UML instance and let UML run.
1149 Assuming the same PID number as in the previous example, this would be::
1153 This will STOP the UML instance, so you must enter `cont` at the GDB
1154 command line to request it to continue. It may be a good idea to make
1155 this into a gdb script and pass it to gdb as an argument.
1157 Developing Device Drivers
1158 =========================
1160 Nearly all UML drivers are monolithic. While it is possible to build a
1161 UML driver as a kernel module, that limits the possible functionality
1162 to in-kernel only and non-UML specific. The reason for this is that
1163 in order to really leverage UML, one needs to write a piece of
1164 userspace code which maps driver concepts onto actual userspace host
1167 This forms the so called "user" portion of the driver. While it can
1168 reuse a lot of kernel concepts, it is generally just another piece of
1169 userspace code. This portion needs some matching "kernel" code which
1170 resides inside the UML image and which implements the Linux kernel part.
1172 *Note: There are very few limitations in the way "kernel" and "user" interact*.
1174 UML does not have a strictly defined kernel to host API. It does not
1175 try to emulate a specific architecture or bus. UML's "kernel" and
1176 "user" can share memory, code and interact as needed to implement
1177 whatever design the software developer has in mind. The only
1178 limitations are purely technical. Due to a lot of functions and
1179 variables having the same names, the developer should be careful
1180 which includes and libraries they are trying to refer to.
1182 As a result a lot of userspace code consists of simple wrappers.
1183 F.e. ``os_close_file()`` is just a wrapper around ``close()``
1184 which ensures that the userspace function close does not clash
1185 with similarly named function(s) in the kernel part.
1187 Security Considerations
1188 -----------------------
1190 Drivers or any new functionality should default to not
1191 accepting arbitrary filename, bpf code or other parameters
1192 which can affect the host from inside the UML instance.
1193 For example, specifying the socket used for IPC communication
1194 between a driver and the host at the UML command line is OK
1195 security-wise. Allowing it as a loadable module parameter
1198 If such functionality is desireable for a particular application
1199 (e.g. loading BPF "firmware" for raw socket network transports),
1200 it should be off by default and should be explicitly turned on
1201 as a command line parameter at startup.
1203 Even with this in mind, the level of isolation between UML
1204 and the host is relatively weak. If the UML userspace is
1205 allowed to load arbitrary kernel drivers, an attacker can
1206 use this to break out of UML. Thus, if UML is used in
1207 a production application, it is recommended that all modules
1208 are loaded at boot and kernel module loading is disabled