Installer et utiliser LXC sur CentOS



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
 


On peut vérifier le nom de l'interface physique, ça nous servira plus tard avec la commande :
Code BASH :
ifconfig


Créer un pont nommé virbr0

J'ai utilisé une CentOS sur laquelle libvirt était installé, et profitant ainsi du réseau interne de libvirt pour LXC.
Utiliser une interface virbr0 sur votre interface Ethernet si vous souhaitez avoir des machines connectées directement au LAN.


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:

Les fichiers ne se téléchargent que lors de la première création de la machine. Ils sont conservés en cache pour préserver la bande passante lors des prochains déploiements de conteneurs du même type.

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


Si on oublie l'option -d, la console est « capturée » par le conteneur.


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


Il existe sans doute une fonctionnalité, mais je n'ai pas trouvé... :intello:


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.
Les snapshots sont des copies complètes du conteneur; et ce à chaque snapshot. Il faut donc prévoir de la place et du temps en fonction du volume de celui-ci.

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


Cette action est irréversible et ne demande pas de conformation !



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.
Cette page a été vue 13538 fois