Monter un PIKVM pour son infra

Publié le 19/10/2023 et écrit par Vincent Finance, dans la catégorie : #infra

Contexte de cet article

Jusqu'à présent, je n'ai jamais eu affaire à de gros problèmes physiques sur mes serveurs, si ce n'est un problème de disque dur qui tombe en panne il y a longtemps. Néanmoins, il est toujours bon de mettre en place une solution de secours avant que tout ne tombe en panne et c'est toujours pratique d'avoir un visuel sur l'interface physique de ses serveurs.
Sur des machines de gamme professionnelle, on utilise généralement iDRAC ou bien IPMI, une interface graphique qui permet d'avoir un visuel rapide sur le matériel et le BIOS de la machine, le tout sur un réseau dédié (en général, sur un réseau de management). Sur une machine grand public, ce genre d'interface n'existe pas et il est donc impossible d'avoir accès au BIOS depuis le réseau. Pour pallier ce problème, il existe heureusement une solution : un KVM sur IP.

Un KVM (ou switch KVM) est une interface déportée qui permet d'avoir un retour écran et un contrôle clavier souris sur une machine sans avoir besoin de se brancher directement sur ladite machine, le KVM étant lui-même branché dessus. Si vous êtes allé dans un datacenter ou chez Cécile, vous avez peut-être remarqué la présence d'une espèce de "PC portable" rangé dans un rack : ceci est un exemple de KVM.
Un KVM sur IP, c'est donc la même chose qu'un KVM tout en rajoutant un module réseau : cela permet de se connecter dessus via un autre ordinateur pour effectuer de la maintenance (pratique quand on n'est pas sur place). Ce genre d'équipement est en général assez cher, mais il existe deux excellentes solutions : PIKVM et Tinypilot.

PIKVM et Tinypilot sont des projets open-source qui consistent à transformer un Raspberry Pi en KVM sur IP et donner ainsi un accès physique à sa machine via le réseau. Ils offrent aussi la possibilité d'utiliser un VPN pour pouvoir y accéder depuis Internet, de manière sécurisée. Dans mon cas, je vais m'intéresser au projet PIKVM, car celui-ci offre une large gamme de cartes compatibles et il a l'avantage de ne pas avoir besoin de licence pour fonctionner. Pour la partie matérielle, je suis parti sur une base de Raspberry Pi Zero 2W pour avoir un truc discret et peu gourmand, sachant que la latence n'est pas un problème pour moi. Je vais aussi rajouter un switch KVM matériel pour pouvoir contrôler plus d'une machine directement depuis la carte.

Voici donc un schéma du résultat final :

Schéma de fonctionnement de mon PIKVM

Prérequis

Voici donc les éléments nécessaires pour ce projet :

Assemblage

Le module HDMI est livré avec des vis, deux entretoises et deux nappes de connexion, une pour les Raspberry Pi classiques (versions 2, 3, 4) et une pour les versions Zero. Il suffit alors de connecter le grand embout de la nappe dans le module HDMI et le petit embout dans le port CSI du Raspberry Pi Zero 2W (celui se trouvant sur le côté opposé au port de carte microSD).
On peut utiliser les deux entretoises pour visser les deux cartes ensemble, mais j'ai opté pour visser le tout directement dans un boîtier imprimé en 3D.

Photo du montage physique de mon PIKVM

On branche enfin le câble HDMI du KVM sur le port HDMI du module et le câble USB OTG sur le port USB du KVM (de préférence, celui pour le clavier). Le câble d'alimentation peut se brancher soit sur une alimentation dédiée, soit sur un des ports USB d'une machine physique (de préférence, sur ceux qui sont toujours alimentés).

Installation du logiciel

Une fois le matériel assemblé, on peut passer à la partie installation. Sur le site de PIKVM, on récupère la dernière version de l'image pour les Raspberry Pi Zero 2W. Le fichier se nomme v2-hdmi-zero2w-latest.img.xz.
On décompresse le fichier téléchargé et on recopie l'image sur une carte microSD à l'aide d'un logiciel dédié. Sous GNU/Linux, Gnome Disks fait largement l'affaire pour ce genre de tâches, mais on peut aussi utiliser BalenaEtcher.

Une fois les données copiées, il est important de monter la première partition (celle qui contient le terme BOOT) pour activer le Wi-Fi lors du premier démarrage. Par défaut, le Raspberry Pi Zero et ses dérivés n'activent pas le Wi-FI et il est donc impossible de se connecter dessus sans adaptateur physique.

Après montage de cette partition, on recherche le fichier nommé pikvm.txt et on ajoute les deux options suivantes pour permettre au Pi de se connecter au premier lancement :

FIRST_BOOT=1
WIFI_ESSID="monssid"
WIFI_PASSWD="monmotdepasse"

On peut ensuite retirer la carte microSD et l'insérer dans la fente du Zero 2W. On connecte ensuite les deux câbles USB aux ports du Raspberry (le câble dédié à l'alimentation dans le port indiqué comme PWR IN) et on attend quelques minutes le temps que le logiciel s'initialise et agrandisse la partition système. Une fois cela fait, la carte se connecte en Wi-fi et on peut scanner son réseau pour trouver la carte.
Dans mon cas, Winbox permet d'afficher les baux DHCP actuellement utilisés.

Une fois l'adresse IP récupérée, on peut la taper dans son navigateur préféré pour obtenir l'interface web de PIKVM. Le logiciel utilise un certificat auto-signé donc vous aurez un avertissement de sécurité que vous pourrez ignorer ici. Le couple admin / admin sera votre ami pour le premier accès.

Capture d'écran de l'interface de PIKVM dans Firefox

Configuration

Une fois que tout est OK et que l'interface s'affiche, on va passer par un peu de configuration pour assurer nos arrières et être tranquille.

Mise en place du réseau

Vu que la modification faite plus haut est temporaire, on va s'assurer que la carte se connecte toute seule au démarrage. On va donc vérifier les paramètres de la carte réseau et ajouter le nécessaire pour que le Wi-Fi soit actif automatiquement. On peut alors utiliser une connexion SSH ou bien le Terminal de l'interface web pour taper les commandes suivantes (le mot de passe par défaut est root) :

$ su -
# rw
# cat /etc/systemd/network/wlan0.network 
# wpa_passphrase monssid 'maclewpa' > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
# systemctl enable wpa_supplicant@wlan0.service
# ro
# reboot

Pour l'anecdote, le système de fichiers est monté par défaut en lecteur seule, ce qui explique pourquoi on doit taper rw avant chaque modification ou mise à jour sur la machine.

Après redémarrage, la carte se reconnecte de nouveau automatiquement et il est maintenant possible de s'en servir sans problèmes.

Un peu de sécurité

La sécurité, c'est toujours important, surtout sur ce genre d'équipements critiques. On va donc changer quelques mots de passe et modifier l'authentification SSH pour l'utilisateur root, afin de n'utiliser que des clés SSH :

# rw
# passwd root
# kvmd-htpasswd set admin
# mkdir ~/.ssh
# vim > ~/.ssh/authorized_keys
##### [ici, mettez vos clés]

# vim /etc/ssh/sshd_config
(...)
PermitRootLogin prohibit-password
(...)
PasswordAuthentication no

# systemctl restart sshd kvmd kvmd-nginx
# ro

Une déconnexion de l'interface Web peut survenir alors. Il suffit de se reconnecter avec le nouveau mot de passe pour retrouver un accès fonctionnel. On peut donc maintenant utiliser notre système sur un réseau plus ouvert, tout en sachant qu'il est fortement déconseillé de l'ouvrir directement sur Internet. Dans mon cas, il est derrière mon routeur et n'est accessible de l'extérieur qu'avec un VPN Wireguard.

Mise à jour

Une fois que tout est configuré, on peut lancer une mise à jour complète du système :

# rw
# pacman -Syu
# reboot

Le projet étant basé sur ArchLinux ARM, il est normal de retrouver ici le gestionnaire de paquets Pacman. Cela n'entrave heureusement pas la stabilité du logiciel ou son efficacité. Sur un Raspberry Pi Zero, les mises à jour sont plus lentes du fait des limitations de la carte. C'est d'ailleurs un point mentionné dans la documentation en ligne.

Du Wake-On-LAN ?

En plus de ces options de base, il est possible de rajouter quelques options supplémentaires dans le menu de l'application via un fichier particulier, qui est notamment utilisé pour utiliser le port GPIO des Raspberry Pi. Parmi ces options, on peut effectuer du Wake-On-LAN : il s'agit d'une méthode permettant d'allumer un ordinateur à distance en utilisant la carte réseau (ce qui explique pourquoi les PC récents ont toujours leur carte réseau allumée même s'ils sont éteints). On envoie un paquet dédié (ou "magic packet") sur l'adresse MAC de l'interface filaire et celle-ci, à sa réception, envoie un signal sur la carte mère pour démarrer la machine.

Dans PIKVM, il est possible d'éditer le fichier /etc/kvmd/override.yaml et d'ajouter une section pour lancer des commandes de Wake-On-LAN depuis le menu de l'interface Web, comme ceci :

kvmd:
    gpio:
        drivers:
            wol_server1:
                type: wol
                mac: ff:ff:ff:ff:ff:f1
            wol_server2:
                type: wol
                mac: ff:ff:ff:ff:ff:f2
            wol_server3:
                type: wol
                mac: ff:ff:ff:ff:ff:f3
        scheme:
            wol_server1:
                driver: wol_server1
                pin: 0
                mode: output
                switch: false
            wol_server2:
                driver: wol_server2
                pin: 0
                mode: output
                switch: false
            wol_server3:
                driver: wol_server3
                pin: 0
                mode: output
                switch: false
        view:
            header:
                title: Wake-on-Lan  # The menu title
            table:  # The menu items are rendered in the form of a table of text labels and controls
                - ["#Narodnaia", "wol_server1|Send Wake-on-LAN"]
                - ["#Raoulblanchard", "wol_server2|Send Wake-on-LAN"]
                - ["#Windows", "wol_server3|Send Wake-on-LAN"]

Après redémarrage de l'interface de KVMD (soit sudo systemctl restart kvmd kvmd-nginx), un nouveau menu s'affiche et on peut maintenant envoyer nos commandes en un clic.

Conclusion

Avec ceci, je peux maintenant contrôler l'ensemble de mes machines depuis l'extérieur et faire des diagnostics matériels plus facilement. En cas de coupure de courant, les onduleurs peuvent revenir en ligne tout seuls et donc rallumer l'alimentation nécessaire pour le PIKVM. Ce dernier peut ensuite relancer les machines via le Wake-On-LAN configuré plus haut et je peux donc être complètement autonome, même sans être à la maison !


Sources pour cet article : PiKVM using a Raspberry Pi Zero 2W


Un commentaire à ajouter ?

Pour ajouter votre commentaire, envoyez directement un mail ici