Es ist am besten, jedes Plugin in einer Sandbox auszuführen, die speziell auf die Anforderungen des Plugins zugeschnitten ist. Darüber hinaus in einer Umgebung, in der das System mit dem Plugin und den Plugins miteinander interagieren kann. Um zu verstehen, dass dies für die Standardverpackung von Paketen gilt, verwenden wir im Folgenden den Begriff „Paket“.
Was auszusuchen?
Was wird in den meisten Fällen dafür verwendet? Docker natürlich!
pkg install docker
pkg: In den Repositorys wurden keine Pakete gefunden, die für die Installation des passenden 'Dockers' verfügbar sind.
Docker bietet keine offizielle FreeBSD-Unterstützung, und natürlich gibt es kein solches Paket im Repository. In der vorherigen Version von IKS haben wir eine inoffizielle, selbst geschriebene Docker-Portierung verwendet, deren Unterstützung jedoch recht mühsam ist. Außerdem treten bei der Verwendung viele Fallstricke auf.
FreeBSD bietet jedoch eine eigene native Unterstützung für isolierte Umgebungen. Es heißt Gefängnis und ist für unsere Zwecke nicht schlechter als Docker. Es ist erwähnenswert, dass es viel früher als Container unter Linux erschien. Mal sehen, wie ein typischer Container konfiguriert ist (eine Zelle in der bsd-Terminologie).
Vorbereiten des Datensatzes und Installieren des Pakets
Zunächst müssen Sie ein Dataset erstellen, für das die Paketzelle konfiguriert wird. Unser System verwendet das ZFS-Dateisystem, mit dem wir eine beliebige Anzahl geerbter Datensätze erstellen können.
Standardmäßig verfügt das System über ein Dataset mit der FreeBSD-
Basiswelt , aus dem wir einen Snapshot (Snapshot) erstellen: zfs snapshot zp000111 / freebsd @ snap
zp000111 ist der Name unseres Root-Dateisystempools. Wir können es durch den Befehl zfs mount sehen . zp000111 / freebsd ist der Name des Datensatzes, in dem die Welt gespeichert ist. Der Name des Schnappschusses wird durch das @ -Symbol angezeigt . Wir erstellen diesen Snapshot einmal und in Zukunft werden alle Datensätze für Pakete davon geerbt.
Aus diesem Snapshot erstellen wir einen Klon, in dem unser Paket leben wird:
zfs-Klon zp000111 / freebsd @ snap zp000111 / packages / <Paketname>
Zuerst werden wir den Datensatz auf dem aktuellen System bereitstellen:
mount -t zfs zp000111 / packages / < Paketname> / mnt / Pakete / <Paketname>
Und jetzt können wir das erforderliche Paket darin installieren:
pkg -r / mnt / Pakete / <Paketname> install -y <Paketname> Der
Schalter -r stellt die Installation im angegebenen Verzeichnis sicher.
Bei Bedarf können wir andere erforderliche Pakete installieren, z. B. mc, um bequem innerhalb des Pakets arbeiten zu können.
Wir führen das Absteigen durch. Dies ist nicht erforderlich, aber nützlich, um die Zelle in Zukunft vollständig zu starten:
umount / mnt / packages / <Paketname>
Zellpräparation
Zunächst müssen Sie die Speicherung der Paketdaten im Produktionssystem festlegen. Sei es / usr / local / share / packages.
Fügen Sie das Verzeichnis <Paketname>
mkdir / usr / local / share / packages /
<Paketname> hinzu. Erstellen Sie nun eine Datei mit dem Einhängepunkt <Paketname> .fstab. Es enthält Informationen für das Gefängnis darüber, welches Verzeichnis im
bereitgestellten Dataset synchronisiert ist: / usr / local / share / packages / <Paketname> / mnt / packages / <Paketname> / usr / local / share / data nullfs rw 0 0
Dies ist wie wir informieren, dass das Verzeichnis / usr / local / share / data mit dem Verzeichnis in unserem Arbeitssystem verbunden wird in unserem montierten Paket. Dies ist ein Gefängnis (Dateisystem nullfs). Sowohl Lesen als auch Schreiben sind für den Datenaustausch mit einem externen System (rw) zulässig. Das Speichern von Informationen über das Dateisystem und das Überprüfen der Integrität ist nicht erforderlich (0 und 0).
Wir speichern die Datei an einem geeigneten Ort, zum Beispiel in /usr/local/etc/packets/<packet_name>/<packet_name>.fstab.
Jetzt müssen wir die Konfigurationsdatei für das Gefängnis unseres Pakets einrichten.
Eine typische Konfiguration mit minimalen Einstellungen sieht folgendermaßen aus
host.hostname = "<packet_name>";
path = " /mnt/packets/<packet_name>";
interface = «em0»;
ip4.addr = 192.168.0.1;
allow.raw_sockets = 1;
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown;";
exec.clean;
enforce_statfs = 0;
mount.devfs;
mount.fstab = /usr/local/etc/packets/<packet_name>/<packet_name>.fstab;
path = " /mnt/packets/<packet_name>";
interface = «em0»;
ip4.addr = 192.168.0.1;
allow.raw_sockets = 1;
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown;";
exec.clean;
enforce_statfs = 0;
mount.devfs;
mount.fstab = /usr/local/etc/packets/<packet_name>/<packet_name>.fstab;
Wir geben eine der Netzwerkkarten im System als Schnittstelle an. Wir weisen ihm eine IP-Adresse zu, die von außen verfügbar sein wird. Damit die Netzwerkfunktionen wie Ping oder Traceroute funktionieren, aktivieren wir die Option allow.raw_sockets.
Der Abschnitt exec-Befehl gibt an, welche Befehle ausgeführt werden sollen, um das System im Gefängnis zu starten und herunterzufahren. Da dies die Standard-FreeBSD-Welt ist, geben wir die Basispfade zum Ein- und Ausschalten des Systems an.
Mit den letzten drei Optionen ermöglichen wir das Mounten externer Systeme, das Anschließen physischer Geräte und das Mounten unseres Datenordners im Gefängnis in einen externen Ordner gemäß der erstellten fstab-Datei.
Wir speichern unsere Datei an einem geeigneten Ort, z. B. im selben Verzeichnis /usr/local/etc/packets/<packet_name>/<packet_name>.jail.conf
Wir sind alle bereit, das Paket im Käfig zu starten. Beginnen wir mit dem Mounten des Paketdatensatzes:
mount -t zfs zp000111 / packages / <Paketname> / mnt / packets / <Paketname>
Jetzt können wir das
Gefängnis ausführen: jail -f / usr / local / etc / packages / <Paketname> / <Paketname> .jail.conf -c <Paketname>
Mit der Option -r geben wir den Pfad zur Konfigurationsdatei an und -c, dass ein neues Gefängnis mit dem angegebenen Namen erstellt werden muss.
Unsere Zelle wurde gestartet, wir können sie überprüfen:
jls -j <Paketname>
Eine Zeile mit dem Namen der Zelle und ihrer ID im Gefängnissystem wird angezeigt.
Wenn Sie nun das Arbeitssystem des Pakets eingeben müssen, führen Sie den folgenden Befehl aus:
jexec <Jail-ID>/ bin / tcsh
Führen Sie
die umgekehrten Befehle aus, um das Gefängnis zu stoppen und die Bereitstellung aufzuheben : jail -f /usr/local/etc/packets/<Paketname>/<Paketname>.jail.conf -r <Paketname> umount / mnt / packages / <Paketname >
Darüber hinaus sind alle Daten, die vom Paket im Ordner / usr / local / share / data des Dateisystems gespeichert wurden, auf dem externen System unter dem Pfad / usr / local / share / packages / <Paketname> verfügbar.
Gesamt
Daher haben wir eine isolierte Umgebung für unser Paket erstellt.
Die Zelle außerhalb pingt an die angegebene Adresse, und dementsprechend sind alle darin ausgelösten Netzwerkdienste auch dort verfügbar. Und da Benutzerdaten in einem externen Ordner auf dem Produktionssystem gespeichert sind, ist es einfach, sie zu speichern und zu sichern.
Ein ähnliches System wird in neuen Versionen von IKS funktionieren , was die Verwendung noch einfacher und angenehmer macht.
Das ist alles für heute, danke für Ihre Aufmerksamkeit!