LXC container for lab environment.

Power of the containers (mainly based on docker) has been proved many, many times. But what in the scenario you have very, very limited resources in your virtual lab and lets say, small debian installation with very few GB of RAM and 1 CPU. With LXC you can use this resources in very convenient and efficient way, to build few separated environment that will serve services for you like DNS, DHCP or web server to provide easy file access in your VMware lab environment. All done in a way you like, as LXC provides full Linux OS in those separated environment. For every of them you can use apt to install and then configure application whatever you like.

I have found such very nice to use, especially with VMware environment, as such one VM (with many containers) can be with little configuration change cloned for many environments and adjusted in a way that is needed – in that sense, it can be duplicated and used several times without huge time effort.

At home lab, my favorite distribution to use is Debian, and so this configuration example is based on it.

  • Download and install Debian. I have found that net installation iso is very nice approach as it speeds up task to create USB bootable drive (350MB). Also installation time is short as Debian installer needs to download only small amount of packages (choose just CLI environment and SSH service, no GUI like gnome we do not really need)
  • Hopefully installed system has working IP address (DHCP). At this point, do not modify the network, just use it download necessary packages plus your favorite one.
    Packages you will need for Debian 11: apt-get install lxc libvirt0 libpam-cgfs bridge-utils uidmap libvirt-clients libvirt-daemon-system iptables ebtables dnsmasq-base libxml2-utils iproute2 — not necessary all needed, but better to be on safe site.
  • Lets configure bridge interface for communication containers with the word.
    Use ip a command to check network interfaces name (eno0 in this example)
    then edit:
    /etc/network/interfaces
    and set the file accordingly:
l@host:~$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

#auto eno0
#iface eno0 inet static
#	address 192.168.1.19
#	netmask 255.255.255.0
#	gateway 192.168.1.1

auto br0
iface br0 inet static
      bridge_ports eno0
      bridge_fd 0
      address 192.168.1.19
      netmask 255.255.255.0
      network 192.168.1.0
      broadcast 192.168.1.255
      gateway 192.168.1.1
      # dns-* options are implemented by the resolvconf package, if installed
      #dns-nameservers 8.8.8.8 1.1.1.1
      #dns-search your.search.domain.here

Change /etc/default/lxc-net to disable lxc bridge as we don’t really need it:

#USE_LXC_BRIDGE="true"
USE_LXC_BRIDGE="false"

LXC can create own bridge to use simply use NAT for containers.

Also edit /etc/lxc/default.conf, with the following:

cat /etc/lxc/default.conf 
lxc.net.0.type = veth
#lxc.net.0.link = lxcbr0
lxc.net.0.link = virbr0
lxc.net.0.flags = up

lxc.apparmor.profile = generated
lxc.apparmor.allow_nesting = 1

Restart network (/etc/init.d/networking restart). While you are doing that, it would be good to have console access to VM, there are many changes and it is likely that network won’t work at the first try. It would be good also to restart whole server and verify how it is working after.

Verify if bridge has created with command ip a
Try to ping gateway, other networks and verify also if br0 interface is reachable.

  • create first container and configure it:
lxc-create -n lxdeb1 -t debian -- -r stretch
lxc-start -n lxdeb1
lxc-attach lxdeb1  //check if you have access and if it is working fine; verify the network
cat /etc/network/interfaces
auto lo
iface lo inet loopback

#auto eth0
#iface eth0 inet dhcp

network/interfaces we are changing inside the container as we don’t really need that configuration, network interface will be configured by the container configuration (see below)

lxc-stop lxdeb1

Reconfigure container with our new br0 interface, file: /var/lib/lxc/lxdeb1/config: //modify lxdeb1 with yours container name.

## Network
lxc.uts.name = lxdeb1
lxc.net.0.type = veth
lxc.net.0.flags = up

## Network
lxc.utsname = containershostname
lxc.network.type = veth
lxc.network.flags = up

# that's the interface defined above in host's interfaces file
lxc.network.link = br0

# name of network device inside the container,
# defaults to eth0, you could choose a name freely
# lxc.network.name = lxcnet0 

lxc.network.hwaddr = 00:FF:AA:00:00:01

# the ip may be set to 0.0.0.0/24 or skip this line
# if you like to use a dhcp client inside the container
lxc.network.ipv4 = 192.168.1.110/24

# define a gateway to have access to the internet
lxc.network.ipv4.gateway = 192.168.1.1

lxc.apparmor.profile = generated
lxc.apparmor.allow_nesting = 1
lxc.rootfs.path = dir:/var/lib/lxc/unfiy/rootfs

# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf

# Container specific configuration
lxc.tty.max = 4
lxc.uts.name = unfiy
lxc.arch = amd64
lxc.pty.max = 1024

Above example from: https://wiki.debian.org/LXC/SimpleBridge#Host_device_as_bridge

Update config for our container

sudo lxc-update-config -c /var/lib/lxc/lxdeb1/config

If not error here, you can start container, attach to it and verify your network configuration, verify if container is reachable from your lab network.

That’s it. Now you can create few more containers and use it in a way you need in your lab.

Other necessary command:

sudo lxc-info lxdeb1

lxc-autostart lxdeb1

If autostart won’t work for you as expected (didn’t work for me) then just add to the container config file the following: lxc.start.auto = 1

Images list can be found here: https://uk.lxd.images.canonical.com/

Hope it was helpful, comments are very welcome.

No Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Free(BSD)
Search for duplicated files

This will be short (but hopefully I will find more time to show entire process to search duplicated files together with some examples). In case you are searching for duplicated files I can recommend two software which actually rocks in openSource world

Linux
2
“Gaming laptop”, steam link and rustdesk.

Not really related to this article, but just wanted to describe the situation.  Most of the time I am working on Linux or Mac. Not a big deal, but last year we bought my daughter a kind of gaming laptop. I am saying kind of, because IMHO there is no …

Azure
NFS issue, cannot be mounted or is not visible

The same kind of issue I have encountered numerous times while working across different environments and with various customers. The problem with NFS mounts connected from remote locations is so common. This issue extends beyond communication solely over WAN and also include connections between datacenters (DC) where we lack control …