Using Linux Containers (LXC) on Slackware

Published: 2021-01-21 | Last Updated: 2021-02-06 | ~5 Minute Read

Context

Ever since I started learning about containerized technologies and started playing with them I have been curious to know more about LXC.

This technology is not as popular as other containerization technologies, like Docker for example, however I think it’s worth exploring given the fact that its main dependency is the Linux kernel itself, so I thought I’d take a look at how it’s used on Slackware.

Base Configuration

Using LXC is already well documented in the Slackware documentation, so it should be fairly straight forward.

I will be using a system with the following specs for reference:

root@server:~ # cat /proc/cpuinfo | grep "model name" | uniq
model name      : Intel(R) Celeron(R) CPU  J1800  @ 2.41GHz
root@server:~ # uname -r 
5.10.4
root@server:~ # cat /proc/cpuinfo | grep "model name" | uniq
model name      : Intel(R) Celeron(R) CPU  J1800  @ 2.41GHz
root@server:~ # free -h | grep -E "Mem|total" | cut -d " " -f 11,15
 total
7.7Gi 

Network Bridge

First I created the network bridge:

root@server:~ # touch /etc/default/lxc-net
root@server:~ # echo USE_LXC_BRIDGE=\"true\" > /etc/default/lxc-net

Then started the service:

root@server:~ # /usr/libexec/lxc/lxc-net start

Then confirmed that the network interface had come up as expected:

root@server:~ # ifconfig lxcbr0
lxcbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.0.3.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:16:3e:00:00:00  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Container Creation

With the network ready, I simply executed the following command to create a container:

root@server:~ # release=14.2 MIRROR=http://mirrors.us.kernel.org/slackware lxc-create -n slack-nginx -t slackware -f /root/lxc-conf/slack-nginx.conf

Where the /root/lxc-conf/slack-nginx.conf file contains the following:

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0

That began the container creation with the packages specified in /usr/share/lxc/templates/lxc-slackware which took about 4 minutes.

At the end of the creation process we see:

Configuring...

Adding an etc/fstab that must be modified later with the
full path of the container's rootfs if you decide to move it.
Root default password is 'root', please change it!

Copying rootfs to /var/lib/lxc/slack-nginx/rootfs...

We can confirm the successful creation of the container by checking in /var/lib/lxc:

root@server:~ # ls /var/lib/lxc
slack-nginx/

Container Configuration

Now we can start our container as follows:

root@server:~ # lxc-start -n slack-nginx

We can confirm the state of the container now:

root@server:~ # lxc-ls --fancy
NAME        STATE   AUTOSTART GROUPS IPV4 IPV6 
slack-nginx RUNNING 0         -      -    -    

We are still missing an IP address assignment so we connect to the container:

root@server:~ # lxc-console -n slack-nginx

Connected to tty 1
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself


Welcome to Linux 5.10.4 (tty1)

slack-nginx login: root
Password: 
Linux 5.10.4.
You have mail.
root@slack-nginx:~#

This gives us access to the console as the root user. We can now perform the necessary network configuration:

root@server:~ # vi /etc/rc.d/rc.inet1.conf

We updated the USE_DHCP[0] field to say yes and saved the file.

Now we exit the shell by pressing <Ctrl-a> + q and then we restart the container:

root@server:~ # lxc-stop -n slack-nginx
root@server:~ # lxc-start -n slack-nginx

And now we can confirm that we have an IP address assigned successfully:

root@server:~ # lxc-ls --fancy
NAME        STATE   AUTOSTART GROUPS IPV4       IPV6 
slack-nginx RUNNING 0         -      10.0.3.241 -    

Just to be sure we’ll access the container again and make sure we can get out to the internet:

root@omega-dev:~ # lxc-console -n slack-nginx

Connected to tty 1
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself


Welcome to Linux 5.10.4 (tty1)

slack-nginx login: root
Password: 
Linux 5.10.4.
Last login: Thu Jan 21 16:16:33 +0000 2021 on /dev/tty1.
You have mail.
root@slack-nginx:~# slackpkg update gpg 

                        Downloading http://mirrors.us.kernel.org/slackware/slackware64-14.2/GPG-KEY...
--2021-01-21 16:17:52--  http://mirrors.us.kernel.org/slackware/slackware64-14.2/GPG-KEY
Resolving mirrors.us.kernel.org... 198.145.21.9, 2001:19d0:306:6:0:1994:3:14
Connecting to mirrors.us.kernel.org|198.145.21.9|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1572 (1.5K) [text/plain]
Saving to: '/tmp/slackpkg.VjDrtZ/gpgkey'

/tmp/slackpkg.VjDrtZ/gpgkey   100%[===============================================>]   1.54K  --.-KB/s    in 0s      

2021-01-21 16:17:52 (90.9 MB/s) - '/tmp/slackpkg.VjDrtZ/gpgkey' saved [1572/1572]

                        Slackware Linux Project's GPG key added

root@slack-nginx:~#

Excellent, so we’ve made our very own Slackware Linux container inside Slackware. We could now install any packages we like individually or perform a full Slackware installation with slackpkg install slackware64 from inside the container.

Container Resource Usage

So what’s so good about LXC or containers in general? Now that we have created our container we can check to see the amount of resources it takes the host system to run this container:

We can check how much space the container takes on the host system:

root@server:~ # du -hs /var/lib/lxc/slack-nginx/
211M    /var/lib/lxc/slack-nginx/

Of course as you add packages to to the container it will increase its total size on the host, however a 211 MB starting point is pretty good.

We can also see the actual resource usage of the container with the output from lxc-top:

Container                   CPU          CPU          CPU          BlkIO        Mem       KMem
Name                       Used          Sys         User          Total       Used       Used
slack-nginx                0.90         0.51         0.37     112.00 KiB   2.60 MiB 920.00 KiB
TOTAL 1 of 1               0.90         0.51         0.37     112.00 KiB   2.60 MiB 920.00 KiB

I will be exploring additional configuration changes in future posts to see how much more LXC can do.

Conclusion

I’m definitely excited about this as it is much simpler than creating a virtual machine and also uses much less resources on the host system.

I will be playing more with LXC as time goes on but for now a simple installation is what I wanted to share and we’ll build upon that in the future.