/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

Proxmox VMがiPXEから起動しない — boot orderにscsi0が入っていない対処法

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の設定を組み込んでおくと確実です。

参考