CentOS 7 : Installer et utiliser LXC
Table des matières
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.
Le système installé est une CentOS 7 64bits.
S'assurer que le système est à jour, et que les dépôts EPEL soient installés.
Ensuite, on installe LXC, les Modèles LXC (templates) et deux outils :
Pour CentOS6, installer la version 1 disponible dans les "EPEL-testing" via la commande
Une fois l'opération terminée, on vérifie l'environnement LXC :
Créer un pont nommé virbr0
Bon, maintenant que tout est installé, on va installer notre premier conteneur LXC.
Pour voir les scripts de création de templates disponibles, exécuter :
Pour la suite, je vais utiliser une Gentoo.
Pour créer un conteneur LXC avec le système Gentoo, nommée mavm :
Le téléchargement des fichiers requis débute, et le conteneur va se construire toute seule grâce au script LXC:
Pour lister les conteneurs installés :
Deux lignes s'affichent : la première ligne affiche les machines disponibles, et la deuxième, les conteneurs démarrés.
ici, la machine poum est démarrée.
Pour démarrer un conteneur :
Il est possible d'obtenir quelques informations sur un conteneur lancée grâce à la commande :
Pour un conteneur LXC arrêté :
Pour se connecter sur un conteneur en cours d'exécution, on utilise la commande
Pour sortir de la console, saisir Ctrl+a q
Deux solution pour arrêter, se connecter sur celle-ci et l'arrêter avec la commande halt ou en dehors du conteneur, saisir :
En cas d'arrêt du système hôte, les conteneurs sont arrêtées.
Lorsque celui-ci se remet en service, toutes les conteneurs LXC sont éteint.
Pour lancer un conteneur au démarrage, créer simplement un script à lancer au démarrage avec la commande
Cloner un conteneur, c'est possible ! Dans ce cas, l'arrêter avant, puis, utiliser la commande
Par défaut, tout le conteneur est cloné, le nom d'hôte change, l'adresse MAC de l'interface aussi.
En cas d'utilisation en tant que "sauvegarde" utiliser les options K et M :
Prendre des instantané de conteneurs, c'est aussi possible. Néanmoins, les conteneurs doivent être arrêtés.
Pour effectuer un snapshot, utiliser :
Pour voir les snapshots réalisés :
Pour restaurer un snapshot, utiliser la commande
Pour supprimer un snapshot, utiliser :
Pour supprimer un conteneur, celui-ci doit être arrêté. Ensuite, utiliser la commande :
Un petit exemple, j'ai une Gentoo nommée mawm, qui héberge un serveur web.
Sur la CentOS de base :
Et sur la Gentoo :
Avec donc tout ça, j'ai un conteneur LXC Gentoo dans un système hôte CentOS.
La Gentoo héberge un site web, et lorsque l'adresse IP de la CentOS est contactée, les requêtes HTTP sont redirigées vers la Gentoo.
Présentation 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.
Installation des composants de base
Le système installé est une CentOS 7 64bits.
S'assurer que le système est à jour, et que les dépôts EPEL soient installés.
Ensuite, on installe LXC, les Modèles LXC (templates) et deux outils :
Code BASH :
yum install lxc lxc-templates bridge-utils debootstrap bzip2 tar gzip wget net-tools
Pour CentOS6, installer la version 1 disponible dans les "EPEL-testing" via la commande
Code BASH :
yum --enablerepo=epel-testing install lxc-templates
Une fois l'opération terminée, on vérifie l'environnement LXC :
Code BASH :
lxc-checkconfig Kernel configuration not found at /proc/config.gz; searching... Kernel configuration found at /boot/config-3.10.0-123.6.3.el7.x86_64 .--- Namespaces ---. Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled Network namespace: enabled Multiple /dev/pts instances: enabled .--- Control groups ---. Cgroup: enabled Cgroup clone_children flag: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: enabled Cgroup cpuset: enabled .--- Misc ---. Veth pair device: enabled Macvlan: enabled Vlan: enabled File capabilities: enabled Note : Before booting a new kernel, you can check its configuration usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
Créer un pont nommé virbr0
Utilisons LXC
Bon, maintenant que tout est installé, on va installer notre premier conteneur LXC.
Pour voir les scripts de création de templates disponibles, exécuter :
Code BASH :
ls /usr/share/lxc/templates/ lxc-alpine lxc-archlinux lxc-centos lxc-debian lxc-fedora lxc-openmandriva lxc-oracle lxc-sshd lxc-ubuntu-cloud lxc-altlinux lxc-busybox lxc-cirros lxc-download lxc-gentoo lxc-opensuse lxc-plamo lxc-ubuntu
Pour la suite, je vais utiliser une Gentoo.
Pour créer un conteneur LXC avec le système Gentoo, nommée mavm :
Code BASH :
lxc-create -t gentoo -n mawm
Le téléchargement des fichiers requis débute, et le conteneur va se construire toute seule grâce au script LXC:
Code BASH :
### set_default_arch: default arch/variant autodetect... => Got: arch=amd64 variant=amd64 Attempting to obtain an exclusive lock (timeout: 60 sec) named "cache-amd64-amd64"... => done. => Executing "do_all" ###### cache_setup(): doing cache preparation ### cache_precheck(): doing some pre-start checks ... ### cache_stage3(): stage3 cache deployment... Determining path to latest Gentoo amd64 (amd64) stage3 archive... => downloading and processing http://distfiles.gentoo.org/releases/amd64/autobuilds/latest-stage3-amd64.txt => Got: 20140807/stage3-amd64-20140807.tar.bz2 Downloading/untarring the actual stage3 tarball... --2014-08-14 18:22:44-- http://distfiles.gentoo.org/releases/amd64/autobuilds/20140807/stage3-amd64-20140807.tar.bz2 Résolution de distfiles.gentoo.org (distfiles.gentoo.org)... 156.56.247.195, 64.50.236.52, 140.211.166.134, ... Connexion vers distfiles.gentoo.org (distfiles.gentoo.org)|156.56.247.195|:80...connecté. requête HTTP transmise, en attente de la réponse...200 OK Longueur: 186320443 (178M) [application/x-tar] Sauvegarde en : «STDOUT» 100%[========================================================================================>] 186 320 443 520KB/s ds 9m 6s 2014-08-14 18:31:51 (333 KB/s) - envoi vers sortie standard [186320443/186320443] => extracted to: /var/cache/lxc/gentoo/partial-amd64-amd64 chroot test... OK => stage3 cache extracted in : /var/cache/lxc/gentoo/partial-amd64-amd64 ### cache_portage: caching portage tree tarball... Downloading Gentoo portage (software build database) snapshot... Attempting to obtain an exclusive lock (timeout: 60 sec) named "portage"... => done. => Executing "wget -O /var/cache/lxc/gentoo/portage.tbz http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2" --2014-08-14 18:31:51-- http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2 Résolution de distfiles.gentoo.org (distfiles.gentoo.org)... 64.50.233.100, 156.56.247.195, 216.165.129.135, ... Connexion vers distfiles.gentoo.org (distfiles.gentoo.org)|64.50.233.100|:80...connecté. requête HTTP transmise, en attente de la réponse...200 OK Longueur: 70569402 (67M) [application/x-bzip2] Sauvegarde en : «/var/cache/lxc/gentoo/portage.tbz» 100%[========================================================================================>] 70 569 402 436KB/s ds 2m 38s 2014-08-14 18:34:31 (436 KB/s) - «/var/cache/lxc/gentoo/portage.tbz» sauvegardé [70569402/70569402] => done. ### cache_inittab: tuning inittab... ### cache_net: doing some useful net tuning... ### cache_dev(): /dev tuning... ### cache_openrc(): doing openrc tuning ### cache_locale(): initiating minimale locale en_US.UTF-8 * Generating 1 locales (this might take a while) with 1 jobs * (1/1) Generating en_US.UTF-8 ... [ ok ] * Generation complete ###### cache_setup: Cache should be ready ##### container_setup(): starting container setup ### container_precheck(): doing some pre-start checks ... #### container_rootfs(): copying rootfs /var/lib/lxc/mawm/rootfs from cache /var/cache/lxc/gentoo/rootfs-amd64-amd64 ... chroot test... OK => done #### container_consoles(): setting container consoles ... => main console + 1 ttys => done #### container_tz(): setting container timezone ... => host localtime copyed to container #### container_portage(): setting container portage... Warnings are normal here, don't worry !!! Section 'gentoo' in repos.conf has location attribute set to nonexistent directory: '/usr/portage' !!! Section 'x-portage' in repos.conf has location attribute set to nonexistent directory: '/usr/portage' !!! Invalid Repository Location (not a dir): '/usr/portage' !!! Section 'gentoo' in repos.conf has location attribute set to nonexistent directory: '/usr/portage' !!! Section 'x-portage' in repos.conf has location attribute set to nonexistent directory: '/usr/portage' !!! Invalid Repository Location (not a dir): '/usr/portage' trying to guess portage_dir from host... => host portage detection failed (not gentoo host), fallback to private portage tree # untaring private portage to /var/lib/lxc/mawm/rootfs//usr/portage from /var/cache/lxc/gentoo/portage.tbz ... Attempting to obtain an exclusive lock (timeout: 60 sec) named "portage"... => done. => Executing "tar -xp --strip-components 1 -C /var/lib/lxc/mawm/rootfs//usr/portage -f /var/cache/lxc/gentoo/portage.tbz" => done container_net(): setting container network conf... * service net.eth0 added to runlevel default => network conf done. #### container_hostname(): setting hostname... => done. #### container_auth(): setting authentification... setting password for root ... BAD PASSWORD: it is too short BAD PASSWORD: is too simple => done. if you didn't specify , default is 'toor' => done. #### container_sshd(): enabling sshd... * service sshd added to runlevel sysinit => done. container_configuration(): making lxc configuration file... => done. ###### container_setup(): container should be ready to start! You could now use you container with: lxc-start -n mawm little things you should know about your container: => rootfs of container is : /var/lib/lxc/mawm/rootfs => config of container is : /var/lib/lxc/mawm/config => timezone was staticly copyed from host => container has its own portage tree at /usr/portage => Warning, these veth NIC don't have fixed hwaddr : eth0 see http://lists.linuxcontainers.org/pipermail/lxc-devel/2013-December/006736.html and man lxc.conf => Connection user is root => root has the default password 'toor', please change it ASAP
Lister les conteneurs
Pour lister les conteneurs installés :
Code BASH :
lxc-ls mawm pam pim poum test1 poum
Deux lignes s'affichent : la première ligne affiche les machines disponibles, et la deuxième, les conteneurs démarrés.
ici, la machine poum est démarrée.
Démarrer un conteneur
Pour démarrer un conteneur :
Code BASH :
lxc-start -n $NOM -d
Avoir des infos sur le conteneur
Il est possible d'obtenir quelques informations sur un conteneur lancée grâce à la commande :
Code BASH :
lxc-info -n mawm Name: mawm State: RUNNING PID: 2336 CPU use: 0.35 seconds BlkIO use: 25.62 MiB Memory use: 14.73 MiB KMem use: 0 bytes Link: veth1KAV9N TX bytes: 1.53 KiB RX bytes: 870 bytes Total bytes: 2.37 KiB
Pour un conteneur LXC arrêté :
Code BASH :
lxc-info -n pim
Name: pim
State: STOPPED
Se connecter à un conteneur démarré
Pour se connecter sur un conteneur en cours d'exécution, on utilise la commande
Code BASH :
lxc-console -n $NOM
Pour sortir de la console, saisir Ctrl+a q
Code BASH :
lxc-console -n mawm Connected to tty 1 Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself mawm login: root Password: Last login: Thu Aug 14 19:51:09 CEST 2014 on tty1 mawm ~ # ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.122.128 netmask 255.255.255.0 broadcast 192.168.122.255 inet6 fe80::88d3:57ff:fed1:a091 prefixlen 64 scopeid 0x20<link> ether 8a:d3:57:d1:a0:91 txqueuelen 1000 (Ethernet) RX packets 184 bytes 10350 (10.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 13 bytes 2014 (1.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 mawm ~ #
Arrêter un conteneur
Deux solution pour arrêter, se connecter sur celle-ci et l'arrêter avec la commande halt ou en dehors du conteneur, saisir :
Code BASH :
lxc-stop -n $NOM
Démarrer un conteneur au lancement du système hôte
En cas d'arrêt du système hôte, les conteneurs sont arrêtées.
Lorsque celui-ci se remet en service, toutes les conteneurs LXC sont éteint.
Pour lancer un conteneur au démarrage, créer simplement un script à lancer au démarrage avec la commande
Code BASH :
lxc-start -n $NOM -d
Cloner un conteneur
Cloner un conteneur, c'est possible ! Dans ce cas, l'arrêter avant, puis, utiliser la commande
Code BASH :
lxc-clone $NOM $NOUVEAUNOM
Par défaut, tout le conteneur est cloné, le nom d'hôte change, l'adresse MAC de l'interface aussi.
En cas d'utilisation en tant que "sauvegarde" utiliser les options K et M :
Code BASH :
lxc-clone -KM $NOM $NOUVEAUNOM
Instantanés de conteneurs
Prendre des instantané de conteneurs, c'est aussi possible. Néanmoins, les conteneurs doivent être arrêtés.
Pour effectuer un snapshot, utiliser :
Code BASH :
lxc-snapshot -n $NOM
Pour voir les snapshots réalisés :
Code BASH :
lxc-snapshot -n $NOM -L snap0 (/var/lib/lxcsnaps/$NOM) 2014:08:18 11:45:23 snap1 (/var/lib/lxcsnaps/$NOM) 2014:08:18 11:53:01
Pour restaurer un snapshot, utiliser la commande
Code BASH :
lxc-snapshot -n $NOM -r $NOMDUSNAPSHOT
Pour supprimer un snapshot, utiliser :
Code BASH :
lxc-snapshot -n $NOM -d $NOMDUSNAPSHOT
Supprimer un conteneur
Pour supprimer un conteneur, celui-ci doit être arrêté. Ensuite, utiliser la commande :
Code BASH :
lxc-destroy -n $NOM
Un exemple
Un petit exemple, j'ai une Gentoo nommée mawm, qui héberge un serveur web.
Sur la CentOS de base :
Code BASH :
[root@LXC-HOST ~]# ifconfig enp0s3 enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.21.27.198 netmask 255.255.255.0 broadcast 10.21.27.255 inet6 fe80::a00:27ff:fe43:75c9 prefixlen 64 scopeid 0x20<link> ether 08:00:27:43:75:c9 txqueuelen 1000 (Ethernet) RX packets 162 bytes 18762 (18.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 114 bytes 19834 (19.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@LXC-HOST ~]# ifconfig virbr0 virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether fe:ea:55:73:c4:dc txqueuelen 0 (Ethernet) RX packets 14 bytes 933 (933.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 18 bytes 1642 (1.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@LXC-HOST ~]# cat /etc/rc.local #!/bin/bash sleep 5 /usr/bin/lxc-start -n mawm -d iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t nat -A PREROUTING -j DNAT -i enp0s3 -p tcp --dport 80 --to-destination 192.168.122.20:80 touch /var/lock/subsys/local
Et sur la Gentoo :
Code BASH :
This is mawm. (Linux x86_64 3.10.0-123.6.3.el7.x86_64) 23:33:18 mawm login: root Password: Last login: Thu Aug 14 23:28:17 CEST 2014 on tty1 mawm ~ # cat /etc/conf.d/net rc_keyword="-stop" config_eth0="192.168.122.20/24" routes_eth0="default via 192.168.122.1" dns_servers="8.8.8.8" mawm ~ # /etc/init.d/apache2 status * status: started mawm ~ #
Avec donc tout ça, j'ai un conteneur LXC Gentoo dans un système hôte CentOS.
La Gentoo héberge un site web, et lorsque l'adresse IP de la CentOS est contactée, les requêtes HTTP sont redirigées vers la Gentoo.