LXC su ArchLinux

LXC (abbreviazione di Linux Containers) è un ambiente di virtualizzazione a container, che opera a livello del sistema operativo e permette di eseguire diversi ambienti Linux virtuali isolati tra loro (container) su una singola macchina reale avente il kernel Linux.

I conteniner sono più simili a un chroot avanzato che a una virtualizzazione completa come Qemu o VMware, in quanto non emulano le componenti hardware e condividono il medesimo kernel dell’host. I contenitori sono simili alle zone Solaris o alle jail BSD. Linux-vserver e OpenVZ sono due implementazioni preesistenti, sviluppate in maniera indipendente, di funzionalità del tipo contenitore per Linux. In effetti i contenitori hanno avuto origine dal lavoro in upstream delle funzionalità vserver e OpenVZ.

Installazione

Per proceder alle configurazioni riportate di seguito su archlinux si possono installare i pacchetti necessari con il comando :

pacman -S lxc arch-install-scripts dnsmasq netctl haveged

Configurazione

NB: la procedura che segue è server per gestire container non privilegiati, allo scopo di garantire una mggiore sicurezza.

Configurazione dell’host

Per permettere l’esecuzione di conteiner non privilegiati è necessario che l’opzione del kernel CONFIG_USER_NS sia abilitata, su archlinux lo è di default.

Rimane comunque da abilitare l’opzione su sysctl, quindi creare il file:

/etc/sysctl.d/lxc.conf

----

kernel.unprivileged_userns_clone=1

Configurazione del demone

Per il demone è necessatio configurare la mappatura tra uid e gid del container e quelli del sistema host, editando i seguenti file:

/etc/lxc/default.conf

---

lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 65536
/etc/subuid

----

root:100000:65536
/etc/subgid

----

root:100000:65536

NB : durante il deploy di un container è possibile incontrare rallentamenti o errori dovuti all’inizializzazione delle chiavi GPG

per ovviare a questo problema è consigliabile abilitare e avviare il demone haveged

Configurazione di rete

Lxc supporta diversi tipi di rete virtuali, vedere lcx.container.conf

Rete interna

/etc/default/lxc-net

---

# Leave USE_LXC_BRIDGE as "true" if you want to use lxcbr0 for your
# containers.  Set to "false" if you'll use virbr0 or another existing
# bridge, or mavlan to your host's NIC.
USE_LXC_BRIDGE="true"

# If you change the LXC_BRIDGE to something other than lxcbr0, then
# you will also need to update your /etc/lxc/default.conf as well as the
# configuration (/var/lib/lxc/<container>/config) for any containers
# already created using the default config to reflect the new bridge
# name.
# If you have the dnsmasq daemon installed, you'll also have to update
# /etc/dnsmasq.d/lxc and restart the system wide dnsmasq daemon.
LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
LXC_DHCP_MAX="253"
# Uncomment the next line if you'd like to use a conf-file for the lxcbr0
# dnsmasq.  For instance, you can use 'dhcp-host=mail1,10.0.3.100' to have
# container 'mail1' always get ip address 10.0.3.100.
#LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf

# Uncomment the next line if you want lxcbr0's dnsmasq to resolve the .lxc
# domain.  You can then add "server=/lxc/10.0.3.1' (or your actual $LXC_ADDR)
# to your system dnsmasq configuration file (normally /etc/dnsmasq.conf,
# or /etc/NetworkManager/dnsmasq.d/lxc.conf on systems that use NetworkManager).
# Once these changes are made, restart the lxc-net and network-manager services.
# 'container1.lxc' will then resolve on your host.
#LXC_DOMAIN="lxc"

Host Bridge

Creazione del bridge

Per creare un bridge usando netctl si parte copiando il template :

/etc/netctl/lxcbr1 

---

Description="lxc Bridge connection"
Interface=lxcbr1
Connection=bridge
BindsToInterfaces=(enp1s0)
IP=dhcp
## Ignore (R)STP and immediately activate the bridge
#SkipForwardingDelay=yes

dopo di che è necessario disabilitare la configurazione automatica dell’interfaccia enp1s0, se presente.

NB: al posto di enp1s0 bisgona inserire il nome della propria interfaccia

Successivamente bidogna abilitare il bridge : ` netctl enable lxcbr1`

Al prossimo riavvio l’interfaccia sarà configurata.

Connettere un container al bridge

Per connetere un container al bridge è necessario modificare la conf di rete dello stesso nel suo file di configurazione:

/var/lib/lxc/container-name/config

---

lxc.net.0.link = lxcbr1

Gestione Container

Configurazione del container

In generale il file di configurazione del container si presenta:

/var/lib/lxc/playtime/config

---

# Template used to create this container: /usr/share/lxc/templates/lxc-archlinux
# Parameters passed to the template:
# For additional config options, please look at lxc.container.conf(5)

## default values
lxc.rootfs.path = /var/lib/lxc/playtime/rootfs
lxc.uts.name = playtime
lxc.arch = x86_64
lxc.include = /usr/share/lxc/config/common.conf

## network
lxc.net.0.type = veth
lxc.net.0.link = br0
lxc.net.0.flags = up
lxc.net.0.name = eth0
lxc.net.0.hwaddr = ee:ec:fa:e9:56:7d
# uncomment the next two lines if static IP addresses are needed
# leaving these commented will imply DHCP networking
#
#lxc.net.0.ipv4.address = 192.168.0.3/24
#lxc.net.0.ipv4.gateway = 192.168.0.1

Comandi utili

creare un container

lxc-create -t download -n CONTAINER_NAME

stampare la lista dei container

lxc-ls -f

avviare un container

lxc-start -n CONTAINER_NAME

Systemd può essere usato per gestire un container: start,stop e enable,disable systemctl commad lxc@CONTAINER_NAME.service

fermare un container

lxc-stop -n CONTAINER_NAME

login su un container lxc-console -n CONTAINER_NAME

attach a un container

lxc-attach -n CONTAINER_NAME --clear-env

Riferimenti

  • https://it.wikipedia.org/wiki/LXC
  • https://wiki.debian.org/LXC/SimpleBridge
  • https://wiki.debian.org/LXC/
  • https://wiki.archlinux.org/index.php/Bridge_with_netctl
  • https://wiki.archlinux.org/index.php/Linux_Containers
  • https://help.ubuntu.com/lts/serverguide/lxc.html