Utiliser Gentoo et Calculate Linux

Installer et utiliser LXC sur Gentoo / Calculate Linux

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

conteneurs







Présentation de LXC





LXC, contraction de l’anglais LinuX Containers est un système de virtualisation, utilisant l'isolation comme méthode de cloisonnement au niveau du système d'exploitation. Il est utilisé pour faire fonctionner des environnements Linux isolés les uns des autres dans des conteneurs partageant le même noyau et une plus ou moins grande partie du système hôte. Le conteneur apporte une virtualisation de l'environnement d'exécution (Processeur, Mémoire vive, réseau, système de fichier… ) et non pas de la machine. Pour cette raison, on parle de « conteneur » et non de machine virtuelle.



Ce système est similaire aux autres systèmes de virtualisations au niveau du système d'exploitation comme openVZ.





Prérequis pour l'installation





Tout le long de l'article, j'ai utilisé une CSS (CalculateLinux Server Scratch), avec le noyau 3.14.22.





Partie kernel





LXC a besoin des fonctionnalités CGROUP du noyau linux.



Ces valeurs de configuration doivent être positionnées à y :



Code BASH :
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_CGROUPS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CPUSETS=y
CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
CONFIG_CGROUP_FREEZER=y
CONFIG_VETH=y
CONFIG_MACVLAN=y
CONFIG_MACVTAP=y
CONFIG_BRIDGE=y




On peut trouver ces valeurs via la commande suivante :



Code BASH :
zcat /proc/config.gz




Si tout n'est pas sur "y" :



Désactiver le FLAG minimal :

Code BASH :
echo "sys-kernel/calculate-sources -minimal" >> /etc/portage/package.use/custom




Puis réémerger le noyau :

Code BASH :
emerge -q sys-kernel/calculate-sources




Se rendre dans les sources :

Code BASH :
cd /usr/src/linux




Nettoyer les compilations précédentes :

Code BASH :
make distclean




Copier la configuration actuelle dans .config :

Code BASH :
zcat /proc/config.gz > .config




Passer à y les valeurs non définies :



Voici une commande sympathique pour vérifier tout d'un coup :

Code BASH :
grep CONFIG_NAMESPACES .config ; \
grep CONFIG_UTS .config ; \
grep CONFIG_IPC .config ; \
grep CONFIG_USER_NS .config ; \
grep CONFIG_PID_NS .config ; \
grep CONFIG_NET_NS .config ; \
grep CONFIG_CGROUPS .config ; \
grep CONFIG_CGROUP_DEVICE .config ; \
grep CONFIG_CPUSETS .config ; \
grep CONFIG_DEVPTS_MULTIPLE_INSTANCES .config ; \
grep CONFIG_CGROUP_FREEZER .config ; \
grep CONFIG_VETH .config ; \
grep CONFIG_MACVLAN .config ; \
grep CONFIG_MACVTAP .config ; \
grep CONFIG_BRIDGE .config
 




Puis éditer avec l'éditeur de son choix le fichier .config pour placer chaque valeur à y.

J'ai opté personnellement pour sed :

Code BASH :
sed -e 's/# CONFIG_CGROUP_DEVICE is not set/CONFIG_CGROUP_DEVICE=y/g' -i .config
sed -e 's/# CONFIG_CPUSETS is not set/CONFIG_CPUSETS=y/g' -i .config
sed -e 's/# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set/CONFIG_DEVPTS_MULTIPLE_INSTANCES=y/g' -i .config
sed -e 's/# CONFIG_CGROUP_FREEZER is not set/CONFIG_CGROUP_FREEZER=y/g' -i .config
sed -e 's/# CONFIG_VETH is not set/CONFIG_VETH=y/g' -i .config
sed -e 's/# CONFIG_MACVLAN is not set/CONFIG_MACVLAN=y/g' -i .config
sed -e 's/# CONFIG_MACVTAP is not set/CONFIG_MACVTAP=y/g' -i .config
sed -e 's/CONFIG_BRIDGE=m/CONFIG_BRIDGE=y/g' -i .config




Puis on recompile le noyau :

Code BASH :
make oldconfig
make
make modules_install
make install
dracut --force
#emerge @module-rebuild
#cl-setup-boot




Pour compiler plus vite, on peut passer à make l'argument -jX X est le nombre de processeurs + 1

Pour un intel i7 avec 8 coeurs :

Code BASH :
make -j9




On redémarre ensuite pour démarrer sur le nouveau noyau :

Code BASH :
reboot




Une fois redémarré, on vérifie que les CGROUPS sont bien actifs :

Code BASH :
 mount | grep cgroup




Qui doit renvoyer ces lignes :

Citation :
cgroup_root on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,relatime,size=10240k,mode=755)

openrc on /sys/fs/cgroup/openrc type cgroup (rw,nosuid,nodev,noexec,relatime,release_agent=/lib64/rc/sh/cgroup-release-agent.sh,name=openrc)

cpuset on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)

cpu on /sys/fs/cgroup/cpu type cgroup (rw,nosuid,nodev,noexec,relatime,cpu)

cpuacct on /sys/fs/cgroup/cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct)

memory on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)

devices on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)

freezer on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)

net_cls on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)

blkio on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)






Partie réseau





Pour utiliser nos conteneurs, on a besoin d'une interface réseau en mode pont (bridge).



On installe les modules réseau nécessaires :



Code BASH :
emerge -q net-misc/bridge-utils




On édite ensuite le fichier de configuration des interfaces réseaux :



Code BASH :
nano /etc/conf.d/net




On commente la configuration de l'interface en cours (chez moi enp0s3), on indique à null sa configuration et on créée le pont nommé br0 :



Code BASH :
#config_enp0s3="dhcp"
 
config_enp0s3="null"
 
# Pont réseau
config_br0="10.21.27.253/24"
routes_br0="default via 10.21.27.254"
dns_servers="10.21.27.250"
 
brctl_br0="setfd 0
sethello 10
stp off"
bridge_br0="enp0s3"




On n'oublie pas de créer le lien symbolique qui va bien et de lancer cette connexion au démarrage :



Code BASH :
ln -s /etc/init.d/net.lo /etc/init.d/net.br0
rc-update add net.br0 default




On redémarre pour vérifier le bon fonctionnement du pont réseau :

Code BASH :
reboot




On vérifie avec ifconfig que l'interface br0 ait bien son adresse IP et que les communications réseaux fonctionnent correctement.







Installation de LXC







Installation commune





Aucun FLAG par défaut n'est activé.

On va activer deux FLAG : examples et doc vont nous fournir des modèles de base tout prêt pour déployer rapidement nos conteneurs.



Code BASH :
echo "app-emulation/lxc examples doc #LXC" >> /etc/portage/package.use/custom




lxc est archtildé sur Calculate Linux, donc on l'ajoute au fichier packages.keywords :



Code BASH :
echo "app-emulation/lxc #LXC" >> /etc/portage/package.keywords/custom




Puis on lance l'installation :



Code BASH :
emerge -avq app-emulation/lxc




Voilà, c'est installé.





Installations optionnelles







Cas Debian





Si on souhaite par la suite installer un conteneur fonctionnant sous Debian, il est nécessaire d'installer dev-util/debootstrap :



Code BASH :
emerge -aqv dev-util/debootstrap






Cas Fedora/CentOS





Si on souhaite par la suite installer un conteneur fonctionnant sous Fedora ou CentOS, il est nécessaire d'installer sys-apps/yum qui installera aussi en dépendance app-arch/rpm .

On ajoute quelques paquets au fichier package.keywords et ajoutons les USE lua et python à RPM :



Code BASH :
echo "sys-apps/yum #LXC" >> /etc/portage/package.keywords/custom 
echo "dev-python/sqlitecachec #LXC" >> /etc/portage/package.keywords/custom 
echo "dev-lang/python sqlite #LXC" >> /etc/portage/package.use/custom 
echo "dev-libs/libxml2 python #LXC" >> /etc/portage/package.use/custom
echo "app-arch/rpm lua python #LXC" >> /etc/portage/package.use/custom 




On installe ensuite yum :



Code BASH :
emerge -aqv sys-apps/yum






Utiliser LXC







Où sont les fichiers





Tous les fichiers sont stockés dans /etc/lxc.

Un dossier sera créé par conteneur, et contient :

  • Un dossier rootfs (le / du conteneur)
  • Un fichier config (la configuration du conteneur).







Créer un conteneur





La commande pour créer un conteneur est lxc-create et s'utilise de cette manière :



Code BASH :
lxc-create -n $NomDuConteneur -t $TypeDuConteneur




Voici quelques syntaxes :



Pour un conteneur nommé alpha de type Gentoo :

Code BASH :
lxc-create -n alpha-t gentoo




Pour un conteneur nommé beta de type Debian :

Code BASH :
lxc-create -n beta -t debian




Pour un conteneur nommé gamma de type Fedora :

Code BASH :
lxc-create -n gamma -t fedora




Pour un conteneur nommé delta de type CentOS :

Code BASH :
lxc-create -n delta -t centos






Personnaliser la configuration





La configuration est localisée dans /etc/lxc/nomduconteneur/config.





Partie réseau





Par défaut, le réseau est sur :

Code BASH :
lxc.network.type = empty




Commenter cette ligne si on souhaite avoir du réseau dans le conteneur.



Voici un exemple de configuration, avec un conteneur LXC connecté directement au réseau local :



Code BASH :
lxc.network.type = veth
lxc.network.name = veth0
lxc.network.veth.pair = veth-test
lxc.network.flags = up
lxc.network.link = br0
lxc.network.ipv4 = 10.21.27.201/24
lxc.network.ipv4.gateway = 10.21.27.254




Quelques explications...

  • lxc.network.type=veth : utilisation d’un bridge. Ce mode veth permet de créer deux interfaces : l’une est ajouté au bridge de l’hôte, l’autre est utilisée par le conteneur LXC. Les communications entre le conteneur et les autres de même configuration ainsi que l'extérieur sont possible.
  • lxc.network.name = veth0 : nom de l'interface réseau dans le conteneur LXC.
  • lxc.network.veth.pair = veth-test : nom de l'interface réseau du conteneur LXC sur l'hôte.
  • lxc.network.flags = up : active l'interface.
  • lxc.network.link = br0 : fait le lien sur le bridge br0 de l'hôte.
  • lxc.network.ipv4 = 10.21.27.201/24 : adresse IPv4 du conteneur
  • lxc.network.ipv4.gateway = 10.21.27.254 : passerelle pour le conteneur.







Points de montage





Il est possible d'imposer des points de montage dans le conteneur via la ligne lxc.mount.entry.

La syntaxe :

Code BASH :
lxc.mount.entry=/chemin/absolu/du/dossier chemin/relatif/dans/le/conteneur none rw,bind 0 0




Par défaut, sur le conteneur de type gentoo, certains points de montage sont actifs. Les commenter (portage, calculate et eix).





D'autres attributs





En vrac, mais commentés :



Code BASH :
#Chemin de la racine du conteneur
lxc.rootfs = /etc/lxc/test/rootfs
 
#Nom d'hôte du conteneur
lxc.utsname = test






Lister les conteneurs





Pour lister les conteneurs installés, on utilise la commande lxc-ls :



Code BASH :
lxc-ls
debiantest  test  testcentos  testfedo




Si on souhaite lister les conteneurs démarrés, on utilise l'option --active :



Code BASH :
lxc-ls --active
test






Démarrer un conteneur





Pour démarrer un conteneur, on utilise la commande lxc-start avec l'option -n pour spécifier le nom et -d pour lancer le conteneur en tant que démon :



Code BASH :
lxc-start -n $NomDuConteneur -d




Si on ne met pas l'option -d, la console sera alors "capturée" par celle du conteneur et seul l'extinction du conteneur permettra de retrouver la main.





Se connecter à un conteneur démarré





Pour se connecter sur un conteneur en cours d'exécution, on utilise la commande lxc-console :



Code BASH :
lxc-console -n $NomDuConteneur




Pour sortir de la console tout en laissant le conteneur démarré, saisir Ctrl+a q.





Avoir des informations sur le conteneur