ZFS und Jail (ezjail)

Photor

Well-Known Member
Hallo Forum,

ich überlege, das unter FreeBSD 13 mit ZFS laufenden MacBook stationär zu nutzen (z.B. Nextcloud im Heimnetz, vielleicht noch andere Server-Dienste wie Git drauf). Dazu würde ich gerne Jails einsetzen wollen. Gibt es dabei etwas bezüglich ZFS zu beachten?

Früher(TM) - zu Zeiten von FreeBSD 7 - habe ich mit mal Jails experimentiert (damals auf UFS), wobei ich zum Schluss ezjail genutzt habe, um ein Base-Jail als Ausgangspunkt zu haben und dann verschiedene Jails daraus "abzuleiten". Ich habe gesehen, dass ezjail noch in den Ports (und als Package) zu finden ist; d.h. es ist noch aktuell?

Spricht etwas gegen ezjail für diese Aufgabe? Oder gibt es was moderneres? Auch hier wieder: gibt es was im Zusammenhang mit ZFS zu beachten? System update des Base-Jails geht mit den normale aktuellen Tools (freebsd-update) - das lief früher über make buildworld, wenn ich mich recht erinnere?

Danke für Eure Hinweise,
Photor
 

medV2

Well-Known Member
Ezjail gibt es noch, ich weiß nicht wie aktiv das noch gepflegt wird, da kamen lange zeit diverse warnings.

Gerade für den Einsatz mit ZFS würd ich dir mal raten nen Blick auf iocage zu werfen. Da hast du quasi ein Release-Dataset von dem du dann Clones für deine einzelnen Jails machst. Ist auch sehr Platzsparend hat aber ein paar Vor und Nachteile zur ezjail-Basejail lösung. Iocage ist sehr gut Dokumentiert, einfach mal reinschauen.
 

Andy_m4

Well-Known Member
Gibt es dabei etwas bezüglich ZFS zu beachten?
Ja. Nimm für jede Jail (mindestens) ein eigenes Dataset. :-)

Spricht etwas gegen ezjail für diese Aufgabe?
Im Handbuch wirds ja noch erwähnt. Ich weiß aber nicht, wie aktiv das noch entwickelt wird. Patches gabs jedenfalls schon länger nicht mehr.

Ansonsten ist ja so eine Jail (auch ohne zusätzliche Software) schnell eingerichtet.
Du erstellst das Dataset und machst dann ein
bsdinstall jail /path/to/myjail
und durchläufst damit im Wesentlichen die gewohnte FreeBSD-Setup-Routine.
Konfiguriert werden Jails auch nicht mehr allein durch die /etc/rc.conf, sondern es gibt eine /etc/jail.conf
C-ähnlich:
# globale Angaben:
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;

# Jail-spezifische Konfigurationen:

webserver {
    # $name ist hier vorbelegt mit dem Jailnamen 'webserver'
    host.hostname = $name;
    path = "/jailz/$name/";
    interface = "eth0";
    ip4.addr = 192.168.0.5;
    mount.fstab = "/jailz/$name.fstab";
    allow.set_hostname = 0;
    allow.reserved_ports = 1;
}

database {
    mount.devfs;
    host.hostname = $name;
    path = "/jailz/$name/";
    interface = "eth0";
    ip4.addr = 192.168.0.6;
    mount.fstab = "/jailz/$name.fstab";
    allow.set_hostname = 0;
    allow.reserved_ports = 0;
}


Sowas wie Thin-Jails oder auch Template-Jails kann man sehr gut mit ZFS-Features (z.B. 'clone') abbilden.

Man kann zu Software wie iocage greifen, aber im Prinzip kriegst Du heute einfachere Setups auch gut mit Bordmitteln hin.

System update des Base-Jails geht mit den normale aktuellen Tools (freebsd-update)
Ja. Du kannst brauchst im Prinzip nur ein
freebsd-update -b /path/to/myjail
machen. Kann aber passieren, das freebsd-update bei Release-Upgrades meckert weil er nachguckt, welche FreeBSD-Version aktuell läuft und dann sagt: Hey. Was machst Du da? Ich bin doch schon auf der aktuellen Version.

Dann hilft es die Version der Jail anzugeben:
freebsd-update -r 13.0-RELEASE --currently-running 12.2-RELEASE fetch install

Wenn Du Packages installieren willst, gibts den Schalter -j:
pkg -j myjail upgrade

Mit jls kannst Du Dir alle laufenden Jails anzeigen lassen.

Das kannst Du nutzen, um beispielsweise alle (laufenden) Jails mit einmal zu aktualisieren:
Code:
foreach j ( `jls | grep -v JID | awk '{print $1}'` )
    pkg -j $j --yes upgrade
end
oder solche Scherze.

Für die /etc/rc.conf gibts auch diverse Schalter.
Neben dem bekannten jail_enable="YES" gibts da noch:
Code:
# Startet von allen Jails aus der /etc/jail.conf nur die,
# die in der (leerzeichengetrennten) Liste angegeben sind
jail_list="database webserver"

# Jails in umgekehrter Reihenfolge stoppen
# (kann interessant sein, falls Jails von einander abhängen)
jail_reverse_stop="YES"

# Wenn sie nicht voneinander abhängen, kannst Du auch ein
# Parallel-Startup machen
jail_parallel_start="YES"

Du kannst das normale service-Kommando benutzen, um Jails zu starten oder stoppen.
Alle Jails:
service jail start
oder nur bestimmte Jails:
service jail stop webserver
 

Photor

Well-Known Member
Moin,

lese gerade zu iocage und finde schon, dass ich das in die engere Wahl ziehen sollet.

Zu ZFS aber habe ich noch Fragen. Zuerst: so sieht es momentan aus
Code:
root@7of9:~ # zfs list
NAME                 USED  AVAIL     REFER  MOUNTPOINT
zroot               13.0G   433G       96K  /zroot
zroot/ROOT          10.3G   433G       96K  none
zroot/ROOT/default  10.3G   433G     10.3G  /
zroot/tmp            192K   433G      192K  /tmp
zroot/usr           2.69G   433G       96K  /usr
zroot/usr/home       871M   433G      871M  /usr/home
zroot/usr/ports     1.15G   433G     1.15G  /usr/ports
zroot/usr/src        702M   433G      702M  /usr/src
zroot/var            900K   433G       96K  /var
zroot/var/audit       96K   433G       96K  /var/audit
zroot/var/crash       96K   433G       96K  /var/crash
zroot/var/log        372K   433G      372K  /var/log
zroot/var/mail       144K   433G      144K  /var/mail
zroot/var/tmp         96K   433G       96K  /var/tmp
Das ist im Prinzip so, wie es nach einer normalen Installation aussieht (wenn man noch X und XFCE nachinstalliert; selbst in HOME ist ja kaum etwas gespeichert).

Auf UFS würde ich jetzt ein /usr/local/JAILS-Verzeichnis anlegen und da die diversen Jails unterbringen. ZFS bietet aber ja einige Features mehr (Snapshots, Clone, ...). Was wäre die sinnvollste Vorgehensweise, wenn man berücksichtigt, dass ich experimentieren werde/muss/will und wenn man nachher z.B. ein Nextcloud-Server betreiben will, der - zwar privat - "produktiv" eingesetzt werden soll (ich weiß, dass sich beides in den Anforderungen irgendwo widerspricht - aber deshalb frage ich ja)

Ciao,
Photor
 

medV2

Well-Known Member
iocage kümmert sich da automatisch darum, dem sagst du nur "nutze zroot" dann legt es automatisch zroot/iocage an und darunter viele datasets für releases, jails, ...
die datasets sind dann immer clones von den jeweiligen releases, das ist sehr platzsparend. gerade wenn du experimentieren willst sehr gut geeignet. einfach rumspielen damit und am schluss die vms wieder löschen - iocage regelt das alles sehr gut. nur die backup-snapshots die iocage bei upgrades und co anlegt hab ich oft händisch aufgeräumt weils mir zu viel wurden - aber das ist geschmackssache.
 

Photor

Well-Known Member
Jo. Das klingt ziehmlich genau nach dem, was ich brauche. Dann stürze ich mich da mal rein.

Danke,
Photor
 

medV2

Well-Known Member
bastille und containerd verfolgen halt andere ziele als klassiche bsd jails mit ezjails oder iocage. das will eher docker/podman ersatz werden.
 

Photor

Well-Known Member
Moin,

ich bin endlich mal dazu gekommen, mit iocage zu experimentieren: ich habe zunächst mit pkg install py38-iocage iocage installiert. Im wesentlichen habe ich mich an Basic Usage gehalten.

activate hat nicht funktioniert, was ich aber ignoriert habe.

Mit iocage fetch -r LATEST habe dann ich FreeBSD 13.0 RELEASE geholt, was auch ohne Probleme funtioniert hat.

Allerdings bekomme ich schon im nächsten Schritt ein Problem: iocage create -r LATEST --name MyJail sollte mir ein erstes Test-Jail erzeugen. Das bricht jedoch mit folgender Fehlermeldung ab:

Bash:
root@7of9:~ # iocage create -r LATEST --name MyJail
********************************************************************************
fdescfs(5) is not mounted, performance may suffer. Please run:
mount -t fdescfs null /dev/fd
You can also permanently mount it in /etc/fstab with the following entry:
fdescfs /dev/fd  fdescfs  rw  0  0
********************************************************************************


Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/iocage_cli/create.py", line 167, in cli
    ioc_common.check_release_newer(release)
  File "/usr/local/lib/python3.8/site-packages/iocage_lib/ioc_common.py", line 722, in check_release_newer
    r_float = float(str(release).rsplit("-")[0])
ValueError: could not convert string to float: '13.0</p'


During handling of the above exception, another exception occurred:


Traceback (most recent call last):
  File "/usr/local/bin/iocage", line 10, in <module>
    sys.exit(cli())
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/iocage_cli/create.py", line 173, in cli
    _release = ioc_common.get_jail_freebsd_version(path, release)
  File "/usr/local/lib/python3.8/site-packages/iocage_lib/ioc_common.py", line 927, in get_jail_freebsd_version
    with open(
FileNotFoundError: [Errno 2] No such file or directory: '/zroot/iocage/releases/13.0</p-RELEASE/root/bin/freebsd-version'

Auffälling ist der Directory-Pfad. Wie der sich zusammen setzt und wo das "<" her kommt, kann ich nicht sagen.

Hier noch der aktuelle "Zustand" des zroot:das siht for mich nicht auffällig aus. Oder übersehe ich etwas?

Bash:
root@7of9:~ # zfs list
NAME                                      USED  AVAIL     REFER  MOUNTPOINT
zroot                                    14.9G   431G       96K  /zroot
zroot/ROOT                               10.6G   431G       96K  none
zroot/ROOT/default                       10.6G   431G     10.6G  /
zroot/iocage                             1.70G   431G      140K  /zroot/iocage
zroot/iocage/download                     401M   431G       96K  /zroot/iocage/download
zroot/iocage/download/13.0-RELEASE        401M   431G      401M  /zroot/iocage/download/13.0-RELEASE
zroot/iocage/images                        96K   431G       96K  /zroot/iocage/images
zroot/iocage/jails                         96K   431G       96K  /zroot/iocage/jails
zroot/iocage/log                           96K   431G       96K  /zroot/iocage/log
zroot/iocage/releases                    1.31G   431G       96K  /zroot/iocage/releases
zroot/iocage/releases/13.0-RELEASE       1.31G   431G       96K  /zroot/iocage/releases/13.0-RELEASE
zroot/iocage/releases/13.0-RELEASE/root  1.31G   431G     1.31G  /zroot/iocage/releases/13.0-RELEASE/root
zroot/iocage/templates                     96K   431G       96K  /zroot/iocage/templates
zroot/tmp                                 184K   431G      184K  /tmp
zroot/usr                                2.69G   431G       96K  /usr
zroot/usr/home                            868M   431G      868M  /usr/home
zroot/usr/ports                          1.15G   431G     1.15G  /usr/ports
zroot/usr/src                             702M   431G      702M  /usr/src
zroot/var                                 912K   431G       96K  /var
zroot/var/audit                            96K   431G       96K  /var/audit
zroot/var/crash                            96K   431G       96K  /var/crash
zroot/var/log                             384K   431G      384K  /var/log
zroot/var/mail                            144K   431G      144K  /var/mail
zroot/var/tmp                              96K   431G       96K  /var/tmp
root@7of9:~ #

Frage ist natürlich: was ist falsch gelaufen und wie kann ich es reparieren?

Weiterführende Frage: es gibt ja auch die Möglichkeit ein Base Jail aufzusetzen. Ist das dem unter ezjail ähnlich (also als Prototyp, den ich für alle weitere nutzen kann, und das ich später update, um alle abgeleiteten mitzunehmen)?

Dankbar für Eure Tipps und Hinweise,
Photor
 

medV2

Well-Known Member
Gib statt LATEST direkt das Release an, also 13.0-RELEASE. Wusste garnicht das "LATEST" überhaupt funktioniert, dürfte etwas neuer dazugekommen sein, vielelicht hakt da was.
 

Andy_m4

Well-Known Member
Ja. Ich würde auch nicht unbedingt LATEST nehmen. Offenbar versucht das Python-Skript dann (auf welchem Wege auch immer) die letzte Version zu ermitteln. Vermutlich via Webscraping oder so. Jedenfalls gehts schief, so das in der zuständigen Variable dann nicht 13.0-RELEASE drin steht.
Jedenfalls legt das die Fehlermeldung nahe: ValueError: could not convert string to float: '13.0</p'

Irgendwelche windigen Webscraping-Geschichten sind aber ziemlich schlechter Stil. Ich kenne iocage jetzt nicht aus eigener Erfahrung, aber allein das die sowas machen würde jetzt nicht unbedingt mein Vertrauen in die Software stärken. :-)

Frage ist natürlich: was ist falsch gelaufen und wie kann ich es reparieren?
Ja. Kann man. Entweder Du reparierst das defekte Webscraping im iocage-Code oder Du nimmst beim Aufruf 13.0-RELEASE.
 

Photor

Well-Known Member
Tja. Sieht so aus:

It is as simple as that :)
Bash:
root@7of9:~ # iocage create -r 13.0-RELEASE --name MyJail
********************************************************************************
fdescfs(5) is not mounted, performance may suffer. Please run:
mount -t fdescfs null /dev/fd
You can also permanently mount it in /etc/fstab with the following entry:
fdescfs /dev/fd  fdescfs  rw  0  0
********************************************************************************

Missing default rc.conf, creating it
MyJail successfully created!
root@7of9:~ #
Danke für den Hinweis. Jetzt kann ich weiter experimentieren.

Ciao,
Photor
 
Oben