Outils pour utilisateurs

Outils du site


issue148:tutoriel1

SETTING UP A SERIAL TERMINAL SERVER

METTRE EN PLACE TERMINAL SERVER VIA UN PORT SERIE

Years ago, many screen-less devices did not usually have access to any kind of dedicated network. Ubiquitous WiFi was not yet a thing, nor was Bluetooth. Some of the more expensive printers did have Ethernet cards, as did servers, but in many cases, to set up the device or to regain control in the case of a crash, access was made through a serial connection.

Il y a plusieurs années, de nombreux dispositifs sans écran n'avaient généralement pas accès à une connexion réseau dédiée. Le WiFi, aujourd’hui omniprésent, n’existait pas, pas plus que le Bluetooth. Certaines imprimantes les plus chères étaient équipées de cartes Ethernet, tout comme les serveurs, mais dans de nombreux cas, l'accès pour configurer la « machine », ou pour reprendre le contrôle en cas de panne, se faisait via une connexion série.

Flash forward to modern times, and the serial port has disappeared altogether from most computers – though some servers and professional-grade routers still retain them as standard. The major use-case as of now is probably access to automobile onboard electronics, through the OBD (On-board Diagnostic) port found underneath the steering wheel in most cars. This can be seen as a variant of a serial connection. But, although some aspects of serial technology have changed over the years, it can still be a nice way to control a home server or an IoT (Internet of Things) device such a Raspberry Pi. As before, using a serial connection means we can troubleshoot and repair our system without ever needing to plug in a screen and a keyboard which, depending on its physical location, may be something of an issue. The protocols concerned are relatively simple, software is ubiquitous (for GNU/Linux and BSD operating systems), and hardware is cheap. For this reason, serial access can become something akin to a spare tire: a technique that we do not really wish to use often, but that we are very happy to have at our disposition when the need arises.

A notre ère, le port série a complètement disparu de la plupart des ordinateurs - bien que certains serveurs et routeurs professionnels en disposent encore en standard. Aujourd’hui, on retrouve principalement son usage dans le cadre de l'accès à l'électronique embarquée d’une voiture, par le biais du port OBD (On-board Diagnostic) que l'on trouve sous le volant de la plupart des véhicules. Cela peut être considéré comme une variante d'une connexion « série ». Mais, bien que certains aspects de la technologie « série » aient changé au fil des années, cela peut encore être un bon moyen de contrôler un serveur ou un dispositif IoT (Internet des Objets) comme un Raspberry Pi. Comme autrefois, l'utilisation d'une connexion série nous permet de dépanner et de réparer un système sans avoir besoin de brancher un écran et un clavier, ce qui, selon son emplacement physique, peut poser un problème. Les protocoles concernés sont relativement simples, les logiciels toujours omniprésents (pour les systèmes d'exploitation GNU/Linux et BSD) et le matériel nécessaire reste bon marché. Pour cette raison, l'accès via un port série peut devenir une sorte de roue de secours : une technique que nous ne souhaitons pas vraiment utiliser souvent, mais que nous sommes très heureux d'avoir à notre disposition quand le besoin s'en fait sentir.

The hardware

Le matériel

I picked up the hardware required for this experiment online, and for a mere 10 euros obtained: two USB-to-serial dongles, and one 1.8 meter null-modem cable. One of the dongles will be needed to equip my (modern) computer with a serial port, in this case with the DB-9 male connector. The other dongle will be used on a Raspberry Pi. Although this small board already has two possibilities as regards serial connections, the onboard electronic circuits work only with TTL (Transistor-transistor level) voltages of about 0 V (for a logic 0), and about +5 V (for a logic 1) which, incidentally, is also the case for the Arduino. The usual serial connection for computers, on the other hand, obeys the RS-232 norm and works with inverted voltages of about +12 V (for a logic 0), and -12 V (for a logic 1). Specific integrated circuits (such as the MAX 232) are available to do conversion; however, for the Raspberry Pi it is simpler and more convenient to use a standard USB to serial dongle.

J'ai acheté, en ligne, le matériel nécessaire à cette expérience et, pour seulement 10 euros, j’ai obtenu : deux dongles USB-à-série, et un câble null-modem de 1,8 mètre. Un des dongles sera nécessaire pour équiper mon ordinateur (récent) d'un port série, avec le connecteur DB-9 mâle. L'autre dongle sera utilisé sur un Raspberry Pi. Bien que ce nano-ordinateur dispose déjà de deux possibilités de connexion série, les circuits électroniques embarqués ne fonctionnent qu'avec des tensions TTL (Transistor-Transistor Logic) d'environ 0 V (état logique 0), et d'environ +5 V (état logique 1) ce qui est d'ailleurs aussi le cas pour la carte Arduino. En revanche, la connexion série habituelle pour les ordinateurs obéit à la norme RS-232 et fonctionne avec des tensions inversées d'environ +12 V (pour un état logique à 0), et -12 V (pour un état logique à 1). Des circuits intégrés spécifiques (tels que le MAX 232) sont disponibles pour effectuer la conversion ; cependant, pour le Raspberry Pi, il est plus simple et plus pratique d'utiliser un dongle USB à port série standard.

The null-modem cable is a very simple cable to connect two serial devices, that in our case has a female DB-9 connector at each end. It performs two main functions. One is as an electrical bus, where Signal Ground on both devices are connected together, and each device’s TX (transmission) pin is connected to the other device’s RX (reception) pin. The second function, which is implemented in most well-built null-modem cables, is to deactivate hardware control pins on both interfaces. Back in the day, these were used to control traffic between two modems, but this function is not really necessary for a short cable with no active electronics.

Le câble null-modem est un câble très basique pour connecter deux machines via le port série ; dans notre cas, il a un connecteur DB-9 femelle à chaque extrémité. Il remplit deux fonctions principales, l'une est un bus électrique, où la masse du signal des deux machines sont connectées ensemble, et la broche TX (transmission) de chaque machine est connectée à la broche RX (réception) de l'autre machine. La deuxième fonction, qui est implémentée dans la plupart des câbles null-modem bien conçus, consiste à désactiver les broches de commande matérielles sur les deux interfaces. À l'époque, ils étaient utilisés pour contrôler le trafic entre deux modems, mais cette fonction n'est pas vraiment nécessaire pour un câble court sans « électronique active ».

Setting up a serial terminal service

Mise en place du service de terminal série

From the software point of view, it is fairly difficult to find up-to-date documentation on setting up a serial terminal server on a modern GNU/Linux distribution. The basic program –the getty utility– is usually already installed. But, most tutorials were written in a period when system services were configured using init or upstart, including community documentation found today at https://help.ubuntu.com/community/SerialConsoleHowto . Since that time, however, most distributions have moved over to systemd. It would seem that they have done so at a time when serial connections are little-used, which is why they have been rather neglected by the manuals.

Du point de vue logiciel, il est assez difficile de trouver une documentation à jour sur la configuration d'un serveur de terminaux « série » sur une distribution GNU/Linux récente. Le programme de base - l'utilitaire getty - est généralement déjà installé. Mais la plupart des tutoriels ont été écrits à une époque où les services système étaient configurés à l'aide de init ou upstart, y compris la documentation de la communauté que l'on trouve aujourd'hui sur https://help.ubuntu.com/community/SerialConsoleHowto . Depuis, la plupart des distributions sont passées à systemd. Il semblerait que cette évolution ait été réalisée à une époque où les connexions série étaient déjà peu utilisées, ce qui explique pourquoi ils ont négligé la documentation.

I will be following this note https://ubuntuforums.org/showthread.php?t=2343595 by user paulstaf. Though short, it is clear and will set you on the right track for most distributions, for instance on Ubuntu and Linux Mint for a computer, or Raspbian for a Raspberry Pi. I will be using Linux Mint 19.1 on the client computer, and either the same on a server computer or Raspbian 9 on a Raspberry Pi, also as a server. Most instructions should be identical between recent versions of Ubuntu, Linux Mint and Debian.

Je vais suivre cette documentation https://ubuntuforums.org/showthread.php?t=2343595 rédigée par « paulstaf ». Bien que succincte, elle est claire et vous mettra sur la bonne voie pour la plupart des distributions, par exemple sur Ubuntu et Linux Mint pour un ordinateur, ou Raspbian pour un Raspberry Pi. J'utiliserai Linux Mint 19.1 sur l'ordinateur client et, soit de même côté serveur, soit Raspbian 9 sur un Raspberry Pi, aussi en tant que serveur. La plupart des instructions devraient être identiques entre les versions récentes d'Ubuntu, Linux Mint et Debian.

The first thing we will need to do is verify our existing system on the server. Let us start by seeing if getty is actually installed – as, indeed, it should be, to give up access to that standard VT (Virtual Terminals) that usually are activated on GNU/Linux systems:

La première chose que nous devons faire consiste à vérifier le système existant côté serveur. Commençons par voir si getty est réellement installé – car nécessaire pour avoir accès à la fonction VT (Virtual Terminals) standard qui est habituellement activée sur les systèmes GNU/Linux :

# getty –version getty from util-linux 2.29.2

This looks good. If getty is not installed on your system, get it using your package manager of choice. Now, let us test the hardware. Plug the dongle into any available USB port, and check the kernel messages:

Ça a l'air bon. Si getty n'est pas installé sur votre système, utilisez le gestionnaire de paquets (de logiciels) de votre distribution pour l’installer. Maintenant, testons le matériel. Branchez le dongle sur n'importe quel port USB disponible et vérifiez les messages du noyau par :

# dmesg | grep ttyUSB [ 2507.371545] usb 1-1.4: ch341-uart converter now attached to ttyUSB0

So far, so good: our USB dongle has been recognized by the kernel’s USB subsystem, and configured as /dev/ttyUSB0. Most USB-to-serial hardware is rather standard, and should be detected and set up with no problems. However, if it is correctly connected and no /dev/ttyUSB* devices show up, that means we have a hardware problem and will probably need to try another physical dongle.

Jusqu'ici, tout va bien : notre clé USB a été reconnue par le sous-système USB du noyau, et configurée comme /dev/ttyUSB0. La plupart des matériels USB-à-série sont plutôt standard et devraient être détectés et configurés sans problème. Cependant, s'il est correctement connecté et qu'aucun périphérique /dev/ttyUSB* n'apparaît, cela signifie que nous avons un problème matériel et que nous devrons probablement essayer un autre dongle physique.

Next, become root (using the su or sudo commands), and navigate to the directory /lib/systemd/system. Here, we will need to create a new service file. It can have any name we choose, but it is best to use a name we will remember easily. For instance, let us call it ttyUSB0.service, and edit it with the following contents:

Ensuite, passez en  « root » (en utilisant la commande su, ou sudo), et naviguez vers le répertoire /lib/systemd/system. Ici, nous devons créer un nouveau fichier pour configurer le service. Il peut porter n'importe quel nom, mais il est préférable d'utiliser un nom dont nous nous souviendrons facilement. Par exemple, appelons-le ttyUSB0.service, et créons-le avec le contenu suivant :

[Unit] Description=USB Serial dongle console service [Service] ExecStart=/sbin/getty -L 115200 ttyUSB0 vt102 Restart=always [Install] WantedBy=multi-user.target

The main line here is the one beginning with “ExecStart”. In this, we invoke getty with the correct device and line speed; we will thus need to get it right. Substitute your real device name here, it may or not be ttyUSB0, depending on your precise setup. As for line speed, most devices will run along happily at 115200 baud (bits / second). If yours does not, try lowering the speed to 28800 or even 9600 for testing purposes.

La ligne principale ici est celle qui commence par « ExecStart ». Ici, nous invoquons getty avec le bon dispositif et la vitesse correcte de transmission ; nous devrons donc le faire scrupuleusement. Donnez ici le nom réel de votre dispositif, ça peut être ttyUSB0 ou pas, en fonction de votre configuration/distribution. Concernant la vitesse de transmission, la plupart des dispositifs fonctionneront à merveille à une vitesse de 115 200 bauds (bits/seconde). Si ce n'est pas le cas, essayez de réduire la vitesse à 28 800 ou même à 9 600 à des fins de test.

Once we are happy with our configuration, let us save the file and reload the daemon. This will force systemd to re-examine its configuration files, and hopefully detect the presence of the new file we just created.

Une fois que nous sommes satisfaits de notre configuration, sauvons le fichier et rechargeons le démon. Cela forcera systemd à réexaminer ses fichiers de configuration et, espérons-le, à détecter la présence du nouveau fichier que nous venons de créer.

# systemctl daemon-reload

Finally, we need to flag this service as enabled, so systemd will activate it each time the computer is booted:

Enfin, nous devons signaler que ce service est activé, afin que systemd l'active chaque fois que l'ordinateur sera démarré :

# systemctl enable ttyUSB0.service Created symlink /etc/systemd/system/multi-user.target.wants/ttyUSB0.service → /lib/systemd/system/ttyUSB0.service.

In theory, we should now have a working setup on our server. The original authors of these instructions indicate they like to reboot the server computer to make sure the new configuration is in place, and, indeed, this can do no harm.

En théorie, nous devrions maintenant avoir une configuration opérationnelle côté serveur. Les auteurs à l’origine de cette documentation indiquent qu'ils préfèrent redémarrer le serveur pour s'assurer que la nouvelle configuration est bien en place et, en effet, cela ne peut faire aucun mal.

Once our getty service is up and running, let us turn to the client computer from which we intend to connect to the server. On a GNU/Linux system, there are very many serial terminal programs available. One that should already be installed is screen:

Une fois notre service getty opérationnel, tournons-nous vers l'ordinateur client à partir duquel nous avons l'intention de nous connecter au serveur. Sur un système GNU/Linux, il existe de très nombreux programmes de terminaux « série » disponibles. Un qui devrait déjà être installé est screen :

$ screen /dev/ttyUSB0 115200

Connect the two devices and the null-modem cable. You may need to hit the Enter key a couple of times on the client screen to activate the connection. You have also obtained some “strange characters” due to bit-rate errors, but they should disappear when the next login message comes up from the server. You can quit the screen command with key combination Ctrl+A and then an uppercase letter K.

Connectez les deux machines avec le câble null-modem. Vous devrez peut-être appuyer plusieurs fois sur la touche Entrée du clavier côté client afin d’activer la connexion. Vous avez peut-être obtenu quelques « caractères étranges » dus à des erreurs de bit-rate, mais ils devraient disparaître lors du prochain message de connexion provenant du serveur. Vous pouvez quitter la commande screen avec la combinaison de touches Ctrl+A et ensuite la lettre majuscule K.

If this does not work, perhaps a better choice would be either of cu or minicom. Install either using the standard commands:

Si cela ne fonctionne pas, peut-être faut-il essayer avec l’utilitaire cu ou minicom. Installez l'un ou l'autre en utilisant les commandes standard :

$ sudo apt install cu $ sudo apt install minicom

Then connect, e.g. with cu:

Ensuite connectez-vous, avec cu par exemple :

$ cu -l /dev/ttyUSB0 -s 115200Connected. Raspbian GNU/Linux 9 raspberrypi ttyUSB0 raspberrypi login: pi Password: Last login: Fri Jul 12 18:15:53 UTC 2019 on ttyUSB0 […] pi@raspberrypi:~$

As before, a couple of Enter keys may be necessary to get to the login prompt. You can quit cu using command “~.”

Comme précédemment, quelques appuis successifs sur la touche Entrée de votre clavier peuvent être nécessaires pour accéder à l'invite de connexion. Vous pouvez ensuite quitter cu en utilisant la commande « ~. »

Similar connections should be rather easy to set up on clients with a Mac OS or a Microsoft operating system, using the appropriate tools in either case. Even a very old or low-spec computer should be well up to the task of working as a serial terminal – even one with a rather ancient Intel 80386 to Pentium IV processor. If you still have one lying around, it could even come with a serial port on the motherboard known in the BIOS or MS-DOS as COM1: or COM2:, and in Linux as /dev/ttyS0 or /dev/ttyS1 . These can easily be found by examining the rear panel of the computer body for a 9-pin connector: see (a) in the following image. In such a case, you will not even need to acquire a USB dongle.

Des connexions similaires devraient être assez faciles à mettre en place sur des clients avec un système d'exploitation Mac ou Microsoft, en utilisant les outils appropriés dans les deux cas. Même un ordinateur très ancien devrait être capable de fonctionner comme un terminal série - même avec un processeur Intel 80386 ou Pentium IV assez ancien. Si vous en avez encore un, il peut même être doté d'un port série sur la carte mère connu au niveau du BIOS ou de MS-DOS sous le nom de COM1: ou COM2: ; sous Linux, c’est /dev/ttyS0 ou /dev/ttyS1 . Ces ports « série » sont facilement reconnaissables en examinant le panneau arrière du boîtier d’un ordinateur pour trouver un connecteur à 9 broches : voir (a) dans l'image suivante. Dans ce cas, vous n'aurez même pas besoin d'acquérir un dongle USB-Série.

Enjoy!

Amusez-vous bien !

issue148/tutoriel1.txt · Dernière modification : 2019/09/06 08:25 de auntiee