WOL sur VM Proxmox

Le WOL natif sur les VM (et contenair LXC) de Proxmox n'existe pas à l'heure actuelle. Il est possible de contourner ce problème par une capture de trame puis un réveil de la VM par Proxmox.

source: https://forum.proxmox.com/threads/wake-on-lan-wol-for-vms-and-containers.143879/

Etape 1 : Créer un script relais

Sur le PVE qui héberge les VMs, on va créer un script qui va intercepter les trames WOL destinées à la VM hébergée. Une fois la VM identifée, une commande qm ou pct allumera la machine.

Pour cela, depuis l'interface Proxmox manager

  • aller dans “Shell”
  • créer un répertoire
mkdir script
  • créer dedans un script
cd script
vi wol_VM.sh
  • coller le contenu
Remplace vmbr0 par votre interface (vbr1 ou autre) et le port 7 par celui que vous utilisez (9) de la ligne 10
#!/bin/bash

# Attempts to start Proxmox VM or LXC that matches MAC address received on WOL message
# This could be dangerous if abused by spamming the interface with many packages
# so I would like to try no more than once per 5 seconds.
# In my case useful with Moonlight client
# Uses tcpdump on default proxmox interface, change the interface if needed.
while true; do
  sleep 5
  wake_mac=$(tcpdump -c 1 -UlnXi vmbr1 ether proto 0x0842 or udp port 9 2>/dev/null |\
  sed -nE 's/^.*20:  (ffff|.... ....) (..)(..) (..)(..) (..)(..).*$/\2:\3:\4:\5:\6:\7/p')
  echo "Captured magic packet for address: \"${wake_mac}\""
  echo -n "Looking for existing VM: "
  matches=($(grep -il ${wake_mac} /etc/pve/qemu-server/*))
  if [[ ${#matches[*]} -eq 0 |]]; then
    echo "${#matches[*]} found"
  echo -n "Looking for existing LXC: "
  matches=($(grep -il ${wake_mac} /etc/pve/lxc/*))
  if [[ ${#matches[*]} -eq 0 |]]; then
    echo "${#matches[*]} found"
    continue
  elif [[ ${#matches[*]} -gt 1 |]]; then
    echo "${#matches[*]} found, using first found"
  else
    echo "${#matches[*]} found"
  fi
  vm_file=$(basename ${matches[0]})
  vm_id=${vm_file%.*}
  details=$(pct status ${vm_id} -verbose | egrep "^name|^status")
  name=$(echo ${details} | awk '{print $2}')
  status=$(echo ${details} | awk '{print $4}')
  if [[ "${status}" != "stopped" |]]; then
    echo "SKIPPED CONTAINER ${vm_id} : ${name} is ${status}"
  else
    echo "STARTING CONTAINER ${vm_id} : ${name} is ${status}"
    pct start ${vm_id}
  fi
    continue
  elif [[ ${#matches[*]} -gt 1 |]]; then
    echo "${#matches[*]} found, using first found"
  else
    echo "${#matches[*]} found"
  fi
  vm_file=$(basename ${matches[0]})
  vm_id=${vm_file%.*}
  details=$(qm status ${vm_id} -verbose | egrep "^name|^status")
  name=$(echo ${details} | awk '{print $2}')
  status=$(echo ${details} | awk '{print $4}')
  if [[ "${status}" != "stopped" |]]; then
    echo "SKIPPED VM ${vm_id} : ${name} is ${status}"
  else
    echo "STARTING VM ${vm_id} : ${name} is ${status}"
    qm start ${vm_id}
  fi
done
  • autoriser l'exécution de ce script
chmod +x wol_VM.sh

Etape 2 : Créer un service

Ce script doit écouter en permanence les requetes de WOL sur l'interface de votre PVE (ici vmbr0). On va donc le mettre dans un service.

  • création du service qui exécutera ce script
vi /etc/systemd/system/pve-wakeonlanVM.service

coller le contenu:

[Unit]
Description=Wake-on-LAN for Proxmox Virtual Environments
After=network.target

[Service]
Type=simple
Restart=always
User=root
ExecStart=/root/script/wol_VM.sh

[Install]
WantedBy=multi-user.target
  • Activation du service
systemctl enable system/pve-wakeonlanVM.service
  • Démarrage du service
systemctl start system/pve-wakeonlanVM.service
  • Vérifier le status du service
systemctl satus system/pve-wakeonlanVM.service
Avec le status vous verrez si le WOL fonctionne, comme un log

Etape 3 : Tester

Testez le réveil d'une VM éteinte sur votre PVE depuis une machine tier. ATTENTION vérifier d'abord avec une machine tier qui soit sur le meme switch que votre PVE pour vous éliminer un éventuel probleme de franchissement de commutateur, routeur, etc…

Dernière modification : le 2025/10/24