在運行實例至少一次後,基於某些現有的 LXC 模板建立自訂模板

在運行實例至少一次後,基於某些現有的 LXC 模板建立自訂模板

(請注意這個問題關於 LXC 1.x,而這個關於 LXC 2.x/LXD)

我在網路上搜尋了這個問題的答案,但無法想出任何合理的非駭客答案。

我正在尋找以我想要的方式塑造現有模板的方法。我特別想要的是透過在其根 FS 中進行各種更改並添加/更改配置來自訂上游 Ubuntu 雲映像。

因此,我目前的方法是lxc launch ubuntu:lts CONTAINER運行lxc exec CONTAINER -- ...我編寫的腳本(將其推入容器後)來執行我的自訂。

我使用這種方法得到的是一個合理定制的容器。唉,有一個問題。此時的容器已準備好cloud-init,它是一個容器實例,而不是映像/模板。

所以這就是我現在不知所措的地方。我需要的是將我的容器轉回圖像(應該可以通過使用lxc publish),並撤消對它所做的更改,cloud-init或者至少cloud-init再次“cock”,以便下次將圖像用作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,您可以找到第二種方法:

手動建立圖像

建立自己的形像也非常簡單。

  1. 生成容器檔案系統。這完全取決於您使用的發行版。對於 Ubuntu 和 Debian,可以使用 debootstrap。
  2. 配置分發在容器中正常工作所需的任何內容(如果需要的話)。
  3. 製作該容器檔案系統的 tarball,可以選擇壓縮它。
  4. 根據上述文件撰寫一個新的metadata.yaml 檔案。
  5. 建立另一個包含該metadata.yaml 檔案的tarball。
  6. 使用下列命令將這兩個 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

現在您可以調整檔案甚至 chroot 到南瓜目錄中。然後,您可以 tar 這兩個目錄並使用以下命令匯入調整後的圖像:

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

答案2

lxd建構/圖像的主要工具lxc發行版建構者

配置影像的現代方法是雲端初始化


為了自訂 LXD / LXC 影像,我寫道:

Distrobuilder 的 python 控制台前端(包含兩者)

LXD 和 LXC 的發行版選單


它遵循一個類似的方法到 Hashicorp Packer 並分層建置模板。

  1. 建立base覆蓋standard模板並包含您的shell自訂和其他自訂的圖像
  2. custom使用您的網路服務等創建一個圖像覆蓋來覆蓋您的base圖像(即在生成圖像時使用base圖像模板作為模板)SOURCE自訂模板使用您的自訂服務覆蓋/cloud-init 配置)

我用於dbmenu構建非特權 LXD 容器並添加(和包)示例配置來創建:

  • base經過一些客製化的Alpine Linux / Ubuntu鏡像
  • Alpine Linux 建置環境alpine-sdk(&cloud-init在首次啟動時被刪除)
  • 首次啟動時安裝 Gitlab 的 Ubuntu 容器(透過 cloud-init)

我還用來dbmenu建立一個適合在rootless內部運行 podman / docker 的Ubuntu 映像lxd(在撰寫本文時尚未添加到例子


  • 自述文件現在已經相當完整了

  • Ubuntu 的 LXD 和新的incusfork 都支援建置鏡像

  • 請參閱依賴關係需要dbmenu.在2023 年 10 月您需要最新git版本來distrobuilder建立最新的範本格式

  • 在幕後dbmenu是使用 Mike Farahyqyaml模板合併在一起(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/發布)

相關內容