Contesto #
virsh_wakeonlan è un servizio systemd che intercetta pacchetti Wake-on-LAN (WoL) e avvia automaticamente la macchina virtuale libvirt associata al MAC address ricevuto.
Utile per ambienti di test o lab dove vuoi accendere VM on-demand senza esporre API o accessi diretti.
Prerequisiti #
- Host Linux con
systemd python3>= 3.8libvirtevirshinstallati e funzionanti- VM già definite in libvirt
- Interfacce di rete delle VM con MAC address noti
- Privilegi root
Procedura #
1. Installazione del servizio #
Clona il repository e installa:
git clone https://github.com/lineadicomando/virsh_wakeonlan.git
cd virsh_wakeonlan
sudo make installQuesto comando:
- copia gli script
- registra il servizio systemd
- lo abilita all’avvio
2. Apertura porte firewall (firewalld) #
Identifica la zona associata all’interfaccia (es. bridge libvirt):
sudo firewall-cmd --get-zone-of-interface=virbr1Apri le porte UDP usate dal listener:
sudo firewall-cmd --zone=<zone> --add-port=9/udp --permanent
sudo firewall-cmd --zone=<zone> --add-port=7/udp --permanent
sudo firewall-cmd --zone=<zone> --add-port=40000/udp --permanent
sudo firewall-cmd --reloadPorte utilizzate:
- 7/udp
- 9/udp
- 40000/udp
3. Verifica del servizio #
Controlla lo stato:
sudo systemctl status virsh_wakeonlan.serviceAnalizza i log:
sudo journalctl -u virsh_wakeonlan.service4. Abilitare logging su file (opzionale) #
Per scrivere log persistenti in /var/log/virsh_wakeonlan.log:
sudo systemctl edit virsh_wakeonlan.serviceInserisci:
[Service]
Environment=VIRSH_WAKEONLAN_LOG_ENABLED=1Applica le modifiche:
sudo systemctl daemon-reload
sudo systemctl restart virsh_wakeonlan.serviceMonitoraggio in tempo reale:
sudo tail -f /var/log/virsh_wakeonlan.log5. Test funzionamento #
Invia un pacchetto Wake-on-LAN verso il MAC di una VM configurata.
Se tutto è corretto:
- il servizio intercetta il pacchetto
- identifica la VM tramite MAC
- esegue
virsh start <vm>
Esempi pratici #
Invio WoL da un altro host Linux:
wakeonlan <mac_vm>Oppure con etherwake:
sudo etherwake <mac_vm>Errori comuni #
La VM non parte
- MAC non associato a nessuna VM libvirt
- VM non definita (
virsh list --all)
Nessun evento nei log
- porte UDP bloccate dal firewall
- servizio non attivo
Listener attivo ma nessuna azione
- pacchetto WoL inviato su subnet errata
- bridge libvirt non raggiungibile
Note operative #
- Il matching è basato esclusivamente sul MAC address
- Funziona solo con VM già definite (non crea VM)
- Non richiede agent all’interno della VM
- Ideale per ambienti KVM/libvirt headless
Alternativa:
- usare hook libvirt o API REST custom (più complesso ma più flessibile)