Hyper-VでUbuntu 24.04のcloud-initを使う方法
Hyper-V上でUbuntu 24.04サーバーVMをcloud-initを使って自動化起動する手順です。
前提条件:
- OS: Ubuntu 24.04 Server
- Platform: Windows Hyper-V
- WSL (Windows Subsystem for Linux) 環境
📋 cloud-init設定ファイル
user-data.yml
#cloud-config
users:
- name: ubuntu
gecos: Ubuntu
sudo: ALL=(ALL) NOPASSWD:ALL
groups: sudo
shell: /bin/bash
lock_passwd: false
ssh_import_id: [gh:<github_user_id>]
apt:
primary:
- arches: [default]
uri: http://ftp.udx.icscoe.jp/Linux/ubuntu
security:
- arches: [default]
uri: http://ftp.udx.icscoe.jp/Linux/ubuntu
package_update: true
package_upgrade: true
packages:
- vim
- nano
- curl
- wget
- tmux
- jq
- fish
- ca-certificates
- gnupg
- lsb-release
- software-properties-common
- build-essential
- pkg-config
- net-tools
- dnsutils
- iproute2
- traceroute
- ssh
- git
- make
locale: en_US.UTF-8
timezone: Asia/Tokyo
ssh_pwauth: no
resize_rootfs: true
growpart:
mode: auto
meta-data.yml
instance-id: ubuntu
local-hostname: ubuntu
🚀 実行手順
Step 1 - WSL環境で準備
WSLでcloud-initディスクを作成します。
# クラウドイメージをダウンロード
curl -sLO https://ftp.udx.icscoe.jp/Linux/ubuntu-cloud-images/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img
# cloud imageをVHDX形式に変換
qemu-img convert -p -f qcow2 -O vhdx ubuntu-24.04-server-cloudimg-amd64.img ubuntu-24.04-server-cloudimg-amd64.vhdx
# cloud-init seed diskを作成
cloud-localds seed.iso user-data.yml meta-data.yml
Step 2 - PowerShell (管理者権限)
作成したVMディスクを任意の場所にコピーします。
(コピーしなくてもいいですが使いまわすために元のVHDXは取っておいたほうが賢明です)
VMディスクサイズを128GBに拡張します。
Resize-VHD -Path '<VM DISK PATH>' -Size 128GB
Step 3 - Hyper-VでVM作成
以下の最低要件設定:
| 項目 | 設定値 |
|---|---|
| Generation | Gen 2 |
| Secure Boot | Microsoft UEFI Certificate Authority |
| Network | 接続 (インターネット) |
| Hard Disk | 作成したVHDX、ブート構成最上位 |
| DVD Drive | cloud-initのseed.iso |
Step 4 - PowerShell (管理者権限)
VMプロセッサ設定とディスクアクセス権付与:
# 仮想化拡張機能を公開
Set-VMProcessor -VMName "<VM NAME>" -ExposeVirtualizationExtensions $true
# ディスクへのフルアクセス権限付与
$VM = Get-VM "<VM NAME>"
icacls "<VM DISK PATH>" /grant "NT VIRTUAL Machine\$($VM.Id):(F)"
Step 5 - Serial Console接続 (PS1)
起動用シェルスクリプトを作成してシリアルコンソールでVM出力を確認:
$VM = '<VM NAME>'
sudo pwsh.exe -Command "
Start-VM '$VM' &&
Set-VMComPort -VMName '$VM' -Number 1 '\\.\pipe\$VM'
"
# Named Pipe接続
$pipe = New-Object System.IO.Pipes.NamedPipeClientStream(".", "$VM", [System.IO.Pipes.PipeDirection]::In)
$pipe.Connect()
$sr = New-Object System.IO.StreamReader($pipe)
while (-not $sr.EndOfStream) {
$ch = [char]$sr.Read()
[Console]::Write($ch)
}
📝 補足情報
Secure Bootの理由
Gen 2 VMではSecure Boot必須。Ubuntu Cloud ImageはMicrosoft UEFI CAで署名されているため、この設定が必要。
Serial Console接続の目的
- VM起動時のboot logを確認
- boot processの問題を診断
- 初期化プロセスを追跡
この記事が参考になれば幸いです!