Red Hat et dérivées version SERVEUR

CentOS 7 : Installer et utiliser LXC

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

conteneurs





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




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




Redémarer !



Créer un pont nommé virbr0

Il faut expliquer ici



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 une machine virtuelle 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 la machine 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






Lancer une machine virtuelle LXC





Pour lister les machines installées :



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 machines démarrées.

ici, la machine poum est démarrée.



Pour démarrer une machine :



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




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





Avoir des infos sur la machine LXC





Il est possible d'obtenir quelques informations sur une machine LXC 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 une machine LXC arrêtée :



Code BASH :
lxc-info -n pim
 
Name:           pim
State:          STOPPED






Se connecter à une machine LXC démarrée





Pour se connecter sur une machine LXC en cours d'exécution, on utilise la commande



Code BASH :
lxc-console -n $NOMDELAMACHINE




Pour sortir de la console, saisir Ctrl+a q



l
Code BASH :
xc-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 une machine LXC





Deux solution pour arrêter, se connecter sur celle-ci et l'arrêter avec la commande halt ou en dehors de la machine, saisir :



Code BASH :
lxc-stop -n $NOMDELAMACHINE






Démarrer une machine au lancement du système hôte





En cas d'arrêt du système hôte, les machines sont arrêtées.

Lorsque celui-ci se remet en service, toutes les machines LXC sont éteintes.



Pour lancer une machine au démarrage, créer simplement un script à lancer au démarrage avec la commande



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




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