この記事では、Proxmox VE上にUbuntu Server 26.04 LTSの検証用VMを作り、Ubuntu InstallerのAutoinstallを使って最小構成で自動インストールする。
この記事でやること
- Ubuntu 26.04 LTS Server ISOをProxmoxに配置する
- Windows PC上のPowerShellワンライナーでuser-dataとmeta-dataをHTTP配信する
- Proxmox VEで検証用VMを作成する
- セットアップ画面にてAutoinstallを開始する
前提
今回の環境は次のとおり。
| 項目 | 値 |
|---|---|
| Proxmox VE | 9.1.1 |
| Proxmox 管理 URL | https://192.168.11.99:8006 |
| Proxmox ノード名 | pve |
| Ubuntu | RHEL 9.7 |
| RHEL ISO | ubuntu-26.04-live-server-amd64.iso |
| VM 名 | ubuntu-2604-autoinstall |
| VM ID | 102 |
| CPU | 2 cores |
| メモリ | 4096 MiB |
| ディスク | 40 GiB |
| ISO ストレージ | local |
| VM ディスクストレージ | local-lvm |
| ネットワーク | DHCP |
| Autoinstall配信端末 | 192.168.11.170 |
| タイムゾーン | Asia/Tokyo |
| キーボード | 日本語 |
UbuntuのAutoinstallは、公式ドキュメント上でもHTTPでuser-dataとmeta-dataを配信し、カーネル引数にautoinstall ds=nocloud-net;s=http://…/を指定する形が案内されている。
参考:
- Ubuntu Server installation documentation
- Autoinstall quick start
- Autoinstall configuration reference
パスワードの扱い
Autoinstallのidentity.passwordには平文パスワードではなく、crypt形式の値を指定する。今回は検証用パスワードとしてroot123を使い、Autoinstallにはそのcrypt値を設定する。
crypt値は次のように生成できる。
openssl passwd -6
今回生成した値は次のとおり。
$6$TqiSqYot.ycTffeq$Lv8kUve3numOm5TKzQA5kwDo4mMY.SmbtBmgAnTXahLPSwlJ/1oTRJZKibXq5m99J/2jqbin/FTMqxJ3ArKAv/
Windows PowerShellワンライナーでAutoinstallをHTTP配信する
Windows PCのIPアドレスを確認する。
ipconfig
Proxmox側のVMから到達できるLAN側IPを使う。今回のWindows PCでは192.168.11.170だった。
ゴリ押しではあるがワンライナーで設定ファイルを配信する
次のPowerShellワンライナーは、一時フォルダにuser-dataとmeta-dataを作成し、ポート8080でHTTP配信する。PowerShellのhere-stringは1行に潰すと壊れるため、ここでは配列を改行で結合する形にしている。
identity.passwordには平文ではなくcrypt値を入れる。
$port=8080;$root=Join-Path $env:TEMP "ubuntu-2604-autoinstall";New-Item -ItemType Directory -Force $root|Out-Null;$ud=@("#cloud-config","autoinstall:"," version: 1"," locale: ja_JP.UTF-8"," keyboard:"," layout: jp"," variant: `"`""," timezone: Asia/Tokyo"," source:"," id: ubuntu-server-minimal"," identity:"," hostname: ubuntu-2604-autoinstall"," username: ubuntu"," password: `"`$6`$TqiSqYot.ycTffeq`$Lv8kUve3numOm5TKzQA5kwDo4mMY.SmbtBmgAnTXahLPSwlJ/1oTRJZKibXq5m99J/2jqbin/FTMqxJ3ArKAv/`""," ssh:"," install-server: true"," allow-pw: true"," apt:"," mirror-selection:"," primary:"," - uri: `"http://jp.archive.ubuntu.com/ubuntu`""," arches: [amd64]"," - uri: `"http://archive.ubuntu.com/ubuntu`""," arches: [amd64]"," fallback: offline-install"," geoip: false"," storage:"," layout:"," name: direct"," packages:"," - qemu-guest-agent"," late-commands:"," - curtin in-target -- systemctl enable qemu-guest-agent"," updates: security"," shutdown: reboot") -join [Environment]::NewLine;[IO.File]::WriteAllText((Join-Path $root "user-data"),$ud,[Text.UTF8Encoding]::new($false));[IO.File]::WriteAllText((Join-Path $root "meta-data"),"",[Text.ASCIIEncoding]::new());$listener=[Net.Sockets.TcpListener]::new([Net.IPAddress]::Any,$port);$listener.Start();"Serving $root at http://0.0.0.0:$port/";while($true){$client=$listener.AcceptTcpClient();try{$stream=$client.GetStream();$reader=[IO.StreamReader]::new($stream,[Text.Encoding]::ASCII,$false,1024,$true);$request=$reader.ReadLine();do{$header=$reader.ReadLine()}while($header);$path="/user-data";if($request -match '^\S+\s+([^\s]+)'){$path=$Matches[1]};$name=[Uri]::UnescapeDataString($path.Split('?')[0].TrimStart('/'));if([string]::IsNullOrWhiteSpace($name)){$name="user-data"};$file=Join-Path $root $name;if(Test-Path $file){$body=[IO.File]::ReadAllBytes($file);$head=[Text.Encoding]::ASCII.GetBytes("HTTP/1.1 200 OK`r`nContent-Type: text/plain`r`nContent-Length: $($body.Length)`r`nConnection: close`r`n`r`n");$stream.Write($head,0,$head.Length);$stream.Write($body,0,$body.Length)}else{$body=[Text.Encoding]::UTF8.GetBytes("not found");$head=[Text.Encoding]::ASCII.GetBytes("HTTP/1.1 404 Not Found`r`nContent-Type: text/plain`r`nContent-Length: $($body.Length)`r`nConnection: close`r`n`r`n");$stream.Write($head,0,$head.Length);$stream.Write($body,0,$body.Length)}}finally{$client.Close()}}別ターミナルから疎通確認する。
PS C:\Users\kyoro> curl.exe http://192.168.11.170:8080/user-data期待する結果は、#cloud-configから始まるAutoinstall設定が返ること。
PS C:\Users\kyoro> curl.exe http://127.0.0.1:8080/user-data
#cloud-config
autoinstall:
version: 1
locale: ja_JP.UTF-8
keyboard:
layout: jp
variant: ""
timezone: Asia/Tokyo
source:
id: ubuntu-server-minimal
identity:
hostname: ubuntu-2604-autoinstall
username: ubuntu
password: "$6$TqiSqYot.ycTffeq$Lv8kUve3numOm5TKzQA5kwDo4mMY.SmbtBmgAnTXahLPSwlJ/1oTRJZKibXq5m99J/2jqbin/FTMqxJ3ArKAv/"
ssh:
install-server: true
allow-pw: true
apt:
mirror-selection:
primary:
- uri: "http://jp.archive.ubuntu.com/ubuntu"
arches: [amd64]
- uri: "http://archive.ubuntu.com/ubuntu"
arches: [amd64]
fallback: offline-install
geoip: false
storage:
layout:
name: direct
packages:
- qemu-guest-agent
late-commands:
- curtin in-target -- systemctl enable qemu-guest-agent
updates: security
shutdown: rebootWindows Defender Firewallでポート8080の受信がブロックされる場合は、プライベートネットワークで許可する。
ProxmoxでVMを作成する
Proxmox VEの管理画面を開き、VMを作成する。
VM作成ウィザードでは、以下のように指定する。
| 画面 | 設定 |
|---|---|
| General | VM 名: ubuntu-2604-autoinstall |
| OS | local からubuntu-26.04-live-server-amd64.isoを選択 |
| System | 基本はデフォルト |
| Disks | Storage: local-lvm、Size: 40 GiB。バスは VirtIO Block または SCSI |
| CPU | 2 cores |
| Memory | 4096 MiB |
| Network | Bridge は環境に合わせる。Model は VirtIO |
起動パラメータにAutoinstall URLを指定する
VMを起動し、Ubuntuのインストール画面が表示されたら、eキーを押す。
linux または linuxefiで始まる行の末尾に、次のようなパラメータを追加する。
autoinstall ds=nocloud-net\;s=http://192.168.11.170:8080/

入力後は Ctrl + X または F10 で起動する。
インストール後の確認
インストールが完了するとVMが再起動する。
ユーザ名ubuntu、パスワードroot123でログインし、ubuntuのバージョンを確認する。
cat /etc/os-release実行結果:
PRETTY_NAME="Ubuntu 26.04 LTS"
NAME="Ubuntu"
VERSION_ID="26.04"
VERSION="26.04 (Resolute Raccoon)"
VERSION_CODENAME=resolute
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=resolute
LOGO=ubuntu-logoトラブルシュート
user-dataが取得されない場合は、まずProxmoxホストからWindows PCのHTTPサーバーへ到達できるか確認する。
curl http://192.168.11.170:8080/user-data
#cloud-configが返らない場合、Windows Defender Firewall、IPアドレス違い、ポート違いを確認する。
まとめ
Windows PCからPowerShellだけでuser-dataとmeta-dataを配信し、Proxmox側ではISO内のvmlinuz/initrdを使って起動引数を渡すと、検証用VMをかなり少ない資材で自動インストールできる。
まずこの最小構成で成功させてから、配信用サーバ、固定IP、SSH公開鍵、パッケージ追加、初期設定スクリプトへ広げるのが扱いやすい。
