Salta al contenuto principale

Avviare VM libvirt via Wake-on-LAN con virsh_wakeonlan

·370 parole·2 minuti
❯ lineadicomando.it
Autore
❯ lineadicomando.it
Specs, Bugs and Log Console

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.8
  • libvirt e virsh installati 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 install

Questo 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=virbr1

Apri 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 --reload

Porte utilizzate:

  • 7/udp
  • 9/udp
  • 40000/udp

3. Verifica del servizio
#

Controlla lo stato:

sudo systemctl status virsh_wakeonlan.service

Analizza i log:

sudo journalctl -u virsh_wakeonlan.service

4. Abilitare logging su file (opzionale)
#

Per scrivere log persistenti in /var/log/virsh_wakeonlan.log:

sudo systemctl edit virsh_wakeonlan.service

Inserisci:

[Service]
Environment=VIRSH_WAKEONLAN_LOG_ENABLED=1

Applica le modifiche:

sudo systemctl daemon-reload
sudo systemctl restart virsh_wakeonlan.service

Monitoraggio in tempo reale:

sudo tail -f /var/log/virsh_wakeonlan.log

5. 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)

Riferimenti
#