LoginSignup
1
1

More than 1 year has passed since last update.

ProxmoxでVMをWake on LAN

Last updated at Posted at 2022-06-23

はじめに

通常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')

Screenshot 2022-06-24 at 08-35-20 kiyoura - Proxmox Virtual Environment.png
Screenshot 2022-06-24 at 08-40-06 kiyoura - Proxmox Virtual Environment.png

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"

おわり

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1