L'hôte centos tourne dans une vmware-server-2.0.2 installée sur une ubuntu-8.0.3_x86_64 noyau maison (détail de l'install sur l'hôte physique ici )


En clair cela donne :

lxc centos

Le noyau centos étant par défaut un 2.6.18.xxxx (le compteur à noyau semblant bloqué chez redhat) il n'était pas possible d'utiliser les fonctionnalités de container. J'ai donc recompilé un 2.6.31.5 dont le détail est donné ici.

Attention: il s'agit d'une config pour une machine virtuelle vmware. A vous d'adapter selon votre config hardware.

Détail de l'hôte centos après finalisation:

[root@centos54 ~]# cat /etc/issue.net
CentOS release 5.4 (Final)
Kernel \r on an \m

[root@centos54 ~]# df -ah
Sys. de fich.         Tail. Occ. Disp. %Occ. Monté sur
/dev/sda1             3,4G  2,3G  861M  74% /
proc                     0     0     0   -  /proc
sysfs                    0     0     0   -  /sys
devpts                   0     0     0   -  /dev/pts
tmpfs                 182M     0  182M   0% /dev/shm
/dev/sdb1            1004M  700M  254M  74% /usr/share
/dev/sdd1             1,9G  769M 1021M  43% /usr/src
none                     0     0     0   -  /proc/sys/fs/binfmt_misc
sunrpc                   0     0     0   -  /var/lib/nfs/rpc_pipefs
/dev/sdd2             2,0G  450M  1,4G  24% /opt
cgroup                   0     0     0   -  /cgroup

[root@centos54 ~]# ifconfig
br0       Link encap:Ethernet  HWaddr 00:0C:29:FB:7A:0F 
          inet adr:192.168.0.39  Bcast:192.168.0.255  Masque:255.255.255.0
          adr inet6: fe80::20c:29ff:fefb:7a0f/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1362 errors:0 dropped:0 overruns:0 frame:0
          TX packets:832 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0
          RX bytes:106165 (103.6 KiB)  TX bytes:198488 (193.8 KiB)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:FB:7A:0F 
          adr inet6: fe80::20c:29ff:fefb:7a0f/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:634870 errors:0 dropped:0 overruns:0 frame:0
          TX packets:85041 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000
          RX bytes:911805837 (869.5 MiB)  TX bytes:7450807 (7.1 MiB)

lo        Link encap:Boucle locale 
          inet adr:127.0.0.1  Masque:255.0.0.0
          adr inet6: ::1/128 Scope:Hôte
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0
          RX bytes:1488 (1.4 KiB)  TX bytes:1488 (1.4 KiB)

veth0_16847 Link encap:Ethernet  HWaddr 5E:4E:D3:D1:C2:69 
          adr inet6: fe80::5c4e:d3ff:fed1:c269/64 Scope:Lien
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:6992 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13366 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000
          RX bytes:379216 (370.3 KiB)  TX bytes:19393630 (18.4 MiB)

[root@centos54 ~]# free
             total       used       free     shared    buffers     cached
Mem:        370696     347136      23560          0      17484     265072
-/+ buffers/cache:      64580     306116
Swap:       610460         88     610372
[root@centos54 ~]#

Concernant l'installation de lxc je suis reparti du billet rédigé il y a quelques mois après avoir installé le paquet bridge-utils (yum install bridge-utils) et ai recompilé les sources de iproute2 à l'identique.

La configuration réseau est un peu différente chez redhat. Pour activer le bridge voici les modifs effectuées:

[root@centos54 network-scripts]# pwd
/etc/sysconfig/network-scripts

[root@centos54 network-scripts]# ls -l ifcfg*
-rw-r--r-- 3 root root 256 nov  3 12:56 ifcfg-br0
-rw-r--r-- 1 root root  49 nov  3 12:37 ifcfg-eth0
-rw-r--r-- 1 root root 254 jui  4 11:10 ifcfg-lo

[root@centos54 network-scripts]# cat ifcfg-br0
# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=br0
BROADCAST=192.168.0.255
PORTS=eth0
STP=off
MAXWAIT=5
IPADDR=192.168.0.39
IPV6_AUTOCONF=yes
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes
GATEWAY=192.168.0.254
TYPE=Bridge


[root@centos54 network-scripts]# cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
BRIDGE=br0
ONBOOT=yes

[root@centos54 network-scripts]# cat ifcfg-lo
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

Ensuite un petit redémarrage du réseau et le tour est joué:

[root@centos54 network-scripts]# /etc/init.d/network restart
Arrêt de l'interface br0 :                                 [  OK  ]
Arrêt de l'interface eth0 :                                [  OK  ]
Arrêt de l'interface loopback :                            [  OK  ]
Activation de l'interface loopback :                       [  OK  ]
Activation de l'interface eth0 :                           [  OK  ]
Activation de l'interface br0 :                            [  OK  ]



On constate qu'il faut simplement créer un fichier ifcfg-br0 et modifier le ifcfg-eth0 existant.

Souhaitant installer un container debian il me fallait, à priori, le paquet debootstrap (qui n'existe pas sous centos bien sûr) et que j'ai créé en .rpm avec l'outil alien sur une machine debian existante (commande: alien -r debootstrap_1.0.10lenny1_all.deb )

L'install du paquet debootstrap s'effectue par un simple: rpm -ivh debootstrap-1.0.10lenny1-2.noarch.rpm

Je laisse celui-ci dispo au téléchargement : debootstrap-1.0.10lenny1-2.noarch.rpm


J'ai ensuite lancé la commande création d'un container debian :

[root@centos54 opt]# lxc-debian create
What is the name for the container ? [lxccentos]
What hostname do you wish for this container ? [lxccentos]
What IP address do you wish for this container ? [172.20.0.21] 192.168.0.74
What is the gateway IP address ? [172.20.0.1] 192.168.0.254
What is the MTU size ? [1500]
Specify the location of the rootfs [./rootfs.lxccentos]
Specify the location for an extra fstab file [(none)]
Choose your architecture
1) amd64
2) i386
#? 1
Architecture amd64 selected
Checking cache download ...not cached
Downloading debian minimal ...
.....

Done.

You can run your container with the 'lxc-start -n lxccentos'

[root@centos54 opt]#

OK c'est parti:

[root@centos54 ~]# lxc-start -d -n lxccentos

[root@centos54 ~]# lxc-ps --lxc
CONTAINER    PID TTY          TIME CMD
lxccentos  31118 ?        00:00:00 init
lxccentos  31433 ?        00:00:00 sshd
lxccentos  31450 ?        00:00:00 getty
lxccentos  31451 pts/0    00:00:00 getty
lxccentos  31452 pts/1    00:00:00 getty
lxccentos  31453 pts/2    00:00:00 getty
lxccentos  31454 pts/3    00:00:00 getty
[root@centos54 ~]# ssh root@192.168.0.74
Last login: Tue Nov  3 15:36:13 2009 from mx.centos.loc
Linux lxccentos 2.6.31.5 #1 SMP Sat Oct 31 07:09:36 CET 2009 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

lxccentos:~# ifconfig
eth0      Link encap:Ethernet  HWaddr b2:e5:e8:30:52:0f 
          inet addr:192.168.0.74  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::b0e5:e8ff:fe30:520f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:56 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:8526 (8.3 KiB)  TX bytes:4666 (4.5 KiB)

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lxccentos:~# ping www.google.fr
PING www.l.google.com (209.85.227.104) 56(84) bytes of data.
64 bytes from wy-in-f104.1e100.net (209.85.227.104): icmp_seq=1 ttl=49 time=62.9 ms
64 bytes from wy-in-f104.1e100.net (209.85.227.104): icmp_seq=2 ttl=49 time=44.3 ms
^C
--- www.l.google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 44.395/53.656/62.917/9.261 ms
lxccentos:~#


Impeccable, ça fonctionne au poil.

Maintenant je vais installer un serveur samba sur ce container avec gestion des acl. Je modifie donc le fstab de l'hôte comme ceci:

[root@centos51 etc]# cat fstab
LABEL=/                 /                       ext3    defaults        1 1
tmpfs                   /dev/shm                tmpfs   defaults        0 0
/dev/sdb1        /usr/share        ext3    defaults    0 1
/dev/sdd1        /usr/src        ext3    defaults    0 1
/dev/sdd2        /opt            ext3    acl,defaults    0 1
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
LABEL=SWAP-sda2         swap                    swap    defaults        0 0

sachant que mes containers sont créés dans /opt et remonte la partition pour prendre en compte cette modif:

[root@centos51 etc]# mount -o remount /opt

[root@centos51 etc]# mount
/dev/sda1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sdb1 on /usr/share type ext3 (rw)
/dev/sdd1 on /usr/src type ext3 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/sdd2 on /opt type ext3 (rw,acl)
cgroup on /cgroup type cgroup (rw)

[root@centos51 opt]# pwd;ls -l
/opt
total 20
drwx------  2 root root 16384 oct 31 07:42 lost+found
drwxr-sr-x 20 root ftp   4096 nov  3 12:25 rootfs.lxccentos




Je me connecte sur le container et installe samba par apt-get (je passe les détails).

Je modifie le fichier de config de samab comme ceci et crée un partage nommé ... partage :)

lxccentos:/opt# cat /etc/samba/smb.conf |egrep -v '^$|\;|^#'
[global]
   workgroup = WORKGROUP
   server string = %h server
   dns proxy = no
interfaces = 192.168.0.74/24 eth0
bind interfaces only = yes
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 256
   panic action = /usr/share/samba/panic-action %d
   encrypt passwords = true
   passdb backend = tdbsam
   obey pam restrictions = yes
   unix password sync = yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = yes
[homes]
   comment = Home Directories
   browseable = no
   read only = yes
   create mask = 0700
   directory mask = 0700
   valid users = %S
[partage]
   comment = Repertoire Partage
   path = /opt
   guest ok = yes
   read only = no
   browseable = yes


Pour tester je vais créer 2 groupes spécifiques: svcrx et svcrwx (plus facile pour suivre les droits)

lxccentos:/opt# groupadd svcrx

lxccentos:/opt# groupadd svcrwx

Je crée ensuite un utilisateur dans chacun de ces groupes:

lxccentos:/opt# adduser --ingroup svcrwx userrwx

lxccentos:/opt# adduser --ingroup svcrx userrx

Et les déclare dans la base samba:

lxccentos:/opt# smbpasswd -a userrwx
New SMB password:
Retype new SMB password:
Added user userrwx.

lxccentos:/opt# smbpasswd -a userrx
New SMB password:
Retype new SMB password:
Added user userrx.


Je crée 2 répertoires dans le /opt et ajuste les droits:

lxccentos:/opt# mkdir sharerx sharerwx
lxccentos:/opt# chown nobody:nogroup sharerx sharerwx
lxccentos:/opt# chmod 2750 sharerx sharerwx

lxccentos:/opt# ll
total 16
drwxr-xr-x  4 root   root    4096 Nov  4 17:20 .
drwxr-sr-x 20 root   staff   4096 Nov  3 11:25 ..
drwxr-s---  2 nobody nogroup 4096 Nov  4 17:18 sharerwx
drwxr-s---  2 nobody nogroup 4096 Nov  4 17:18 sharerx

Maintenant je vais jongler un peu avec les acl:

lxccentos:/opt# setfacl -m g:svcrwx:rwx sharerwx
lxccentos:/opt# setfacl -m g:svcrx:rx sharerx
lxccentos:/opt# getfacl -R *
# file: sharerwx
# owner: nobody
# group: nogroup
user::rwx
group::r-x
group:svcrwx:rwx
mask::rwx
other::---

# file: sharerx
# owner: nobody
# group: nogroup
user::rwx
group::r-x
group:svcrx:r-x
mask::r-x
other::---


Je teste ensuite depuis mon desktop:

root@p733:/# smbmount //192.168.0.74/partage /mnt -o username=userrx
Password:

root@p733:/# cd /mnt
root@p733:/mnt# ll
total 4
drwxr-xr-x   4 root   root       0 2009-11-04 18:20 .
drwxr-xr-x  28 root   root    4096 2009-08-01 15:17 ..
drwxrws---+  2 nobody nogroup    0 2009-11-04 18:18 sharerwx
drwxr-s---+  2 nobody nogroup    0 2009-11-04 18:18 sharerx

root@p733:/mnt# cd sharerx
root@p733:/mnt/sharerx# touch essai
touch: ne peut faire un touch sur `essai': Permission non accordée

root@p733:/mnt/sharerx# cd ../sharerwx/
root@p733:/mnt/sharerwx# touch essai
touch: ne peut faire un touch sur `essai': Permission non accordée

root@p733:/mnt/sharerwx#
root@p733:/mnt/sharerwx# cd /
root@p733:/# smbumount /mnt

L'utilisateur userrx appartenant au groupe svcrx n'a pas les droits d'écriture.


root@p733:/# smbmount //192.168.0.74/partage /mnt -o username=userrwx
Password:

root@p733:/# cd /mnt

root@p733:/mnt# cd sharerwx
root@p733:/mnt/sharerwx# touch essai
root@p733:/mnt/sharerwx# ls -l
total 0
-rw-r--r-- 1 pme nogroup 0 2009-11-04 18:35 essai

L'utilisateur userrwx appartenant au groupe svcrwx a le droit d'écrire dans sharerwx ....

root@p733:/mnt/sharerwx# cd ../sharerx
root@p733:/mnt/sharerx# touch essai
touch: ne peut faire un touch sur `essai': Permission non accordée

... mais pas dans sharerx  donc c'est bon.

root@p733:/mnt/sharerx# cd /
root@p733:/# smbumount /mnt

Pourquoi cette manip: tout simplement pour donner une idée des possibilités des containers dans un environnement ou plusieurs services doivent accéder à des ressources
partagées. On peut en effet imaginer créer un container par service et laisser un responsable gérer les droits sur SON container







Si vous êtes intéressé par lxc, je vous recommande de suivre de près les évolutions car l'auteur me signalait ces derniers jours qu'une nouvelle version allait faire son entrée avec pas mal de modifs à la clé.

http://lxc.sourceforge.net

irc://irc.freenode.net#lxc-devel