Page suivantePage précédenteTable des matières

14. Détails de la configuration de l'ordinateur

Il faut éditer plusieurs fichiers pour configurer l'ordinateur pour gérer le terminal. Si vous avez de la chance, vous ne devrez éditer que /etc/inittab. On fait ce travail d'édition à partir de la console (ou de n'importe quel terminal qui fonctionne).

14.1 Getty (dans /etc/inittab)

Afin de lancer un processus de login sur un port série quand l'ordinateur démarre (ou change de niveau d'exécution) une commande getty doit être placée dans le fichier /etc/inittab. Getty permet de faire fonctionner (GET) un terminal (TTY). Chaque terminal a besoin de sa commande getty. Il y a aussi au moins une commande getty pour la console dans chaque fichier /etc/inittab. Trouvez-la et ajoutez-y les commandes getty pour les vrais terminaux. Ce fichier peut contenir des lignes d'exemples de commandes getty pour les terminaux texte mises en commentaire, et donc tout ce qu'il vous reste à faire est d'enlever les commentaires (enlevez le # au début de la ligne) et de modifier quelques arguments.

Les arguments autorisés dépendent du getty que vous utilisez :

Les deux meilleurs getty pour les terminaux reliés de manière directe sont :

Les deux gettys plus appropriés pour les modems (évitez-les pour les terminaux) sont :

Un getty simple à utiliser uniquement pour les logins sur la console :

Si vous n'avez pas le getty que vous désirez, cherchez-le dans d'autres distributions et utilisez le programme alien pour le convertir entre paquets RPM et Debian. Le code source sur Metalab (logiciels série).

Si vous n'utilisez pas les lignes de contrôle du modem (par exemple si vous n'utilisez que les 3 conducteurs minimums : transmission, réception et masse commune) vous devriez le faire savoir à getty en utilisant un drapeau "local". Le format de celui-ci dépend du getty que vous utilisez.

Agetty (peut s'appeler getty)

Un exemple de ligne dans /etc/inittab :

S1:23:respawn:/sbin/getty -L 19200 ttyS1 vt102

S1 vient de ttyS1. 23 veut dire que getty est lancé en entrant dans les niveaux d'exécution 2 ou 3. respawn veut dire que si getty est tué, il se relancera automatiquement. /sbin/getty est la commande getty. Le -L veut dire Local (ignorer les signaux de contrôle du modem). -h (non montré dans l'exemple) permet le contrôle de flux matériel (même chose que stty crtscts). 19200 est la vitesse de transmission. ttyS1 veut dire /dev/ttyS1 (COM2 sous MS-DOS). vt102 est le type de terminal et ce getty donnera cette valeur à la variable d'environnement TERM. Il n'y a pas de fichiers de configuration. Tapez "init q" sur la ligne de commande après avoir édité la ligne de getty et vous devriez apercevoir une invite de login.

La détection de parité de Agetty

Le programme agetty détectera automatiquement la parité configurée dans le terminal. Excpté si vous utilisez 8bit d'octet de données avec 1-bit de parité. Si vous utilisez stty pour fixer la parité, agetty la désactivera automatiquement puisqu'il veut que le bit de parité passe comme si c'était un bit de donnée. C'est parce qu'il a besoin d'obtenir le dernier bit (qui peut être un bit de parité) pendant que vous tapez votre nom de login afin d'auto-détecter la parité. Donc, si vous utilisez la parité, ne l'activez que du côté du terminal et laissez agetty la détecter automatiquement et la positionner sur l'ordinateur. Si votre terminal supporte la parité en réception, l'invite de login sera brouillée jusqu'à ce que vous tapiez quelque chose et que getty positionne la parité. L'invite brouillée repoussera les visiteurs etc. qui essaient de se logger. Cela peut être exactement ce que vous voulez.

Il y a parfois des problèmes avec l'autodetection de parité. Cela arrive car après la première frappe de votre login, agetty utilise le programme login pour finir de vous loguer. Si le premier essai de login échoue, login se relance pour s'occuper des éssais futurs de login (incluant l'écriture de votre login). Le problème est que seulement agetty peut detecter la parité tandis que le programme login ne le fait pas. Donc, si vous remontez dans le programme login pour quelque raison que ce soit et que la parité n'a pas encore été détectée, vous etes en difficulté tant que le programme login ne peut pas detecter la parité. Avec une mauvaise parité, login ne peut pas lire correctement ce que vous écrivez et vous ne pouvez pas vous loguez. Si votre terminal supporte la réception de parité, vous continuerez à voir un écran brouillé.

On peut arriver dans cette "boucle de login" de plusieurs façons. Supposez que vous tapez une ou deux lettres seulement pour votre login et que vous tapez Entrée. Si ces lettres ne sont pas suffisantes pour la detection de parité, alors login se lancera avant que la parité soit detectée. Quelque fois ce problème arrive si vous n'avez pas le terminal allumé et connecté quand agetty démarre pour la première fois. Si vous restez bloqué dans cette "boucle de login", une solution est d'attendre à peu près une minute, le temps qu'agetty se relance dû au "timeout".

La parité d'Agetty avec des octets de données de 8-bit

Malheureusement, agetty ne peut pas detecter cette parité. Il (fin 1999) n'y a pas d'options pour desactiver l'auto-detection de parité et cela detectera les parités incorrects. Le résultat est que le processus de login sera brouillé et la parité sera mal reglé. Ainsi il ne parait pas faisable d'essayer d'utiliser des octets de données de 8-bit avec parité.

getty (fait partie de getty_ps)

(Ceci est tiré du vieux Serial-HOWTO de Greg Hankins).
Ajoutez des entrées pour getty pour utiliser votre terminal dans le fichier de configuration /etc/gettydefs si elles ne sont pas déjà présentes :

# 38400 bps Dumb Terminal entry
DT38400# B38400 CS8 CLOCAL # B38400 SANE -ISTRIP CLOCAL #@S @L login: #DT38400
# 19200 bps Dumb Terminal entry
DT19200# B19200 CS8 CLOCAL # B19200 SANE -ISTRIP CLOCAL #@S @L login: #DT19200
# 9600 bps Dumb Terminal entry
DT9600# B9600 CS8 CLOCAL # B9600 SANE -ISTRIP CLOCAL #@S @L login: #DT9600

Si vous voulez, vous pouvez faire en sorte que getty affiche des choses intéressantes dans la bannière de login. Dans mes exemples, je fais afficher le nom du système et la ligne série. Vous pouvez ajouter d'autres choses :

@B    la vitesse courante (évaluée au moment où @B est rencontré).
@D    la date courante, au format MM/JJ/AA.
@L    la ligne série à laquelle est attaché getty.
@S    le nom du système.
@T    l'heure courante, au format HH:MM:SS (24 heures).
@U    le nombre d'utilisateurs actuellement loggés. C'est le compte
 du nombre d'entrées dans le fichier /etc/utmp qui possèdent
 un champ ut_name non nul.
@V    la valeur de VERSION, donnée dans les fichiers de valeurs par
 défaut.
Pour afficher un caractère '@', utilisez soit '\@', soit '@@'.

Quand vous avez fini d'éditer /etc/gettydefs, vous pouvez vérifier que la syntaxe est correcte en faisant :

linux# getty -c /etc/gettydefs

Assurez-vous qu'il n'y a pas de fichier de configuration getty ou uugetty pour le port série auquel est attaché votre terminal (/etc/default/{uu}getty.ttySN ou /etc/conf.{uu}getty.ttySN), car cela entrera sûrement en conflit avec le lancement de getty sur un terminal. Enlevez le fichier s'il existe.

Éditez le fichier /etc/inittab pour lancer getty sur le port série (en mettant les informations correctes pour votre environnement -- port, vitesse et type de terminal par défaut) :

S1:23:respawn:/sbin/getty ttyS1 DT9600 vt100

Relancez init :

linux# init q

À ce point, vous devriez voir une invite de login sur votre terminal. Vous devrez peut-être appuyer sur Retour pour que le terminal soit attentif.

mgetty

Le "m" veut dire modem. Ce programme est d'abord destiné aux modems et en mi-1999 ne fonctionnait pas toujours très bien pour les terminaux texte. Il est très mal documenté pour les terminaux et vous devrez parcourir beaucoup de documentation sur les modems pour déterminer comment l'utiliser pour un terminal. Regardez les dernières lignes de /etc/mgetty/mgetty.config pour avoir un exemple de la configuration d'un terminal. [Note du relecteur : je le trouve au contraire bien documenté (janvier 1999) dans man mgetty : un mgetty -r -s 9600 /dev/ttyS0 (par exemple) est suffisant. Le -r indique que la connexion est directe (sans modem).] Ceci sera, espérons-le, réparé dans le futur. Il serait bien d'avoir le même getty à la fois pour les terminaux et les modems mais mgetty nécessite quelques améliorations avant de convenir pour les deux utilisations.

14.2 Stty et Setserial

Il y a à la fois une commande "stty" et une commande "setserial" pour configurer les ports série. Certains (ou tous les) paramètres stty nécessaires peuvent être positionnés grâce à getty et il peut ne pas être nécessaire d'utiliser setserial ; l'utilisation de ces deux commandes peut donc ne pas être nécessaire. Celles-ci (stty et setserial) paramètrent différents aspects du port série. Stty en fait la plupart tandis que setserial configure la partie bas niveau comme les interruptions et les adresses de ports. Pour "sauvegarder" les paramètres, ces commandes doivent être écrites dans certains fichiers (scripts shell) qui sont lancés à chaque démarrage de l'ordinateur. Les distributions de Linux fournissent souvent un script shell qui lance setserial mais en fournissent rarement un qui lance stty tant qu'on en aura rarement besoin..

14.3 Setserial

Introduction

N'utilisez jamais setserial avec des portables (PCMCIA). setserial est un programme vous permettant d'indiquer au logiciel pilote l'adresse d'entrée/sortie du port série, quelle interruption (IRQ) est positionnée dans le matériel du port, le type d'UART que vous possédez, etc. Il peut aussi vous montrer comment le pilote est configuré à ce moment. En plus, il peut faire des requêtes au matériel (si certaines options sont données).

Si vous avez seulement un ou deux ports séries, ils seront bien configuré sans utiliser setserial. Autrement (ou si il y'a des problèmes avec ce port série) vous devrez utiliser setserial. En plus du manuel de setserial, regardez les informations dans /usr/doc/setserial.../ ou autre. Cela devrait vous indiquer comment setserial se comporte dans votre distribution de Linux.

Setserial est souvent lancé automatiquement au démarrage par un script shell. Il ne fonctionnera que si le module série est chargé. Si vous devez pour une raison ou pour une autre décharger le module série plus tard, les modifications faites précédemment par setserial seront oubliées. Setserial doit donc être re-lancé pour les prendre en compte à nouveau. En plus de le lancer avec un script de démarrage, quelque chose semblable à setserial se lance quand le module série est chargé. Ainsi quand vous regardez les messages de démarrage sur l'écran il pourra vous sembler être lancé deux fois, et en fait c'est ce qui s'est passé.

Setserial peut régler le temps que le port restera actif après qu'il soit fermé (pour sortir les caractères qui sont encore dans leurs buffers dans la RAM principale). C'est necéssaire pour un taux de transferts de 1200 baud ou plus bas. C'est aussi necéssaire pour des vitesses plus rapides si il y'a beaucoup de "contrôle de flux" en attente.

Si votre port série est Plug-and-Play, vous devrez peut-être consulter d'autres HOWTOs, comme Plug-and-Play et Serial.

Avec les bonnes options, setserial peut chercher (à une adresse d'entrée/sortie donnée) un port série mais vous devez deviner l'adresse d'entrée/sortie. Si vous lui demandez de chercher /dev/ttyS2 par exemple, il ne cherchera qu'à l'adresse où il pense trouver ttyS2. Si vous dites à setserial que ttyS2 est à une adresse différente, alors il cherchera à cette adresse, etc. Voyez Recherche.

Setserial ne positionne pas lui-même les IRQ ou les adresses d'entrée/sortie dans le matériel du port série. Ceci est fait soit avec des cavaliers, soit par plug-n-play. Vous devez dire à setserial les valeurs mêmes qui ont été configurées dans le matériel. N'inventez pas simplement des valeurs dont vous pensez qu'elles font joli en les soumettant à setserial. Cependant, si vous connaissez les adresses d'entrée/sortie mais pas l'IRQ, vous pouvez demander à setserial de tenter de déterminer l'IRQ.

Vous pouvez voir une liste des commandes possibles et utilisables (mais pas les options à une lettre telles que -v pour verbeux -- que vous devriez normalement utiliser pour déboguer) en tapant simplement setserial sans argument. Notez que setserial nomme une adresse d'entrée/sortie un "port". Si vous tapez :

setserial -g /dev/ttyS*

vous verrez quelques informations sur la manière dont ce pilote de périphériques est configuré pour vos ports. Ajoutez un "v" à l'option "-g" pour en voir plus. Mais ceci ne vous dira pas si le matériel dispose vraiment de ces valeurs. En fait, vous pouvez lancer setserial et assigner une adresse d'entrée/sortie purement fictive, n'importe quelle IRQ, et tout type d'UART que vous aimeriez avoir. Alors, la prochaine fois que vous lancerez "setserial ...", il affichera ces valeurs fausses sans se plaindre. Notez que les assignations faites par setserial sont perdues quand le PC est éteint donc il est en général lancé automatiquement quelque part à chaque fois que Linux est démarré.

Recherche

Afin de tenter de trouver si vous avez un certain type de matériel série, vous devez d'abord savoir (ou deviner) son adresse d'entrée/sortie (ou le pilote de périphérique doit en avoir une adresse d'entrée/sortie, sûrement positionnée précédemment par setserial). Pour tenter de détecter le matériel physique, utilisez l'option -v (verbeux) et la commande autoconfig de setserial. Si le message résultant montre un type d'UART tel que 16550A, alors tout est bon pour vous. Si par contre il affiche un type d'UART "unknown" (inconnu), alors il n'y a sûrement pas de port série du tout à cette adresse d'entrée/sortie. Certains ports série bon marché ne s'identifient pas correctement donc si vous voyez "unknown" vous avez peut-être quand même un port série à cet endroit.

En plus de faire une auto-détection sur le type d'UART, setserial peut aussi déterminer automatiquement les IRQs, mais ceci ne fonctionne pas toujours bien non plus. Dans les versions de setserial>= 2.15, votre dernier test de recherche peut être sauvé et placé dans le fichier de configuration /etc/serial.conf qui sera utilisé au prochain démarrage de Linux. Le script qui lance setserial au démarrage ne fait généralement pas de recherche, mais vous pouvez le modifier pour qu'il le fasse. Voyez la section suivante.

Linux peut-il configurer les périphériques série automagiquement ?

Oui, mais... Votre distribution doit deja le faire au démarrage. Mais vous pouvez le customiser. C'est facile à faire avec setserial < 2.15. Ajoutez simplement quelques lignes au fichier qui lance setserial au démarrage. Voyez vieille méthode de configuration : édition d'un script. Par exemple, pour ttyS3 vous ajouteriez :

/sbin/setserial /dev/ttyS3 auto_irq skip_test autoconfig

au fichier qui lance setserial au démarrage. Faites ceci pour chaque port série que vous voulez auto-configurer. Assurez-vous de donner un nom de périphérique qui existe vraiment sur votre machine. Dans certains cas ca ne marchera pas bien à cause du matériel, donc vous pouvez lui assigner un irq et/ou un type d'uart. Par exemple:

/sbin/setserial /dev/ttyS3 irq 5 uart 16550A skip_test

Pour les versions>= 2.15 (à condition que votre distribution ait inclus la modification, Redhat ne l'a pas fait), il est plus difficile de le faire puisque le fichier qui lance setserial au démarrage, /etc/init.d/setserial ou autre n'a pas été prévu pour être édité par l'utilisateur. Il peut ne pas y avoir de commentaires utiles comme il y en avait dans les versions précédentes.

Configuration au démarrage

Quand le noyau charge le module série (ou si le "module" est intégré au noyau) alors seuls ttyS{0-3} sont auto-détectés et le pilote est configuré avec les IRQs 4 et 3 (peu importe la configuration réelle du matériel). Vous le voyez sur un message au démarrage comme si setserial avait été lancé. Si vous utilisez 3 ports ou plus, ceci peut engendrer des conflits d'IRQ.

Pour régler de tels conflits en donnant à setserial les vraies IRQs (ou pour d'autres raisons) il peut y avoir un fichier quelque part qui lance setserial à nouveau. Ceci se passe tôt pendant le démarrage avant que n'importe quel processus utilise le port série. En fait, votre distribution peut avoir configuré les choses pour que le programme setserial se lance automatiquement à partir d'un script au démarrage. On peut trouver plus d'informations pour gérer cette situation dans /usr/doc/setserial.../ ou autre.

Nouvelle méthode de configuration en utilisant /etc/serial.conf

les versions inferieurs à la 2.15 de setserial, la façon pour le configurer était d'édité le script shell qui lancait setserial au démarrage. Avec la version 2.15 (1999) de setserial le script shell n'est pas édité mais est lancé au démarrage et obtient ses données à partir d'un fichier de configuration: /etc/serial.conf. Mais on n'édite normalement jamais /etc/serial.conf. À la place, utilisez simplement setserial sur la ligne de commande.

Normalement, ce que vous avez modifié avec la commande setserial est sauvé dans le fichier de configuration (serial.conf) quand vous éteignez (normalement) ou que vous redémarrez. Ceci ne fonctionne que si "###AUTOSAVE###" ou similaire se trouve sur la première ligne de serial.conf. Si vous devez utiliser setserial de manière expérimentale et qu'il ne fonctionne pas correctement, alors n'oubliez pas de le relancer pour que les paramètres expérimentaux ne soient pas sauvés par erreur. Le fichier le plus couramment utilisé pour lancer setserial au démarrage (en restant conforme avec le fichier de configuration) est maintenant /etc/init.d/setserial (Debian) ou /etc/init.d/serial (Redhat), ou etc., mais ne devrait normalement pas être édité non plus.

Pour désactiver un port, utilisez setserial pour le positionner à "uart none". Le format de /etc/serial.conf apparaît être comme celui des paramètres placés après "setserial" sur la ligne de commande avec une ligne pour chaque port. Si vous n'utilisez pas autosave, vous pouvez éditer /etc/serial.conf à la main. Pour la version 2.15, la distribution Debian installe le système avec la sauvegarde automatique activée, mais Redhat 6.0 avait simplement un fichier /usr/doc/setserial-2.15/rc.serial que vous deviez déplacer dans /etc/init.d/.

BOGUE : en juillet 1999 il un bogue/problème puisqu'avec ###AUTOSAVE### seuls les paramètres de setserial affichés par "setserial -G /dev/ttyS?" (où ? vaut 0, 1, 2, ...) sont sauvés mais pas les autres paramètres. Ceci n'affecte qu'une minorité d'utilisateurs puisque les paramètres non sauvés sont de toute façon rarement utilisés. Cela a été rapporté comme un bogue et peut être réparé maintenant.

Afin de forcer les paramètres courants positionnés par setserial à être sauvés dans le fichier de configuration (serial.conf) sans éteindre la machine, faites ce qui se passe normalement quand vous éteignez : lancez le script shell /etc/init.d/{set}serial stop. La commande "stop" sauvera la configuration courante mais les ports série continueront de fonctionner correctement.

Dans certains cas vous pouvez avoir l'ancienne et nouvelle méthode d'installé mais heureusement juste une d'elles se lance au démarrage. Debian étiquette les fichiers obsolètes avec "...pre-2.15".

Ancienne méthode de configuration : édition d'un script

Avant la version 2.15 (1999) il n'y avait pas /etc/setserial.conf pour configurer setserial. Ainsi vous devez chercher un fichier qui lance setserial au démarrage et l'édité. S'il n'existe pas, vous devez en créer un (ou placer les commandes dans un fichier qui se lance tôt au démarrage). Si un tel fichier est utilisé en ce moment, il se trouve sûrement dans l'arborescence /etc. Mais Redhat <6.0 l'a mis dans /usr/doc/setserial/ bien que vous deviez le déplacer dans l'arborescence /etc avant de l'utiliser. Vous pouvez utiliser "locate" pour essayer de trouver un tel fichier. Par exemple, vous pouvez taper : locate "*serial*".

Ce que pouvez chercher peut s'appeler rc.serial ou 0setserial (Debian). Si un tel fichier est fourni, il devrait contenir un certain nombre d'exemples commentés. En décommentant certains d'entre eux et/ou en les modifiant, vous devriez pouvoir configurer les choses correctement. Assurez-vous que vous utilisez un chemin valide pour setserial, et un nom de périphérique valide. Vous pouvez faire un test en exécutant ce fichier à la main (tapez simplement son nom en tant que super-utilisateur) pour voir si ça fonctionne bien. Un test comme celui-ci est bien plus rapide que de faire des redémarrages à répétition pour avoir le bon résultat. Bien sûr, vous pouvez aussi tester une commande setserial unique en la tapant simplement sur la ligne de commande.

Le script /etc/rc.d/rc.serial était couramment utilisé dans le passé. La distribution Debian a utilisé /etc/rc.boot/0setserial. Un autre fichier qui a été utilisé est /etc/rc.d/rc.local mais ce n'est pas une bonne idée car il peut ne pas être lancé assez tôt. On a indiqué que d'autres processus peuvent essayer d'ouvrir le port série avant l'exécution de rc.local, ce qui entraîne des échecs de communication série.

IRQs

Par défaut, ttyS0 et ttyS2 partagent l'IRQ 4, tandis que ttyS1 et ttyS3 partagent l'IRQ 3. Le partage des interruptions série n'est permis que si : 1. vous avez un noyau 2.2 ou supérieur, 2. vous avez compilé le support pour le faire et 3. votre matériel série le supporte. Voyez le HOWTO Série, sur le partage des interruptions et les noyaux 2.2 et plus.

Si vous n'avez que deux ports série, ttyS0 et ttyS1, cela fonctionne encore puisque les conflits de partage d'IRQ n'existent pas pour des périphériques non existants.

Si vous ajoutez un modem interne et gardez ttyS0 et ttyS1, vous devriez alors tenter de trouver une IRQ non utilisée et la positionner à la fois sur votre port série (ou carte modem) et ensuite utiliser setserial pour l'assigner à votre pilote de périphérique. Si l'IRQ 5 n'est pas utilisée par une carte son, ce peut être une IRQ utilisable pour un modem. Pour positionner l'IRQ de manière matérielle vous devrez peut-être utiliser isapnp, un BIOS PnP ou modifier Linux pour le rendre PnP. Pour vous aider à déterminer quelles IRQs sont disponibles, tapez "man setserial" et cherchez, disons "IRQ 11".

14.4 Stty

Introduction

stty effectue la plupart de la configuration du port série mais puisque les applications (et le programme getty) la gèrent souvent, vous n'aurez peut-être pas besoin de l'utiliser souvent. C'est pratique si vous avez des problèmes ou voulez voir comment le port est paramétré. Essayez de taper ``stty -a'' sur votre terminal/console pour voir les paramètres actuels. Essayez aussi de taper la commande sans le -a (all = tout) pour obtenir une liste courte qui montre les paramètres différents de la normale. N'essayez pas d'apprendre tous les réglages à moins de vouloir devenir un gourou du port série. La plupart des valeurs par défaut conviennent et certains réglages ne sont nécessaires que pour certains terminaux non-intelligents et obsolètes fabriqués dans les années 1970 (Mais pas après)

Alors que setserial ne travaille qu'avec les ports série réels, stty s'utilise à la fois pour les ports série et pour les terminaux virtuels comme l'interface texte standard de Linux sur un moniteur de PC. Pour le moniteur de PC, la plupart des paramètres de stty n'ont pas de signification. Le changement de la vitesse de transmission, etc. ne semble pas faire grand chose.

Voici quelques uns des items que stty peut configurer : vitesse (bits/seconde), parité, bits par octet, nombre de bits de stop, enlever le 8ème bit ?, signaux de contrôle du modem, contrôle de flux, signal d'arrêt, délimiteurs de fin de ligne, changer la casse, remplissage, sonner si le tampon déborde ?, écho, permettre à des tâches de fond d'écrire sur le terminal ?, définir des caractères spéciaux (de contrôle, comme quelle touche presser pour faire une interruption). Voyez la page de manuel de stty ou la page info pour plus de détails. Voyez aussi la page de manuel : termios qui couvre les mêmes options que stty mais (en mi-1999) couvre des possibilités que la page de manuel de stty ne mentionne pas. Pour l'utilisation de certains caractères spéciaux, voyez caractères spéciaux (de contrôle).

Avec certaines implémentations de getty (paquet getty_ps), les commandes qu'on enverrait normalement à stty sont entrées dans un fichier de configuration getty : /etc/gettydefs. Même sans ce fichier de configuration, la ligne de commande de getty devrait suffire pour paramètrer les choses de sorte que vous n'ayez pas besoin de stty.

On peut écrire des programmes en C qui modifient la configuration de stty etc. Regarder la documentation pour ce faire peut aider quelqu'un à mieux comprendre l'utilisation des commandes stty (et ses nombreux arguments possibles). Le Serial-Programming-HOWTO est utile. La page de manuel de termios contient la description de la structure au sens langage C (de type termios) qui stocke la configuration de stty dans la mémoire de l'ordinateur. Bien des noms de drapeaux dans cette structure C sont quasiment les mêmes (et font la même chose) que les arguments de la commande stty.

Utilisation de stty pour un terminal "étranger"

L'utilisation de stty pour inspecter ou configurer le terminal que vous utilisez est facile. Faire ca pour terminal (étranger) different ou un port série est délicat. Par exemple, supposons que êtes sur le moniteur du PC (tty1) et vouliez utiliser stty pour le port série ttyS2. Vous devez utiliser l'opérateur de redirection <. D'abord, soyez prévenu que s'il y a un terminal sur ttyS2 et un shell tourne sur ce terminal, ce que vous verrez alors sera décevant et une tentative de le paramétrer sera infructueuse. Voyez deux interfaces sur un terminal pour comprendre ceci.

Tapez ``stty -a < /dev/ttyS2'' pour regarder les paramètres de ttyS2. Utilisez le même opérateur de redirection < pour paramétrer ttyS2. Cela fait de ttyS2 l'entrée standard de stty. Ca donne au programme stty un lien vers le "fichier" ttyS2 donc il doit le "lire". Mais au lieu de lire les octets envoyés vers ttyS2 comme on pourrait le prévoir, il utilise le lien pour trouver les paramètres de configuration du port donc il devrait les lire ou les changer. Certaines personnes tentent d'utiliser ``stty ... > /dev/ttyS2'' pour paramétrer le terminal. Ceci ne le fera pas. À la place, il prendra le message normal affiché par la commande stty pour le terminal sur lequel vous êtes (tty1) et envoie ce message à ttyS2 mais ne change aucun paramètre pour ttyS2.

Arrive un autre problème avec l'opérateur de redirection. Quelques fois quand on essaye d'utiliser stty, la commande s'arrette et rien ne se passe ( vous n'avez pas de prompt pour une autre commande, même après avoir frapper <entrée>). C'est probablement due au port étant bloqué car il attend une ligne de controle modem pour être déclaré. Par exemple, tant que vous n'avez pas parametrer "clocal" pour ignorer les lignes de controles modem, Alors si il n'y a pas de signal CD de déclaré, le port ne s'ouvrira pas et stty ne fonctionnera pas. Une situation similaire doit exister pour le control de flux materiel. Si le cable du port n'a pas de fils pour la broche qui doit être déclaré donc il n'y a pas besoin d'arreter l'attente.

Une façon à essayer pour se passer de cette attente, est d'utiliser un programme sur le port qui le forcera à être opérationnel même si les lignes de controles disent le contraire. Ainsi heureusement, ce programme doit parametrer le port donc il n'a plus besoin du signal de controle pour ouvrir: clocal ou -crtscts. Pour se servir de "minicom" pour faire ca, il faut le reconfigurer pour un autre ttyS, etc, et le redémarrer. Puisque vous avez à reconfigurer minicom, c'est plus simple de redémarrer le PC.

Les versions à partir de 1.17 (pas encore sortie en mi-1999) n'auront plus besoin de la redirection (<) mais à la place utiliseront ``stty ... -F /dev/ttyS2'' (ou --file au lieu de -F), etc. Cela devrait forcer le port à s'ouvrir et eviter le second problème de redirection.

Deux interfaces sur un terminal

En utilisant un shell (tel que bash) avec l'édition de la ligne de commande activée, il y a deux interfaces de terminal différentes (ce que vous voyez quand vous tapez stty -a). Quand vous tapez sur la ligne de commande vous avez une interface "brute" temporaire (mode brut, ou "raw") où chaque caractère est lu par l'éditeur de ligne de commande au moment où vous le tapez. Une fois que vous appuyez sur la touche <entrée>, l'éditeur de ligne de commande sort et l'interface du terminal est modifiée en interface nominale "améliorée" (mode amélioré ou "cooked") pour le terminal. Ce mode amélioré dure jusqu'à ce que l'invite suivante soit envoyée au terminal. Notez qu'on ne tape jamais rien dans ce mode "amélioré" mais ce qui a été tapé en mode raw passe en mode amélioré dès qu'on a tapé sur la touche <entrée>.

Quand une invite est envoyée au terminal, le terminal passe du mode "amélioré" au mode "brut" (comme il le fait quand vous démarrez un éditeur puisque vous démarrez l'éditeur de ligne de commande). Les paramètres pour le mode "brut" ne sont basés que sur les paramètres de base pris à partir du mode "amélioré". Le mode brut garde ces paramètres mais modifie plusieurs autres paramètres afin de passer en mode "brut". Il n'est pas du tout basé sur les paramètres utilisés dans le mode "brut" précédent. Ainsi si on utilise stty pour modifier les paramètres du mode brut, de tels paramètres seront perdus dès qu'on appuiera sur la touche <entrée> sur le terminal qu'on suppose avoir "configuré".

Maintenant, quand on utilise tape stty pour regarder l'interface du terminal, on peut avoir une vue soit du mode amélioré, soit du mode brut. Vous devez trouver lequel vous regardez. Si vous utilisez stty à partir d'un autre terminal pour vous occuper d'un terminal qui affiche une ligne de commande, vous aurez la vue du mode brut. Tout changement effectué ne le sera que pour le mode brut et sera perdu quand quelqu'un appuiera sur <entrée> sur le terminal que vous avez tenté de "paramétrer". Mais si vous tapez une commande stty sur votre terminal (sans utiliser < pour la redirection) et ensuite tapez sur <entrée>, c'est une histoire différente. <entrée> met le terminal en mode amélioré. Vos modifications seront sauvées et seront toujours présentes quand le terminal reviendra en mode brut (sauf, bien sûr, si c'est un paramètre non permis en mode brut).

Cette situation peut créer des problèmes. Par exemple, supposez que vous corrompez votre interface de terminal et que pour la récupérer vous alliez sur un autre terminal et tapiez "stty sane <dev/ttyS1" pour la récupérer. Ceci ne fonctionnera pas ! Bien sûr vous pouvez essayer de taper "stty sane ..." sur le terminal corrompu mais vous ne pouvez pas voir ce qui est tapé. Tout ce qui précède ne s'applique pas aux terminaux non-intelligents mais aux terminaux virtuels utilisés sur un moniteur de PC ainsi que sur les terminaux fenêtrés sous X. En d'autres termes, ceci s'applique à presque tout le monde qui utilise Linux. Heureusement, un fichier qui lance stty au démarrage s'occupera certainement d'un terminal (ou d'un port série sans terminal) n'ayant aucun shell tournant dessus, donc il n'y a pas de problème.

Où mettre la commande stty ?

Si vous avez besoin que stty configure l'interface série à chaque fois que l'ordinateur démarre, vous devez mettre la commande stty dans un fichier qui sera exécuté à chaque démarrage de l'ordinateur (de Linux). Il devrait être lancé avant l'utilisation du port série (ce qui comprend le lancement de getty sur le port). Il y a de nombreux endroits disponibles pour le mettre. S'il est mis à plus d'un endroit et que vous n'en connaissez (ou rappelez) qu'un, il y aura sûrement un conflit. Assurez-vous donc de documenter ce que vous faites.

Un bon endroit pour placer cette commande serait dans le même fichier qui lance setserial quand le système démarre. L'emplacement dépend des distributions et des versions. Il semblerait mieux de la placer après la commande setserial pour que la partie de bas niveau soit faite en premier. Si vous avez un répertoire dans le /etc où tous les fichiers sont éxecutés au démarrage (System V Init), ainsi vous pourriez créer un fichier nommé "stty" dans ce but.

14.5 Terminfo et Termcap (bref)

Voyez Terminfo et Termcap (en détails) pour une discussion plus détaillée sur terminfo. Beaucoup d'applications que vous lancez utilisent la base de données terminfo (anciennement termcap). Celle-ci possède une entrée (ou fichier) pour chaque modèle ou type (tel que le vt100) de terminal et indique ce que le terminal peut faire, quels codes envoyer pour diverses actions, et quels codes envoyer au terminal pour l'initialiser.

Puisque beaucoup de terminaux (et de PC aussi) peuvent émuler d'autres terminaux et possèdent des "modes" d'opération variés, il peut y avoir plusieurs entrées terminfo parmi lesquelles choisir pour un terminal physique donné. Ils auront en général des noms similaires. Le dernier paramètre de getty (à la fois pour agetty et getty_ps) devrait être le nom terminfo du terminal (ou de l'émulation de terminal) que vous utilisez (comme vt100).

La base terminfo fait plus que simplement spécifier de quoi le terminal est capable et de donner les codes à envoyer au terminal pour le faire faire certaines choses. Elle spécifie à quoi "gras" ressemblera (sera-ce en vidéo inverse ou en intensité forte), comment sera le curseur, si les lettres seront noires, blanches ou d'une autre couleur, etc. En terminologie PC on appelle ceci des "préférences". Elle spécifie les codes d'initialisation à envoyer au terminal (analogues aux chaînes d'initialisation qu'on envoie aux modems). Linux n'envoie pas automatiquement de telles chaînes au terminal. Voyez chaîne d'initialisation. Si vous n'aimez pas l'affichage à l'écran ni son comportement, vous devrez peut-être éditer (et ensuite mettre à jour) le fichier terminfo (ou termcap). Voyez compilateur terminfo (tic) sur la manière de faire la mise à jour.

14.6 Positionner TERM et TERMINFO

Voici deux variables d'environnement pour les terminaux : TERM et TERMINFO, mais vous ne devriez rien avoir à faire avec elles. TERM doit toujours être positionnée au nom du terminal que vous utilisez (comme vt100). Si vous ne connaissez pas son type (nom), voyez quel est le nom terminfo de mon terminal ?. TERMINFO contient le chemin vers la base de données terminfo, mais peut ne pas être nécessaire si la base de données est dans un endroit prédéfini (ou TERMINFO peut être positionné automatiquement par un fichier qui est livré avec votre distribution de Linux). Vous voudrez voir Emplacement des bases de données compilées.

Heureusement, le programme getty positionne en général TERM pour vous juste avant le login. Il utilise juste le type de terminal qui a été spécifié sur la ligne de commande de getty (dans /etc/inittab). Cela permet aux applications de trouver le nom de votre terminal et ensuite de regarder les capacités du terminal dans la base de données terminfo. Voyez variable TERM pour plus de détails sur TERM.

Si votre base de données terminfo ne peut pas être trouvée, vous verrez un message d'erreur à ce propos sur votre terminal. Si cela arrive il est temps de vérifier où réside terminfo et de positionner TERMINFO si nécessaire. Vous pouvez découvrir où se trouve la base de données terminfo en cherchant un fichier terminfo courant comme "vt100" avec la commande "locate". Assurez-vous que votre terminal est dans cette base de données. Un exemple de positionnement de TERMINFO : export TERMINFO=/usr/share/terminfo (mettez ceci dans /etc/profile ou autre). Si les données concernant votre terminal dans cette base de données ne vous conviennent pas, vous devrez l'éditer. Voyez terminfo et termcap (bref).

Quel est le nom terminfo de mon terminal ?

Vous avez besoin du nom exact afin de positionner la variable d'environnement TERM ou pour renseigner getty. Le même nom doit être utilisé à la fois par la base termcap et la base terminfo, vous n'avez donc besoin de le trouver qu'une seule fois. Un terminal dispose généralement d'alias mais si vous trouvez plus d'un nom, utilisez le premier.

Pour le trouver, essayez de regarder le fichier /etc/termcap... (si vous l'avez). Sinon, regardez soit dans l'arborescence terminfo (voyez ref id="tc_compiled_locs" name="emplacement des bases de données compilées">), soit essayez de trouver le fichier de code source de terminfo (voyez ref id="tc_source_loc" name="emplacements du code sources des bases de données">).

14.7 Fichier /etc/ttytype rarement nécessaire

Le fichier de configuration /etc/ttytype est utilisé pour faire la correspondance entre /dev/ttySn et les noms de terminaux comme dans terminfo. tset l'utilise, mais si la variable d'environnement TERM est déjà positionnée correctement, alors ce fichier n'est pas nécessaire. Puisque le getty de Linux positionne TERM pour chaque tty, vous n'avez pas besoin de ce fichier. Dans d'autres systèmes Unix comme FreeBSD, le fichier /etc/ttys fait la correspondance entre les ttys et bien plus de choses, comme la commande getty appropriée, et la catégorie de connexion (comme "dialup"). Un exemple de ligne pour le ttytype sous Linux : vt220 ttyS1

14.8 Restrictions sur les logins

Par défaut, l'utilisateur root ne peut pas se logger à partir d'un terminal. Pour permettre cela vous devez créer (ou éditer) le fichier /etc/securetty en suivant la page de manuel "securetty". Mais cette utilisation est spécifique à la distribution, la Suse n'utilise pas /etc/securetty. Pour restreindre les logins de certains utilisateurs et/ou de certains terminaux etc., éditez /etc/login.access (cela remplace le vieux fichier /etc/usertty ??). /etc/login.defs détermine si /etc/securetty doit être utilisé et peut être édité afin que /etc/securetty ne soit pas nécessaire (ou utilisé). /etc/porttime restreint les heures auxquelles certains ttys et utilisateurs peuvent utiliser l'ordinateur. S'il y a trop de tentatives de login ratées pour un utilisateur, cet utilisateur peut se voir interdire l'accès au système. Voyez la page de manuel "faillog" sur la manière de contrôler cela.

14.9 Lancer des commandes uniquement si TERM=mon_terminal

Il y a parfois des commandes qu'on ne veut exécuter au démarrage que pour un certain type de terminal. Faire cela pour la commande stty ne pose pas de problèmes puisque l'on utilise l'opérateur de redirection < pour spécifier le terminal vers lequel la commande est destinée. Mais quid des alias de shell ou des fonctions ? Vous aurez envie de créer une fonction pour la commande ls qui mettra en couleur la liste des répertoires uniquement sur des terminaux couleur ou sur la console. Pour les terminaux monochromes vous voudrez le même nom de fonction (mais un corps de fonction différent) qui utilisera des symboles à la place du codage par couleurs. Où mettre de telles définitions de fonctions qui doivent être différentes pour des terminaux différents ?

Vous pouvez les mettre à l'intérieur d'opérateurs "if" dans /etc/profile qui est lu au départ à chaque fois que quelqu'un se logge. L'opérateur confitionnel "if" définit certaines fonctions etc., seulement si le terminal est d'un type spécifique.

Exemple pour la fonction ls

Bien que la plupart de ce que fait cet opérateur if puisse être fait dans le fichier de configuration de dircolors, voici un exemple dans le cas du shell bash :


if [ "$TERM" = linux ]; then
 eval `dircolors`;
elif [ "$TERM" = vt220 ]; then
 ls () { command ls -F $* ; }
# pour exporter la fonction ls():
 declare -xf ls
else echo "De /etc/profile : terminal de type $TERM inconnu"
fi


Page suivantePage précédenteTable des matières