====== 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/|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…