====== LXC ======
**LXC** (Linux Containers) je zástupce kontejnerové [[linux:virtualizace|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 ((dle: https://support.dce.felk.cvut.cz/mediawiki/index.php/LXC)), 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 =====
* **hostitel** (anglicky host)
* host (anglicky guest) = **kontejner** (container) = VE (virtual enviroment; virtuální prostředí)
* kontejnerová virtualizace = virtualizace na úrovni operačního systému
===== Přístup na virtualizované stroje =====
* jako na normální serverové stroje přes ssh
* případně přes ssh hostitele a ''lxc-attach'' (do roota systému) nebo lze sledovat kompletní bootovací proces s ''lxc-start'' bez volby -d (--daemon)
==== Adreáře ====
* /var/lib/lxc: contains a folder for each VE with a config and fstab file in it.
* /usr/lib/lxc/templates/lxc-*: contains the LXC templates which build the VE contents. (Basically shell scripts.)
* /etc/lxc/auto: When symlinking a VE’s config file here, it will autostart upon boot.
* /var/cache/lxc/download/
* /usr/share/lxc/
===== 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. unprivileged((Viz: https://help.ubuntu.com/lts/serverguide/lxc.html#lxc-unpriv))). //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 [[https://github.com/lxc/lxc/commit/f2a5d95d00a55bed27ef9920d67617cc75fecad8|keyserver.ubuntu.com byl dočasně používán]] a později bylo [[https://github.com/lxc/lxc/commit/58520263041b6864cadad96278848f9b8ce78ee9
|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 brigde((Viz: https://wiki.debian.org/LXC/SimpleBridge)) (možností je více((Viz: https://wiki.debian.org/LXC#Setup_networked_containers))). 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 ''[[linux:sudo|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 [[linux:lvm|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