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.
lxc-attach
(do roota systému) nebo lze sledovat kompletní bootovací proces s lxc-start
bez volby -d (–daemon)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).
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
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
# /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
# /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
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
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).
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.
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
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