Datenverzeichnisse außerhalb des Jails verbinden

Einleitung

Bestimmte Verzeichnisse innerhalb einer Jail können in "externe" (Datasets) ausgelagert werden. Dadurch werden diese Daten unabhängig vom Jail gespeichert. Ziel ist es, ähnlich wie bei Docker, so wenig wie möglich vom Jail selbst abhängig zu sein. Sollte die Jail aus irgendeinem Grund beschädigt oder gelöscht werden, ist man so in der Lage, die vorherige Konfiguration und die Daten mit minimalem Aufwand wiederherzustellen. Außerdem können diese Verzeichnisse dann effizient und regelmäßig per Snapshot gesichert werden, was auch weitere Backups vereinfacht. Ganz zu schweigen von Umzügen oder Migrationen.

Letzte Aktualisierung:

  • 17.11.2024: TrueNAS Referenzen entfernt, auf Bastille umgestellt und an die Logik der FreeBSD Server Artikelreihe und Bastille angepasst
  • 03.03.2024: Kleinigkeiten angepasst
  • 23.01.2024: Etwas gestrafft und Konfiguration in TrueNAS aufgenommen
  • 18.08.2023: Initiale Version

Begrifflichkeiten

  • JAILNAME = Der Name des Jails
  • POOLNAME = Der ZFS Poolname wo die Daten abgelegt werden sollen z.B. work
  • QUELLPFAD = Das Verzeichnis (DATASET) auf dem FreeBSD, z.B. /usr/local/bastille/data/JAILNAME, welches auf den ZFS Pool datain das Dataset bastille_data/JAILNAME verweist
  • ZIELPFAD = Das Verzeichnis innerhalb des Jails, z.B. /usr/local/bastille/jails/JAILNAME/root/mnt/data
  • ID = Benötigte Benutzer-ID innerhalb des Jails, z.B. 123

Verzeichnisstruktur

Wichtig: Da hier mit ZFS gearbeitet wird, gibt es eine Unterscheidung zwischen dem Pool, bzw. Dataset und dem eigentlichen Verzeichnis, in dem das Dataset eingebunden wird. Wie hier beschrieben,

  • werden die Jails im ZFS Pool work im Verzeichnis bastille und
  • die ausgelagerten Daten im ZFS Pool data im Verzeichnis bastille_data abgelegt. Dieser Pool bietet vielleicht wesentlich mehr Speicherplatz. Das ist sehr praktisch bei großen Datenhalden wie Bildern oder Dateifreigaben, die im Jail direkt einfach nix verloren haben. Auch nur lesend falls benötigt.

Damit diese unterschiedlichen Pools aber nicht immer wieder zu Verwirrungen führen, werden diese Dataset in dem Bastille Verzeichnis /usr/local/bastille/ gebündelt. Damit sieht das komplette Bild folgendermaßen aus:

─ work/bastille -> /usr/local/bastille/
─ data/bastille_data -> /usr/local/bastille/data

└── /usr/local/bastille/jails # Jail Verzeichnis
    └── JAILNAME              # Jail Name
        └── root              # Root des Jails, das / im Jail
└── /usr/local/bastille/data  # Jail Datenverzeichnis
    └── JAILNAME              # Jail Name
        └── conf              # Konfigurationen, z.B. /mnt/conf
        └── data              # Jail Daten, z.B. /mnt/data
        └── db                # Datenbanken, z.B. /var/db/pgsql
        └── ...               # usw

NullFS

Aber wie kommt das zusammen? Ganz einfach über NullFS. NullFS legt quasi den Inhalt von Verzeichnis A in Verzeichnis B, auch über Jailgrenzen hinweg. z.B. /usr/local/bastille/data/JAILNAME/data liegt dann in der Jail unter /mnt/data. Sehr praktisch! Ein wichtiger Faktor sind jedoch die richtigen Berechtigungen. Wenn es in der Jail einen Benutzer USER mit der ID 123 gibt, der entsprechende Zugriffsrechte auf ein Verzeichnis hat, dann MUSS das Verzeichnis außerhalb des Jails die gleichen Rechte haben. Glücklicherweise reicht dafür die Benutzer-ID aus, es muss also nicht jedes Mal der entsprechende Benutzername im FreeBSD-Server angelegt werden.

Alles was hier ausgeführt nachfolgend wird, passiert auf dem FreeBSD Server. NICHT innerhalb des Jails!

Datenverzeichnisse erstellen

Zuerst wird das Basisverzeichnis work/bastille_data erstellt und in /usr/local/bastille/data/ mit zfs create -o /usr/local/bastille/data data/bastille_data eingebunden. Das Verzeichnis /usr/local/bastille/data/JAILNAME/data wird dann einfach mit dem Befehl zfs create -p work/bastille_data/JAILNAME/data angelegt. Das übergeordnete Verzeichnis /usr/local/bastille/data/JAILNAME wird durch den Parameter -p dabei ebenfalls automatisch mit angelegt. Die Syntax lautet:zfs create -p POOLNAME/bastille/JAILNAME/data

Berechtigungen

chmod -R ID:ID /usr/local/bastille/data/JAILNAME/data

Datenverzeichnisse einbinden

Wichtig! Da die Zielverzeichnisse oft noch nicht in der Jail existieren, müssen diese vorher angelegt werden. Einige der Verzeichnisse werden erst bei der Installation der Pakete angelegt, was aber zu spät ist. Denn während der Installation wird der Inhalt (z.B. Konfigurationsdateien) in das Zielverzeichnis kopiert.

  • TrueNAS / Jails / JAILNAME / Mount Points / Actions / Add
    data:
    └── Source: QUELLPFAD     # z.B. /mnt/tank/jails_data/gitea/data
    └── Destination: ZIELPFAD # z.B. /mnt/tank/iocage/jails/gitea/root/var/db/gitea

Damit zeigt im Jail GITEA das Verzeichnis /var/db/gitea auf das eigentlich extern liegende Verzeichnis /mnt/tank/jails_data/gitea/data.
Alles klar? Gut!

Konsole

Das Jail muss jedesmal mit bastille restart JAILNAME neu gestartet werden, damit die neuen Pfade eingebunden werden.

Voilá

Wenn Du diese Inhalte für wertvoll und nützlich findest, dann freue ich mich über eine Rückmeldung per Matrix, folge mir doch auf Mastodon oder hinterlasse hier einen Kommentar.