Erstellen einer benutzerdefinierten Vorlage basierend auf einer vorhandenen LXC-Vorlage, nachdem die Instanz mindestens einmal ausgeführt wurde

Erstellen einer benutzerdefinierten Vorlage basierend auf einer vorhandenen LXC-Vorlage, nachdem die Instanz mindestens einmal ausgeführt wurde

(Bitte beachte, dassdiese Fragehandelt von LXC 1.x, währendDieses hierhandelt von LXC 2.x/LXD)

Ich habe das Internet nach einer Antwort auf diese Frage abgesucht, konnte aber keine einigermaßen vernünftige Antwort finden.

Ich suche nach einem Ansatz, um eine vorhandene Vorlage so zu gestalten, wie ich es möchte. Insbesondere möchte ich das Upstream-Ubuntu-Cloud-Image anpassen, indem ich verschiedene Änderungen an seinem Root-FS vornehme und die Konfiguration hinzufüge/ändere.

lxc launch ubuntu:lts CONTAINERDaher besteht mein aktueller Ansatz darin, lxc exec CONTAINER -- ...ein von mir erstelltes Skript auszuführen (nachdem ich es in den Container geschoben habe), um meine Anpassungen vorzunehmen.

Mit diesem Ansatz erhalte ich einen einigermaßen angepassten Container. Leider gibt es einen Haken. Der Container wurde an dieser Stelle vorbereitet cloud-initund es handelt sich um eine Containerinstanz, nicht um ein Image/eine Vorlage.

Hier bin ich jetzt ratlos. Ich müsste meinen Container wieder in ein Image umwandeln (sollte mit möglich sein lxc publish) und entweder die vorgenommenen Änderungen rückgängig machen cloud-initoder zumindest erneut „cocken“, damit es ausgelöst wird, wenn das Image das nächste Mal als Quelle für oder cloud-initverwendet wird . Alternativ gibt es vielleicht eine Möglichkeit, es vollständig zu deaktivieren, wenn ich vom Upstream-Image aus gehe?lxc initlxc launchcloud-initlxc launch

Gibt es einen autoritativen Weg? Obwohl ich alle möglichen Dokumente durchgesehen habe, einschließlich derMarkdown-Dokumentation im LXD-Repositorysowie die Blogserie von Stéphane Graber (LXD-Projektleiter),insbesondere [5/12], ich konnte keinen geeigneten Ansatz finden. Vielleicht habe ich ihn einfach übersehen (das heißt, ich lese gerne weitere Dokumentationen durch, wenn Sie welche kennen, die beschreiben, was ich brauche).

Die verwendete LXC-Version ist 2.20 (d. h. ich verwende das LXD-Frontend).

Antwort1

Auf der verlinktenSeite [5/12]von Stéphane Graber findet sich ein zweiter Ansatz:

Manuelles Erstellen eines Images

Es ist auch ziemlich einfach, ein eigenes Bild zu erstellen.

  1. Generieren Sie ein Container-Dateisystem. Dies hängt ganz von der verwendeten Distribution ab. Für Ubuntu und Debian wäre dies mit debootstrap möglich.
  2. Konfigurieren Sie alles, was für die ordnungsgemäße Funktion der Verteilung in einem Container erforderlich ist (falls etwas benötigt wird).
  3. Erstellen Sie ein Tarball dieses Containerdateisystems und komprimieren Sie es optional.
  4. Schreiben Sie eine neue metadata.yaml-Datei basierend auf der oben beschriebenen.
  5. Erstellen Sie ein weiteres Tarball, das die Datei metadata.yaml enthält.
  6. Importieren Sie diese beiden Tarballs als LXD-Image mit:

Auf diese Weise müssen Sie den Container nicht starten, bevor Sie das Image veröffentlichen. Sie können mit einem vorhandenen Image beginnen:

$ lxc image copy ubuntu:16.04/amd64 local: --alias ubuntu
$ mkdir export-directory
$ lxc image export ubuntu export-directory
$ cd export-directory
$ ls 
5f364e2e3f460773a79e9bec2edb5e993d236f035f70267923d43ab22ae3bb62.squashfs
meta-5f364e2e3f460773a79e9bec2edb5e993d236f035f70267923d43ab22ae3bb62.tar.xz

$ mkdir meta squashfs
$ tar -xf *.tar.xz -D meta
$ sudo unsquashfs -f -d squash/ *squashfs

Nun kannst du Dateien anpassen oder sogar per Chroot in das Squash-Verzeichnis wechseln. Anschließend kannst du beide Verzeichnisse tarnen und das angepasste Image importieren mit:

lxc image import <metadata tarball> <rootfs tarball> --alias my-adjusted-image

Antwort2

Das wichtigste Werkzeug zum Erstellen lxdvon lxcBildern istDistrobuilder

Die moderne Art, Bilder zu konfigurieren, ist mitCloud-Init


Zum Anpassen von LXD/LXC-Bildern habe ich geschrieben:

Ein Python-Konsolen-Frontend für Distrobuilder (das beides enthält)

Distrobuilder-Menü für LXD und LXC


Es folgt eineähnliche Methodikzu Hashicorp Packer und erstellt Vorlagen in Ebenen.

  1. Erstellen Sie ein baseBild, das eine Vorlage überschreibt und Ihre und andere Anpassungen standardenthältshell
  2. Erstellen Sie ein customBild-Override mit Ihren Web-Diensten etc., das Ihr baseBild überschreibt (d.h. verwenden Sie die baseBildvorlage als SOURCEVorlage beim Generieren einesbenutzerdefinierte Vorlagemit Ihrer benutzerdefinierten Service-Override-/Cloud-Init-Konfiguration)

Ich verwende es dbmenuzum Erstellen nicht privilegierter LXD-Container und habe eine Beispielkonfiguration hinzugefügt (und verpackt), um Folgendes zu erstellen:

  • Alpine Linux / Ubuntu- baseImages mit einigen Anpassungen
  • Alpine Linux Build-Umgebung mit alpine-sdk(und mit cloud-initEntfernung beim ersten Booten)
  • Ubuntu-Container, der Gitlab beim ersten Start installiert (über Cloud-Init)

Ich verwende auch, dbmenuum ein Ubuntu-Image zu erstellen, das für die Ausführung von rootlessPodman / Docker geeignet ist lxd(zum Zeitpunkt des Schreibens noch nicht zumBeispiele)


  • DerLiesmichist jetzt ziemlich vollständig

  • Ubuntus LXD und das neueincusFork werden beide zum Erstellen von Bildern unterstützt

  • Sehen Sie sich dieAbhängigkeitenbenötigt von dbmenu. InOktober 2023Sie benötigen die neueste gitVersion von, distrobuilderum das neueste Vorlagenformat zu erstellen

  • Unter der Haube dbmenuwird Mike Farahs verwendet, yqum die yamlVorlagen zusammenzuführen ( yq& distrobuildersind beide in geschrieben, Goverwenden also beide die gleiche zugrunde liegende yamlBibliothek)

  • Die Verwendung PyYamlzum Zusammenführen war problematisch - es liest und schreibt yamldie Konfiguration sehr schnell mit yaml.CSafeLoaderzum Lesen

  • dbmenuDie Installation ist so einfach wie:

  • pipx install distrobuilder-menu(pypi - neueste Version)

  • pipx install git+https://github.com/itoffshore/distrobuilder-menu.git(neueste GitHub dev-Version/-Release)

verwandte Informationen