\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{ven. nov. 25 10:06:46 CET 2016}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={lxc.container.conf-2.0.5},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Fichiers de configuration de conteneur pour LXC},
CreationDate={D:20161125100646},
ModDate={D:20161125100646},
Keywords={Linux;Linux configuration;cgroups;lxc}
}}
\begin{document}
 
\begin{center}
{\Huge lxc.container.conf-2.0.5 }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Fichiers de configuration de conteneur pour LXC}
 
\vspace{10mm}
 
\hspace{1mm}  Les conteneurs linux sont toujours créé avant être utilisés. Cette création définis un jeu de ressources système à virtualiser/isoler quand un processus utilise le conteneur. Par défaut, les pid, sysv ipc et points de montage sont virtualisés et isolés. Les autres ressources système sont partagées entre les conteneurs, tant qu'ils sont explicitement définis dans la configuration.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Configuration }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} lxc.include]{Spécifie un fichier de configuration à inclure}
\item[\hspace{1mm} lxc.arch]{Autoriser un jeu d'architectures pour le conteneur, par exemple lancer des binaires 32bits dans un hôte 64bits}
\item[\hspace{1mm} lxc.utsname]{Spécifie le hostname pour le conteneur}
\item[\hspace{1mm} lxc.haltsignal]{Spécifie un signal utilisé pour arrêter le conteneur (utilisé par lxc-stop) Défaut: SIGPWR}
\item[\hspace{1mm} lxc.rebootsignal]{Spécifie un signal utilisé pour redémarrer le conteneur (utilisé par lxc-stop) Défaut: SIGINT}
\item[\hspace{1mm} lxc.stopsignal]{Spécifie un signal utilisé pour stopper le conteneur (utilisé par lxc-stop) Défaut: SIGKILL}
\item[\hspace{1mm} lxc.init\_cmd]{Chemin absolu dans le rootfs du conteneur du binaire à utiliser comme init. Défaut: /sbin/init}
\item[\hspace{1mm} lxc.init\_uid]{UID à utiliser dans un namespace user pour init. Défaut: 0}
\item[\hspace{1mm} lxc.init\_gid]{GID à utiliser dans un namespace user pour init. Défaut: 0}
\item[\hspace{1mm} lxc.ephemeral]{(bool) Spécifie si un conteneur est détruit à l'arrêt}
\item[\hspace{1mm} lxc.network]{Peut être utilisé sans valeur pour supprimer toutes valeurs précédentes.}
\item[\hspace{1mm} lxc.network.type]{Spécifie le type de réseau à utiliser pour le conteneur. Chaque fois qu'un lxc.network.type est trouvé, une nouvelle configuration réseau commence et permet de définir plusieurs types de réseaux:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} none]{Le conteneur partage l'espace réseau de l'hôte}
\item[\hspace{6mm} empty]{Ne créé que l'interface loopback}
\item[\hspace{6mm} veth]{Créé une paire ethernet virtuel, dont la partie dans l'hôte est attaché à un bridge.}
\item[\hspace{6mm} vlan]{interface vlan lié avec l'interface}
\item[\hspace{6mm} macvlan]{lie une interface macvlan}
\item[\hspace{6mm} phys]{Une interface déjà existante est assignée au conteneur}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} lxc.network.vlan.id]{Pour le type vlan, indique le numéro du vlan}
\item[\hspace{1mm} lxc.network.flags]{Àction à prendre pour le réseau (up=active l'interface)}
\item[\hspace{1mm} lxc.network.link]{Spécifie l'interface à utiliser pour le trafic réseau réel (type phys ou macvlan)}
\item[\hspace{1mm} lxc.network.mtu]{mtu max pour cette interface}
\item[\hspace{1mm} lxc.network.name]{Nom de l'interface}
\item[\hspace{1mm} lxc.network.hwaddr]{Adresse mac pour l'interface virtuelle}
\item[\hspace{1mm} lxc.network.ipv4]{IPv4 de l'interface}
\item[\hspace{1mm} lxc.network.ipv4.gateway]{passerelle de l'interface}
\item[\hspace{1mm} lxc.network.ipv6]{IPv6 pour l'interface}
\item[\hspace{1mm} lxc.network.ipv6.gateway]{Passerelle ipv6 pour l'interface}
\item[\hspace{1mm} lxc.network.script.up]{script à exécuter après la création/configuration de l'interface (côté hôte).}
\item[\hspace{1mm} lxc.network.script.down]{script à exécuter après la avant de détruire l'interface (côté hôte).}
\item[\hspace{1mm} lxc.pts]{Si définis, le conteneur aura une nouvelle instance de pseudo tty. La valeur spécifie le nombre de tty permis.}
\item[\hspace{1mm} lxc.console.logfile]{Chemin vers un fichier où la sortie de la console est écrite}
\item[\hspace{1mm} lxc.console]{Chemin vers un périphérique auquel la console est attachée. Option dangereuse.}
\item[\hspace{1mm} lxc.tty]{Spécifie le nombre de tty à rendre disponible dans le conteneur}
\item[\hspace{1mm} lxc.devttydir]{Spécifie un répertoire sous /dev sous lequel créer les périphériques de console du conteneur. les pty Unix98 sont créés sur l'hôte et lié dans les périphériques attendus dans le conteneur. Par défaut, il sont liés sur /dev/console et /dev/ttyN. Cela peut empêcher des misesà jours. En changeant d'emplacement sous /dev, ils seront liés symboliquement.}
\item[\hspace{1mm} lxc.autodev]{Par défaut lxc ne créé que quelques liens symboliques dans /dev du conteneur (fd,stdin,stdout,stderr) ais ne créé pas automatiquement les entrées de périphérique. À 1, lxc monte un nouveau tmpfs sous /dev (limité à 500k) et définis les périphériques minimum requis. À 0, empêche de monter et remplir /dev}
\item[\hspace{1mm} lxc.kmsg]{Active /dev/kmrsg comme lien vers /dev/console. Défaut: 0}
\item[\hspace{1mm} lxc.mount]{Les points de montage sont privés au conteneur. Spécifie l'emplacement d'un fichier fstab contenant les informations de montage.}
\item[\hspace{1mm} lxc.mount.entry]{Spécifie un point de montage correspondant à une ligne dans le fichier fstab}
\item[\hspace{1mm} lxc.mount.auto]{Spécifie quels systèmes de fichiers kernel devraient être automatiquement montés:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} proc:mixed]{/proc est monté en rw, mais /proc/sys et /proc/sysrq-trigger sont montés en ro}
\item[\hspace{6mm} proc:rw]{/proc est monté en rw}
\item[\hspace{6mm} sys:mixed]{/sys en ro, /sys/devices/virtual/net en rw}
\item[\hspace{6mm} sys:ro]{monté en ro}
\item[\hspace{6mm} sys:rw]{monté en rw}
\item[\hspace{6mm} cgroup:mixed]{Monte un tmpfs sous /sys/fs/cgroup, créé les répertoires pour toutes les hiérarchies auquel le conteneur est ajouté, créé les sous-répertoires avec le nom du cgroup, et mount le cgroup du conteneur dans ce répertoire. Le conteneur sera capable d'écrire dans son propre cgroup mais pas les parents, vu qu'ils sont remontés en ro}
\item[\hspace{6mm} cgroup:ro]{tout en ro}
\item[\hspace{6mm} group:rw]{en rw}
\item[\hspace{6mm} cgroup-full:mixed]{Un peu plus simplifié que cgroup:mixed, peut laisser fuiter des information dans le conteneur.}
\item[\hspace{6mm} group-full:ro]{tout en ro}
\item[\hspace{6mm} cgroup-full:rw]{tout en rw}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} lxc.rootfs]{Emplacement du système de fichier racine pour le conteneur. Peut être un fichier image, un répertoire, ou un périphériques block. Non spécifié, partage celui de l'hôte}
\item[\hspace{1mm} lxc.rootfs.mount]{Où monter récursivement lxc.rootfs avant le pivot.}
\item[\hspace{1mm} lxc.rootfs.options]{Options de montage supplémentaires pour rootfs}
\item[\hspace{1mm} lxc.rootfs.backend]{Spécifie le type de backend rootfs à utiliser (dir, zfs,...).}
\item[\hspace{1mm} lxc.cgroup.\texttt{[}subsystem name\texttt{]}]{Spécifie la valeur cgroup à définir.}
\item[\hspace{1mm} lxc.cap.drop]{Capabilities à supprimer dans le conteneur, sans le préfix CAP.}
\item[\hspace{1mm} lxc.cap.keep]{Spécifie la capabilitie à conserver dans le conteneur. none supprime toutes les capabilities}
\item[\hspace{1mm} lxc.aa\_profile]{Spécifie le profile apparmor sous lequel le conteneur devrait fonctionner. unconfined désactive apparmor. unchanged conserve le profile du conteneur parent.}
\item[\hspace{1mm} lxc.aa\_allow\_incomplete]{les profiles apparmor sont basés sur des chemins. Donc des restrictions de fichier nécessitent des restrictions de montage. Cependant, ces restrictions de montage ne sont pas encore implémentées dans le kernel. À 0, le conteneur n'est pas démarré si le kernel n'a pas les fonctions de montage apparmor, donc un regression après une mise à jours kernel sera détectée.}
\item[\hspace{1mm} lxc.se\_context]{Spécifie le contexte SELinux sous lequel le conteneur devrait être lancé ou unconfined\_t. (ex: system\_u:system\_r:lxc\_t:s0:c22)}
\item[\hspace{1mm} lxc.seccomp]{Spécifie un fichier contenant la configuration seccomp à charger avant que le conteneur démarre.}
\item[\hspace{1mm} lxc.id\_map]{Un conteneur peut être démarré dans un namespace user privé avec un mappage. Contient 4 champs séparés par des espaces:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} 1]{'u', 'g', ou 'b' pour both}
\item[\hspace{6mm} 2]{L'UID/GID vu dans le namespace}
\item[\hspace{6mm} 3]{L'UID/GID vu dans l'hôte}
\item[\hspace{6mm} 4]{Le nombre d'uid/gid consécutifs à mapper}
\end{description}
 
\vspace{1cm}{\huge hooks }
 
\
 
\hspace{1mm}  Les hooks de conteneur sont des programmes ou des scripts qui peuvent être exécutés à divers moments dans la durée de vie d'un conteneur. Quand un hook est exécuté, des informations sont passées en argument et via les variables d'environnement:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} -]{Le nom du conteneur}
\item[\hspace{6mm} -]{Section (toujours 'lxc')}
\item[\hspace{6mm} -]{Type de hook (ex: 'clone' ou 'pre-mount')}
\item[\hspace{6mm} -]{Arguments additionnels.}
\item[\hspace{6mm} LXC\_NAME]{Nom du conteneur}
\item[\hspace{6mm} LXC\_ROOTFS\_MOUNT]{Chemin du rootfs monté}
\item[\hspace{6mm} LXC\_CONFIG\_FILE]{Chemin du fichier de configuration de conteneur}
\item[\hspace{6mm} LXC\_SRC\_NAME]{Dans le cas d'un hook clone, c'est le nom du conteneur original}
\item[\hspace{6mm} LXC\_ROOTFS\_PATH]{valeur de lxc.rootfs pour le conteneur}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} lxc.hook.pre-start]{Un hook à lancer dans l'espace de nom de l'hôte avant que le ttys du conteneur, consoles ou mountages soient effectués.}
\item[\hspace{1mm} lxc.hook.pre-mount]{Un hook à lancer dans l'espace de nom fs du conteneur avant que le rootfs ne soit up. Permet la manipulation du rootfs (ex: fs chiffré)}
\item[\hspace{1mm} lxc.hook.mount]{Un hook à lancer dans l'espace de nom du conteneur après que le montage ait été effectué, mais avant le pivot\_root}
\item[\hspace{1mm} lxc.hook.autodev]{Un hook à lancer dans l'espace de nom du conteneur après que le montage ait été effectué, mais avant le pivot\_root si lxc.autodev == 1. Permet d'assister le remplissage de /dev}
\item[\hspace{1mm} lxc.hook.start]{Un hook à lancer dans l'espace de nom du conteneur immédiatement après l'exécution du init. Nécessite un programme dans le conteneur}
\item[\hspace{1mm} lxc.hook.stop]{Un hook à lancer dans l'espace de nom de l'hôte après que le conteneur ait été éteind. Pour chaque espace de nom un argument est passé au hook contenant le type de namespace et un fichier qui peut être utilisé pour obtenir un fd vers le namespace correspondant.}
\item[\hspace{1mm} lxc.hook.post-stop]{Un hook à lancer dans l'espace de nom de l'hôte après que le conteneur ait été stoppé.}
\item[\hspace{1mm} lxc.hook.clone]{Un hook à lancer quand le conteneur est cloné.}
\item[\hspace{1mm} lxc.hook.destroy]{Un hook à lancer quand le conteneur est détruit}
\end{description}
 
\hspace{1mm}  Des variables d'environnement sont disponible aux hooks pour fournir des informations de configuration. Toutes les variables ne sont pas valides dans tous les contextes. En particulier, tous les chemins sont relatifs au système hôte et donc non valides durant lxc.hook.start
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} LXC\_NAME]{Nom du conteneur}
\item[\hspace{1mm} LXC\_CONFIG\_FILE]{Chemin du fichier de configuration de conteneur}
\item[\hspace{1mm} LXC\_CONSOLE]{Chemin de la console de sortie du conteneur si non null}
\item[\hspace{1mm} LXC\_CONSOLE\_PATH]{Chemin de la console de sortie de log du conteneur si non null}
\item[\hspace{1mm} LXC\_ROOTFS\_MOUNT]{Chemin du rootfs monté dans l'hôte}
\item[\hspace{1mm} LXC\_ROOTFS\_PATH]{Valeur de lxc.rootfs pour le conteneur}
\item[\hspace{1mm} LXC\_SRC\_NAME]{Dans le cas d'un hook clone, c'est le nom du conteneur original}
\item[\hspace{1mm} LXC\_TARGET]{Seulement pour le hook stop. Vaut stop ou reboot}
\item[\hspace{1mm} LXC\_CGNS\_AWARE]{Non définis, cette version de lxc ne gère pas les namespaces cgroup. Ne garantit pas que ces namespaces sont activés dans le kernel.}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} lxc.loglevel]{Niveau de log de 0 (trace) à 8 (fatal)}
\item[\hspace{1mm} lxc.logfile]{Fichier où logger les infos}
\item[\hspace{1mm} lxc.start.auto]{(bool) Indique si le conteneur devrait être auto-démarré.}
\item[\hspace{1mm} lxc.start.delay]{Délai d'attente avant que le conteneur suivant ne soit démarré}
\item[\hspace{1mm} lxc.start.order]{Un entier utilisé pour trier les conteneurs durant l'auto-démarrage}
\item[\hspace{1mm} lxc.monitor.unshare]{Si non 0, le namespace de montage sera non partagé avec l'hôte avant l'initialisation du conteneur (avant le hook pre-start). Nécessite CAP\_SYS\_ADMIN.}
\item[\hspace{1mm} lxc.group]{Clé multivalué pour placer le conteneur dans un groupe.}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} lxc.environment]{Permet de passer des variables d'environnement au conteneur. Noter que ces variables sont visibles dans l'hôte dans /proc/PID/environ}
\end{description}
 
\vspace{1cm}{\huge Exemples de configuration }
 
\
 
\hspace{1mm} Exemple de configuration réseau:
 
{\ttfamily
lxc.utsname = myhostname\\ lxc.network.type = veth\\ lxc.network.flags = up\\ lxc.network.link = br0\\ lxc.network.name = eth0\\ lxc.network.hwaddr = 4a:49:43:49:79:bf\\ lxc.network.ipv4 = 10.2.3.5/24 10.2.3.255\\ lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3597\\
}
\vspace{8mm}
 
\hspace{1mm} uid/gid mapping
 
{\ttfamily
lxc.id\_map = u 0 100000 10000\\ lxc.id\_map = g 0 100000 10000\\
}
\vspace{8mm}
 
\hspace{1mm} cgroup
 
{\ttfamily
lxc.cgroup.cpuset.cpus = 0,1\\ lxc.cgroup.cpu.shares = 1234\\ lxc.cgroup.devices.deny = a\\ lxc.cgroup.devices.allow = c 1:3 rw\\ lxc.cgroup.devices.allow = b 8:0 rw\\
}
\vspace{8mm}
 
\hspace{1mm} Exemple de configuration complexe:
 
{\ttfamily
lxc.utsname = complex\\ lxc.network.type = veth\\ lxc.network.flags = up\\ lxc.network.link = br0\\ lxc.network.hwaddr = 4a:49:43:49:79:bf\\ lxc.network.ipv4 = 10.2.3.5/24 10.2.3.255\\ lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3597\\ lxc.network.ipv6 = 2003:db8:1:0:214:5432:feab:3588\\ lxc.network.type = macvlan\\ lxc.network.flags = up\\ lxc.network.link = eth0\\ lxc.network.hwaddr = 4a:49:43:49:79:bd\\ lxc.network.ipv4 = 10.2.3.4/24\\ lxc.network.ipv4 = 192.168.10.125/24\\ lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596\\ lxc.network.type = phys\\ lxc.network.flags = up\\ lxc.network.link = dummy0\\ lxc.network.hwaddr = 4a:49:43:49:79:ff\\ lxc.network.ipv4 = 10.2.3.6/24\\ lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3297\\ lxc.cgroup.cpuset.cpus = 0,1\\ lxc.cgroup.cpu.shares = 1234\\ lxc.cgroup.devices.deny = a\\ lxc.cgroup.devices.allow = c 1:3 rw\\ lxc.cgroup.devices.allow = b 8:0 rw\\ lxc.mount = /etc/fstab.complex\\ lxc.mount.entry = /lib /root/myrootfs/lib none ro,bind 0 0\\ lxc.rootfs = /mnt/rootfs.complex\\ lxc.cap.drop = sys\_module mknod setuid net\_raw\\ lxc.cap.drop = mac\_override\\
}
\vspace{8mm}
\end{flushleft}
\end{document}
