(その点に注意してくださいこの質問LXC 1.xに関するものですが、これですLXC 2.x/LXDについて)
この質問に対する答えをウェブで探しましたが、ハッキングっぽくない合理的な答えは見つかりませんでした。
私が探しているのは、既存のテンプレートを自分の好きなように作成する方法です。特に、ルート FS にさまざまな変更を加え、構成を追加/変更することで、アップストリームの Ubuntu クラウド イメージをカスタマイズしたいと考えています。
したがって、私の現在のアプローチはlxc launch ubuntu:lts CONTAINER
、lxc exec CONTAINER -- ...
(コンテナーにプッシュした後)作成したスクリプトを実行してカスタマイズを実行することです。
このアプローチを使用すると、適切にカスタマイズされたコンテナーが得られます。ただし、問題があります。この時点でのコンテナーは によって準備されておりcloud-init
、イメージ/テンプレートではなくコンテナー インスタンスです。
これが今私が困っているところです。必要なのは、コンテナーをイメージに戻し ( を使用して実行できるはずですlxc publish
)、 によって行われた変更を元に戻すかcloud-init
、少なくとももう一度「cock」して、次にイメージがまたはcloud-init
のソースとして使用されたときにトリガーされるようにすることです。あるいは、アップストリーム イメージから を完全に無効にする方法があるでしょうか?lxc init
lxc launch
cloud-init
lxc launch
権威ある方法はあるのでしょうか?LXDリポジトリのMarkdownドキュメントまた、Stéphane Graber (LXDプロジェクトリーダー)によるブログシリーズもご覧ください。特に [5/12]、適切なアプローチを見つけることができませんでした。おそらく私がそれを見逃しただけでしょう (つまり、私が必要としているものを説明しているドキュメントをご存知であれば、喜んでさらに読んでみます)。
使用されている LXC バージョンは 2.20 です (つまり、LXD フロントエンドを使用しています)。
答え1
リンクされたページ [5/12]Stéphane Graber による 2 番目のアプローチを見つけることができます。
手動でイメージを構築する
独自のイメージを構築することも非常に簡単です。
- コンテナ ファイルシステムを生成します。これは、使用しているディストリビューションによって完全に異なります。Ubuntu および Debian の場合は、debootstrap を使用します。
- ディストリビューションがコンテナー内で適切に動作するために必要なものをすべて構成します (必要な場合)。
- コンテナファイルシステムの tarball を作成し、必要に応じて圧縮します。
- 上記の内容に基づいて、新しい metadata.yaml ファイルを作成します。
- その metadata.yaml ファイルを含む別の tarball を作成します。
- 次のコマンドで、これら 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 コンソール フロントエンド (両方を組み込んでいます)
それは同様の方法論Hashicorp Packer にテンプレートをレイヤーで構築します。
base
テンプレートを上書きしstandard
、自分のカスタマイズshell
やその他のカスタマイズを組み込んだ画像を作成しますcustom
ウェブサービスなどでイメージをオーバーライドするイメージオーバーライドを作成しますbase
(つまり、base
イメージテンプレートをSOURCE
テンプレートとして使用して、カスタムテンプレートカスタムサービスオーバーライド/cloud-init構成を使用)
非特権 LXD コンテナーの構築に使用しdbmenu
、作成するためのサンプル構成 (およびパッケージ) を追加しました:
- いくつかのカスタマイズを加えたAlpine Linux / Ubuntu
base
イメージ - Alpine Linux ビルド環境
alpine-sdk
(cloud-init
初回起動時に削除される) - 最初の起動時に Gitlab をインストールする Ubuntu コンテナ (cloud-init 経由)
また、 podman / dockerdbmenu
を実行するのに適したUbuntuイメージを作成するためにも使用します(執筆時点ではまだ追加されていません)rootless
lxd
例)
のREADME今ではかなり完成している
UbuntuのLXDと新しい
incus
イメージの構築にはフォークがサポートされているを参照してください依存関係必要です
dbmenu
。2023年10月最新のテンプレート形式を構築するには、最新git
バージョンが必要ですdistrobuilder
内部的には、
dbmenu
Mike Farah のテンプレートyq
を結合するために使用されていますyaml
(yq
&distrobuilder
は両方とも で記述されているGo
ため、両方とも同じ基礎ライブラリを使用していますyaml
)PyYaml
マージに使用すると問題がありました。読み取りと書き込みがyaml
非常に高速で、yaml.CSafeLoader
dbmenu
インストールは次のように簡単です:pipx install distrobuilder-menu
(pypi - 最新リリース)pipx install git+https://github.com/itoffshore/distrobuilder-menu.git
(github 最新dev
/ リリース)