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).
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 meilleurs getty pour les terminaux reliés de manière directe sont :
Deux gettys plus appropriés pour les modems sont :
Un getty simple à utiliser pour les logins sur la console :
Si vous n'avez pas le getty que vous désirez, vous pouvez le télécharger dans les 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.
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). 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.
Le programme agetty détectera automatiquement la parité configurée dans le terminal. Si vous utilisez stty pour fixer la parité, agetty la désactivera automatiquement puisqu'il ne veut pas que le pilote série enlève le bit de parité étant donné qu'il a besoin de le voir dans un caractère 8 bits afin de 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. L'invite de login sera brouillée jusqu'à ce que vous tapiez quelque chose et que getty positionne la parité. Faites-moi savoir si vous trouvez une manière d'obtenir une invite de login qui ait l'air correcte avec la parité en utilisant agetty. L'invite brouillée repoussera les visiteurs etc. qui essaient de se logger (si c'est ce que vous voulez).
(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.ttyS
N ou
/etc/conf.{uu}getty.ttyS
N), 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.
Le m veut dire modem. Ce programme est d'abord destiné aux modems mais il fonctionnera pour les terminaux texte. C'est très mal documenté (en mi-1998) pour les terminaux et vous devrez parcourir beaucoup de documentation sur les modems pour déterminer comment l'utiliser pour un terminal. Regardez /etc/mgetty/mgetty.config pour avoir un exemple de la configuration d'un terminal. [Note du relecteur : je le trouve au contraire bien documenté (jan 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).]
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. Vous pouvez aussi utiliser les commandes stty
et setserial
sur la ligne de commande mais de tels paramètres seront
perdus dès que vous éteindrez l'ordinateur.
Setserial indique au pilote de port série à la fois le numéro d'interruption (IRQ) et l'adresse du port. Il peut vous dire quel type de puce UART vous avez si vous utilisez le paramètre autoconfig. Il peut paramétrer le temps de fonctionnement du port après sa fermeture (afin de laisser sortir les caractères qui seraient encore dans son tampon en mémoire principale). Cela est nécessaire à des vitesses basses de 1200 et moins. Pour que le port série fonctionne, le module série (dans le noyau Linux) doit être chargé. Si vous utilisez plus de deux ports série et voulez assigner des numéros d'IRQ uniques, vous devez alors utiliser setserial. Si votre port série est Plug-and-Play vous devriez regarder le Modem-HOWTO, ou éventuellement, le Serial-HOWTO.
Pour modifier (ou ajouter) une commande setserial, éditez le script shell qui lance setserial. Son emplacement dépend de votre distribution. Il peut être dans un répertoire /etc/rc.d ou dans un fichier "rc.serial". Vous devrez peut-être créer votre propre fichier à cette fin. Dans la distribution Debian c'était le fichier 0setserial dans /etc/rc.boot.
Vous n'avez probablement pas besoin d'utiliser la commande "stty" pour configurer si vous utilisez l'un des deux getty suggérés pour faire l'équivalent de stty... Vous aurez encore besoin d'utiliser la commande stty pour voir comment le port série est configuré et vous aurez peut-être besoin de consulter la page de manuel de stty.
Stty effectue la majeure partie de la configuration du port série (mais les valeurs par défaut plus ce que vous modifiez avec getty devraient mettre les choses en place correctement). Pour voir comment il est configuré en ce moment pour le terminal (ou la console) sur lequel vous vous trouvez, tapez à l'invite du shell : stty -a. Pour d'autres terminaux (comme ttyS1) tapez : stty -a < /dev/ttyS1. Voici quelques uns des items que stty peut configurer : vitesse (bits/seconde), parité, bits/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-1998) couvre des possibilités que les documents sur stty ne mentionnent 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.
Si getty met correctement les choses en place, vous pouvez sauter cette sous-section. Pour que stty configure le terminal à 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). Ce fichier devrait être lancé avant le démarrage de getty. 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 son emplacement (peut-être dans le manuel de votre terminal).
Un bon endroit pour placer cette commande serait dans le même fichier qui lance setserial quand le système démarre. Voyez où lancer setserial ?. Il semblerait mieux de la placer après la commande setserial pour que la partie de bas niveau soit faite en premier. Dans la distribution Debian il y a un script /etc/init.d/bootmisc.sh mais il est lancé pour l'instant avant 0setserial.
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 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.
Ce sont deux variables d'environnement pour les terminaux, mais vous ne devriez rien avoir à faire avec elles. TERM doit toujours être positionnée au nom du terminal que vous utilisez. 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).
Heureusement, le programme getty positionne en général TERM pour vous juste avant le login. 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).
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
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". 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.
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.
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