Demo: Thin Jails with nullfs

Problem — von ezjail auf native Jails migrieren (Hintergrund).

Auf dieser Seite — wie kann ich Thin Jails mit VNET und nullfs von einer Tick Jail erstellen und diese (vorerst) parallel neben ezjail laufen lassen?

Lasse die alte Thick Jail einfach mal so liegen, gehe aber von dieser Config aus, und erweitere die dann später.

Installation

Es geht streng nach Handbuch also erstelle ich mir Datasets:

zfs create tank/root/templates
zfs create tank/root/templates/13.4-RELEASE-base

Dann installieren wir mal ein älteres Release als vom Host:

fetch https://download.freebsd.org/ftp/releases/amd64/amd64/13.4-RELEASE/base.txz \
  -o /usr/jails/templates/13.4-RELEASE-base.txz
tar -xf /usr/jails/templates/13.4-RELEASE-base.txz \
  -C /usr/jails/templates/13.4-RELEASE-base --unlink

Bekannt von vorhin: timezone & resolv.conf:

cp /usr/jails/templates/13.4-RELEASE-base/usr/share/zoneinfo/Europe/Berlin \
  /usr/jails/templates/13.4-RELEASE-base/etc/localtime

cat << EOF > /usr/jails/templates/13.4-RELEASE-base/etc/resolv.conf
nameserver 2620:fe::fe
nameserver 2620:fe::9

nameserver 149.112.112.112
nameserver 9.9.9.9
EOF

Updates! Damit die korrekten Updates für das Template installiert werden muss man currently-running setzen:

freebsd-update -b /usr/jails/templates/13.4-RELEASE-base \
  --currently-running 13.4-RELEASE \
  fetch install

Skelett

Die Ordner die man in den Jails einzigartig (beschreibbar) haben möchte verschiebt man ins skeleton.

zfs create tank/root/templates/13.4-RELEASE-skeleton
mkdir -v /usr/jails/templates/13.4-RELEASE-skeleton/home
mkdir -v /usr/jails/templates/13.4-RELEASE-skeleton/usr
mv -v /usr/jails/templates/13.4-RELEASE-base/etc \
      /usr/jails/templates/13.4-RELEASE-skeleton/etc
mv -v /usr/jails/templates/13.4-RELEASE-base/usr/local \
      /usr/jails/templates/13.4-RELEASE-skeleton/usr/local
mv -v /usr/jails/templates/13.4-RELEASE-base/tmp \
      /usr/jails/templates/13.4-RELEASE-skeleton/tmp
mv -v /usr/jails/templates/13.4-RELEASE-base/var \
      /usr/jails/templates/13.4-RELEASE-skeleton/var
mv -v /usr/jails/templates/13.4-RELEASE-base/root \
      /usr/jails/templates/13.4-RELEASE-skeleton/root

Hier gibts Beschwerde beim kopieren von /var/empty. Löschen geht nicht, weil Berechtigungen. Die /usr/jails/templates/13.4-RELEASE-skeleton/var/empty ist aber korrekt da. Dennoch müssen wir das für den nächsten Schritt beheben:

chflags -R noschg /usr/jails/templates/13.4-RELEASE-base/var/empty
rmdir -v /usr/jails/templates/13.4-RELEASE-base/var/empty
rmdir -v /usr/jails/templates/13.4-RELEASE-base/var

Zurück in der Basis:

mkdir -v /usr/jails/templates/13.4-RELEASE-base/skeleton
ln -s skeleton/etc            /usr/jails/templates/13.4-RELEASE-base/etc
ln -s ../skeleton/usr/local   /usr/jails/templates/13.4-RELEASE-base/usr/local
ln -s skeleton/tmp            /usr/jails/templates/13.4-RELEASE-base/tmp
ln -s skeleton/var            /usr/jails/templates/13.4-RELEASE-base/var
ln -s skeleton/root           /usr/jails/templates/13.4-RELEASE-base/root
ln -s skeleton/home           /usr/jails/templates/13.4-RELEASE-base/home

Ein ls -l sollte dann so aussehen:

etc -> skeleton/etc
home -> skeleton/home
root -> skeleton/root
tmp -> skeleton/tmp
usr/local -> ../skeleton/usr/local
var -> skeleton/var

Thin Jails erstellen

Bitte recht freundlich:

zfs snapshot tank/root/templates/13.4-RELEASE-skeleton@base

Davon die Datasets für thin-demo & thin-test erstellen:

zfs clone tank/root/templates/13.4-RELEASE-skeleton@base \
  tank/root/containers/thin-demo-data
zfs clone tank/root/templates/13.4-RELEASE-skeleton@base \
  tank/root/containers/thin-test-data

Ein zfs list sollte nun grob so aussehen:

NAME                                        USED  AVAIL  REFER  MOUNTPOINT
…
tank                                       3.15T  3.69T   128K  none
tank/root                                  3.15T  3.69T   151K  /usr/jails
…
tank/root/containers                        703M  3.69T   196M  /usr/jails/containers
tank/root/containers/classic                507M  3.69T   490M  /usr/jails/containers/classic
tank/root/containers/thin-demo-data           0B  3.69T  6.15M  /usr/jails/containers/thin-demo-data
tank/root/containers/thin-test-data           0B  3.69T  6.15M  /usr/jails/containers/thin-test-data
…
tank/root/some                             1.49G  3.69T   797M  /usr/jails/some
…
tank/root/templates                         796M  3.69T   209M  /usr/jails/templates
tank/root/templates/13.4-RELEASE-base       581M  3.69T   581M  /usr/jails/templates/13.4-RELEASE-base
tank/root/templates/13.4-RELEASE-skeleton  6.15M  3.69T  6.15M  /usr/jails/templates/13.4-RELEASE-skeleton
…

USED 0B — Schon gute Ansage 🙃

Konfiguration

Die /etc/jail.conf wird auf Grundlage von vorhin erweitert — Das Netzwerk Setup und die Jail Config von dort sollte da sein & funktionieren:

path = "/usr/jails/containers/${name}";
# falls noch nicht vorhanden
mount.fstab = "/etc/fstab.jail.${name}";

…

thin-demo {
    $num = "13";
    $hex = "d";
}

thin-test {
    $num = "12";
    $hex = "c";
}

Wir brauchen mountpoints und fstabs für thin-demo & thin-test:

mkdir -v /usr/jails/containers/thin-demo
mkdir -v /usr/jails/containers/thin-demo/skeleton

cat << EOF > /etc/fstab.jail.thin-demo
/usr/jails/templates/13.4-RELEASE-base  /usr/jails/containers/thin-demo           nullfs  ro  0 0
/usr/jails/containers/thin-demo-data    /usr/jails/containers/thin-demo/skeleton  nullfs  rw  0 0
EOF

mkdir -v /usr/jails/containers/thin-test
mkdir -v /usr/jails/containers/thin-test/skeleton

cat << EOF > /etc/fstab.jail.thin-test
/usr/jails/templates/13.4-RELEASE-base  /usr/jails/containers/thin-test           nullfs  ro  0 0
/usr/jails/containers/thin-test-data    /usr/jails/containers/thin-test/skeleton  nullfs  rw  0 0
EOF

Starten

Eigentlich haben wir alles die Jails sollten hoch kommen:

service jail start thin-test

Auf dem Host – mount checken:

tank/root/containers/thin-demo-data on /usr/jails/containers/thin-demo-data (zfs, local, nfsv4acls)
tank/root/templates/13.4-RELEASE-skeleton on /usr/jails/templates/13.4-RELEASE-skeleton (zfs, local, nfsv4acls)
tank/root/containers/thin-test-data on /usr/jails/containers/thin-test-data (zfs, local, nfsv4acls)
tank/root/templates/13.4-RELEASE-base on /usr/jails/templates/13.4-RELEASE-base (zfs, local, nfsv4acls)
…
/usr/jails/templates/13.4-RELEASE-base on /usr/jails/containers/thin-demo (nullfs, local, read-only, nfsv4acls)
/usr/jails/containers/thin-demo-data on /usr/jails/containers/thin-demo/skeleton (nullfs, local, nfsv4acls)
devfs on /usr/jails/containers/thin-demo/dev (devfs)
/usr/jails/templates/13.4-RELEASE-base on /usr/jails/containers/thin-test (nullfs, local, read-only, nfsv4acls)
/usr/jails/containers/thin-test-data on /usr/jails/containers/thin-test/skeleton (nullfs, local, nfsv4acls)
devfs on /usr/jails/containers/thin-test/dev (devfs)

In der Jail:

jexec thin-test login -f root

freebsd-version -ru
14.2-RELEASE
13.4-RELEASE-p2

touch /root/hering

touch /boot/test
touch: /boot/test: Read-only file system

cat /etc/motd
FreeBSD 14.2-RELEASE releng/14.2-n269506-c8918d6c7412 GENERIC

Welcome to FreeBSD!
…
  • Neuer Kernel am Host, altes Userland in der Jail. So war das geplant!
  • Nach /etc, /home, /root, /tmp, … darf man schreiben, alles andere nicht…
  • Unbedingt checken, dass nicht /etc, /home, … vom Host eingebunden wird. Hatte mich beim Symlink setzen von der Basejail ins Skeleton vertan. War das falsche /etc gemounted, eher fatal. Deshalb Blick in /etc/motd.
  • Netzwerk sollte™ funktionieren. Zum testen auf der anderen Seite nachsehen.

Wir haben den Ordner thin-test und das Dataset thin-test-data. Der Hering ist also jetzt da:

  • /usr/jails/containers/thin-test/root/hering
    • Mountpoint der Jail - nur solange da wie die Jail läuft
  • /usr/jails/containers/thin-test-data/root/hering
    • Hier sind nur die Skeleton Ordner drin. Ist da, wo die Daten eigentlich liegen.

Fazit

Läuft!

  • Irgendwie ist das anders als was ezjail da macht.
    • Die Tage mal durch die Shell Scripte stöbern um mir da Anregungen zu holen.
    • Auch mal nachschauen welche Ordner ich wirklich im Skeleton brauche.
  • Nächster Schritt: Wie gehen Updates? Einfach neue Basejail bauen, und das im Mountpoint austauschen?

Und weiter?

¯\_(ツ)_/¯

last update: 2024-12-19 19:16:54 +0100