Jailctl : Création de chroot (jails)

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

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.