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?
¯\_(ツ)_/¯