はじめに
通常Wake On Lanは物理マシンに対して行うが、ProxmoxVEの仮想マシンを今回は起こしたい。
以下の記事を見つけたのだが、そのままでは動作しないため手直しを行った。
※追記
ProxmoxVE 7.3から公式に仮想ゲストのWakeOnLanが追加されたので、そちらを使ったほうが良いです…
https://pve.proxmox.com/wiki/Roadmap#Proxmox_VE_7.3
Bashスクリプトの作成
Wake on Lanによって送信するMagicPacketを受信し、そのMACアドレスがVMと一致する場合にVMの起動を行う内容。VMのIDとMACアドレスを引数に取る汎用的なものにした。
修正点
- ncのオプションを実在するものに変更
- 受信ポートを指定できるように変更
- 既にVMが起動中の場合は再度起動をかけないように変更
- while readにパイプで投げ込むとncが終わらなくなるため、別の方法で渡すように変更
/root/wol_vm.sh
#!/bin/bash
if [ $# -ne 3 ] ; then
echo "Usage: $0 VM_ID MAC_ADDRESS";
exit 1
fi
PORT=$1
VM_ID=$2
MAC_ADDRESS=$3
while read ; do
MAC=${REPLY:0:2}:${REPLY:2:2}:${REPLY:4:2}:${REPLY:6:2}:${REPLY:8:2}:${REPLY:10:2};
echo Received Address: $MAC
if [ "$MAC" == "$MAC_ADDRESS" ] && [ ! "$(qm status $VM_ID | awk '{ print $2 }')" == "running" ] ; then
qm start $VM_ID
exit
fi
done < <(nc -v --listen --udp --port=$PORT |
stdbuf -o0 xxd -c 6 -p |
stdbuf -o0 uniq |
stdbuf -o0 grep -v 'ffffffffffff')
VMの番号が107
でMACアドレスが22:e1:08:90:ec:9e
の場合、以下のように実行
Wake on Lanを投げるプログラムによって7番ポートの場合と9番ポートの場合がある。下記は9番ポートの例。
./wol_vm.sh 9 107 22:e1:08:90:ec:9e
スクリプトが稼働し続けるので、その状態でWake on Lanを投げる。Successfullyの表示と共にVMが自動起動する
root@hoge:~# ./wol_vm.sh 9 107 22:e1:08:90:ec:9e
nc: listening on :: 9 ...
nc: listening on 0.0.0.0 9 ...
nc: connect to 0.0.0.0 9 from 192.168.0.244 (192.168.0.244) 36711 [36711]
Received Address: 22:e1:08:90:ec:9e
GUEST HOOK: 107 pre-start
107 is starting, doing preparations.
GUEST HOOK: 107 post-start
107 started successfully.
サービス化
このままでは扱いにくいため、systemdのサービスにする。
以下のファイルを作成する。
/etc/systemd/system/wol-vm@.service
[Unit]
Description=Wake on Lan for VM service Port %I
[Service]
Type=simple
User=root
Group=root
Restart=always
Environment="SCRIPT_ARGS=%I"
ExecStart=/root/wol_vm.sh $SCRIPT_ARGS
[Install]
WantedBy=multi-user.target
以下のコマンドで制御できるようになる。7番ポートと9番ポートをそれぞれ用意すると良い
# wol-vmサービスの有効化
root@hoge:~# systemctl enable wol-vm@"7 107 22:e1:08:90:ec:9e"
# wol-vmサービス開始
root@hoge:~# systemctl start wol-vm@"7 107 22:e1:08:90:ec:9e"
# wol-vmの状態確認
root@hoge:~# status wol-vm@"7 107 22:e1:08:90:ec:9e"
# wol-vmサービスの終了
root@hoge:~# stop wol-vm@"7 107 22:e1:08:90:ec:9e"
おわり