ProxmoxでLXC用テンプレートをカスタマイズする

# はじめに
最近、ESXiからProxmoxへ乗り換えました。
LXCで手軽にLinux環境が構築できて便利～、と思ってましたが、最初からあるテンプレートの種類が少なかったり、イメージが古くてアップデートに時間がかかったり、といろいろ面倒でした。

なので、
**・Proxmoxのデフォルトで登録されているテンプレートをベースに、
　コンテナ作成時点で自分がよくやる初期作業が終わっているようなテンプレート**
**・Proxmoxのデフォルトに登録されていないテンプレートをベースに、（以下略）**
を作成してみました。

一度テンプレートを作成してしまえば、その次からはこのテンプレートを使いまわせばいい、というわけです。


# 対象機器および環境

## 検証環境
* Proxmox Virturl Environment 8.0.4
* Ubuntu22.04



# 作業内容

## その１：デフォルトで登録されているテンプレートをベースにする

この方法では、デフォルトで登録されているテンプレートのバージョンが古いので、以下の手順でパッケージを最新化した状態のテンプレートを作成する、という流れです。
1. Proxmoxにテンプレートをダウンロードする
1. 古いバージョンのテンプレートからコンテナを作成する
1. コンテナのパッケージをアップデートする
1. アップデートしたコンテナのバックアップを取得してテンプレート化する

### テンプレートのダウンロード
Proxmoxはあらかじめ、いくつかのテンプレートが使えるようになっています。
正確には、必要なテンプレートのURLが登録されていて、最初に一度ダウンロードすることでテンプレートが使えるようになります。

データセンター > ノード > ストレージ（local）を選択し、CTテンプレートの「テンプレート」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/a86f3872-6f26-348c-e15b-9be12e9e9bb8.png)

ダウンロードしたいテンプレートを選択して「ダウンロード」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/7987dab3-de4c-6af0-8335-9b90fd8abb62.png)

こんな感じでリストに載ればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/d0ff7912-fc44-1c9d-9419-e9bb4ca8a714.png)

### コンテナの作成
先ほどダウンロードしたテンプレートを利用してコンテナを作成します。

データセンター > ノード を選択し、「CTを作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/8219eac0-cf32-7566-b804-59df9ffc9450.png)

コンテナの設定は適当でよい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/fb67e1cc-fb28-955a-d42f-dbc1ffe98685.png)

テンプレートは先ほどダウンロードしたものを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/c91999d7-3cb4-ec7b-60d9-279f9e2720f1.png)

ディスクはデフォルトのまま（local-lvmに作成する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/1b2d90d9-2968-826a-9934-f14064161da3.png)

CPUはデフォルトのまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/322d2308-adf4-f1d6-dd08-534a45ac425d.png)

メモリはデフォルトのまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/374973cd-bb5d-7a9a-4d40-d9859932d852.png)

ネットワークは自分の環境にあわせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/1bb0876f-4c62-5570-9e9c-629dbadf3d0d.png)

DNSは自分の環境にあわせる（ノード側で設定しているままでよければデフォルトのままでOK）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/2071e7ad-5147-1352-b954-711a3ce73c8f.png)

「完了」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/885af322-ef6c-ce15-d424-7534e3d6ef44.png)

コンテナが作成されたらノード配下のメニュに表示されるので、左クリックして「開始」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/387ab0db-dcc5-6dfb-810d-108594d2f6b0.png)

### パッケージのアップデート
テンプレートは22.04-1の状態なのでこれをアップデートする

データセンター > ノード > 作成したコンテナを選択し、「コンソール」をクリックするとプロンプトが表示されるので、ユーザ名は`root`、パスワードはコンテナ作成時に指定したパスワードでログインする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/f134e404-24eb-3892-a769-c3d0bf3211fc.png)

以下コマンドで導入済みパッケージをアップデートする。
`apt update && apt upgrade -y`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/75821406-f9b4-628e-83ba-54d5e6352e2f.png)

テンプレートからコンテナを作成した時点で必要なパッケージを追加導入する。（必要なければスキップしてOK）
この例では `curl` をインストールしている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/f7513d0e-823e-1f0b-cd44-dc1a58c9a899.png)

最後にキャッシュを削除する
`apt clean && rm -rf /var/lib/apt/lists/*`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/7479e9e5-74ae-6b96-09e0-c398df2bb407.png)

これでコンテナ内の操作は完了したので、コンテナを左クリックして「シャットダウン」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/8d5f1d8a-a4e3-420c-42a6-5b29cd0f620a.png)

### コンテナのテンプレート化
出来上がったコンテナをバックアップすることでテンプレートとして使いまわすことができるようになる

データセンター > ノード > 作成したコンテナ > バックアップを選択し、「今すぐバックアップ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/5d43b06d-72ca-f48d-fd37-b9b4ba93575c.png)

モードは「停止」、圧縮は「GZIP」にして、「バックアップ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/39125bb6-5688-46cd-2bfc-72dc57fefdf8.png)

こんな感じでバックアップが取得できていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/60462708-ffbd-776d-0aa6-647e96d0823b.png)

データセンター > ノード を選択し、「シェル」をクリック（SSHでノードにログインしてもOK）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/5cb815c3-783b-5a18-37bd-6d3b6b6a812f.png)

`/var/lib/vz/dump/` ディレクトリにあるバックアップファイルを `/var/lib/vz/template/cache/`ディレクトリに名称を変更してコピーする
```
root@pve01:~# cp /var/lib/vz/dump/vzdump-lxc-112-2023_08_24-19_11_08.tar.gz \
                 /var/lib/vz/template/cache/ubuntu-22.04-3.tar.gz 
```

データセンター > ノード > ストレージ（local）を選択し、CTテンプレートをクリックして、こんな感じでリストに載ればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/a869001b-a72e-dcd8-4e8b-eb2ab593115f.png)


### カスタマイズしたテンプレートからコンテナを作成
最初にコンテナを作成した手順と同じようにコンテナを作成する。

テンプレートの選択画面では、先ほどコピーしたファイルを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/2a6ef12a-f0b4-7255-aa8f-9c7c722bbb60.png)

これで立ち上げるとパッケージもアップデートされ（先頭のバージョン表記が22.04.3になっている）、`curl`もインストールされた状態のコンテナが作成できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/a738e7d4-67bc-0554-6732-10613fc95641.png)

コンテナのバックアップファイルは不要なので、削除してしまって問題ない。



## その２：デフォルトで登録されていないテンプレートをベースにする

いっぽう、Proxmoxにデフォルトで登録されていないテンプレートをベースにしたい場合はどうするか？

この場合は、以下のURLからベースとなるテンプレートをダウンロードしてきたうえで、その１と同じようにカスタマイズしていく。

https://images.linuxcontainers.org/images/

この場合、各階層にある `rootfs.tar.xz` が対象になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/c923e43d-3d5d-155f-03cb-8a2add9a1572.png)

このリンクをコピーして、「CTテンプレート」の「URLダウンロード」に入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/78bc7cd5-5539-1078-137c-e71e0c985de5.png)

このあとの手順はその１と同じになる。
SSHサーバが導入されてない場合は、パッケージの追加導入のときにインストール＆起動時にサービス開始するように設定しておけば、コンテナ作成時にSSHで待ち受けることができるようになる。


# さいごに

もっとはやくテンプレート作成しとけばよかった