Post

Proxmox Wake-on-lan VM

Le Wake-on-LAN (WoL) est une fonctionnalité puissante et pratique qui permet de réveiller un ordinateur à distance, même s’il est éteint. Cette technologie, bien que discrète, offre des avantages considérables en matière de gestion de parc informatique, d’économie d’énergie et de productivité.

Précisions

Qu’est-ce que le Wake-on-LAN ?

Le WoL est un protocole réseau standard qui permet d’allumer un ordinateur à distance. Concrètement, cela signifie que vous pouvez démarrer un ordinateur depuis un autre emplacement, qu’il s’agisse du même réseau local ou d’Internet. Pour que le Wake-on-LAN fonctionne, l’ordinateur à réveiller doit répondre à certaines conditions matérielles et logicielles.

Comment fonctionne le Wake-on-LAN ?

Le principe de fonctionnement du WoL repose sur l’envoi de “paquets magiques” (magic packets) sur le réseau. Ces paquets sont envoyés en broadcast (diffusion) sur le réseau local ou à l’adresse IP spécifique de la carte réseau de l’ordinateur cible. Le paquet magique contient l’adresse MAC (Media Access Control) de la carte réseau de l’ordinateur à réveiller. Lorsque la carte réseau de cet ordinateur détecte un paquet magique correspondant à son adresse MAC, elle déclenche le processus de démarrage.

Conditions requises pour le Wake-on-LAN

Pour que le WoL fonctionne correctement, certaines conditions doivent être remplies :

  • L’ordinateur à réveiller doit être connecté à une source d’alimentation, même s’il est éteint.
  • La carte réseau de l’ordinateur doit prendre en charge le WoL.
  • Le BIOS/UEFI de l’ordinateur doit avoir la fonction Wake-on-LAN activée.
  • Le routeur et les pare-feu doivent autoriser le trafic WoL.

Applications pratiques

  • Gestion de parc informatique : Les administrateurs système peuvent utiliser le WoL pour économiser de l’énergie en n’allumant que les ordinateurs nécessaires, facilitant ainsi la gestion à distance des parcs informatiques.

  • Maintenance à distance : Le WoL est une solution idéale pour effectuer des opérations de maintenance sur des ordinateurs sans avoir besoin d’une présence physique.

  • Économie d’énergie : Les utilisateurs domestiques peuvent tirer parti du WoL pour allumer leur ordinateur à distance uniquement lorsque nécessaire, réduisant ainsi la consommation d’énergie.

Utilisation pratique du Wake-on-LAN

  • Des outils logiciels dédiés tels que des applications mobiles, des clients WoL pour PC ou des services en ligne permettent d’envoyer des paquets magiques et de réveiller des ordinateurs à distance.

  • L’utilisation de lignes de commande ou de scripts personnalisés est également possible pour ceux qui préfèrent une approche plus technique.

Introduction

L’ensemble de ces manipulations sont à effectuer sur l’hôte Proxmox et non sur une VM.

Je part aussi du principe que vous n’avez qu’un réseau simple ou toutes les adresses ip sont sur le même masque réseau.

A effectuer en root

Vérification de la fonctionalité

Afin de s’assurer que l’hôte Proxmox est capable d’utiliser le Wake On Lan (ou plutôt que la carte ethernet connecté au réseau l’est), il convient de tapper la commande suivante :

1
ethtool [iface] |grep "Wake-on"

[iface] est à remplacer par le nom de l’interface connectée physiquement au réseau

Ce qui doit vous restituer les informations suivantes :

1
2
Supports Wake-on: pumbg
Wake-on: g

Il y a deux élément important ici :

  • Supports doit comporter la lettre g (magic packet)
  • Wake-on ne doit par être sur d (disabled)

Plus d’informations sur la vidéo de Christian Lempa.

Fichiers requis

Source: le forum Proxmox

/opt/scripts/wol.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/bash
# 2023-11-10

re='^[0-9]+$'
port=9 # Define UDP port to listen on for the package
echo "Starting Wake on LAN script"

while true; do

    echo "Listening on UDP port $port ..."
    echo "\n" | nc -knl -p $port -u | # listen to udp port (default: 9) for packets, check if it is a magic packet
        stdbuf -o0 xxd -c 6 -p |
        stdbuf -o0 uniq |
        stdbuf -o0 grep -v 'ffffffffffff' |
        while read; do
            macWOL="${REPLY:0:2}:${REPLY:2:2}:${REPLY:4:2}:${REPLY:6:2}:${REPLY:8:2}:${REPLY:10:2}"
            if [[ "00:00:00:00:00:00" == *"$macWOL"* ]]; then
                echo "script is finished and would go to endless loop. Restarting service..."
                systemctl restart wol.service
            fi
            macWOL=$(echo "$macWOL" | tr "[:upper:]" "[:lower:]")
            #VM loop
            /usr/sbin/qm list | tr -s ' ' | cut -d ' ' -f 2 | while read -r id; do
                if [[ $id =~ $re ]]; then
                    echo "check VM-ID $id for $macWOL"
                    /usr/sbin/qm config $id | grep ^net0 | while read -r macstr; do
                        macstr=$(echo "$macstr" | tr "[:upper:]" "[:lower:]")
                        if [[ $macstr == *"$macWOL"* ]]; then
                            echo "MAC $macWOL found at VMID  $id. Starting VM"
                            /usr/sbin/qm start $id
                            /usr/sbin/qm resume $id
                        fi
                    done
                fi
            done

            #container loop
            /usr/sbin/pct list | tr -s ' ' | cut -d ' ' -f 1 | while read -r id; do
                if [[ $id =~ $re ]]; then
                    echo "check VM-ID $id for $macWOL"
                    /usr/sbin/pct config $id | grep ^net0 | while read -r macstr; do
                        macstr=$(echo "$macstr" | tr "[:upper:]" "[:lower:]")
                        if [[ $macstr == *"$macWOL"* ]]; then
                            echo "MAC $macWOL found at VMID  $id. Starting VM"
                            /usr/sbin/pct start $id
                            /usr/sbin/pct resume $id
                        fi
                    done
                fi
            done
        done

    # the script never reaches here.. and I do not know why,
    # which is why we just restart the service to listen for
    # new magic packages after the first iteration
done

echo "script has concluded and stopped.. this should never happen"

exit 1

/etc/systemd/system/wol.service

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=WOL (Wakeup on LAN)
After=network.target

[Service]
Type=simple
Restart=always
User=root
ExecStart=/bin/bash /opt/scripts/wol.sh

[Install]
WantedBy=multi-user.target

Mise en place

Vous devez copier chaque fichier (en mode LF et non CRLF) dans leurs emplacement respectifs.

Ensuite vous définissez wol.sh comme étant éxécutable :

1
sudo chmod +x wol.sh

Puis vous activez le service systemd :

1
2
sudo systemctl enable wol.service
sudo systemctl start wol.service

Utilisation

Vous installez le paquet Debian wakeonlan :

1
sudo apt install wakeonlan

Et ensuite pour réveiller n’importe quelle VM sous Proxmox, il suffit d’envoyer un paquet magique sur l’adresse MAC de la VM :

1
wakeonlan a8:a1:59:af:03:64

Conclusion

Comme chaque VM sous Proxmox ne dispose pas d’une carte réseau physique, on utilise ici la possibilité de démarrer une VM depuis l’hôte Proxmox lorsqu’il détecte un paquet de type WOL sur le réseau dont l’adresse MAC correspond à une des VM.

En résumé, le Wake-on-LAN est une fonctionnalité ingénieuse qui offre des avantages significatifs en matière de gestion informatique, d’économie d’énergie et de facilité d’utilisation. Que ce soit pour administrer un parc informatique professionnel ou pour simplifier la gestion de votre propre ordinateur à domicile, le WoL est une technologie qui mérite d’être explorée et exploitée.

Quelques sources

Cet article est sous licence CC BY 4.0 par l'auteur.

© 2022- Olivier. Certains droits réservés.

Propulsé par τζ avec le thème Χ