Installer et utiliser LXC sur CentOS

Cet article a été mis à jour, vous consultez ici une archive de cet article!



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
<h2 class="wiki_paragraph2" id="paragraph_namespaces">Namespaces</h2><br />
 
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled
<h2 class="wiki_paragraph2" id="paragraph_control-groups">Control groups</h2><br />
 
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
<h2 class="wiki_paragraph2" id="paragraph_misc">Misc</h2><br />
 
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 mawm -d


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