Julien De Bona
Free Software, Cooking, and Everything


Console série sous Debian Jessie et systemd

Publié le 2015-02-08.

J'ai déjà mis en place des machines avec un port série pour seule console. J'utilisais des systèmes basés sur System V init mais Debian Jessie change la donne avec l'utilisation de systemd comme système d'init. Heureusement, la tâche est simplifiée. Le terminal que je désire connecter est un vt510 configuré à 9600 bauds, des mots de 8 bits, pas de parité et un bit d'arrêt. C'est un vrai terminal, pas un émulateur.

Dans ce système, l'installation s'est faite avec un écran et un clavier; je me contente juste d'ajouter le nécessaire pour pouvoir m'en passer.

Configuration de GRUB2

Sous Debian, les paramètres nécessaires sont dans /etc/default/grub2. Ajouter ou modifier les lignes suivantes dans ce fichier:

GRUB_CMDLINE_LINUX="console=ttyS0,9600n8 console=tty0"
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1"

Ensuite, mettre à jour la configuration effective de GRUB en exécutant:

update-grub

La ligne GRUB_CMDLINE_LINUX indique les options à passer au kernel; les deux définitions de consoles font que les messages du kernel s'afficheront sur chacune des définitions, la dernière étant celle étant utilisée lorsqu'on utilise le périphérique /dev/console (je n'ai pas poussé jusqu'à avoir tout sur le port série). La ligne GRUB_TERMINAL indique que le port série sera l'affichage primaire de GRUB, mais qu'il sera aussi visible sur un écran raccordé au port VGA. Il faut redémarrer pour que les changements prennent effet.

Configuration du login

Il me faut maintenant un getty sur le port série. La bonne nouvelle est que systemd détecte tout seul que la console est sur le port série en utilisant les options passées au kernel, et il lance tout seul un getty dessus. La mauvaise nouvelle est que les logins ont tendance à bloquer et afficher des caractères bizarres lors du premier login après avoir allumé le terminal. Le problème n'est pas lié à systemd, et tout tient dans la configuration du getty. L'option magique est l'option "-8" d'agetty. Il reste à trouver l'endroit où la spécifier. Sous les versions précédentes de Debian, ça se trouvait dans /etc/inittab. Maintenant, ça se trouve de manière prévisible dans la configuration de systemd.

  1. Copier /lib/systemd/system/serial-getty@.service vers /etc/systemd/system/serial-getty@ttyS0.service. Le nouveau fichier dans /etc va prendre la priorité sur l'original dans /lib. C'est important de procéder ainsi, sinon les mises à jour du paquet systemd vont écraser les changements.
  2. Modifier ce nouveau fichier. La ligne à modifier est celle du paramètre "ExecStart"; ma configuration est donc (%I représente le terminal traité, donc ttyS0):
    ExecStart=-/sbin/agetty -8 -o '-p -- \\u' --keep-baud 115200,38400,9600 %I vt510
    
  3. Créer un lien vers ce fichier dans /etc/systemd/system/getty.target.wants
  4. Recharger la configuration:
    systemctl daemon-reload
    systemctl restart serial-getty@ttyS0.service
    

Pour tester, fermer une éventuelle session sur le port série, éteindre le terminal et le rallumer. Appuyer une fois sur ENTER pour forcer l'affichage du prompt, et tout devrait marcher.

Définitions des terminaux

La configuration par défaut configure le terminal en vt102. Ça ne pose pas de problèmes puisque le vt510 est compatible, mais des définitions pour ce modèle sont disponibles. Installer le paquet ncurses-term. Il contient toutes les définitions existantes (on peut les trouver dans /usr/share/terminfo). Une fois installé, on peut remplacer "vt102" par "vt510" dans la configuration du getty, et recharger la configuration de systemd.


tags: linux

Quelques tags ...