LXD configuration for OSM Release THREE

From OSM Public Wiki
Jump to: navigation, search


LXD is a pure container hypervisor that runs unmodified Linux guest operating systems with VM-style operations at incredible speed and density. This makes it particularly well-suited for developing complex systems. This can be used to install OSM without tainting your host system with its dependencies. OSM modules will be running in LXD containers, thus not affecting your host system.

Configuring LXD

The current installation is intended to be used with the Ubuntu 16.04 LTS.

Installing LXD

Install the lxd package:

sudo apt-get update
sudo apt-get install -y lxd
newgrp lxd                   # required to log the user in the lxd group if lxd was just installed

Configure LXD with a bridge for networking:

sudo lxd init
 Name of the storage backend to use (dir or zfs) [default=dir]:
 Would you like LXD to be available over the network (yes/no) [default=no]?
 Do you want to configure the LXD bridge (yes/no) [default=yes]?
   Do you want to setup an IPv4 subnet? Yes
      Default values apply for next questions
   Do you want to setup an IPv6 subnet? No
 LXD has been successfully configured.

Network Bridge

By default, LXD creates a bridge named lxdbr0.

Although further customization is possible, default options for LXD bridge configuration will work.


Check the MTU of the LXD bridge (lxdbr0) and the MTU of the default interface. If they are different, change the default MTU of the containers. This might be required, for instance, when running OSM in a VM on some Openstack distributions.

Note: In this example, we will assume that the default interface is ens3 and its MTU is 1446

lxc list                                              # This will drive initialization of lxdbr0
ip address show ens3                                  # In case ens3 is the default interface
ip address show lxdbr0
sudo lxc profile device set default eth0 mtu 1446     # Use the appropriate MTU value

Testing LXD

To test that your LXD installation is correct, try to deploy a container and run 'apt-get update' from inside:

lxc launch ubuntu:16.04 test          # Create a container based on Ubuntu 16.04 with name 'test'
lxc exec test bash                    # Access the container
root@test:~# apt-get update           # Run command 'apt-get update' from inside the container
root@test:~# exit                     # Exit from the container
lxc stop test                         # Stop the container
lxc delete test                       # Delete the container

LXD within LXD (optional, only for advanced users)

While OSM installer won't install any dependencies in the system, it will add a minimal configuration (NAT rules and routes) in your host system to work properly. If you want to avoid that minimal configuration, you might be interested in using LXD within LXD. You can create a LXD container in the host (host container) which will run LXD again. OSM modules will run in LXD containers inside the host container. This is called also called nesting.

As illustrated below, your Host System (a laptop, a virtual machine, etc), you launch the Host Container, with nesting enabled. Inside the Host Container, we'll launch the containers for OSM: SO, RO, and VCA.

|                              Host System                                       |
|                                                                                |
|                              eth0:                               |
|                                                                                |
| +----------------------------------------------------------------------------+ |
| |                          +----------v-----------+                          | |
| |                          | Host Container       |                          | |
| |                          |                      |                          | |
| |                          | eth0:      |                          | |
| |                          | lxdbr0: |                          | |
| |            +-------------+----------+-----------+------------+             | |
| |            |                        |                        |             | |
| |            |                        |                        |             | |
| | +----------v-----------+ +----------v-----------+ +----------v-----------+ | |
| | | SO-ub                | | RO                   | | VCA                  | | |
| | |                      | |                      | |                      | | |
| | | eth0: | | eth0: | | eth0: | | |
| | |                      | |                      | | lxdbr0:  | | |
| | +----------------------+ +----------------------+ +----------------------+ | |
| +----------------------------------------------------------------------------+ |

Please note that the IP addresses used in the diagram above and instructions below will vary. Please replace these IP addresses with the ones on your system.

Prepare the host system

You need to configure LXD in you host system, following the same steps indicated above.

Launch the Host Container

Launch a container to host the OSM installation:

lxc launch ubuntu:16.04 osmr3 -c security.privileged=true -c security.nesting=true

Resource Limits

Setting limits will prevent any process from using an unexpected amount of resources. Here, we'll set the resource limits to OSM Release 2's recommended minimum resources:

lxc config set osmr3 limits.cpu 4
lxc config set osmr3 limits.memory 8GB

Configuring the Host Container

First, make sure the container is fully updated:

lxc exec osmr3 bash
sudo apt update
sudo apt upgrade

Next, initialize LXD inside the host container. Unless otherwise noted, the defaults will work fine. ZFS won't work inside a container, but that's okay; we've set it up on the host machine.

sudo lxd init
 Do you want to configure a new storage pool (yes/no) [default=yes]? 
 Name of the new storage pool [default=default]: 
 Name of the storage backend to use (dir, btrfs, lvm, zfs) [default=zfs]: dir
 Would you like LXD to be available over the network (yes/no) [default=no]? 
 Would you like stale cached images to be updated automatically (yes/no) [default=yes]? 
 Would you like to create a new network bridge (yes/no) [default=yes]? 
 What should the new bridge be called [default=lxdbr0]? 
 What IPv4 address should be used (CIDR subnet notation, “auto” or “none”) [default=auto]? 
 What IPv6 address should be used (CIDR subnet notation, “auto” or “none”) [default=auto]? none
 LXD has been successfully configured.

Continue with the Release THREE installation, and return to this page once the installation is complete.


All containers within the osmr3 container will be assigned an IP address from the lxdbr0 interface inside the Host Container. The steps below will route traffic destined for the OSM containers through the osmr3 container's primary interface.

Get the bridge and network IP of osmr3

From the Host Machine, get the two IPv4 addresses for the osmr3 container: one for the lxdbr0 interface inside the Host Container, and one from the Host Machine. This tells us where to route the traffic to the network inside the Host Container.

lxc list osmr3
| NAME  |  STATE  |              IPV4              | IPV6 |    TYPE    | SNAPSHOTS |
| osmr3 | RUNNING | (lxdbr0)          |      | PERSISTENT | 0         |
|       |         | (eth0)               |      |            |           |

Route traffic from the Host Machine to the Host Container

route add -net gw

You should now be able to connect to the SO in your browser. Open up and verify you can reach the OSM Launchpad.


Unable to launch nested container

If the installation fails with an error message similar to this:

Creating RO
Starting RO           
error: Error calling 'lxd forkstart RO /var/lib/lxd/containers /var/log/lxd/RO/lxc.conf': err='exit status 1'
  lxc 20170530162611.740 ERROR lxc_apparmor - lsm/apparmor.c:apparmor_process_label_set:234 - No such file or directory - failed to change apparmor profile to lxd-coherent-reptile_//&:lxd-RO <var-lib-lxd>:
  lxc 20170530162611.740 ERROR lxc_sync - sync.c:__sync_wait:57 - An error occurred in another process (expected sequence number 5)
  lxc 20170530162611.740 ERROR lxc_start - start.c:__lxc_start:1346 - Failed to spawn container "RO".
  lxc 20170530162612.281 ERROR lxc_conf - conf.c:run_buffer:405 - Script exited with status 1.
  lxc 20170530162612.281 ERROR lxc_start - start.c:lxc_fini:546 - Failed to run lxc.hook.post-stop for container "RO".

Try `lxc info --show-log local:RO` for more info.

There is a known issue if the version of LXD on your system is 2.12 or higher, where the default version of LXD (2.0.9) included in the Xenial cloud image conflicts with newer versions of LXD. In this case, you either need to downgrade your host machine's LXD to 2.0.9, or wait for the release of 2.0.10, which fixes this version conflict.