Closed14

OSSなHCIソリューション「Proxmox」を試す

kun432kun432

ちょっとこの辺の波に乗ってみた。

https://x.com/hAru_mAki_ch/status/1882014524133519398

https://x.com/umiyuki_ai/status/1882041125479080234

https://x.com/gosrum/status/1883733200994017739

自分が買ったのはこれ

https://x.com/miyasa/status/1883345713863831907

https://www.amazon.co.jp/dp/B0DCBQ9NY6

皆さんはClineで生成させたアプリのデプロイ環境みたいな感じで使っておられる様子。自分もそれは試してみたいと思っているが(最近は別のことをやっているので全然触れていない・・・)、個人的には以下に興味がある。

https://qiita.com/s059ff/items/8595bfcc4909c0d1a4f1

https://note.com/enokiko/n/n8361a30cc362

GPUをパススルーでVMに割り当てて環境を構築すれば、例えばバージョンの異なるCUDAを複数のVMで運用できるのではないか?と考えている。

(もうCUDAのバージョンで動かないとかダウングレードしないといけない、とかを考えたくもないしやりたくもないのよな・・・)

実際にできるかどうかは置いといて、とりあえずProxmoxを一度も試したことがないのでやってみる。

kun432kun432

そういえば「おうちKubernetes」をやろうと思った時に、Proxmoxも考えたのよな。

https://developers.cyberagent.co.jp/blog/archives/27443/

ただ、当時は複数台用意するとなるとRPiのほうが安かったので、そちらにしたのだけども。我が家のお蔵入りしているRPi K8Sクラスタ・・・

ちょっと前にも改めてやっていたのだけど、K8S熱が上がってきた感があるなー。マルチエージェントのデプロイ先にK8Sはとてもいいと思うし。

https://note.com/hatti8/n/nc504f6f2854b

kun432kun432

公式サイト

https://www.proxmox.com/en/

データセンターをシンプルに

Proxmoxは、すべての機能に誰もがフルアクセスできる強力なエンタープライズグレードのソリューションを提供します。信頼性と安全性に優れています。
ソフトウェア定義のオープンなプラットフォームは、導入、管理、予算が容易です。

Proxmox Virtual Environment

Proxmox Virtual Environmentは、企業向け仮想化のための完全なオープンソースプラットフォームです。内蔵のウェブインターフェースにより、単一のソリューションを使用して、VMやコンテナ、ソフトウェア定義のストレージやネットワーク、高可用性クラスタリング、複数のすぐに使えるツールを簡単に管理できます。

Proxmox Backup Server

Proxmox Backup Serverは、VM、コンテナ、物理ホストのバックアップと復元を行うためのエンタープライズバックアップソリューションです。このオープンソースソリューションは、増分バックアップ、重複排除、Z標準圧縮、認証付き暗号化をサポートしています。

Proxmox Mail Gateway

Proxmox Mail Gatewayは、メールサーバーをあらゆるメールの脅威から保護するオープンソースのメールセキュリティソリューションです。すべての機能を備えたメールプロキシは、ファイアウォールと内部メールサーバーの間に数分で簡単に導入できます。

使うのは Proxmox Virtual Environment(Proxmox VE) ということになる。

https://www.proxmox.com/en/products/proxmox-virtual-environment/overview

Proxmox Virtual Environment

Proxmox Virtual Environmentは、エンタープライズ仮想化のための完全なオープンソースのサーバー管理プラットフォームです。KVMハイパーバイザーとLinuxコンテナ(LXC)、ソフトウェア定義のストレージおよびネットワーク機能を単一のプラットフォームに緊密に統合しています。統合されたウェブベースのユーザーインターフェースにより、VMやコンテナ、クラスターの高可用性、統合された災害復旧ツールを簡単に管理できます。

コンピューティング、ネットワーク、ストレージを単一のソリューションで

エンタープライズクラスの機能と100%ソフトウェアベースの特長を備えたProxmox VEは、ITインフラストラクチャの仮想化、既存のリソースの最適化、最小限の費用で効率性を向上させるのに最適な選択肢です。LinuxおよびWindowsアプリケーションのワークロードの中でも最も要求の厳しいものも簡単に仮想化でき、ニーズの拡大に合わせてコンピューティングとストレージを動的に拡張できるため、データセンターを将来の成長に合わせて調整することができます。

Proxmox VEでオープンで将来性のあるデータセンターを構築してみませんか?

Proxmox VEの機能についてはこちらにまとまっている

https://www.proxmox.com/en/products/proxmox-virtual-environment/features

箇条書きでまとめるとこんな感じ

  • 仮想化
    • Debian GNU/Linuxを基盤とし、カスタムLinuxカーネル
    • ソースコードはAGPLv3ライセンスで公開
    • KVM
    • LXC
  • 管理
    • Web GUI
    • モバイルWeb・Androidアプリ
    • CLI
    • REST API
  • クラスタリング
    • Proxmox Cluster File System(pmxcfs)による構成ファイルのリアルタイム同期
    • ライブ/オンラインマイグレーション
    • マルチマスターデザインによりどのノードからも管理GUIにアクセス可能
  • 認証
    • RBACにより細かい権限の制御が可能
    • 複数の認証方式に対応
      • Linux PAM
      • Proxmox VE ビルトイン認証サーバー
      • LDAP
      • Microsoft Active Directory
      • OIDC
  • 高可用性(HA)
    • Linux HAをベースにしたProxmox VE High Availability (HA) Cluster
    • Proxmox VE HA Manager
      • 障害時に自動で対応、ゼロコンフィギュレーションで動作
      • ノード障害時のVM自動フェイルオーバー
      • ウォッチドッグベースのノードの自動フェンシング
    • Proxmox VE HAシミュレーター
      • 3ノードクラスタ・6VMによるHAのテストが可能
      • 初期セットアップ不要で利用可
  • ネットワーク
    • SDNによる高度なネットワーク構成やマルチテナント
      • ノード単体でプライベートネットワーク
      • クラスタ間でオーバーレイネットワーク
      • NAT、802.1q VLAN、QinQ、VXLAN、BGPベースのEVPNなど
    • Linuxネットワーキングスタック
      • ローカルノードごとの柔軟なネットワーク
        • ブリッジネットワークモデル
        • VLAN、ボンディング、ルーティング等
  • ストレージ
    • 柔軟なストレージモデルで、VMをローカル・共有ストレージのどちらにも保存可
    • ストレージ数の制限なし、Debian GNU/Linuxで利用可能なすべてのストレージ技術をサポート
    • ネットワークストレージ
      • LVMグループ(iSCSIターゲットをバックエンドとして使用)
      • iSCSIターゲット
      • NFS共有
      • SMB/CIFS
      • Ceph RBD
      • iSCSI LUNへの直接接続
      • GlusterFS
      • CephFS
    • ローカルストレージ
      • LVMグループ
      • ディレクトリ型ストレージ(既存のファイルシステム上にVMイメージを保存)
      • ZFS
  • Cephによるソフトウェア定義ストレージ
    • Cephによる分散オブジェクトストア・ファイルシステムが利用可能
    • ストレージタイプ
      • RADOSブロックデバイス
        • ブロックレベルのストレージ、VMイメージやスナップショットのストレージとして利用可
      • CephFS
        • Cephストレージクラスタを使用するPOSIX準拠のファイルシステム
    • Proxmox VEはCephと完全に統合
      • GUI・CLIによりセットアップ・管理が用意
      • セルフヒーリングによる耐障害性
      • エクサバイト規模のスケーラビリティ
      • ストレージプールで異なるパフォーマンス・冗長性に適応
      • 安価な汎用ハードウェアで動作可
  • ファイアウォール
    • Proxmox VE Firewallがビルトイン
      • GUI・CUIで設定可
      • クラスタ全体、VM単位、コンテナ単位でルール適用可
      • ファイアウォールマクロ、セキュリティグループ、IPセット、エイリアスなど
    • 分散ファイアウォール
      • pmxcfsによる分散かつ一元管理
      • クラスタノードでiptablesベースのファイアウォールが動作
      • 集中管理型よりも高い帯域幅
    • IPv4・IPv6サポート
      • 両方に完全対応
      • デフォルトは両方ともフィルタリングされる
  • バックアップ
    • バックアップソリューションが完全統合
      • GUI・CLI(vzdumpツール)により実施が容易
      • VM・コンテナのメタデータも含む完全バックアップ
      • vmdumpツールを使用した整合性のあるスナップショット
      • 任意のノード・VM単位でスケジュールバックアップ
    • バックアップストレージ
      • NFS, iSCSI LUN, Ceph RBDなどのすべてのストレージタイプに対応したKVMライブバックアップ
      • スパースファイルに最適化され高速なProxmox VEバックアップフォーマット
  • Proxmox Backup Serverの統合
    • Proxmox Backup Server: エンタープライズ向け高性能バックアップソリューション
      • Proxmox VEと完全統合、VM/コンテナ/物理ホストのバックアップを効率的に管理可能。
      • 増分バックアップ
      • クライアントサイド暗号化
    • ライブリストア
      • リストア開始直後に起動可能
      • VMがアクティブに使用するデータを優先して復元しつつ、バックグラウンドで継続的にコピー
    • シングルファイルリストア
      • 特定のファイルやディレクトリのみを復元可
      • GUIからの検索・復元が容易
kun432kun432

インストールメディアの作成

以下よりISOイメージをダウンロード。現時点で最新の「Proxmox VE 8.3 ISO Installer」を選択した。

https://www.proxmox.com/en/downloads/proxmox-virtual-environment/iso

自分は4GBのUSBメモリを用意。Macなので以下のように実施した。

接続されているディスクの一覧を表示

diskutil list

USBメモリはこのdisk4

出力
/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *4.0 GB     disk4
   1:                 DOS_FAT_32                         4.0 GB     disk4s1

マウントされていれば、アンマウントする

diskutil unmountDisk /dev/disk4

ddでISOイメージをUSBメモリに書き込み。普通にやると終わるまで何も出力されないのでstatus=progressをつけておくと良いかも。

sudo dd if=proxmox-ve_8.3-1.iso bs=1M of=/dev/rdisk4 status=progress

進捗は見えないけど、少なくとも動いている様はわかるので。

出力
  81788928 bytes (82 MB, 78 MiB) transferred 26.268s, 3114 kB/s

終了

出力
1381+1 records in
1381+1 records out
1449048064 bytes transferred in 469.937444 secs (3083491 bytes/sec)

balkenaEtcherとかを使ったほうがわかりやすいかも。

https://etcher.balena.io/

kun432kun432

Proxmoxのインストール

今回使用したこのミニPC。

https://www.amazon.co.jp/dp/B0DCBQ9NY6

インストール開始すべくUSBメモリからブートさせるために、まずBIOSに入ろうとしたが、BIOSへの入り方がどこにも載ってないし、起動時にPOST画面が表示されない、いろいろキーも試したけど、全然進めず・・・

いろいろ四苦八苦した挙げ句、なんとなくわかったこと。

  • ディスプレイはHDMI2に繋ぐ必要がありそう。HDMI1ではPOST画面が表示されず、OS(デフォルトだとWindows11)の起動が始まってしまう。つまりOS起動後に切り替わっているのではなかろうか。
  • BIOSに入るにはDEL or ESCで。

ここに気づくまでに結構な時間を無駄にした・・・とりあえずBIOSでは以下を設定した。

  • Fast Bootを無効化
  • 仮想化関連機能が有効になっていることを確認
  • ブートデバイスでUSBメモリを最優先

やっとインストーラが起動した・・・

あとは指示に従って進めていく。

インストールが終わったらコンソールでログインできるようになるが、ブラウザでもアクセスできるようになっているはず。https://[IPアドレス]:8006にアクセスして、証明書の警告は出るがそのまま進めれば、ログイン画面が表示される。

レルムは"Linux PAM"、ユーザ名はroot、パスワードはインストーラで入力したパスワードを入力してログイン。

サブスクリプションの警告が出るが、とりあえず進める。

ログイン完了。

kun432kun432

VMの作成

管理画面で「VMの作成」を実行

各種設定を行う。設定内容はいろいろあるが、とりあえずほぼデフォルトだと以下(赤部分だけが設定したもの)

VMを作成して起動。

コンソールを表示する。

あとは画面に従ってインストーラを進めればOK。

デフォルトだとVMはホスト側のNICとはブリッジでつながる様子なので、LAN内から直接SSH等で接続できる。

kun432kun432

テンプレートとクローン

毎回OSのインストールやセットアップをするのはめんどくさい。一旦作成・セットアップしたVMをテンプレートに変換することで、それを元にVMのクローンが作成できる。

テンプレート化するまでにVMはまあ一旦停止しておくほうが良さそう。

テンプレートに変換するとアイコンがちょっと変わる。テンプレートそのものから起動はできなくなり、クローンして起動することになる。

モードは2つあって、クローン時のストレージの扱いに違いがある。お好きな方を。

クローン後はセットアップ済みVMとして使える。なお、MACアドレスは変更される。

kun432kun432

CLI

qmコマンドを使う。

https://pve.proxmox.com/pve-docs/qm.1.html

ここが一番手っ取り早くまとまってた。

https://www.nakivo.com/blog/top-10-proxmox-cli-commands/

VMの一覧

qm listでVMの一覧。テンプレートも表示される。

qm list
出力
      VMID NAME                 STATUS     MEM(MB)    BOOTDISK(GB) PID
       100 ubuntu-24.04-lts-server stopped    2048              32.00 0

VMの新規作成

VMを新規作成はqm createを使う。

qm create 101 \
    --name "test-vm-01" \
    --sockets 1 \
    --cores 1 \
    --memory 2048 \
    --net0 virtio,bridge=vmbr0,firewall=1 \
    --ostype l26 \
    --ide2 local:iso/ubuntu-24.10-live-server-amd64.iso,media=cdrom \
    --scsi0 local-lvm:32

確認

qm list
出力
      VMID NAME                 STATUS     MEM(MB)    BOOTDISK(GB) PID
       100 ubuntu-24.04-lts-server stopped    2048              32.00 0
       101 test-vm-01           stopped    2048              32.00 0

VMを起動

qm start 101

あとはGUIからコンソールに接続してインストールを進めればOK。(コンソールに接続するコマンドもあるようなのだけど、インストーラだといろいろむずかしいかも?)

基本的なパラメータの指定は、GUIでVM作成する際のこの内容をほぼそのまま指定すれば良さそうな感じ。

VMの停止・削除

VMの停止にはstopshutdownがある。shutdownはVM内のOSをきちんと終了させるのに対し、stopは電源ブチ切りと同じことになるので注意。(そういうことが必要な場合もある)

qm stop 101
qm shudown 102

VMが停止した状態であればqm destroy削除が可能

vm destroy 101

テンプレートからのクローン

OSインストールを伴うVM新規作成では、結局コンソールを開くことになるので、正直CLIでやるメリットはあまりない。CLIが便利なのはテンプレートからのクローンだと思う。qm cloneを使う

クローン元テンプレートのIDと、新しく作るクローン先VMのIDを指定する。

qm clone 100 102 --name "cloned-vm-01"
出力
create linked clone of drive scsi0 (local-lvm:base-100-disk-0)
  Logical volume "vm-102-disk-0" created.

デフォルトだとリンクされたクローンになるが、--fullをつけると完全なクローンになる。

qm clone 100 103 --name "cloned-vm-02"
出力
create full clone of drive scsi0 (local-lvm:base-100-disk-0)
  Logical volume "vm-103-disk-0" created.
transferred 0.0 B of 32.0 GiB (0.00%)
transferred 327.7 MiB of 32.0 GiB (1.00%)
transferred 655.4 MiB of 32.0 GiB (2.00%)
transferred 983.0 MiB of 32.0 GiB (3.00%)
transferred 1.3 GiB of 32.0 GiB (4.00%)
transferred 1.6 GiB of 32.0 GiB (5.00%)
transferred 1.9 GiB of 32.0 GiB (6.01%)
transferred 2.2 GiB of 32.0 GiB (7.01%)
transferred 2.6 GiB of 32.0 GiB (8.01%)
transferred 2.9 GiB of 32.0 GiB (9.01%)
(snip)
transferred 31.4 GiB of 32.0 GiB (98.10%)
transferred 31.7 GiB of 32.0 GiB (99.10%)
transferred 32.0 GiB of 32.0 GiB (100.00%)
transferred 32.0 GiB of 32.0 GiB (100.00%)

クローンされたVMのパラメータはqm setで変更できる。まず元のテンプレートの設定を確認してみる。VMやテンプレートの設定の確認はqm configを使う。

qm config 100
出力
boot: order=scsi0;ide2;net0
cores: 1
cpu: x86-64-v2-AES
ide2: local:iso/ubuntu-24.04.1-live-server-amd64.iso,media=cdrom,size=2708862K
memory: 2048
meta: creation-qemu=9.0.2,ctime=1739216816
name: ubuntu-24.04-lts-server
net0: virtio=BC:24:11:B8:BD:0C,bridge=vmbr0,firewall=1
numa: 0
ostype: l26
scsi0: local-lvm:base-100-disk-0,iothread=1,size=32G
scsihw: virtio-scsi-single
smbios1: uuid=cf5e28af-bbe3-4fae-911b-754c6ee2c60e
sockets: 1
template: 1
vga: serial0
vmgenid: 37eb7e54-880b-4df2-938d-ae39c80a5e00

CPUコアx1、メモリ2GB、ディスク32GBになっている。

クローンしたVM ID: 102のほうはコアを増やしてみる。

qm set 102 --cores 2
出力
update VM 102: -cores 2

もう1台のVM ID: 103のほうはメモリを増やしてディスクを追加してみる。

qm set 103 --memory 4096
出力
update VM 103: -memory 4096
qm set 103 --scsi1 local-lvm:8
出力
  Logical volume "vm-103-disk-1" created.
scsi1: successfully created disk 'local-lvm:vm-103-disk-1,size=8G'

Kubernetesのようにクラスタを作るために複数台のVMが必要になるケースではとても便利。

kun432kun432

Cloud-Initも使ってみる。Cloud-Initの設定の流れはこういうもの

  • 自動設定したい初期設定情報を含んだISOイメージを作る。seed.isoという名前にしておくのが一般的。
  • 各OSベンダーが配布しているCloud-Init対応OS(ディスク)イメージを使ってVMを起動。
  • 起動時にseed.isoをCDROMドライブにマウントしておくと、その内容通りに自動的に設定してくれる。

ProxmoxでもCloud−Initに対応している。

https://pve.proxmox.com/wiki/Cloud-Init_Support

ドキュメントを見る限り、seed.isoをCLIで設定できる様子。管理画面も見渡してみたけど、GUIだとできることが限られてるように思えるので、ドキュメントに従うこととする。Proxmoxホスト上で作業を行う。

まずCloud-Init対応イメージをダウンロード。ここではUbuntu-24.04を使う。

Proxmoxホスト上にディレクトリを作成してダウンロード

mkdir ci-images && cd ci-images
wget https://cloud-images.ubuntu.com/releases/noble/release/ubuntu-24.04-server-cloudimg-amd64.img

virtio-scsi-pciコントローラを持つVMを作る。これはUbuntuのCloud−InitイメージはSCSIドライブにvirtio-scsi-pciコントローラを必要とするためらしい。

qm create 9000 \
    --memory 2048 \
    --net0 virtio,bridge=vmbr0 \
    --scsihw virtio-scsi-pci

ダウンロードしたUbuntu-24.04のディスクイメージをProxmoxのローカルLVMボリュームにインポートしつつ、上記のVMにアタッチする。このときディスクイメージはフルパスで指定する必要がある。

qm set 9000 --scsi0 local-lvm:0,import-from=/root/ci-images/ubuntu-24.04-server-cloudimg-amd64.img
出力
update VM 9000: -scsi0 local-lvm:0,import-from=/root/ci-images/ubuntu-24.04-server-cloudimg-amd64.img
  Logical volume "vm-9000-disk-0" created.
transferred 0.0 B of 3.5 GiB (0.00%)
transferred 35.8 MiB of 3.5 GiB (1.00%)
transferred 72.0 MiB of 3.5 GiB (2.01%)
transferred 109.3 MiB of 3.5 GiB (3.05%)
(snip)
transferred 3.4 GiB of 3.5 GiB (98.38%)
transferred 3.5 GiB of 3.5 GiB (99.39%)
transferred 3.5 GiB of 3.5 GiB (100.00%)
transferred 3.5 GiB of 3.5 GiB (100.00%)
scsi0: successfully created disk 'local-lvm:vm-9000-disk-0,size=3584M'

こんな感じでVMが作成されディスクがアタッチされている

次に、Cloud−Initの設定をVMに渡すためのCDROMドライブをアタッチする。

qm set 9000 --ide2 local-lvm:cloudinit
出力
update VM 9000: -ide2 local-lvm:cloudinit
  Logical volume "vm-9000-cloudinit" created.
ide2: successfully created disk 'local-lvm:vm-9000-cloudinit,media=cdrom'
generating cloud-init ISO

おお、これでCloud−InitのISOイメージが作成されるような感じなのね。

ディスクから起動するようにブート順を設定

qm set 9000 --boot order=scsi0
出力
update VM 9000: -boot order=scsi0

Cloud−Initイメージの多くはシリアルコンソールを必要とするらしいのでシリアルデバイスも接続。

qm set 9000 --serial0 socket --vga serial0
出力
update VM 9000: -serial0 socket -vga serial0

最後にVMをテンプレートに変換する。

qm template 9000
出力
  Renamed "vm-9000-disk-0" to "base-9000-disk-0" in volume group "pve"
  Logical volume pve/base-9000-disk-0 changed.
  WARNING: Combining activation change with other commands is not advised.

こんな感じになった。

ではこのテンプレートからVMをクローンする。

qm clone 9000 123 --name ubuntu2404-test
出力
create full clone of drive ide2 (local-lvm:vm-9000-cloudinit)
  Logical volume "vm-123-cloudinit" created.
create linked clone of drive scsi0 (local-lvm:base-9000-disk-0)
  Logical volume "vm-123-disk-0" created.

ではCloud-Initの設定を行う。この時点で既にGUIのVM設定画面からCloud-Initメニューが使えるようになっている。

GUIでは変更したい項目を変更して「イメージ再作成」するような感じになるみたいだけど、設定できる項目が少ない。

CLIでもqm setで設定変更ができるが、以下あたりでこちらも同様に少ない。

  • --cipassword <パスワード>: ユーザのパスワード
  • --ciupgrade <boolean>: 初回起動時にパッケージを最新にするか?デフォルトは「する」(1
  • --ciuser <ユーザ名>: イメージのデフォルトユーザ以外でSSH鍵やパスワードの変更を行うユーザ名
  • --ipconfig[n] [gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,ip=<IPv4Format/CIDR>] [,ip6=<IPv6Format/CIDR>]: ネットワークの設定
  • --nameserver <DNSサーバ名>: DNSサーバの設定
  • --searchdomain <ドメイン名>: DNS検索時のドメイン名
  • --sshkeys <SSH鍵へのファイルパス>: SSH鍵の設定

あともう一つ--cicustomというのがあるがこれは後述する

とりあえずこんな感じでユーザとパスワード、あとネットワークの設定は必須で、今回はDHCPから取得するように設定してある。

qm set 123 --ciuser kun432
qm set 123 --cipassword hogehoge
qm set 123 --ipconfig0 ip=dhcp
出力
update VM 123: -ciuser kun432
update VM 123: -cipassword <hidden>
update VM 123: -ipconfig0 ip=dhcp

ではVMを起動してみる。

qm start 123

コンソールを開くと諸々の設定やパッケージの更新などが行われ、最後に設定したユーザとパスワードでログインできると思う。

ただちょっとVM設定するたびにこの設定をするのは面倒。テンプレートであらかじめ設定しておけばいいのでは?と思って試してみた。

クローンでVM作成

引き継がれている様子。

起動しても反映されていた。設定がこれぐらいだけでいいなら、GUIだけで完結するかなと思ったけど、ディスクイメージをVMにインポートできないとGUIだけでは無理そうだし、Cloud-Init使うならもっと色々設定したくなるはず。

ということで、--cicustom

https://pve.proxmox.com/wiki/Cloud-Init_Support#_custom_cloud_init_configuration

また、Cloud-Initの統合により、自動生成された構成ファイルの代わりにカスタム構成ファイルを使用することもできます。これは、コマンドラインのcicustomオプションを使用して実行します:

qm set 9000 --cicustom "user=<volume>,network=<volume>,meta=<volume>"

カスタム構成ファイルは、スニペットをサポートするストレージ上に配置し、VMが移行されるすべてのノードで利用可能にする必要があります。そうでない場合、VMは起動できません。例えば、以下のようになります。

qm set 9000 --cicustom "user=local:snippets/userconfig.yaml"

Cloud-Initには3種類の構成があります。1つ目は、上記の例で示したuser設定です。2つ目はnetwork設定、3つ目はmeta設定です。これらすべてを一緒に指定することも、必要に応じて混在させて指定することもできます。カスタム構成ファイルが指定されていない場合は、自動生成された構成が使用されます。

生成されたコンフィグは、カスタムコンフィグのベースとして使用するためにダンプすることができます。

qm cloudinit dump 9000 user

networkmetaにも同じコマンドがあります。

qm setのドキュメントを見ると以下とあり、

--cicustom [meta=<volume>] [,network=<volume>] [,user=<volume>] [,vendor=<volume>]
cloud-init: Specify custom files to replace the automatically generated ones at start.

Proxmox上のボリュームにファイルを置いて指定する形になる様子。で、上記にある「スニペット」というのはどうやらストレージ機能の1つらしい。

ピンポイントに書かれている記事を見つけた。

https://ainoniwa.net/pelican/2021-08-10a.html

なるほど、localボリューム上にCloud-Init設定ファイルを保存するためのsnippetsディレクトリを作成できるのね。

手元のProxmoxを見てみるとどうやら有効化されていない様子。

有効化する。

localボリュームは以下のパスにあり、

ls /var/lib/vz/

スニペットが有効化されるとディレクトリが作成される

出力
dump  images  snippets	template

GUIでも、localボリュームのメニューにスニペットが追加された。ただしメニューを見る限り、GUIからの追加はできなさそう・・・

Cloud−Initを有効にして作成したテンプレートから、設定をダンプしてみる。

qm cloudinit dump 9000 user
出力
#cloud-config
hostname: VM9000
manage_etc_hosts: true
fqdn: VM9000
user: kun432
password: $5$tH3jSrAj$nJCq/dW4YLuw.hiEfPOs.KYMV3jR27wanJTCjIqvUe.
chpasswd:
  expire: False
users:
  - default
package_upgrade: true
qm cloudinit dump 9000 network
出力
version: 1
config:
    - type: physical
      name: eth0
      mac_address: 'bc:24:11:e2:d8:c4'
      subnets:
      - type: dhcp4
    - type: nameserver
      address:
      - '8.8.8.8'
      search:
      - 'local'
qm cloudinit dump 9000 meta
出力
instance-id: 51e90aa554aa7ca63cbba6580005fbc8b35c1fb6

つまりCloud-Initの設定はsnippetsディレクトリに用意しておいて、VMなりテンプレートなりに紐づけてやればよい。

この辺を見ながら設定

https://cloudinit.readthedocs.io/en/latest/reference/examples.html

https://cloudinit.readthedocs.io/en/latest/reference/examples_library.html

色々試行錯誤しながらこんな感じにした。

  • ホスト名を設定
  • ユーザを追加
    • sudoグループに追加することで対象ユーザがsudoできるようになる
  • パスワードの設定
    • 設定ファイル内にプレーンテキストで設定(あまりよろしくないが)
  • パッケージ
    • パッケージの更新
    • build-essentialパッケージを追加インストール
  • ロケール・タイムゾーン設定
    • 日本向けに設定
  • コマンド実行
    • sshdを有効化して起動
  • 再起動
    • パッケージアップデートでカーネルなど再起動が必要な場合にリブート
/var/lib/vz/snippets/ubuntu2404-custom-ci-user.yaml
#cloud-config
hostname: ubuntu2404-ci-snippets
fqdn: ubuntu2404-ci-snippets
manage_etc_hosts: true

users:
  - name: kun432
    shell: /bin/bash
    primary_group: kun432
    groups: sudo

chpasswd:
  expire: False
  users:
  - {name: kun432, password: hogehoge, type: text}
ssh_pwauth: true

package_update: true
package_upgrade: true
packages:
  - build-essential

timezone: Asia/Tokyo
locale: ja_JP.utf8

runcmd:
  - systemctl enable ssh
  - systemctl start ssh

power_state:
  mode: reboot
  message: Rebooting after initial setup
  timeout: 30
  condition: True
/var/lib/vz/snippets/ubuntu2404-custom-ci-network.yaml
version: 2
ethernets:
  ens18:
    dhcp4: true

では今回はVMを作成して、上記のCloud−Initの設定を紐づける。

まずVM作成。上でやったときには気づいてなかったけど、Cloud-Init対応ディスクイメージをそのままSCSIディスクとしてインポートするとディスクサイズが元のイメージのサイズになってしまい、ディスクが溢れてしまったので、リサイズを追加している。

qm create 125 \
    --memory 2048 \
    --net0 virtio,bridge=vmbr0 \
    --scsihw virtio-scsi-pci

qm set 125 --scsi0 local-lvm:0,import-from=/root/ci-images/ubuntu-24.04-server-cloudimg-amd64.img

qm disk resize 125 scsi0 20G

qm set 125 --ide2 local-lvm:cloudinit

qm set 125 --boot order=scsi0

qm set 125 --serial0 socket --vga serial0

--cicustom でCloud−Init設定ファイルをVMに紐づける。なお、--cicustomを使うと、このVMのCloud-Init設定はGUIで設定できなくなる。

qm set 125 --cicustom "user=local:snippets/ubuntu2404-custom-ci-user.yaml,network=local:snippets/ubuntu2404-custom-ci-network.yaml"

VM起動

qm start 125

起動後にログインしてみると、上記の設定が一通りできていることが確認できると思う。


参考

https://qiita.com/bashaway/items/d0124733c469bba8dbed

https://zenn.dev/pkkudo/articles/bulk-vm-proxmox

https://qiita.com/yamada-hakase/items/40fa2cbb5ed669aaa85b

kun432kun432

上でも書いたのだけども、

起動しても反映されていた。設定がこれぐらいだけでいいなら、GUIだけで完結するかなと思ったけど、ディスクイメージをVMにインポートできないとGUIだけでは無理そうだし、Cloud-Init使うならもっと色々設定したくなるはず。

ディスクイメージをVMにインポートするのはCLIだけでしかできなさそうに思ったのだけども、ストレージlocalの設定を見ると以下のようなものがある。

有効にしてみる。

インポートのメニューが増えた。

上で試したUbuntu-24.04のCloud-Initイメージをダウンロード・インポートさせてみる。「URLからダウンロード」を選択して、URLを入力。「クエリURL」をクリクするとファイル名が設定されるので、ダウンロード。

が、エラー。

ファイル名を変えたり、拡張子を.qcow2とかに変更してみてもダメ。ドキュメント見てみたけども見つけれなかった。このメニューは何のために使うんだろうか?

Cloud−Initのイメージを置いたりできるのかなーとおもったけど、そうではなさそう。

とりあえずCloud-Initを使う場合は現状はCLIが前提かな。

kun432kun432

Amazon Linux 2023の場合は以下の記事が参考になる。

AWS公式に従ってseed.isoを使う方法
https://qiita.com/hamada-kc/items/7b509df842078eccf04b

ProxmoxのGUIからCloud−Initを設定する方法
https://www.kokozo.net/proxmox/#14

どちらもCLIとGUIの両方の操作が必要になっていて、できればどちらかだけにしたいな、ということで、Ubuntuでやった場合と同じような手順に従ってやってみた。

Amazon Linux 2023のディスクイメージをダウンロード

cd ci-images
https://cdn.amazonlinux.com/al2023/os-images/2023.6.20250303.0/kvm/al2023-kvm-2023.6.20250303.0-kernel-6.1-x86_64.xfs.gpt.qcow2

VMを作成してAmazon Linux 2023のディスクイメージをインポートしてアタッチ

qm create 9001 \
    --name "AmazonLinux2023" \
    --machine q35,viommu=intel \
    --cpu host \
    --cores 2 \
    --memory 2048 \
    --net0 virtio,bridge=vmbr0 \
    --scsihw virtio-scsi-pci \
    --bootdisk scsi0 \
    --serial0 socket \
    --vga serial0

qm set 9001 --scsi0 local-lvm:0,import-from=/root/ci-images/al2023-kvm-2023.6.20250303.0-kernel-6.1-x86_64.xfs.gpt.qcow2

qm set 9001 --ide2 local-lvm:cloudinit

qm set 9001 --boot order=scsi0

で、Ubuntuと同じようにCloud-Initの設定ファイルを作って--cicustomから設定するのだけれども、これがどうもうまくいかない・・・具体的には起動してもログインできない。どうやらパスワード変更ができていないようなんだけど、ログインできないので確認ができないのだよね・・・

とりあえず--cicustomは諦めて、以下のようにCLIで設定したらログインできた。

qm set 9001 --cipassword hogehoge
qm set 9001 --ipconfig0 ip=dhcp

ここまでできれば、あとはそのままVMで起動するなり、テンプレート化してクローンするなりすればよい。

まあ一応GUI操作ゼロでCLIに統一はできてるんだけど、どっちかというとGUIだけで完結したいという思いがあるのと、なんでAmazon Linux 2023だとうまくいかないのかが釈然としない・・・

このスクラップは2ヶ月前にクローズされました