Jailctl : Création de chroot (jails)
Contents
1 Introduction
jailctl est un outil écrit en shell permettant de créer/lancer/arrêter/mettre à jour/sauvegarder/restaurer/détruire des jails. Par jail, on entend ici un “serveur virtuel” et non simplement une méthode consistant à isoler un service.
2 Installation
Voici la commande pour installer le fameux package :
pkg_add -vr jailctl
ou
cd /usr/ports/sysutils/jailctl ; make install clean
3 Configuration
- Il faut un fichier de conf : /usr/local/etc/jails.conf
- Il faut aussi : un répertoire où seront posées les jails (/data dans cet exemple)
- Un runme.sh fourni avec jailctl qui habite par défaut dans /usr/local/jails/addons/
- Un fichier dellist4.txt qui contient une liste de fichiers à supprimer dans les jails car inutiles (par exemple des commandes comme mount)
- Un fichier dellist5.txt qui contient la suite des fichiers à supprimer dans le cas où jailctl s’exécute sur une 5.x ou une 6.x (jailctl est en effet compatible avec toutes les versions de 4.x à 6.x)
- Et enfin un répertoire etc/ avec les fichiers de conf à installer dans les nouvelles jails (par défaut, login.conf et make.conf).
Tout cela habite dans /usr/local/jails/addons/ qu’il faudra dans notre exemple déplacer dans /data/addons/.
3.1 Modifs dans login.conf
Il est conseillé de modifier la ligne suivante :
:setenv=PS1=[\\u@\\h] \\w\\\\$ ,MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES, \ PACKAGEROOT=ftp\c//ftp.no.freebsd.org,CLICOLOR=1,EDITOR=/usr/local/bin/nano:\
pour taper dans un miroir plus proche :
:setenv=PS1=[\\u@\\h] \\w\\\\$ ,MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES, \ PACKAGEROOT=ftp\c//ftp.fr.freebsd.org,CLICOLOR=1,EDITOR=/usr/local/bin/nano:\
On personnalisera aussi si besoin l’éditeur par défaut et autres joyeusetés.
3.2 Modifs dans jails.conf
Voici maintenant le gros de la conf. Le fichier étant super bien documenté en interne, voici juste les éléments obligatoires pour pouvoir démarrer rapidement.
Interface sur laquelle sont à ajouter les IP des jails :
IF="em0"
Où qu’elles habitent les jails :
JAIL_HOME="/data/"
Où qu’elles habitent les sauvegardes des jails (par défaut au même endroit) :
BACKUPDIR=$JAIL_HOME
Les trucs à pas sauvegarder :
BACKUP_EXCLUDE="--exclude ./usr/ports/* --exclude ./tmp/* --exclude ./var/tmp/* --exclude ./usr/src/*"
Les jails elles mêmes :
JAILS="" JAILS="$JAILS chii.domaine.com:192.168.1.43" JAILS="$JAILS motosuwa.domaine.com:192.168.1.44" JAILS="$JAILS sumomo.domaine.com:192.168.1.46" JAILS="$JAILS yuzuki.domaine.com:192.168.1.47:/usr/local/jails" JAILS="$JAILS yoshiyuki.domaine.com:192.168.1.48:/data2/yoshi/" JAILS="$JAILS example.domaine.com:192.168.1.49"
Notons ici une petite particularité disponible depuis peu dans jailctl. On peut customiser le répertoire où sera stockée une jail particuilère.
En effet, jusque là, elles ont toujours été stockées dans $JAIL_HOME/nom.de.domaine.com. Maintenant, on peut soit préciser un autre répertoire général (si on ne met pas de / à la fin, par exemple ici yuzuki sera dans /usr/local/jails/yuzuki.domaine.com/) ou un répertoire complet pour une jail donnée (si on met un / à la fin, yoshiyuki sera donc dans /data2/yoshi/).
Un rc.conf sera posé dans la jail, contenant :
RC_CONF='sendmail_enable="NO" sshd_enable="YES" portmap_enable="NO" \ network_interfaces="" tcp_keepalive="NO" inetd_enable="NO"'
Enfin, il faut donner un DNS pour le resolv.conf de la jail :
NAMESERVER="195.95.225.104"
Il est indispensable que ce DNS soit joignable pendant le “create” de la jail, en effet des packages seront installés par runme.sh à la fin de la création.
Enfin, si on le souhaite, on peut préciser des scripts qui seront exécutés avant/après certaines commandes jailctl (les scripts recevront en argument $1 le nom de la jail et en $2 son jail ID à condition d’être au moins sur une 5.x) :
BEFORESTATUS_HOOKS="/usr/bin/true" AFTERSTATUS_HOOKS="/usr/bin/true" BEFORESTART_HOOKS="/usr/bin/true" AFTERSTART_HOOKS="/usr/bin/true" BEFORESTOP_HOOKS="/usr/bin/true" AFTERSTOP_HOOKS="/usr/bin/true"
4 Conseils
ATTENTION : Il est FORTEMENT déconseillé de créer des jails avec un environnement différent de celui de la machine hôte, par exemple un hôte en -STABLE et des jails en -RELEASE, ou réciproquement. Dans l’absolu, avec jailctl, cela signifie qu’il ne faut pas faire de cvsup entre la compilation de l’hôte et l’installation des jails.
Prenez le temps de lire jails.conf ainsi que runme.sh avant de faire quoi que ce soit afin de les personnaliser.
5 Mise en pratique
5.1 Etat des jails
# jailctl status Jail status (*=running, !=not configured): *chii.domaine.com (192.168.1.43) *motosuwa.domaine.com (192.168.1.44) *sumomo.domaine.com (192.168.1.46) *yuzuki.domaine.com (192.168.1.47) yoshiyuki.domaine.com (192.168.1.48) *example.domaine.com (192.168.1.49)
Dans cet exemple, toutes les jails sont installées et yoshiyuki n’est pas lancée. Une jail non encore créée serait marquée d’un point d’exclamation.
5.2 Création d'une jail
# jailctl create example.domaine.com Creating jail example.domaine.com... >>> Making hierarchy >>> Installing everything Setting root password in jail Changing local password for root New Password: Retype New Password: chsh: user information updated use.perl: not found ifconfig em0 inet 192.168.1.49 netmask 0xffffffff alias jail /data/example.domaine.com example.domaine.com 192.168.1.49 /bin/sh /runme.sh ifconfig em0 inet 192.168.1.49 netmask 0xffffffff -alias
Le use.perl est encore là pour des raisons de compatibilité. Cela ne constitue pas une erreur. La seule information à fournir pour l’installation est le mot de passe root de la jail, si jailctl n’est pas exécuté en mode batch.
5.3 Lancement d'une jail
# jailctl start example.domaine.com Starting jail example.domaine.com... stty: stdin isn't a terminal yellow-sub# ln: /dev/log: Operation not permitted
Les erreurs sont normales est simplement dues à des particularités de jail.
5.4 Arrêt d'une jail
# jailctl stop example.domaine.com Stopping jail example.domaine.com... Sending TERM signal to jail processes... Stopping cron. Shutting down daemon processes:. Shutting down local daemons:. Terminated .
5.5 Sauvegarde d'une jail (non lancée)
# jailctl backup example.domaine.com Doing cold backup of jail example.domaine.com...
Un beau tar.gz apparaît dans le répertoire où se situent les jails. Restauration d'une jail (forcément non lancée)
# jailctl restore example.domaine.com No valid jail specified! Usage: jailctl <command> <jail> [<path>] <command> = start|stop|status|create|delete|upgrade|backup|restore <jail> = hostname|all <path> = Backup destination / restore source
Mais que se passe-t-il ?
Pour restaurer une jail, il ne faut pas qu’elle existe. Effacement d'une jail
# jailctl delete example.domaine.com Deleting jail example.domaine.com...
Restauration d'une jail, 2ème
# jailctl restore example.domaine.com Restoring jail example.domaine.com from backup
Sauvegarde d'une jail (lancée)
Il s’agit là du menu maxi best of.
# jailctl backup example.domaine.com Doing warm backup of jail example.domaine.com... tar: ././var/run/log: tar format cannot archive socket: Inappropriate file type or format tar: ././var/run/logpriv: tar format cannot archive socket: Inappropriate file type or format
Les erreurs sont normales.