qm create で --net0 を指定してテンプレートを作ると、boot orderが net0 だけになることがあります。このテンプレートからcloneしたVMを起動するとディスクからブートせずiPXEループに入ります。qm set <vmid> --boot order=scsi0 で解決します。
確認環境: Proxmox VE 8.x
何が起きたか
ホームラボでcloud-initテンプレートを作ってたんですよ。テンプレートからcloneしたVMを起動したら、ディスクから起動せずにiPXEの画面がループし続ける。
コンソールにはこれだけ出てる:
iPXE (http://ipxe.org) ... Booting from ROM... iPXE initializing devices...
PXEサーバーなんて立ててないので、タイムアウトしてまたリトライして、延々ループ。エラーメッセージらしいエラーメッセージが出ないのが厄介で、最初は「ディスクイメージが壊れたか?」と疑ってました。
原因
boot orderに scsi0(ディスク)が入っていなかった。
$ qm config 9000 | grep boot boot: order=net0
犯人は qm create の --net0 オプションです。こうやってテンプレートを作ると:
qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0 --scsi0 local-lvm:32
Proxmox VE 8.x では、--net0 を指定した qm create で --boot を省略すると、boot orderが net0 のみになることがあります。--scsi0 でディスクも同時に作ってるのに、boot orderにディスクが入らない。
期待: boot: order=scsi0 (ディスクから起動) 実際: boot: order=net0 (ディスクが入っていない)
結果、VMはディスクを持ってるのにディスクを見に行かず、PXEブートを試み続けるわけです。
解決方法
テンプレート作成時にboot orderを明示する
qm create の後に、boot orderを上書きすればOKです:
# テンプレート作成 qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0 --scsi0 local-lvm:32 # boot orderを明示(ディスク優先) qm set 9000 --boot order=scsi0
確認:
$ qm config 9000 | grep boot boot: order=scsi0
これでテンプレート化すれば、cloneしたVMすべてに正しいboot orderが引き継がれます。
clone済みのVMを修正する
既にcloneしてしまったVMは個別に直す必要があります。iPXEループ中のVMは qm stop で確実に止めてからboot orderを変更します:
qm stop <vmid> qm set <vmid> --boot order=scsi0 qm start <vmid>
複数台あるなら:
for vmid in 100 101 102; do qm stop $vmid qm set $vmid --boot order=scsi0 qm start $vmid done
なお、ディスクが scsi0 でない場合(virtio0, ide0, sata0 など)は、自分の環境に合わせてデバイス名を読み替えてください。
なぜ気づきにくいか
これ、3段階で見つけにくくなってます。
1つ目。qm template でテンプレートに変換したVMは起動できないので、boot orderが間違っていても問題にならない。cloneして初めて起動したときに発覚する。
2つ目。エラーメッセージが出ない。iPXEの初期化画面が流れるだけで、「boot orderが間違ってる」とは教えてくれない。
3つ目。Terraform経由だとさらに見えにくい。Terraformの proxmox_vm_qemu リソースで network ブロックを書くと、内部的に --net0 が渡される。Terraformのコード上にboot orderの問題は見えないんですよね。Terraform経由の場合は boot パラメータを明示的に指定する必要がありますが、詳細はこの記事ではカバーしません。
テンプレート作成(問題に気づかない)
↓
clone × N台(問題が伝播)
↓
VM起動(全台PXEブートループ)← ここで初めて気づく
まとめ
qm create に --net0 を付けると、Proxmoxが自動的にnet0をboot orderに登録して、ディスクが入らないことがある。qm set --boot order=scsi0 を忘れると、cloneしたVM全台がiPXEループに入ります。テンプレート作成スクリプトにboot orderの設定を組み込んでおくと確実です。