Obsah

LXC

LXC (Linux Containers) je zástupce kontejnerové virtualizace (Virtualizace na úrovni operačního systému). Je to prostředí pro běh více vzájemně izolovaných linuxových systémů na jednom linuxovém hostiteli. Vytváří prostředí, které má své vlastní procesy a síťové prostředí.

LXC pracuje s originálním linuxovým jádrem (kernelem), čímž se liší od OpenVZ (a podobných) potřebují vlastní upravenou verzi jádra.

LXC začíná být rozumně použitelné od jádra verze 3.8 (vydáno v únoru 2013; lépe však od verze 3.12), protože předtím zde byl velký bezpečnostní nedostatek, kdy root kontejnerovaného systému musel vystupoval jako root systému hostitelského. Od verze jádra 3.8 je už možné vytvářet kontejnery jako „neprivilegované“, tj. root kontejneru běží v hostiteli pod běžným účtem. Přesto stále zůstává potenciální nebezpečí pro ohrožení hostitelského systému 1), takže při potřebě mít naprosto izolované kontejnery, je lepší použít OpenVZ (které toto díky své modifikaci jádra má vyřešené). Toto riziko je ale stále jen potenciální, takže náklonost OpenVZ platí především pro poskytovatele veřejných kontejnerových VPS. Pokud kontejnerové systémy i hostitele spravuje jeden správce, není v tomto ohledu LXC špatnou volbou.

LXC se ve vezi 1.0 představilo v únoru 2014.

Slovíčka

Přístup na virtualizované stroje

Adreáře

Cheatsheet

apt-get install lxc
# instaluje obslužné ''lxc-*'' nástroje (samotné lxc je součástí jádra)

Nyní je vhodné spustit lxc-checkconfig a zkontrolovat konfiguraci hostitele. Dále by mohl být správný čas nachystat si /etc/lxc/default.conf, kde nastavují hodnoty, které budou mít vytvářené kontejnery (síťování, případně pro unprivileged users).

Vytvoření kontejneru

Příkaz lxc-create nabídne interaktivní prostředí, kde je třeba si vybrat distribuci (a jeho verzi a architekturu). Zde je potřeba si rozmyslet, zda budeme provádět následující pod rootem nebo ne (privileged vs. unprivileged2)). Vytvoří kořenový file systém (rootfs) kontejneru a provede template skript.:

lxc-create -t download -n server4

Pro lxc do verze 4 včetně je potřeba předefinovat GPG keyserver (původní není dostupný kvůli GDPR problémům). Náhradní server keyserver.ubuntu.com byl dočasně používán a později bylo GPG ověřování vyřazeno.

lxc-create -t download -n server4 -- --keyserver hkp://keyserver.ubuntu.com

Nastavení sítě

Nastavuji hostitelskou síťovku jako brigde3) (možností je více4)). Kontejner tedy bude na stejné síti jako hostitel. Hostitel bude potřebovat balík bridge-utils.

Nastavení hostitele:

# /etc/network/interfaces (na hostiteli)
auto lo
iface l0 inet loopback

auto br0 # name of the device
iface br0 inet static # or dhcp
    # bridge information
    bridge_ports eth0 # interface to use
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0
    # staticka IP hostitele a nastaveni site
    address 192.168.0.200
    netmask 255.255.255.0
    gateway 192.168.0.1
    dns-nameservers 8.8.8.8

Nastavení sítě pro kontejner

# /var/lib/lxc/ct/config (na hostiteli)

lxc.net.0.type = veth
lxc.net.0.link = virbr0 # bridge name
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:1e:9e:2a # lepe nastavit jinak bude se pri kazdem startu znovu vygeneruje jina
lxc.net.0.ipv4.address = 192.168.0.201/24
lxc.net.0.ipv4.gateway = 192.168.0.1
# /var/lib/lxc/server4/rootfs/etc/network/interfaces (na hostiteli)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual
# /var/lib/lxc/server4/rootfs/etc/resolv.conf (na hostiteli)
nameserver 192.168.0.1

ubuntu kontejner ma nainstalován resolvconf, se kterým se pracuje trochu jinak. Místo definování DNS resolveru v resolv.conf je potřeba jej dfinovat v interfaces, protom tedy to vypadá takto nějak:

auto eth0
iface eth0 inet manual
  dns-nameservers 192.168.2.1

Nastavení hostitele

# /etc/lxc/default.conf - podle tohoto souboru se vytvori kontejner


# pro neprivilegovany kontejner:
#lxc.id_map = u 0 100000 10000
#lxc.id_map = g 0 100000 10000
# za lxc.id_map nasleduji ctyri parametry:
#   u = uid, g = gid
#   0 = v kontejneru  se bude mapovat od tohoto uid/gid
#   100000 = odtud se bude mapovat v hostiteli
#   10000 = tolik uid/gid je možné mapovat
# tedy v kontejneru se bude mapovat 0 až 9999 na 100000 až 109999
# cislo 100000 je tedy pro jednoho hostitelskeho uzivatele, jini by meli mit 
# jine, aby to nekolidovalo (vice kontejneru muze mit stejne?)

# pro sit
lxc.net.0.type = veth
lxc.net.0.link = virbr0 # bridge name
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:1e:9e:2a # lepe nastavit jinak bude se pri kazdem startu znovu vygeneruje jina
lxc.net.0.ipv4.address = 192.168.0.201/24
lxc.net.0.ipv4.gateway = 192.168.0.1

# autostart
lxc.start.auto = 1
lxc.start.delay = 2

Nastavení kontejneru

V první řadě se vypořádat s uživateli. Nastavit rootu heslo, případně vytvořit uživatele, doinstalovat sudo atp.

passwd

Dále doinstaluji co jsem shledal, že mi chybí v základním kontejnerovém systému

apt-get update && apt-get upgrade
apt-get install apt-listchanges apt-utils aptitude aptitude-common bash-completion cpio cron iputils-ping less nano openssh-server tasksel traceroute whiptail wget htop ntp rsync

LVM

LXC umí pracovat s LVM. Logický svazek (LV) si umí vytvořit sám během lxc-create. Určíme na kterém VG, jak veliký LV bude a jaký filesystém bude vytvořený. (default LV: dle názvu, VG:lxc, velikost:1G, fs:ext4).

Klonování

Pře klonováním (vytvořením kopie) je potřeba kopírovaný kontejner zastavit.

lxc-stop -n p1
lxc-clone -o p1 -n p2

S volbou overlayfs se nebude vytvářet plný klon, ale budou se u něj zaznamenávat jen přírůstky.

Snapshoty

Neprivilegovaný kontejner (unprivileged)

Kontejner může být vytvořený a spouštěný v hostiteli uživatelem root (kontejner je privilegovaný), nebo jinak, tedy že kontejner bude spouštěný pod jiným uživatelem (kontejner je neprivilegovaný). Rozdíl spočívá v potenciálním nebezpečí, že kontejnerový dokáže uniknout z kontejneru, jako root v hostiteli může napáchat fatální škody. Pokud by byl neprivilegovaný a podařilo se mu nějak z kontejneru uniknout (je to teoretická možnost a možná se to nikomu nikdy nepovede), mohl by páchat škody jen zcela omezeně (jako běžný uživatel serveru).

Neprivilegovaný konterner vytváříme upravením /etc/lxc/default.conf, kde se přidají řády lxc.id_map

Příkazy

lxc-ls --fancy 
lxc-start --name u1 --daemon
lxc-attach --name u1
lxc-info --name u1
lxc-stop --name u1
lxc-destroy --name u1
lxc-clone <source> <target>
lxc-destroy
lxc-execute -n <name> -- <command>  # Run command in new container
lxc-attach  -n <name> -- <command>  # Run command in running container
lxc-monitor    # Monitor containers for state changes
lxc-wait       # Wait for a state change
lxc-info       # Give details on a container
lxc-freeze
lxc-unfreeze
lxc-netstat
lxc-ps
lxc-create -t download -n server4 -- --dist debian --release jessie --arch amd64

UPDATE: Debian 11 v LXC

Nepoužívá networking.service, ale systemd-networkd, takže konfigurace IP probíhá na jiném místě. V config souboru kontejneru nemá význam, je potřeba nastavif konfiguraci v souboru /var/lib/lxc/kontejner/rootfs/etc/systemd/network/eth0.network (nebo podobný název souboru)

[Match]
Name=eth0
[Network]
Address=10.0.0.2/24
Gateway=10.0.0.1
DNS=10.0.0.1  

Odkazy