UbuntuをProxmox VEにインストールするとき、毎回GUIで設定するのは手間がかかります。
UbuntuのCloud Imageとcloud-initを使って、完全非対話でVMを構築したので、その時の手順を備忘録として書いておきます。
SSH keyでログイン可能・sudoパスワードなし・Proxmox UIでIPが見える状態で起動完了まで自動化しています
1. 事前準備
snippetsを有効化する(最初の一回だけ)
cloud-initの設定ファイル(YAML)は snippets に保存します。
Proxmoxインストール直後はsnippetがなかったので、ローカルストレージにsnippetsタイプを追加しておきます。
コマンドを実行するとWebUIからもsnippetsが作られたことが確認できます。
pvesm set local --content iso,backup,vztmpl,snippets
2. Ubuntu Cloud Image をダウンロード
Ubuntu Cloud Image は、クラウド環境向けに最小構成で作られた公式イメージです。
Proxmoxでは、このイメージをそのままVMのベースディスクに使えます。
cd /var/lib/vz/template/iso
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img -O ubuntu-24.04-cloudimg-amd64.img
# 確認
ls -lh /var/lib/vz/template/iso
出力例:
-rw-r--r-- 1 root root 592M Oct 2 03:43 ubuntu-24.04-cloudimg-amd64.img
3. cloud-init の設定ファイルを作成
SSHでログインできる最小構成でcloud-initの設定ファイルを作っておきます。
公開鍵ログイン・パスワードなしでsudoできる設定で、ProxmoxからIPが見えるようqemu-guest-agentも自動導入します。
ユーザ名はappにしておきます。
ssh_authorized_keysの中は、ssh-keygenコマンドなどであらかじめ公開鍵を作成しておき、public keyを指定します。
cat >/var/lib/vz/snippets/cloud-init_ubuntu-minimal.yaml <<'YAML'
#cloud-config
package_update: false
package_upgrade: false
users:
- name: app
groups: sudo
shell: /bin/bash
lock_passwd: false
ssh_authorized_keys:
- "ssh-..."
write_files:
- path: /etc/sudoers.d/99-app-nopasswd
permissions: '0440'
content: |
app ALL=(ALL) NOPASSWD:ALL
runcmd:
- |
apt-get update
apt-get install -y qemu-guest-agent
echo "This VM was configured automatically on $(date '+%Y-%m-%d %H:%M:%S') UTC by CLOUD-INIT. IP: $(hostname -I | awk '{print $1}')" > /etc/issue
YAML
cat /var/lib/vz/snippets/cloud-init_ubuntu-minimal.yaml
ポイント
- ssh_authorized_keys に自分の公開鍵を登録しておく
- /etc/issue に生成日時とIPを表示(Proxmoxのコンソールで見やすい)
- qemu-guest-agent がインストールされるので、Web UI の Summaryタブで IP が表示されるようになる
4. VMを作成する
WebUIから操作すると面倒なので、Consoleから作成します。
ここでは例としてVM IDを220とします。数字は空いているIDでOKです。
# 既存VMがあれば削除(再作成の時)
# qm destroy 220
# 新規作成
qm create 220 --name ubu2510 --memory 4096 --cores 2 --net0 virtio,bridge=vmbr0
# ディスクをCloud Imageから作成して接続
qm importdisk 220 /var/lib/vz/template/iso/ubuntu-24.04-cloudimg-amd64.img local-lvm
qm set 220 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-220-disk-0
qm set 220 --bootdisk scsi0
qm set 220 --boot order=scsi0
qm resize 220 scsi0 32G
# cloud-initの設定があるドライブを追加
qm set 220 --ide2 local-lvm:cloudinit
qm set 220 --cicustom "user=local:snippets/cloud-init_ubuntu-minimal.yaml"
# 固定IP設定(自宅の環境に応じて変更する)
qm set 220 --ipconfig0 ip=192.168.1.220/24,gw=192.168.1.1
# QEMU Guest Agentを有効化(Proxmox UIでIPが見えるようにする)
qm set 220 --agent enabled=1
# 起動前確認
qm config 220
5. VMを起動
qm start 220
起動後しばらく待ってから手元の環境にて、以下のコマンドでログインできれば成功です。
ssh -i ~/.ssh/id_rsa app@192.168.12.220
6. GUI環境を入れたい場合(任意)
後からGUIを追加することもできます。
最小構成でGNOMEだけ入れたい場合は以下のコマンドでOKです。
自動でここまでセットアップしたい場合はyamlのruncmdに書いておきます。
再起動されるので、最後に書いておくと良いです。
sudo env DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a \
apt-get -o Dpkg::Options::="--force-confdef" \
-o Dpkg::Options::="--force-confold" \
install -y ubuntu-desktop-minimal gdm3
Tips
/etc/issueに IP と構築日時を出すことで、Webコンソールで一目で状態確認可能qemu-guest-agentを入れると、ShutdownやRebootも Proxmox UI から安全に操作可能- SSHログイン後にパスワードを設定したい場合は
sudo passwd appで設定する
その他、よく使うソフトのインストールコマンド
# gh
sudo apt-get install -y curl
type -p curl >/dev/null || sudo apt install curl -y
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt install -y gh
gh --version
# Docker
curl -fsSL https://get.docker.com | sudo sh
sudo systemctl start docker
sudo usermod -a -G docker app
sudo docker run hello-world
# VSCode, Chromium, Alacritty
sudo snap install --classic code
sudo snap install chromium
sudo apt install -y alacritty
# modern cli commands
sudo apt-get install -y git eza ripgrep btm neovim
# TypeScript
sudo apt-get install -y nodejs npm
npm install -g typescript