jails:zfs

Créer et administrer vos jails par ZFS

La puissance apportée par ZFS va vous simplifier la vie dans la gestion de vos jail. Dans cet article, une base commune est créée dont sera issues toutes les jails que l'on pourra par la suite distribuer pour d'autres machines.

Avant d'utiliser jail(8), vous devez créer un fichier de configuration: jail.conf(5). Ce dernier est composé de deux parties.

/etc/jail.conf
# variables communes à toutes les jails
 
exec.clean;
exec.system_user = "root";
exec.jail_user = "root";
exec.start += "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.consolelog = "/var/log/jail_${name}_console.log";
path = "/jails/${name}";
 
 
R12 {
	host.hostname = r12;           	# Hostname
	ip4 = inherit;# IP address of the jail
	ip6 = inherit;# IP address of the jail
	path = "/jails/12.1-RELEASE";
}

Notez que le path, s'il n'est pas précisé explicitement, prendra automatiquement le nom de la jail.

Vous aurez probablement besoin d'une interface réseau pour faire communiquer les services des jails entre eux.

root@popeye:# ifconfig create lo1
root@popeye:# sysrc cloned_interfaces+=lo1

De même, pour assurer un démarrage à chaque reboot, activer le service jail:

root@popeye:# sysrc jail_enable="YES"

Et précisez les jails à démarrer dans la variable jail_list, ou ignorez cette variable pour toute les démarrer.

Créer un dataset pour contenir toutes les jails, puis un dataset par jail.

root@popeye:# zfs create -o mountpoint=/jails zroot/JAILS
root@popeye:# zfs create zroot/JAILS/12.1-RELEASE
Comme vous allez multiplier les datasets reposant sur une même base, vous pouvez activer la deduplication afin d’économiser de l'espace disque, si vous avez assez de mémoire vive.
root@popeye:# zfs set dedup=on zroot/JAILS

Récupérer une release et installons une première jail, qui va servir de point de départ à toutes les autres.

root@popeye:# cd /jails
root@popeye:# fetch http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/12.1-RELEASE/base.txz
root@popeye:# tar -C 12.1-RELEASE -xf base.txz
root@popeye:# cp /etc/resolv.conf 12.1-RELEASE/etc/resolv.conf
root@popeye:# cp /usr/local/etc/pkg/repos/*.conf 12.1-RELEASE/etc/pkg
root@popeye:# touch 12.1-RELEASE/etc/rc.conf

Dans cet exemple, j'utiliserai ma propre poudriere.

Et réglez votre rc.conf(5) ainsi:

12.1-RELEASE/etc/rc.conf
cron_flags="$cron_flags -J 15"
 
# Disable Sendmail by default
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
 
# Run secure syslog
syslogd_flags="-c -ss"

Plus quelques réglages dédiées:

12.1-RELEASE/etc/rc.conf.local
hostname=nepasutiliser

Si votre jail doit pouvoir envoyer des mails, le plus rapide est d'activer le sendmail de la base sur ce seul service:

rc.conf
sendmail_submit_enable="YES"

Et d'avoir un hostname(1) complet, sur un domaine qualifié (FQDN).

rc.conf
hostname="diaspora.lapinbilly.eu"
Attention, si vous avez autorisé cron(8), assurez vous de désactiver les scripts periodic(8) dans /etc/crontab. Sinon, vous allez remplir la base mail de root.

Vous pouvez démarrer:

root@popeye:# jail -c R12
R12: created

Multiplier

A partir de ce point, vous avez préparé une base saine que vous allez pouvoir reproduire facilement.

Faites un cliché, test, de la base:

root@popeye:# zfs snap zroot/JAILS/12.1-RELEASE@test

Attention, ce cliché est dédié à la jail test, ne prévoyez pas de l'utiliser pour autre chose, puisque qu'en cas de promotion du futur clone, il disparaîtra.

Créons une nouvelle jail, simplement en clonant ce cliché:

root@popeye:# zfs clone zroot/JAILS/12.1-RELEASE@test zroot/JAILS/TEST

En fait, vous avez créer un dataset à partir d'un cliché. C'est aussi simple, vous avez une jail toute prête sur zroot/JAILS/TEST.

Réglons là:

TEST/etc/rc.conf.local
hostname=TEST
/etc/jail.conf
TEST {
	host.hostname = TEST;           	# Hostname
	ip4.addr = "lo1|192.168.5.2";          # IP address of the jail
}

Si vous devez démarrer des jails en cascade, utilisez le mot clef depend pour lier les jails entre elles.

/etc/jail.conf
TEST2 {
	host.hostname = TEST2;
	depend = TEST;
}
root@popeye:# jail -c TEST2
TEST: created
TEST2: created
De même, les jail(8) vont démarrer dans l'ordre donné par le sysrc(8) jail_list.

Déployer

Il suffit de promouvoir le clone, le rendre indépendant du cliché dont il est issu:

root@popeye:# zfs promote zroot/JAILS/TEST

Et voilà.

Réseau

Si vous avez attribué une interface réseau avec IP locale sur vos jails, en d'autre termes, vous n'avez pas utilisé inherit sur l'un des paramètres ip4 ou ip6, n'oubliez pas d'écrire une règle de NAT pour qu'elles puissent accéder à l'extérieur. Par exemple, pour pf(4):

/etc/pf.conf
jailnet="192.168.0.0/24"
 
# ...
 
nat on $ext_if from $jailnet to any -> ($ext_if)

Pensez à vérifier les valeurs de resolv.conf(5). Si vous avez suivi la procédure, ce devrait être une copie de celle de l'hôte.

Attention avant d'autoriser l'accès à l'extérieur depuis une jail. La plupart du temps, hormis lors de l'installation ou la mise à jour de paquets. Vous n'en avez pas besoin.

Pour les services accessibles sur IP que vous ne pourrez pas donner à manger à nginx vous devrez utiliser des règles de redirection. Et, de nos jours, vous devrez de plus le faire pour les adresses IPV6:

pf.conf
jail_git="fc00::168:13"
jail_net="192.168.0.1/24"
# ...
nat on $ext_if from $jail_net to any -> ($ext_if)
nat on $ext_if inet6 from $jail_git to any -> ($ext_if)
rdr pass on $ext_if proto tcp from any to ($ext_if) port 9418 -> 192.168.0.13 port 9418
rdr pass on $ext_if inet6 proto tcp from any to ($ext_if) port 9418 -> $jail_git port 9418

Mettre à jour

Il suffit de demander à freebsd-update(8).

freebsd-update(8) suit par défaut la configuration le fichier /etc/freebsd-update.conf.

Créez en une plus adapté aux jails en général, en retirant tout ce qui concerne le noyau:

/usr/local/etc/jail-update.conf
--- /etc/freebsd-update.conf    2018-11-02 03:58:09.000000000 +0000
+++ /usr/local/etc/jail-update.conf     2020-05-05 11:25:40.662419000 +0000
@@ -12,7 +12,7 @@
 ServerName update.FreeBSD.org
 
 # Components of the base system which should be kept updated.
-Components src world kernel
+Components world 
 
 # Example for updating the userland and the kernel source code only:
 # Components src/base src/sys world
@@ -35,7 +35,7 @@
 
 # When upgrading to a new FreeBSD release, files which match MergeChanges
 # will have any local changes merged into the version from the new release.
-MergeChanges /etc/ /boot/device.hints
+MergeChanges /etc/
 
 ### Default configuration options:
 
@@ -66,11 +66,11 @@
 
 # When installing a new kernel perform a backup of the old one first
 # so it is possible to boot the old kernel in case of problems.
-# BackupKernel yes
+BackupKernel no
 
 # If BackupKernel is enabled, the backup kernel is saved to this
 # directory.
 # BackupKernelDir /boot/kernel.old
 
 # When backing up a kernel also back up debug symbol files?
-# BackupKernelSymbolFiles no
+BackupKernelSymbolFiles no

Utilisez le fichier de configuration et donnez à freebsd-update(8) les bonnes informations:

  • la version avec –currently-running
  • le chemin de la base avec -b
root@popeye:# freebsd-update -f /usr/local/etc/jail-update.conf --currently-running 12.1-RELEASE -b /jails/majail fetch install 

Notez que vous pouvez automatiser le processus en demandant directement à la jail quelle version elle fait tourner:

root@popeye:# jexec jailname freebsd-version -u
12.1-RELEASE-p4

Utilisez automatiquement cette valeur dans un script par:

root@popeye:# freebsd-update -f /usr/local/etc/jail-update.conf --currently-running `jexec jailname freebsd-version -u` -b /jails/majail fetch install 
  • jails/zfs.txt
  • Dernière modification: 2020/08/01 15:49
  • par david