インスタンスを少なくとも1回実行した後、既存のLXCテンプレートに基づいてカスタムテンプレートを作成する

インスタンスを少なくとも1回実行した後、既存のLXCテンプレートに基づいてカスタムテンプレートを作成する

(その点に注意してくださいこの質問LXC 1.xに関するものですが、これですLXC 2.x/LXDについて)

この質問に対する答えをウェブで探しましたが、ハッキングっぽくない合理的な答えは見つかりませんでした。

私が探しているのは、既存のテンプレートを自分の好きなように作成する方法です。特に、ルート FS にさまざまな変更を加え、構成を追加/変更することで、アップストリームの Ubuntu クラウド イメージをカスタマイズしたいと考えています。

したがって、私の現在のアプローチはlxc launch ubuntu:lts CONTAINERlxc exec CONTAINER -- ...(コンテナーにプッシュした後)作成したスクリプトを実行してカスタマイズを実行することです。

このアプローチを使用すると、適切にカスタマイズされたコンテナーが得られます。ただし、問題があります。この時点でのコンテナーは によって準備されておりcloud-init、イメージ/テンプレートではなくコンテナー インスタンスです。

これが今私が困っているところです。必要なのは、コンテナーをイメージに戻し ( を使用して実行できるはずですlxc publish)、 によって行われた変更を元に戻すかcloud-init、少なくとももう一度「cock」して、次にイメージがまたはcloud-initのソースとして使用されたときにトリガーされるようにすることです。あるいは、アップストリーム イメージから を完全に無効にする方法があるでしょうか?lxc initlxc launchcloud-initlxc launch

権威ある方法はあるのでしょうか?LXDリポジトリのMarkdownドキュメントまた、Stéphane Graber (LXDプロジェクトリーダー)によるブログシリーズもご覧ください。特に [5/12]、適切なアプローチを見つけることができませんでした。おそらく私がそれを見逃しただけでしょう (つまり、私が必要としているものを説明しているドキュメントをご存知であれば、喜んでさらに読んでみます)。

使用されている LXC バージョンは 2.20 です (つまり、LXD フロントエンドを使用しています)。

答え1

リンクされたページ [5/12]Stéphane Graber による 2 番目のアプローチを見つけることができます。

手動でイメージを構築する

独自のイメージを構築することも非常に簡単です。

  1. コンテナ ファイルシステムを生成します。これは、使用しているディストリビューションによって完全に異なります。Ubuntu および Debian の場合は、debootstrap を使用します。
  2. ディストリビューションがコンテナー内で適切に動作するために必要なものをすべて構成します (必要な場合)。
  3. コンテナファイルシステムの tarball を作成し、必要に応じて圧縮します。
  4. 上記の内容に基づいて、新しい metadata.yaml ファイルを作成します。
  5. その metadata.yaml ファイルを含む別の tarball を作成します。
  6. 次のコマンドで、これら 2 つの tarball を LXD イメージとしてインポートします。

この方法では、イメージを公開する前にコンテナを起動する必要はありません。既存のイメージから開始できます。

$ 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

これで、ファイルを調整したり、squash ディレクトリに chroot したりすることができます。その後、両方のディレクトリを tar し、調整したイメージを次のようにインポートします。

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

答え2

lxd構築/lxcイメージの主なツールはディストリビューションビルダー

画像を構成する現代的な方法はクラウド初期化


LXD / LXC イメージをカスタマイズするために、次のように書きました:

Distrobuilder の Python コンソール フロントエンド (両方を組み込んでいます)

LXD および LXC 用の Distrobuilder メニュー


それは同様の方法論Hashicorp Packer にテンプレートをレイヤーで構築します。

  1. baseテンプレートを上書きしstandard、自分のカスタマイズshellやその他のカスタマイズを組み込んだ画像を作成します
  2. customウェブサービスなどでイメージをオーバーライドするイメージオーバーライドを作成しますbase(つまり、baseイメージテンプレートをSOURCEテンプレートとして使用して、カスタムテンプレートカスタムサービスオーバーライド/cloud-init構成を使用)

非特権 LXD コンテナーの構築に使用しdbmenu、作成するためのサンプル構成 (およびパッケージ) を追加しました:

  • いくつかのカスタマイズを加えたAlpine Linux / Ubuntubaseイメージ
  • Alpine Linux ビルド環境alpine-sdk(cloud-init初回起動時に削除される)
  • 最初の起動時に Gitlab をインストールする Ubuntu コンテナ (cloud-init 経由)

また、 podman / dockerdbmenuを実行するのに適したUbuntuイメージを作成するためにも使用します(執筆時点ではまだ追加されていません)rootlesslxd


  • README今ではかなり完成している

  • UbuntuのLXDと新しいincusイメージの構築にはフォークがサポートされている

  • を参照してください依存関係必要ですdbmenu2023年10月最新のテンプレート形式を構築するには、最新gitバージョンが必要ですdistrobuilder

  • 内部的には、dbmenuMike Farah のテンプレートyqを結合するために使用されていますyaml( yq&distrobuilderは両方とも で記述されているGoため、両方とも同じ基礎ライブラリを使用していますyaml)

  • PyYamlマージに使用すると問題がありました。読み取りと書き込みがyaml非常に高速で、yaml.CSafeLoader

  • dbmenuインストールは次のように簡単です:

  • pipx install distrobuilder-menupypi - 最新リリース

  • pipx install git+https://github.com/itoffshore/distrobuilder-menu.git(github 最新dev/ リリース)

関連情報