Sous NetBSD, on a pas jail(8). C’est comme ça, ‘faut l’accepter, on a plein de trucs, mais ça, non.
Or je prévois de migrer le site ici présent de son kimloli natal vers un nouveau kimloli, mais un peu plus pêchu. La machine cible a plus de ram (2G) et plus de disque (2×750G/RAID1 soft), ce qui me permettra d’y coller un bon Xen des familles et faire tourner l’ensemble d’iMil.net dans une VM NetBSD, comme il se doit.
Mais voila, j’aimais bien ça moi, les jails, ou en tout cas, l’idée de faire tourner des services dans un environnement restreint m’est agréable. Du coup, il ne me reste plus que chroot(8).
Vous me connaissez, j’aime pas les trucs “one shot”, je me suis donc fendu d’un script simplissime qui permet la création et la destruction d’un chroot, donc, mais par service. Il prend en entrée un petit fichier de configuration que je m’en vais vous détailler :
# dans la variable SETSDIR, on renseigne le repertoire qui va accueillir les
# sets NetBSD nécessaires au fonctionnement du service souhaité.
SETSDIR=/home/imil/binary/sets
# SCVDIR représente le repertoire de base qui contiendra lui même un
# repertoire "${CHROOTDIR}-`uname -s`-`uname -r`"
SVCDIR=/home/imil/apache
# le nom-prefixe du repertoire effectif du chroot
CHROOTDIR=${SVCDIR}/chroot
# l'endoit d'ou nous allons télécharger les sets
SETSURL=ftp://ftp.fr.netbsd.org/pub/NetBSD/NetBSD-5.0.1/amd64/binary/sets
# les sets nécessaires au fonctionnement du service, par exemple, apache
# a besoin de base, xbase et etc
SETS="base xbase etc" # xbase required for apache (expat)
# le préfixe d'installation des packages dans le chroot
PREFIX="/usr/pkg"
# le repertoire sur le filesystem "réel" qui contiendra les packages binaires
# à installer dans le chroot
PACKAGES="/home/imil/packages"
# la liste des packages à installer dans le chroot
PKGLIST="perl apr apr-util apache"
# les points de montage de type "null" à monter dans le chroot
MOUNTS="/dev ${PACKAGES}"
# l'endroit ou se trouvent les fichiers supplémentaires à copier dans le
# chroot. Par exemple, toujours pour apache, ${SVCDIR}/root contiendrait
# au minimum :
# etc/hosts
# etc/rc.conf
CPFILES="${SVCDIR}/root"
# le nom du ou des services à démarrer
SERVICES="apache"
Reste à déployer le service chrooté de cette façon :
(imil@korriban) [~] sudo bin/mksvcchroot.sh create etc/apache-chroot.conf
Ce qui nous donne :
fetching binary sets... done
creating chroot... extracting: base xbase etc done
null-mounting... /dev /home/imil/packages done
preparing packages...perl Creating binary package: perl-5.10.0nb6
Creating package /home/imil/packages/perl-5.10.0nb6
Using SrcDir value of /usr/pkg
apr Creating binary package: apr-1.3.9
Creating package /home/imil/packages/apr-1.3.9
Using SrcDir value of /usr/pkg
apr-util Creating binary package: apr-util-1.3.9
Creating package /home/imil/packages/apr-util-1.3.9
Using SrcDir value of /usr/pkg
apache Creating binary package: apache-2.2.13nb3
Creating package /home/imil/packages/apache-2.2.13nb3
Using SrcDir value of /usr/pkg
done
installing packages... perl apr apr-util apache apache-2.2.13nb3: Creating group ``www''
apache-2.2.13nb3: Creating user ``www''
useradd: Warning: home directory `/nonexistent' doesn't exist, and -m was not specified
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/extra/httpd-autoindex.conf to /usr/pkg/etc/httpd/httpd-autoindex.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/extra/httpd-dav.conf to /usr/pkg/etc/httpd/httpd-dav.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/extra/httpd-default.conf to /usr/pkg/etc/httpd/httpd-default.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/extra/httpd-info.conf to /usr/pkg/etc/httpd/httpd-info.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/extra/httpd-languages.conf to /usr/pkg/etc/httpd/httpd-languages.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/extra/httpd-manual.conf to /usr/pkg/etc/httpd/httpd-manual.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/extra/httpd-mpm.conf to /usr/pkg/etc/httpd/httpd-mpm.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/extra/httpd-multilang-errordoc.conf to /usr/pkg/etc/httpd/httpd-multilang-errordoc.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/extra/httpd-ssl.conf to /usr/pkg/etc/httpd/httpd-ssl.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/extra/httpd-userdir.conf to /usr/pkg/etc/httpd/httpd-userdir.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/extra/httpd-vhosts.conf to /usr/pkg/etc/httpd/httpd-vhosts.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/httpd.conf to /usr/pkg/etc/httpd/httpd.conf
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/magic to /usr/pkg/etc/httpd/magic
apache-2.2.13nb3: copying /usr/pkg/share/examples/httpd/mime.types to /usr/pkg/etc/httpd/mime.types
===========================================================================
The following files should be created for apache-2.2.13nb3:
/etc/rc.d/apache (m=0755)
[/usr/pkg/share/examples/rc.d/apache]
===========================================================================
done
copying files... done
starting services...Starting apache.
httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.28.2 for ServerName
done
Notez que pour le moment tous les packages doivent être préalablement installés sur le filesystem réel, leur reconstruction est réalisée par pkgtools/pkg_tarup (vous devez donc evidemment disposer de ce package). Il va sans dire que les services installés sur le filesystem réel ne doivent pas être démarrés, et qu’ils peuvent être desinstallés après leur ajout dans le chroot.
On détruit le chroot précedemment créé de cette façon :
(imil@korriban) [~] sudo bin/mksvcchroot.sh rm etc/apache-chroot.conf
Ce qui nous donne :
stopping services...Stopping apache. Waiting for PIDS: 4022. done umounting... /dev /home/imil/packages done erasing /home/imil/apache/chroot-NetBSD-5.0.1...done
Tout ceci est encore un peu roots, les améliorations sont evidemment bienvenues.
Le script en question est disponible ici.
NB: ouais, ouais, je sais, echo "ajouter un flag chroot à pkgin" >> TODO
January 17th, 2010 at 5:30 pm
Peut-être qu’on pourra bientôt profiter de ça: http://mult.bsd.lv/
Talk (vieux) ici: http://www.tmux.org/~tobiasu/mirrors/www.dcbsdcon.org/speakers/videos/dzonsons_dcbsdcon2009.avi
January 18th, 2010 at 7:59 am
Moi je dis pour un premier jet c’est sympa comme tout. Tu décris par contre la liste des packages à installer dans le chroot, il peut se produire un problème de dépendances en cas d’oubli ?
January 18th, 2010 at 10:43 pm
oui clairement, je pars du principe que c’est l’hôte qui gère les packages, et qu’ils sont installés dans le chroot via re-créations des-dits packages via pkg_tarup, cela permet entre autres d’avoir une liste très précise de ce que contient le chroot.
January 20th, 2010 at 12:59 pm
Joli travail !
Ca me plait :-)