[libvirt] Libvirt + LXC terminals

Purcareata Bogdan-B43198 B43198 at freescale.com
Thu Mar 14 11:10:31 UTC 2013


Hello all,

I am looking for a way to start a container with libvirt and bind multiple consoles to it. My container is running busybox, the filesystem created using the LXC package (0.8.0). My libvirt version is 0.10.1.

Configuration of the filesystem:
- in the container rootfs, /dev contains 2 devices - /dev/console and /dev/tty1
- the inittab file looks like this:
::sysinit:/etc/init.d/rcS
tty1::respawn:/bin/getty -L tty1 115200 vt100
console::askfirst:/bin/sh
- it will link the /bin/sh process to /dev/console and the /bin/getty process to /dev/tty
- when starting the container with lxc-start, each of these processes gets his own local /dev/pts device:
25609 ?        Ss     0:00 lxc-start -n foo -d
25612 ?        Ss     0:00  \_ init
25684 ?        Ss     0:00      \_ /bin/syslogd
25686 pts/3    Ss+    0:00      \_ /bin/getty -L tty1 115200 vt100
25687 pts/4    Ss+    0:00      \_ init

Here is the container.xml file I use to run with libvirt (you may ignore the console devices, since I don't know how much sense they make right now):
<domain type='lxc'>
        <name>foo</name>
        <memory>500000</memory>

        <os>
            <type>exe</type>
            <init>/bin/init</init>
        </os>

        <vcpu>1</vcpu>
        <clock offset='utc'/>
        <on_poweroff>destroy</on_poweroff>
        <on_reboot>restart</on_reboot>
        <on_crash>destroy</on_crash>
        <devices>
                <emulator>/usr/libexec/libvirt_lxc</emulator>

                <filesystem type="mount">
                        <source dir="/usr/var/lib/lxc/foo/rootfs" />
                        <target dir="/" />
                </filesystem>

                <interface type="bridge">
                        <source bridge="br0" />
                        <name>eth0</name>
                        <ip address="10.171.73.128" netmask="255.255.255.0" />
                </interface>

                <console type='pty' tty='/dev/pts/3'>
                        <source path='/dev/pts/3' />
                        <target path='/dev/console' />
                </console>

                <serial type='pty' tty='/dev/pts/4'>
                        <source path='/dev/pts/4' />
                        <target path='/dev/tty1' />
                </serial>

        </devices>
</domain>

When starting the container with virsh start foo, the firt init process gets a local /dev/pts device, and it is inherited by its children:
[root at everest][~]# ps axf
25858 ?        Ss     0:00 /usr/libexec/libvirt_lxc --name foo --console 20 --security=selinux --handshake 23 --background --veth veth1
25859 pts/0    Ss+    0:00  \_ init
25870 ?        Ss     0:00      \_ /bin/syslogd
25872 ?        Ss     0:00      \_ /bin/getty -L tty1 115200 vt100
25873 ?        Ss     0:00      \_ init
[root at everest][~]# ls -l /proc/25872/fd
total 0
lrwx------. 1 root root 64 Mar 14 07:09 0 -> /dev/pts/0
lrwx------. 1 root root 64 Mar 14 07:09 1 -> /dev/pts/0
lrwx------. 1 root root 64 Mar 14 07:09 2 -> /dev/pts/0
[root at everest][~]# ls -l /proc/25873/fd
total 0
lrwx------. 1 root root 64 Mar 14 07:09 0 -> /dev/pts/0
lrwx------. 1 root root 64 Mar 14 07:09 1 -> /dev/pts/0
lrwx------. 1 root root 64 Mar 14 07:09 2 -> /dev/pts/0

What I tried to do in the .xml, and I would need, is a way to bind a local /dev/pts devices to child processes in the container. Explicitly:
- bind /dev/pts/3 to <container_rootfs>/dev/console
- bind /dev/pts/4 to <container_rootfs>/dev/tty1

I've found some documentation at [1], hence my trials in the presented .xml. Is my scenario possible / supported?

Thank you very much,
Bogdan P.

[1] http://libvirt.org/formatdomain.html#elementsConsole






More information about the libvir-list mailing list