Les fonctions d’un administrateur ..
Pensez aux petits « outils » de l’administration
aide en ligne .
la richesse de grep et awk ..
localiser les fichiers ..
créer plusieurs niveaux de répertoires en même temps .
Processus de démarrage du système
le MBR .
Le noyau du système ..
Le processus init .
de quoi est chargé le processus init ..
le fichier /etc/inittab ..
le mode mono-utilisateur
les entrées du fichier /etc/inittab .
Les scripts de démarrage ..
dans quel ordre ? ..
rc.modules
les fichiers des répertoires rcn.d .
rc.local
messages de déroulement du processus init : /var/log/messages ..
connaître le run level actuel : runlevel
changer de run level : init n .
préciser le run level au démarrage de linux
arrêter le système .
Les répertoires principaux .
Lilo et loadlin, ou l’amorçage de linux
lilo .
dans le MBR ..
dans le secteur d’amorçage de la partition linux
sur disquette ..
Configuration de lilo ..
syntaxe de .
Enregistrement de la configuration lilo : ..
Supprimer lilo du MBR :
loadlin ..
chargement du noyau par loadlin
Le système de fichiers ..
Structure et composants
Structure du système de fichier de linux : ext2fs ..
Le superbloc ..
La table des descripteurs
Images de blocs et d’inodes .
La table des inodes et structure d’un inode
Structure d’un bloc de données ..
du processus aux données ..
Création d’un système de fichiers ..
Montage et démontage des systèmes de fichiers ..
liste des systèmes de fichiers actuellement montés
Montage manuel .
Le fichier /etc/fstab
Démonter manuellement ..
Processus utilisant un file system
Vérifier un système de fichiers .
Gestion du swap ..
Le système de fichiers /proc
par processus .
Informations globales ..
Gestion des utilisateurs et des groupes
Structure du fichier des utilisateurs : /etc/passwd .
nom ..
x .
UID ..
GID ..
information
répertoire de connexion .
shell de connexion .
Structure du fichier /etc/shadow
nom ..
mot de passe ..
changement
au plus tôt .
au plus tard
avertissement ..
inactivé le .
inactif le ..
Vérifier la cohérence des fichiers /etc/shadow et /etc/passwd : ..
Structure du fichier /etc/group ..
mot de passe ..
liste des utilisateurs
Contrôle de cohérence des fichiers /etc/passwd et /etc/group
Création d’un compte utilisateur
Modification d’un compte utilisateur
Supprimer un compte utilisateur
Création d’un groupe ..
Modification d’un groupe ..
Suppression d'un groupe ..
Changer de groupe dans la même session
Gérer les mots de passe - pour les utilisateurs
Gérer les mots de passe - pour les groupes
Mais au fait, qui suis-je ? ..
Configurer le processus de connexion
déroulement du processus de connexion .
les étapes .
le fichier .
la déconnexion
Qui s’est connecté dernièrement ? ..
Petits conseils rapides aux administrateurs
Gérer les accès et les ressources .
Restrictions générales d’accès ..
Gérer l’insuffisance disque .
Connaître et définir des limites logicielles et matérielles générales
Contrôler et limiter la consommation par utilisateurs : les quotas
L'utilisateur jules crée un fichier.
La gestion des disques ..
Les sauvegardes ..
Stratégies .
les outils ..
dump et restore
tar (tape archive) ..
cpio ..
copie physique .
Surveillance de l'espace disque .
Espace utilisé : df ..
Détail de l'occupation : du ..
RECONSTRUIRE LE NOYAU .
Version actuelle du noyau .
Où se trouve le noyau ? /boot
Les sources du noyau .
La démarche .
Les modules chargeables ..
Compilation et installation ..
Utilisation .
Chargement manuel : insmod <nom du module> ..
Les modules chargés : lsmod
Etablir la table des dépendances .
Charger un module et ses dépendances : modprobe .
Supprimer un module : rmmod [option] <nom du module> .
Intégrer des modules de noyau étrangers .
Installer le module externe ..
Charger le module externe ..
LES PAQUETAGES
Installer un package ..
Désinstaller un package
Mise à jour d'un package ..
Information sur les packages
Vérifier s'il y a eu modification .
GESTION DES PROCESSUS ..
Gestion des processus .
Numéro de processus :PID ..
Processus père :PPID ..
Numéro d'utilisateur et de groupe : UID et GID
Durée de traitement et priorité ..
Répertoire courant du processus .
Table des fichiers ouverts
Processus et tâche de fond .
Affichage des processus en cours : ps (process status) .
Priorité d'un processus .
Mesurer le temps d'exécution d'un processus .
Cette partie essaie de présenter l’administration système suivant les tâches essentielles d’un administrateur, les outils dont il dispose et qu’il se doit de savoir quand et comment les utiliser.
Les tâches d’un administrateur système sont très variées :
- gérer les utilisateurs,
- Planifier, réaliser les sauvegardes et les restaurations,
- répondre aux questions des utilisateurs,
- surveiller le taux d’activité du système,
- gérer les impressions … et ce n’est pas toujours facile !,
- essayer de libérer de l’espace disque, redémarrer le système après une panne,
- corriger les défaillances du réseau,
- ajouter de nouveaux périphériques,
- déterminer pourquoi un compte dysfonctionne soudainement,
- écrire des scripts pour essayer d’automatiser les activités,
- quelquefois déménager le mobilier pour installer de nouvelles machines,
- assister aux réunions,
- dialoguer avec les utilisateurs
- maintenir le noyau ,
- …
Bref beaucoup de tâches techniques mais aussi du relationnel et donc des contacts humains avec tout ce que cela suppose de difficultés.
L’administration système oscille souvent entre autorité et responsabilité d’une part et service et coopération d’autre part. Toute la difficulté consiste à trouver le bon compromis en se demandant si, pour l’utilisateur tartempion, il faut faire
- kill –9 de son processus qui est en train d’immobiliser toutes les ressources ou presque,
- ou bien write tartempion pour lui expliquer que son fonctionnement pose quelques problèmes.
En toutes circonstances, essayez de respecter ces quelques principes de base :
- avant d’agir, réfléchissez à ce que vous allez faire et à sa portée,
- faîtes en sorte que rien ne soit irréversible,
- faîtes les modifications petit à petit et pas tout en une seule fois,
- pensez toujours à sauvegarder les fichiers importants avant de les modifier, de manière à pouvoir restaurer une situation antérieure, qui, si elle n’était pas optimale, avait le mérite de fonctionner correctement,
- testez, testez et retestez pour vous assurer que tout est correct, mais ne testez pour satisfaire votre ego : un bon test consiste à démolir ce que l’on a fait et c’est seulement si l’on n’y arrive pas que l’on pourra estimer que c’est correct,
- sachez au mieux comment les choses fonctionnent et ne vous contentez pas toujours de « recettes de cuisine » : une recette maîtrisée sera optimisée, une recette appliquée sans aucune compréhension peut engendrer de très graves dégâts,
Pour passer sous ce compte privilégié qu’est le root, vous avez deux possibilités :
- vous connecter en tant que tel,
- utiliser la commande su en étant connecté avec un autre compte. le système vous demandera le mot de passe de root et le tour est joué. Si de plus vous souhaitez en récupérer l’environnement, il suffira de saisir : su –
[[email protected] chantal]$ su root
Password:
[[email protected] chantal]# pwd
/home/chantal
[[email protected] chantal]# su -
[[email protected] /root]# pwd
/root
Les bons outils facilitent le travail et le manque d’outils peut quelquefois le rendre impossible.
Ce chapitre fait un petit tour d’horizon des commandes administrateur de base, qui ne sont parfois que le résultat du détournement de commandes utilisateur.
man[options] <liste de commandes>
C’est la commande de base si vous souhaitez obtenir de l’aide sur une commande.
Il est possible de citer plusieurs commandes après man et dans ce cas, le système balayera l’aide des commandes les unes après les autres.
-k pour rechercher les entrées traitant d’un sujet
-a permet d’obtenir les pages d’aide, quelque que soit la section à laquelle elles appartiennent
L’affichage se fait différemment suivant l’interaction avec le système, dès que vous avez le symbole : affiché :
- la barre espace permet un défilement par page,
- la touche « enter » permet un défilement par ligne,
- « Ctrl B » permet de revenir à la page précédente,
- « Esc : q » permet de quitter la commande man.
[[email protected] lib]$ man -k passwd
passwd (5) - password file
rpc.yppasswdd (8) - NIS password update server
smbpasswd (8) - change a users smb password in the smbpasswd file.
yppasswd, ypchfn, ypchsh (1) - NIS password update clients
bash: q: command not found
[[email protected] lib]$ man -k passwd | more
chpasswd (8) - update password file in batch
dpasswd (8) - change dialup password
gpasswd (1) - administer the /etc/group file
nwpasswd (8) - change password for a NetWare user
passwd (5) - password file
…
[[email protected] chantal]$man -a chown
CHOWN(1)CHOWN(1)
…
CHOWN(2) Linux Programmer's Manual CHOWN(2)
Vous remarquerez que les commandes sont suivies d’un numéro qui indique la section du manuel. Ceci fait référence à l’époque où les manuels Unix étaient imprimés et fournis sous forme de volumes reliés. C’est ainsi que les commandes normales se trouvaient dans la section 1, les routines de programmation en 5 ..
De ce fait, la commande man recherche parmi les sections dans un ordre prédéfini et variant souvent suivant les distributions :
- commandes
- appels système
- fonctions des bibliothèques,
- autres sections.
Si vous souhaitez changer cet ordre, il faudra modifier le fichier de configuration de man : et plus précisemment la variable MANSECT.
[[email protected] chantal]$ cat
#
# Generated automatically from by the
# configure script.
#
#
#
# This file is read by man to configure the default manpath (also used
# when MANPATH contains an empty substring), to find out where the cat
# pages corresponding to given man pages should be stored,
# and to map each PATH element to a manpath element.
# It may also record the pathname of the man binary. [This is unused.]
# The format is:
#
# MANBIN pathname
# MANPATH manpath_element [corresponding_catdir]
# MANPATH_MAP path_element manpath_element
#
#…
# and to determine the correspondence between extensions and decompressors.
#
# MANBIN /usr/local/bin/man
#
# Every automatically generated MANPATH includes these fields
#
MANPATH /usr/man
MANPATH /usr/TeX/man
#…
# (these mappings are superfluous when the right hand side is
# in the mandatory manpath already, but will keep man from statting
# lots of other nearby files and directories)
#
MANPATH_MAP /bin /usr/man
MANPATH_MAP /sbin /usr/man
#…
# Useful paths - note that COL should not be defined when
# NROFF is defined as "groff -Tascii" or "groff -Tlatin1";
# not only is it superfluous, but it actually damages the output.
#
TROFF /usr/bin/groff -Tps -mandoc
NROFF /usr/bin/groff -Tlatin1 –mandoc
# Compress cat pages
#
COMPRESS /bin/gzip
COMPRESS_EXT .gz
#
# Default manual sections (and order) to search if -S is not specified
# and the MANSECT environment variable is not set.
#
MANSECT 1:8:2:3:4:5:6:7:9:tcl:n:l:p:o
#
# Decompress with given decompressor when input file has given extension
# The command given must act as a filter.
#
.gz /bin/gunzip -c
.bz2 /bin/bzip2 -c -d
.z /bin/gunzip -c
.Z /bin/zcat
L’utilisateur a souvent recours à grep pour rechercher une chaîne de caractères, mais l’administrateur peut y faire souvent référence dès lors qu’il connecte cette commande au résultat d’une autre.
Par exemple pour connaître tous les processus d’un utilisateur :
ps aux | grep <nom utilisateur>
[[email protected] chantal]$ ps aux | grep chantal
chantal 861 0.0 2.3 1092 732 p0 S 11:04 0:00 /bin/login -h 192.168
chantal 962 0.0 1.2 884 376 p0 R 12:40 0:00 ps aux
chantal 963 0.0 0.9 916 308 p0 S 12:40 0:00 grep chantal
Vous souhaitez savoir si un utilisateur particulier est connecté :
who | grep <nom utilisateur>
[[email protected] chantal]$ who | grep chantal
chantal ttyp0 Mar 13 11:04 (192.168.1.41)
Vous voulez connaître tous les utilisateurs qui jouent en ce moment au jeu XYZ et en garder une trace datée :
(date; ps ef | grep XYZ | awk `{print $1}` | sort | uniq) >> XYZ.users
find<répertoire> <critères-et–actions>
<répertoire> indique le point de départ de la recherche. Par défaut, find parcourt tous les sous-répertoires appartenant au répertoire cité.
<critères> précise les critères à retenir pour la sélection des fichiers. Parmi les plus courant :
-atimen dernier accès au fichier n jours auparavant
-mtimen fichier modifié n jours auparavant
-neverfic fichier modifier plus récemment que fic
-sizen fichier de n blocs de 512 octets
-typex fichier de type x, tel que x ait les valeurs suivantes :
b block (buffered) special
d directory
p named pipe (FIFO)
f regular file
l symbolic link
s socket
-namenom fichier a pour nom nom
-permp fichier de droit p
-useruser fichier appartenant à l’utilisateur user
-groupgrp - au groupe grp
-nouser fichier dont le propriétaire n’est pas dans /etc/passwd
-nogroup - groupe propriétaire - /etc/group
Et si l’on faisait un peu de ménage ….
[[email protected] chantal]# find /home -nouser
/home/chantal/majmin
/home/chantal/mots
/home/toto
/home/toto/.bash_logout
/home/toto/.bashrc
/home/toto/.cshrc
/home/toto/.gcalrc
/home/toto/.inputrc
/home/toto/.kshrc
…
Effectivement l’utilisateur 502 est inexistant …
[[email protected] chantal]# ls -l nvfic
-rw-rw-r-- 1 502 root 0 Jan 28 16:26 nvfic
Pensez qu’il est possible combiner les critères. Le ET logique est implicite, il suffit de citer les critères les uns à la suite des autres.
Le OU logique se précise par –o ; dans ce cas les options sont à regroupées entre ( ) et, pour que le symbole ( ne soit pas analysé au sein de la commande find, vous l’isolerez en le faisant précéder du symbole \.
Ainsi si vous recherchez les fichiersauxquels on n’a pas accédé depuis 2 mois au moinset quin’ontpas été modifié depuis 4 mois au moins, il faudra utiliser les critères suivants :
-atime +60 –mtime +120
Par contre, s’il s’agit de rechercher les fichiers non accédés depuis plus de 7 jours ouinchangés depuis plus de 30 jours:
\( -atime +7 –o –mtime +30 \)
<actions> indique à la commande find ce qui doit être fait des fichiers vérifiant les critères cités.
Voici les plus courantes :
-print affichage du chemin d’accès au fichier (par défaut)
-ls affichage long de la liste des fichiers
-execcde exécution de la commande cde sur le fichier
-okcde idem mais en demandant la confirmation pour chaque fichier
-prune pour ne pas descendre dans les sous-répertoires
Pour –exec et –ok, les commandes doivent être terminées par un ; précédé du symbole \.
L’expression {} peut être utilisée dans les commandes, elle sera remplacée au fur et à mesure par le chemin d’accès complet de chaque fichier rencontré.
Par exemple, si vous souhaitez supprimer les fichiers répondant à votre recherche, il faudra préciser :
Ainsi, la command find peut être largement utilisée pour surveiller l’utilisation de l’espace disque, localiser les fichiers à risque (SUID, SGID) ou effectuer des opérations récursives sur les fichiers.
localiser les gros fichiers n’ayant pas été modifiés depuis 1 mois:
find <répertoire> -size 2048 –mtime +30 –exec ls –l {} \ ;
2048 = 2048 blocs de 512 octets chacun, soit > 1M
afficher les fichiers à risque:
find / -type f \( -perm -2000 -o –perm –4000 \)
mkdir –p <sous-arborescence>
Pour créer r1 et r1/r2 sous /home/chantal
[[email protected] chantal]# mkdir -p /home/chantal/r1/r2
Après ce bref parcours des commandes de base vues du côté de l’administrateur, nous nous attarderons sur le processus de « boot » du système, la gestion des utilisateurs, la gestion des imprimantes …, bref le comment mener à bien les tâches essentielles d’un administrateur.
Attention :
Tout au long de cette partie administration, et même pour ce qui concerne la gestion des réseaux, un certain nombre de fichiers systèmes et de fichiers paramètres seront cités.
Les exemples du support de cours ont été réalisés avec la distribution de Caldera (Open linux 1.3) et quelquefois avec celle de Suse (7.0).
Vous vous rendrez vite compte que si les principes sont les mêmes, les fichiers ne sont pas toujours au même niveau de l’arborescence, en fonction des distributions.
Quelquefois la différence va plus loin, et un script de même nom ne fait pas tout à fait les mêmes choses.
Il vous appartient d’ajuster les propos de ce support, suivant la distribution que vous utiliserez.
Néanmoins, même si quelquefois c’est frustrant, voire agaçant, on s’y fait très vite.
N’oubliez pas les commandes souveraines : find / -name <nom du fichier>
ou pour un exécutable whereis <nom fichier>.
Le système exécute ensuite le POST (Power On Self Test) ce qui lui permet de vérifier que le processeur fonctionne correctement et que les informations du BIOS ont été correctement lues et traitées.
Il faut ensuite charger le système d’exploitation.
Pour cela, et quelque soit le support (lecteur, disque ..) le premier secteur est lu et doit indiquer la manière d’accéder au système d’exploitation.
Il s’agit du MBR (Master Boot Record), bloc 0 du disque dur, si l’on « boote » à partir du disque dur, ou du boot sector, si l’on « boote » à partir de la disquette.
Il contient un petit programme et une table des partitions, enregistrant les informations de quatre partitions primaires.
La structure du MBR est comme suit :
- les 446 premiers octets contiennent un mini programme de démarrage, le « boot loader », dans le monde linux, plus connu sous le nom de LILO (Linux Loader) : son rôle est de charger le début de la partition désignée comme active.
Une première partie de LILO est tout d’abord chargée et exécutée.
Sa tâche consiste à charger en mémoire la 2ème partie de LILO (environ 5K). Lors de cette phase, il y a affichage des lettres LI. S’il y a arrêt, c’est que LILO n’arrive pas à s’exécuter ( généralement problème de géométrie du disque). Or c’est cette deuxième partie qui va permettre à l’utilisateur de choisir le système à lancer.
- une table des partitions, permettant d’obtenir des informations sur les 4 partitions primaires.
Si l’on détaille de plus près le MBR, on y trouve :
- à l’offset 0x1BE : les enregistrements des partitions, à raison de 16 octets chacun,
- à l’offset 0x1FE, sur 2 octets, un nombre « magique », précisant qu’il s’agit d’un MBR (AA55).
struct partable_entry
{
unsigned char boot_flag ;
/* 0 = inactive, 0x80 = active */
unsigned char begin_head,
begin_sector,
begin_cylinder,
partition_type;
/* 0x83 = linux, 0x82 = swap linux */
unsigned char end_head,
end_sector, end_cylinder;
unsigned long start_sector,
sector_count ;
};
unsigned char = 1 octet
unsigned long = 4 octets
Le secteur de début de la partition contient un programme qui charge le noyau et lance le système d’exploitation.
Le noyau du système choisi, quel qu’il soit (linux, windows ..) est décompressé à la volée et chargé en mémoire.
Pour linux, en principe ceci est accompagné du message « Uncompressing linux ….. done. Now booting the Kernel».
Généralement le noyau d’un système linux se trouve sous la racine et porte le nom de vmlinuz. Le z final indique qu’il s’agit d’un fichier compressé.
[[email protected] chantal]$ls -l /vmlinuz
-rw-r--r--2 rootroot424687 Aug 191998 /vmlinuz
La taille du noyau varie en fonction de son contenu, c’est-à-dire des options retenues lors de sa compilation.
Il est possible de « construire » un noyau minimum et grâce aux modules chargeables de l’ajuster aux besoins (pilotes ..). Nous étudierons ceci par la suite.
Dès lors que le noyau est chargé en mémoire, c’est lui qui prend les "affaires" en main et inspecte son matériel.
Son chargement commence par :
? l’exécution de setup.S, programme écrit en assembleur et se trouvant généralement dans le répertoire /usr/src/linux-…/arch/i386/boot
Suivant les distributions, l’un des niveaux de l’arborescence est soit linux –n° de version du noyau, soit linux tout simplement.
A vous de le vérifier, en fonction de votre système.
-rw-r--r--1 rootroot17330 Mar 301996 setup.S
…
? l’exécution du programme (en assembleur) head.S :
? le démarrage du coeur du noyau, main.c, dans /usr/src/linux-…/init
[[email protected] chantal]$ls -l /usr/src/linux-2.0.35/init
-rw-r--r--1 rootroot28511 Aug 191998 /usr/src/linux-2.0.35/init/main.c
Pendant cette étape, le noyau effectue un certain d’initialisations :
Suivant les distributions, le compte rendu des initialisations est stocké dans le fichier /proc/kmsg, ou /var/log/dmesg ou/proc/partitions .
? Le noyau lance ensuite le premier processus : init.
Voici quelques lignes des premiers messages affichés lors du démarrage :
…
Il a le numéro de processus 1 et constitue la racine de tous les autres processus, directement ou indirectement. La commande pstree peut vous permettre d’afficher les processus en cours d’exécution, sous la forme d'un arbre généalogique.
Init est généralement stocké en /sbin.
[[email protected] chantal]#ls -l /sbin/init
-rwxr-xr-x1 rootroot19568 Aug 191998 /sbin/init
Il est chargé de procéder à diverses initialisations et configurations, ainsi que de lancer un certain nombre de démons, qui sont en fait des services systèmes que l’on active.
Parmi les initialisations et configurations, nous citerons :
- le contrôle des partitions
- le contrôle de l’intégrité des systèmes de fichiers, déclarés dans /etc/fstab,
- le montage de ces systèmes,
- l’activation de la zône de pagination
- la configuration de la ou des cartes réseau …
- du démon d’impression, lpd,
- des démons de journalisation, syslogd et klogd,
- du démon de supervision du réseau, inetd,
- de divers démons rpc, liés aussi au réseau,
- du démon NFS (Network File System),
- des démons permettant la gestion des console, getty,
- du démon cron chargé de l’exécution des tâches en différé
- d’un certain nombre de démons définis par l’administrateur, tels que celui permettant de gérer samba, ceux définis pour un firewall …
Init n’active pas systématiquement tout, il s’appuie sur le contenu du fichier /etc/inittab dans lequel il retrouve en fait l’ensemble des scripts à lancer et donc des démons à activer, suivant le profil d’initialisation système choisi.
On parle en fait de niveau de fonctionnement ou plus précisément de run-level.
[[email protected] chantal]#cat /etc/inittab
#
# inittabThis file describes how the INIT process should set up
#the system in a certain run-level.
#
# Author:Miquel van Smoorenburg, <>
#Modified for RHS Linux by Marc Ewing and Donnie Barnes
#Modified for COL by Raymund Will
#
# The runlevels used by COL are:
#0 - halt (Do NOT set initdefault to this)
#1 - Single user mode (including initialisation of network interfaces,
#if you do have networking)
#2 - Multiuser, (without NFS-Server und some such)
#(basically the same as 3, if you do not have networking)
#3 - Full multiuser mode
#4 - unused
#(should be equal to 3, for now)
#5 - X11
#6 - reboot (Do NOT set initdefault to this)
# Default runlevel.
id:3:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.modules default
# What to do in single-user mode.
~1:S:wait:/etc/rc.d/rc 1
~~:S:wait:/sbin/sulogin
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin
# Trap CTRL-ALT-DELETE
ca:12345:ctrlaltdel:/sbin/shutdown -t3 -r now
# Action on special keypress (ALT-UpArrow).
kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."
# When our UPS tells us power has failed, assume we have a few minutes
# of power left.Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -h +5 "Power Failure; System Shutting Down"
# If battery is fading fast -- we hurry
p1::powerfailnow:/sbin/shutdown -c 2> /dev/null
p2::powerfailnow:/sbin/shutdown -h now "Battery Low "
# If power was restored before the shutdown kicked in, cancel it.
po:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Run gettys in standard runlevels
1:12345:respawn:/sbin/getty tty1 VC linux
2:2345:respawn:/sbin/getty tty2 VC linux
# of power left.Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -h +5 "Power Failure; System Shutting Down"
# If battery is fading fast -- we hurry
p1::powerfailnow:/sbin/shutdown -c 2> /dev/null
p2::powerfailnow:/sbin/shutdown -h now "Battery Low "
# If power was restored before the shutdown kicked in, cancel it.
po:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Run gettys in standard runlevels
1:12345:respawn:/sbin/getty tty1 VC linux
2:2345:respawn:/sbin/getty tty2 VC linux
3:2345:respawn:/sbin/getty tty3 VC linux
4:2345:respawn:/sbin/getty tty4 VC linux
5:2345:respawn:/sbin/getty tty5 VC linux
6:2345:respawn:/sbin/getty tty6 VC linux
# Run xdm in runlevel 5
Un peu de détail sur les run-level :
0 shutdown : arrêt du système
1 mono utilisateur
2 multi utilisateurs sans nfs
3multi utilisateurs avec nfs (par défaut)
4 inutilisé ( suivant les distributions)
5 avec interface graphique X11
6 reboot
Dans ce cas seul un utilisateur peut se connecter et généralement c’est l’administrateur qui s’assure ainsi qu’aucun utilisateur ne perturbera le système.
On utilise généralement ce niveau pour :
- résoudre un problème technique,
- installer un nouveau périphérique,
- construire un nouveau noyau.
C’est donc un mode maintenance.
Pour démarrer linux dans ce mode, il suffit de saisir à l’invite :
boot:linux single
Outre les commentaires, ce fichier comporte des lignes du type :
cn:123456:respawn:/sbin/getty tty1VC linux
ou synthétisé autrement
<code>:<niveau>:<action>:<commande>
Le caractère séparateur des champs est :.
<code>
Il identifie le type de l’entrée.
Il est constitué de 1 à 4 caractères, assez souvent une lettre suivie d’un numéro. Ce label doit être unique dans le fichier puisqu’il permet au script d’identifier l’enregistrement.
<niveau>
Ceci correspond au run-level.
En fonction de sa valeur, seules les lignes portant cette valeur sont exécutées, les autres sont ignorées.
Plusieurs niveaux peuvent être cités, les uns à la suite des autres.
<action>
On y rencontre des mots clés permettant de définir la fréquence et le mode d’exécution de la commande citée dans le dernier champ.
Parmi les actions :
respawn commandes traitée par un processus enfant
off commande à ne pas exécutée
wait attente de la fin l’exécution totale de la commande
sysinit commande lancée qu’au démarrage du système avant celles des directives boot et bootwait.
powerfail commande à n’exécuter que si le système a reçu un signal de type SIGPWR (coupure de courant)
ctrlaltdel commande traitées dès que le système intercepte le signal
ctrl + alt + del
boot processus lancé au démarrage ; le champ <niveau> est alors ignoré
bootwait idem boot, mais init attend la fin du processus
…
<commande>
Cette commande est traitée par le bash (équivalent de ).
Toutes les actions réalisées sont enregistrées généralement dans :
/var/run/utmp et
/var/log/wtmp.
Si une modification est faite dans le fichier /etc/initab, pour que le processus init puisse la prendre en compte, au cours de la même session, il faut donc l’obliger à relire le fichier.
Ceci se fait en lui envoyant le signal SIGHUP :
kill –HUP 1
A chaque niveau est associé un ensemble de scripts. On les retrouve à différents points de l’arborescence, suivant les distributions : /etc/rc.d/… ou /sbin/init.d/…
Dans tous les cas, ils sont regroupés dans des répertoires du nom de :
rc1.d pour le démarrage en run level 1,
rc2.d 2
etc ..
Avec Caldera 1.3 :
[[email protected] rc.d]$ ls -l /etc/rc.d
drwxr-xr-x 2 root root 1024 Oct 10 15:16 init.d
-rwxr-xr-x 1 root root 3293 Mar 10 1998 rc
-rwxr-xr-x 1 root root 6825 Oct 10 15:45
-rwxr-xr-x 1 root root 1362 Oct 10 15:26 rc.modules
drwxr-xr-x 2 root root 1024 Oct 10 15:26 rc0.d
drwxr-xr-x 2 root root 1024 Oct 10 15:26 rc1.d
drwxr-xr-x 2 root root 1024 Oct 10 15:26 rc2.d
drwxr-xr-x 2 root root 1024 Oct 10 15:26 rc3.d
drwxr-xr-x 2 root root 1024 Oct 10 15:26 rc4.d
drwxr-xr-x 2 root root 1024 Oct 10 15:26 rc5.d
drwxr-xr-x 2 root root 1024 Oct 10 15:26 rc6.d
Si l’on regarde le début du fichier /etc/inittab, on constate qu’avant toute chose, on déclare le run level par défaut à 3, et 2 scripts sont exécutés :
# Default runlevel.
id:3:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.modules default
- au démarrage, rc.modules avec pour argument default,
- immédiatement après,
- ensuite , en fonction du run level, le système ira dans le répertoire rcn.d
- et enfin, il exécutera le script /etc/rc.d/rc.local
Le répertoire init.d contient les scripts d'initalisation des sous-systèmes.
Ce script charge les modules standard et les modules cités dans /proc/modules, par l’intermédiare de la commande insmod.
Un extrait de rc.modules
[[email protected] rc.d]$ cat rc.modules
#!/bin/sh
#
# Load default/additional modules
#
# $Id: rc.modules,v 1.10 1998/05/12 11:11:02 ray Exp $
#
# this script makes use of the following commands:
# [
# cat
# echo
# insmod
# sed
# uname
# (this is important for use on an 'initrd' :)
if [ -d /usr/bin ]; then
PATH="/bin:/usr/bin:/sbin:/usr/sbin"
else
PATH="/bin:/sbin"
fi ……
echo "Configuring ISA PnP cards "
/sbin/isapnp
fi
Ce fichier est quelquefois appelé rc.sysinit, suivant les ditributions.
Il a des fonctions plus importantes et nombreuses par rapport au script rc.modules, telles que :
- définition du PATH minimum : /bin ;/sbin
- umask 022
- faire le point sur les disques
- récupérer les données de définition du réseau dans /etc/sysconfig/network
[[email protected] chantal]$cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=caldera13
IF_LIST='lo eth tr sl ppp'
- activer la zône de swap,
- monter le système de fichier principal ( / )en lecture pour y effectuer un contrôle de cohérence (fsck)
- le remonter en lecture écriture ainsi que les autres systèmes de fichiers cités dans /etc/fstab
[[email protected] chantal]$cat /etc/fstab
/dev/hda1 / ext2 defaults 0 1
/proc /proc proc defaults 0 0
/dev/hda2 none swap defaults 0 0
#
/dev/fd0 /mnt/floppy ext2 defaults,noauto 0 0
#
/dev/hdc /mnt/cdrom iso9660 ro,noauto 0 0
- activer le réseau ( /etc/rc.d/init.d/network start ) qui fait référence aux fichiers contenant le répertoire /etc/sysconfig/network-scripts, c’est-à-dire à la récupération des données relatives à la carte réseau (ifcfg ) et à la mise en place des routes ..
[[email protected] init.d]$ls -l /etc/sysconfig/network-scripts
total 14
-rw-r--r--1 rootroot1090 Apr 301998 functions
-rwxr-xr-x1 rootroot215 Oct 10 16:19 ifcfg-eth0
-rwxr-xr-x1 rootroot161 Oct 10 15:40 ifcfg-eth1
-rw-r--r--1 rootroot216 May 121998 ifcfg-lo
-rw-r--r--1 rootroot295 Apr 101998 ifcfg-plip0
-rwxr-xr-x1 rootroot163 Oct 10 15:40 ifcfg-tr0
-rwxr-xr-x1 rootroot840 Apr 301998 ifdown-ppp
-rwxr-xr-x1 rootroot393 Apr 301998 ifdown-sl
-rwxr-xr-x1 rootroot2642 Apr 301998 ifup-ppp
- compléter le PATH.
Un extrait de
[[email protected] rc.d]$cat
#! /bin/sh
#
# - run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
# Modified for COL by Raymund Will <>.
#
# Set the path
# don't use 'usr' until *all* filesystems are mounted!
PATH=/bin:/sbin
export PATH
umask 022
# setting up IDE hard drives
if [ ùname -m` = alpha ]; then
echo "Setting up IDE hard drives on an Alpha"
for n in hda hdb hdc hdd; do
hdparm -m 16 /dev/$n 2>/dev/null >/dev/null
done
fi
## collect configuration variables
# Time files in /tmp are kept.
TMPTTL=`get_val CONF_INIT_TMP_TTL`
# Set to yes if you want sulogin to be spawned on bootup
SULOGIN=`get_val CONF_INIT_SULOGIN`
# Set to no if you want to be able to login over telnet/rlogin
# before system startup is complete (as soon as inetd is started)
DELAYLOGIN=`get_val CONF_INIT_DELAYLOGIN`
# Set GMT="-u" if your system clock is set to GMT, and GMT="-l" if you lose.
GMT="`get_val CONF_KERNTZ_FLAG`"
# Get tuneable critical system resources
MAXFILES="`get_val CONF_INIT_MAX_FILES`"
MAXINODES="`get_val CONF_INIT_MAX_INODES`"
# tell kernel local timezone and whether CMOS clock ticks UTC/GMT or not
/sbin/ktzset $GMT
# Read in config data.
. /etc/sysconfig/network
Dans chacun de ces répertoires, il y a deux familles de scripts :
- ceux dont le nom commence par S pour Start,
- ceux dont le nom commence par K pour Kill
Dans les deux cas, le nom est composé d’un numéro et d’une chaîne de caractères.
Le numéro sous la forme nn permet de déterminer l’ordre d’exécution.
[[email protected]rc3.d]$ls
S01networkS25syslogS40cronS62rwhodS92iBCS
S01pcmciaS26ipxS40nfsS63rusersdS95ipfwctrl
S05urandomS27ipxripdS41atdS65netatalkS95news
S10namedS30amdS50mtaS70dialdS98local
S15inetS30ntpS55nwclientS70logoutdS99bigfs
S21nis-clientS35postgresS61rwalldS91sambaS99skipped
Ainsi S10named sera le script à lancer en 10ème position pour le run level 3
[[email protected]rc6.d]$ls
K05ipfwctrlK39rwalldK60cronK74ipxK98pcmcia
K05newsK44dhcpdK60nfsK75syslogK99network
K08iBCSK45nwclientK65lpdK79nis-clientS99reboot
K09sambaK47rusersdK65postgresK80nis-server
K30dialdK48rwhodK70amdK85inet
K30logoutdK50mtaK70ntpK90named
K35netatalkK59atdK73ipxripdK95urandom.
Alors que K09samba est à tuer en 10ème position pour le run level 10.
Et si l’on regarde plus dans le détail, on réalise qu’en fait les fichiers sont des liens sur des fichiers scripts. Ainsi, S01network qui est à exécuter en premier dans le run level 3 pointe en fait sur le script /etc/rc.d/init.d/network.
[[email protected]rc3.d]$ls -l
lrwxrwxrwx1 rootroot17 Oct 10 15:20 S01network -> ../init.d/network
lrwxrwxrwx1 rootroot16 Oct 10 15:23 S01pcmcia -> ../init.d/pcmcia
lrwxrwxrwx1 rootroot17 Oct 10 15:20 S05urandom -> ../init.d/urandom
lrwxrwxrwx1 rootroot15 Oct 10 15:26 S10named -> ../init.d/named
Cette architecture est en fait d’une grande souplesse. En respectant la philosophie, rien n’empêche de rajouter, au rang souhaité, un script personnalisé à exécuter.
Il est exécuté en dernier par le processus init.
Son rôle est d’afficher le message de connexion, /etc/issue, qui peut parfaitement être personnalisé.
Ce script peut aussi renfermer des instructions d’initialisations locales.
[[email protected] rc.d]$ cat rc.local
#!/bin/sh
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
if [ -r /etc/.issue ]; then
cat /etc/.issue > /etc/issue
else
cat << EOI > /etc/issue
Caldera OpenLinux(TM)
Copyright (C) 1996-1998 Caldera, Inc.
EOI
fi
cp -f /etc/issue
[[email protected] log]#cat messages
Feb1 16:11:41 caldera13 syslogd 1.3-3: restart.
Feb1 16:11:44 caldera13 kernel: klogd 1.3-3, log source = /proc/kmsg started.
Feb1 16:11:44 caldera13 kernel: Loaded 4122 symbols from -2.0.
35.
Feb1 16:11:44 caldera13 kernel: Symbols match kernel version 2.0.35.
Feb1 16:11:44 caldera13 kernel: Loaded 81 symbols from 15 modules.
Feb1 16:11:44 caldera13 kernel: Console: 16 point font, 400 scans
Feb1 16:11:44 caldera13 kernel: Console: colour VGA+ 80x25, 1 virtual console
(max 63)
Feb1 16:11:44 caldera13 kernel:
Feb1 16:11:44 caldera13 kernel: >>> kernel: initializing PCI devices <<<
Feb1 16:11:44 caldera13 kernel: pcibios_init : BIOS32 Service Directory struct
ure at 0x000fac70
Feb1 16:11:44 caldera13 kernel: pcibios_init : BIOS32 Service Directory entry
at 0xfb0f0
Feb1 16:11:44 caldera13 kernel: pcibios_init : PCI BIOS revision 2.10 entry at
0xfb120
Feb1 16:11:44 caldera13 kernel: Probing PCI hardware.
Feb1 16:11:44 caldera13 kernel:
Feb1 16:11:44 caldera13 kernel: >>> kernel: calculating speed index <<<
Feb1 16:11:44 caldera13 kernel: Calibrating delay loop.. ok - 333.41 BogoMIPS
…
[[email protected] log]#runlevel
N 3
Au message de boot, il vous suffira d’indiquer avec quel run level vous souhaitez démarrer.
boot:linux init n
ou linux single
S’il est important de bien démarrer le système, il est indispensable de l’arrêter « proprement ».
En effet, il ne faut pas perdre de vue que linux travaille avec la mémoire virtuelle et le système de pagination, en swapp in – swapp out.
Ceci signifie, qu’à l’instant « t », vous pouvez avoir en mémoire des pages fraîchement mises à jour et qui n’ont pas encore été réécrites sur le disque, par soucis d’efficacité.
Il faut savoir que le démon update force la cohérence de votre système de fichiers toutes les 30 secondes.
shutdown[options] time [message]
-h halt
-r reboot
-k simulation d’arrêt
-f pour faciliter un redémarrage rapide, en éliminant le contrôle de cohérence du système de fichiers (fsck)
La notion de temps s’exprime sous différents formats :
hh :mm
now
+ m, indiquant le nombre de minutes avant que l’arrêt système soit exécuté.
Il est possible d’envoyer un message aux utilisateurs pour leur signaler que le système sera arrêté dans m minutes.
/bin commandes majeures et fichiers exécutables nécessaires à l'initialisation
/boot noyau et fichiers de démarrage
/dev fichiers périphériques
/etc fichiers de configuration du systèmes et certains scripts
/etc/X11 fichiers de configuration de Xwindow
/etc/rc.d scripts de démarrage du système
/etc/logrotate.d fichiers de configuration ou script de logrotate
/etc/cron.d tâches à effectuer à la périodicité donnée (daily, hourly, monthly, weekly)
/etc/skel fichiers à recopier dans le répertoire d'un nouvel utilisateur, lors de sa création
/etc/sysconfig fichiers de configuration des périphériques
/home base des répertoires des utilisateurs
/lib librairies système et modules
/lost+found stockage des fichiers retrouvés par fsck
/mnt généralement point d'"ancrage" des sytèmes de fichiers "extérieurs"
/opt logiciels complémentaires
/proc système de fichiers virtuels permettant l'accès aux variables du noyau
/root répertoire de base du super utilisateur
/sbin commandes importantes pour l'administration du système
/tmp les fichiers temporaires
/usr programmes, librairies et fichiers accessibles aux utilisateurs
/X11R6 hiérarchie des fichiers Xwindows
/usr/bin commandes du système
/usr/doc les documentations en ligne
/usr/include définitions des librairies pour la programmation en C
/usr/lib librairies non système
/usr/local hiérarchie des fichiers propres à votre installation, avec une hiérarchie semblable à celle de /usr
/usr/man les fichiers pages du manuel en ligne
/usr/sbin les commandes d'administration non nécessaires au démarrage
/usr/share les fichiers de configuration partagés
/usr/src les sources du système et des applications
/var dépôt de données variables liées à la machine (spool, traces)
/var/adm diverses informations sur le système
/var/catman fichiers d'aide mis en forme pour un accès plus rapide lors d'une deuxième utilisation
/var/lib quelques fichiers de configuration
/var/lock fichiers de verrous des applications
fichiers d'enregistrement des traces du fonctionnement du système. Une grande partie d'administration consiste à suivre les enregistrements afin de détecter les problèmes.
/var/run fichiers contenant les PID des processus du système
/var/spool sous-répertoires de gestion des spoolers d'impression (lpd), de courrier (mail), de forums (news sur certaines distributions). Ces sous répertoires peuvent contenir des fichiers de taille importante, qu'il vous faudra surveiller.
Pour pouvoir utiliser linux, il nous faut un programme d’amorçage, le boot loader, pour autoriser le chargement du noyau.
Lilo et loadlin sont 2 programmes d’amorçage qui s’utilisent dans des contextes différents.
Lilo s’intègre dans le secteur d’amorçage d’une disquette , dans le MBR du disque dur ou dans le premier secteur de la partition d’amorçage linux, alors que loadlin s’appelle depuis une ligne de commande dos.
Dans ce cas, il s’affiche dès la mise en route de l’ordinateur, ce qui permet à l’utilisateur de choisir entre les différents systèmes d’exploitation figurant sur le disque dur.
On configurera alors lilo de manière à pouvoir afficher les différents systèmes bootables par l’utilisation de la touche Tab.
Lilo n’est alors actif que si la partition linux l’est aussi.
Il se situe dans le secteur d’amorçage et démarre alors le système.
Lilo, c’est en fait un programme et un fichier de configuration, .
Voici un exemple de fichier de configuration de lilo, qui correspond à une machine sur laquelle seul le système d’exploitation linux est installé.
[[email protected] analyse]# cat
#
# general section
#
boot = /dev/hda1
install = /boot/boot.b
message = /boot/message
prompt
# wait 20 seconds (200 10ths) for user to select the entry to load
timeout = 200
#
# default entry
#
image = /vmlinuz
label = linux
root = /dev/hda1
read-only
#
# additional entries
# section other
# par exemple avec un windows 98
#sur une autre partition hda3
#other=/dev/hda3
# label=w98
# table=/dev/hda
#
autre exemple(extrait de la bible de linux):
#section générale
boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=500
#section image
image=/boot/vmlinuz-2.0.36-0.7
label=linux52
root=/dev/sdb3
read-only
image=/boot/vmlinuz-2.0.35
label=linux51
root=/dev/sda5
read-only
#section other
other=/dev/sda1
label=windows98
table=/dev/sda
On distingue trois sections :
- une section générale unique (global options)
- des sections pour linux (image)
- des sections pour d’autres systèmes d’exploitation (other)
Les deux derniers types de sections servent donc à distinguer les systèmes d’exploitation.
Une section couvre plusieurs lignes, à une ligne correspond une instruction ou un commentaire.
?backup=<nom-de-fichier>
Permet de définir le nom de fichier où copier l’ancien secteur d’amorçage ; ce nom peut être celui d’un « device ». Cette opération évite de perdre le précédent contenu du secteur d’amorçage. Attention, si le fichier existe déjà, la sauvegarde n’a pas lieu.
Les contenus de secteur d’amorçage utilisés par lilo sont regroupés dans /boot.
[[email protected] chantal]# ls -l /boot
total 462
lrwxrwxrwx 1 root root 32 Oct 10 15:21 -2.0.35 -> /usr
-rw-r--r-- 1 root root 23645 Aug 19 1998 WHATSIN-2.0.35-modular
-rw-r--r-- 1 root root 512 Oct 10 15:39 boot.0301
-rw-r--r-- 1 root root 4548 Aug 19 1998 boot.b
-rw-r--r-- 1 root root 300 Aug 19 1998 chain.b
-rw------- 1 root root 8704 Oct 10 15:39 map
-r--r--r-- 1 root root 1565 Jan 8 1998 message
-rw-r--r-- 1 root root 308 Aug 19 1998 os2_d.b
-rw-r--r-- 2 root root 424687 Aug 19 1998 vmlinuz-2.0.35-modular
On y retrouve essentiellement :
boot.b secteur d’amorçage standard des PC
chain.b lance le secteur d’amorçage de la partition sélectionnée
[[email protected] chantal]# file /boot/boot.b
/boot/boot.b: Linux/i386 LILO boot/chain loader
?boot=<fichier-de-périphérique>
Ce fichier indique où installer lilo :
- s’il s’agit d’une disquette, on trouvera /dev/fd0,
- s’il s’agit du secteur d’amorçage de la partition racine, on retrouvera le nom d fichier de périphérique de la partition linux, par exemple /dv/hda1
- s’il s’agit du MBR, on aura directement /dev/hda, c’est –à-dire le nom du disque même
?compact
?default=<nom>
Le système utilise le nom de l’image citée comme étant l’image de boot par défaut ; Si cette option est inexistante, c’est la première image apparaissant dans le fichier de configuration qui sera prise par défaut.
?delay=<temps en dixièmes de seconde>
Permet de définir le nombre de dixièmes de seconde pendant lequel lilo attendra avant de lancer le premier système d’exploitation de la liste. Si aucune temporisation n’est souhaité, il faut indiquer la valeur 0.
Sans temporisation et sans option prompt, le système défini par défaut est chargé.
Pensez qu’il faut à peu près 5 secondes (donc 50 dixièmes de secondes) pour appuyer sur la tâche alt ou tab ou … pour visualiser les labels de systèmes chargeables.
?force-backup=<nom de fichier>
Idem backup, mais si le fichier existe, lilo l’écrase.
?install=<fichier de boot>
Installe le fichier spécifié comme le nouveau boot secteur. C’est le fonctionnement par défaut.
?linear
Avec cette option, lilo calcule l’emplacement du noyau sur le disque, suivant une logique qui lui est propre, et pas en fonction des cyclindres, pistes et secteurs.
Attention, ceci ne permet de dépasser la limite des 1024 cylindres.
Si linux figure dans un espace situé au delà des 1024, cette option n’apporte rien. Il faudra soit créer une disquette d’amorçage, comprenant le noyau, soit utiliser loadlin.
?map=<fichier-map>
Permet de spécifier l’emplacement du fichier de mapping. S’il est omis, c’est le fichier /boot/map qui est utilisé.
?message=<fichier>
Le fichier indiqué contient un texte que lilo affiche au démarrage. Ce texte doit être inférieur à une page écran, le défilement ne pouvant être interrompu.
?nowarm
Elimine les messages de warning
?password=<mot de passe>
?prompt
Affiche l’invite LILO:. Cette commande est totalement incompatible avec la présence de delay.
?read-only
Cette commande spécifie que le système de fichier / peut être monté en lecture seule, sachant qu’après le démarrage, le système de fichiers est remonté en lecture écriture.
?vga=<mode>
Permet de déterminer le mode de la carte VGA à l’amorçage. Le mode s’exprime sous la forme d’une chaîne de caractères ou d’une valeur numérique.
normal 80 * 25 en mode texte
extended ou ext 80*50 en mode texte
ask demande une saisie de valeur à l’utilisateur au moment du boot
<numérique> le système assure ensuite une correspondance avec le mode texte.
?timeout=<temps en dixièmes de secondes>
Si l’on demande l’affichage d’une invite par la commande prompt, lilo va attendre la saisie correspondante jusqu’à expiration du timeout. Par défaut, c’est souvent une valeur infinie.
Elle intervient après la section globale, sachant que l’ordre des sections est important.
Le mot crucial de cette ouvelle section est image=.
Le but de cette section est d’indiquer de quelle manière linux est lancé.
On peut très bien avoir plusieurs images linux dans le fichier .
cette section regroupe les commandes suivantes :
?append=»arguments du noyau»
Permet de donner des informations complémentaires sur le matériel, qui ne peut les fournir ou très difficilement (carte réseau).
Voici une liste des arguments qui peuvent accompagner l’amorçage :
- debug pour afficher les messages d’erreur détaillés
- ether=IRQ,adresse,[paramètre],nom
paramètres de la carte réseau utilisée.
- max_scsi_luns=nombre
si besoin est, dans le cas de carte scsi pour définir le nombre maximum de préphériques utilisant le même ID SCSI.
- nfsroot=serveur:racine[,options]
le système de fichiers peut être complété par un répertoire nfs, dont un indiquera l’adresse ip (serveur) et la racine du répertoire exporté (racine).
- ramdisk_size=taille création d’un disque virtuel en mémoire vive, la taille étant exprimée en Ko.
- root=<fichier de périph>
fichier de périphérique contenant le système de fichiers racine
- ro ou rw système de fichiers racine en read only ou en read write
exemple de définition de taille mémoire et de définition d’une carte réseau:
append=«mem=64m ether=10,0x300,0xDC000,eth0»
?image=<nom de fichier>
indique le noyau du système à charger, généralement /vmlinuz.
?label=nom
Pour préciser un nom pour la section et de ce fait pour le noyau. Limité à 15 caractères, sans caractères spéciaux, et sans accentuation. c’est le terme qui s’affichera lorsqu’à l’invite de lilo, vous saisirez tab pour connaître les sytèmes d’exploitation chargeables.
?read-only
Idem que pour la section générale, et souvent rajouté par image, pour une simple question de sécurité.
?root=<fichier de périphérique>
Nom du fichier de périphérique permettant d’accéder au système d’exploitation. Ceci est optionnel, puisque l’image indique une partition.
Il est possible de proposer d’autres systèmes que linux. La différence s’établit au travers de la section other.
?label=nom
idem que ci-avant
?loader=<programme de secteur d’amorçage>
Il s’agit du programme employé pour charger le système d’exploitation non linux. Par défaut, on trouve /boot/chain.b.
?other=<fichier de périphérique>
Ceci permet de spécifier une référence à la table des partitions pour ce qui concerne le système à charger.
S’il s’agit par exemple deu système situé sur la 3ème partition du 1er disque, on aura /dev/hda3.
Pour spécifier une référence à la table des partitions pour le système à charger.
/sbin/lilo
Ceci permet d’effectuer l’équivalent d’une compilation du fichier de configuration et prend donc en compte les modifications effectuées.
/sbin/lilo –u
fdisk /MBR
restaurer l’ancien contenu du MBR (backup=…. dans )
Dans le dernier cas, il est sage de sauvegarder le MBR modifié par lilo, avant de le restaurer :
dd if=/dev/hd… size=512 count=1
dd if=/boot/<ancien MBR> of=/dev/hd… size=512 count1
Il s’agit d’un autre programme d’amorçage qui ne fonctionne que sous DOS, c’est-à-dire qu’il s’appelle depuis la ligne de commande DOS.
Son avantage est qu’il permet de franchir la barrière des 1024 cylindres, puisqu’étant lancé par MS-DOS, le programme n’est pas limité par le MBR.
Il fait partie de la plupart des distributions, mais en cas de problème, il est possible de se le procurer:
nux/system/boot/dualboot
Il s’agit du fichier(87 Ko).
L’étape suivante consiste à copier loadlin.exeet le noyau /vmlinuz dans un répertoire de la partition DOS ( c:\loadlin ou c:\linux).
Vous avez copié et /vmlinuz, par exemple dans le répertoire c:\linux.
Pour appeler le noyau, il vous faudra passer la commande suivante :
loadlin c:\linux\vmlinuz root=/dev/hdan ro
Ainsi vous activez linux et recherchez un système de fichiers dans la nième partition de votre disque dur. Bien évidemment si votre disque est de type scsi, /dev/hda.. se transformera en /dev/sda0…9.
Une fois linux chargé, le système MS-DOS ne figure plus en mémoire.
C’est le moyen de stocker et d’organiser les répertoires et fichiers.
Dans cette partie, nous essayerons de regarder le système de fichiers d’un point de vue administrateur et quelquefois « programmeur système ».
Linux offre l’avantage de présenter l’ensemble des fichiers sous la forme d’un seul système de fichiers. Cet espace se décompose en répertoires et fichiers.
Mais avant toute chose, il y a un support physique, le disque, composé d’un certain nombre de blocs de 512 octets.
Ces blocs sont numérotés en continue, et de ce fait le numéro du bloc indique son emplacement. Le contrôleur établit la correspondance entre numéro du bloc et division physique du disque en piste, secteurs pour en déduire l’emplacement réel.
Adressage des blocs de données sur un disque dur (extrait de la bible de linux)
Le nombre de blocs utilisés pour tout ou partie de l’arborescence est obtenu par la commande du.
Suivant le point de l’arborescence où l’on se trouve en exécutant cette commande, le résultat sera bien sûr différent.
Exemple de consommation, pour l’utilisateur chantal.
Il aurait fallu lancer la commande du depuis la racine pour avoir une vue complète des blocs consommés.
[[email protected] chantal]$ du
14 ./.seyon
12
3 ./lg/lg_layouts
9 ./lg
3 ./repert2/repert1
5 ./repert2
4 ./repert3/repert1
5 ./repert3
1 ./disquette
1 ./r1/r2
2 ./r1
153 .
Nous avons dit que linux est capable d’intégrer dans son système de fichiers d’autres systèmes, dont on pourra obtenir la liste en listant le fichier /proc/filesystems.
[[email protected] chantal]$ cat /proc/filesystems
ext2
minix
umsdos
msdos
nodev proc
nodev nfs
iso9660
La liste peut être légèrement différente suivant les distributions de linux.
C’est un système issu du système ext, lui-même issu de minix.
Les principales caractéristiques en sont :
taille maxi d’un fichier 2 Go
taille maxi du nom d’un fichier 255 caractères
support des 3 dates Unix
possibilité d’extension
taille de bloc variable
La structure du système de fichier est constituée de :
- un bloc d’amorçage
- suivi de plusieurs groupes de blocs, eux mêmes composés de :
- d’un superbloc
- d’une table de descripteurs de bloc
- d’une image des blocs
- d’une image de la table des inodes
- d’une table des inodes
- des blocs de données.
Le secteur d’amorçage contient la séquence d’instructions nécessaire au chargement du noyau lors du démarrage du système.
La taille d’un groupe de blocs est de 8192 blocs avec une table de 2048 inodes ont 2040 disponibles (8 réservés).
C’est une structure contenant des informations de contrôle sur le système de fichiers, parmi lesquelles :
- nombre total d’inodes,
- nombre total de blocs,
- nombre de blocs libres,
- nombre d’inodes libres,
- adresse du premier bloc de données,
- nombre de blocs par groupe,
- nombre d’inodes par groupe,
- taille d’un bloc de données (multiple de 1024)
- heure de l’intégration (mount) du système de fichiers,
- nombre de montages du système de fichiers,
- nombre maximum de montage avant vérification forcée,
- heure de la dernière écriture du superbloc
- état du système de fichiers (correctement démonté, comportant des erreurs),
- comportement en cas d’erreur,
- système d’exploitation créateur,
- intervalle maxi entre deux vérifications.
Linux travaille toujours avec une copie du superbloc en mémoire, ce qui permet une optimisation du système.
Il effectue une mise à jour périodique : c’est ce que l’on nomme les points de synchronisation.
C’est pourquoi l’arrêt brutal du système peut le rendre incohérent et il devient nécessaire de forcer la synchronisation, par la commande : sync
Il est possible de voir le contenu du superbloc par la commande :
tune2fs–l<device du système de fichiers>
[[email protected] chantal]# tune2fs -l /dev/hda1
Last mounted on: <not available>
Filesystem UUID: af183c82-9ec3-11d4-9857-e22ed4cb6628
Filesystem magic number: 0xEF53
Filesystem revision #: 0 (original)
Filesystem features: (none)
Filesystem state: not clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 207264
Block count: 828544
Reserved block count: 41427
Free inodes: 153922
First block: 1
Block size: 1024
Fragment size: 1024
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 2032
Inode blocks per group: 254
Last mount time: Sun Mar 18 11:55:24 2001
Mount count:3
Maximum mount count:20
Last checked:Sat Mar 17 13:30:20 2001
Check interval:0 (<none>)
Reserved blocks uid:0 (user root)
Reserved blocks gid:0 (group root)
Elle permet de stocker les adresses des blocs contenant les bitmaps et la table des inodes.
Elle est constituée des éléments suivants :
- adresse du bloc image des inodes,
- adresse du premier bloc de la table des inodes,
- nombre de blocs libres,
- nombre d’inodes libres,
- nombre de répertoires.
Les images de gestion de blocs et d’inodes, libres ou utilisés, sont limitées à un bloc logique chacune.
En fait un bit prend la valeur 0 ou 1 suivant que le bloc soit libre ou utilisé.
Le même principe s’applique aux inodes.
Une taille de bloc logique de 1024 octets permet de gérer 8192 blocs ou inodes, ce qui définit la taille maximale d’un groupe de blocs.
Elle correspond à une multitude d’inodes, toutes de même taille.
Le nombre de ces inodes figure dans le superbloc : en standard 2048.
Une inode s’identifie par un numéro.
A chaque fichier est associé un inode, mais plusieurs noms de fichiers peuvent être rattachés à un seul inode : c’est ce que l’on obtient par la création de liens, à l’aide de la commande ln.
Une inode décrit toutes les caractéristiques d’un fichier.
La première inode est toujours inutilisée et la seconde correspond au répertoire racine.
La taille d’un inode est de 64 octets, composée comme indiquée sur le dessin (extrait de la bible de linux).
On distingue trois types de blocs :
- de données,
- d’indirection,
- libre
Les blocs de données sont des suites d’octets pour les fichiers.
Pour les répertoires, il s’agit de blocs d’informations sur les fichiers contenus dans le répertoire.
Si un processus veut ouvrir un fichier, il utilise un appel système qui crée un enregistrement dans une table de fichiers spécifiques au processus.
Cette table pointe sur un enregistrement de la table des fichiers utilisés par tous les processus du système.
Enfin, en dernier lieu, le système récupère dans la table des inodes l’adresse du bloc de données recherché.
Voici schématiquement ce que l’on obtient :
C’est une étape indispensable si l’on veut rendre utilisable un périphérique de stockage.
Linux sait créer des systèmes de fichiers autre que ext2fs, par exemple msdos. Pour cela nous utiliserons la commande :
mkdosfs <fichier spécial>
Pour un système de fichiers ext2fs, nous utiliserons :
mke2fs [option] <fichier spécial>
-b n pour définir la taille des blocs en octets
-c demande la vérification des blocs
-i n indique le rapport octets/inodes. Par défaut, 1 inode pour 4096 octets.
valeur mini de n : 1024.
-m n nombre de blocs réservés pour l’administrateur (5 % en général)
-q la commande s’effectue sans affichage
-S pour réinitialiser le superbloc
-v « verbose »
A priori, la commande n’est pas reconnue pour un utilisateur autre que l’administrateur.
Le montage d’un disque est un processus qui consiste à rendre le contenu du disque accessible en le fusionnant à l’arborescence des répertoires du système de fichiers.
Un système de fichiers peut être monté ou démonté, c’est-à-dire qu’il peut être « connecté » ou « déconnecté » de votre arborescence.
Cette opération s’appelle le montage ou le démontage. Attention, une fois monté sur un répertoire, le contenu de votre répertoire devient inaccessible tant que vous ne démontez pas le système de fichier.
Dans l’exemple suivant, on monte le contenu de la disquette dans le répertoire repe1 qui contient déjà un fichier. Ce dernier ne sera visible qu’après le démontage de la disquette.
[[email protected] chantal]# ls -l repe1
total 1
-rw-r--r-- 1 root root 19 Mar 25 15:00 essai
[[email protected] chantal]# mount -t msdos /dev/fd0 /home/chantal/repe1
[[email protected] chantal]# ls -l repe1
-rwxr-xr-x 1 root root 709198 Mar 14 14:14
[[email protected] chantal]# umount /dev/fd0
[[email protected] chantal]# ls -l repe1
total 1
-rw-r--r-- 1 root root 19 Mar 25 15:00 essai
Voici un exemple de système de fichiers obtenu après divers montages. L’utilisateur ne verra en fait qu’un seul arbre sans en connaître nécessairement sa constitution :
/etc/mtab
Le fichier /etc/mtab contient la liste des systèmes de fichiers montés à l’instant t.
[[email protected] chantal]$ cat /etc/mtab
/dev/hda1 / ext2 rw 0 1
/proc /proc proc rw 0 0
caldera13:(pid406) /auto auto intr,rw,port=1023,timeo=8,retrans=110,indirect,map=/etc/amd.localdev 0 0
La commande mount sans aucun argument permet de connaître les systèmes de fichiers montés sur le système.
C’est la même information que le fichier /etc/mtab, mais sous une autre forme.
Chaque ligne précise entre autre :
- le device
- le point de montage
- le type de système de fichiers
- les accès autorisés
[[email protected] chantal]$ mount
/dev/hda1 on / type ext2 (rw)
/proc on /proc type proc (rw)
calder13:(pid406) on /auto type auto (intr,rw,port=1023,timeo=8,retrans=110,indirect,map=/etc/amd.localdev)
Et en montant la disquette :
[[email protected] chantal]# mount -t msdos /dev/fd0 /home/chantal/repe1
[[email protected] chantal]# mount
/dev/hda1 on / type ext2 (rw)
/proc on /proc type proc (rw)
caldera13:(pid406) on /auto type auto intr,rw,port=1023,timeo=8,retrans=110,indirect,map=/etc/amd.localdev)
/dev/fd0 on /home/chantal/repe1 type msdos (rw)
[[email protected] chantal]# cat /etc/mtab
/dev/hda1 / ext2 rw 0 1
/proc /proc proc rw 0 0
caldera13:(pid406) /auto auto intr,rw,port=1023,timeo=8,retrans=110,indirect,map=/etc/amd.localdev 0 0
/dev/fd0 /home/chantal/repe1 msdos rw 0 0
mount [options] <fichier spécial> < point de montage>
-n supprime la mise à jour du fichier /etc/mtab
utile en phase de maintenance quand on remonte le système en rw ou quand le répertoire est en accès lecture seulement
-o permet de préciser une liste d’options de montage, séparées les unes des autres par une virgule. Parmi les plus couramment citées :
async : les E/S sont réalisées en mode asynchrone
sync : les E/S sont exécutées en mode synchrone
atime : par défaut, pour demander la mise à jour automatique de la date de dernier accès
noatime : n’effectue pas la mise à jour de la date du dernier accès (gain en rapidité)
exec : permet l’exécution des fichiers binaires
noexec : interdit l’exécution des fichiers binaires
suid : autorise l’effet des SUID et des SGID
nosuid : inhibe l’effet des SUID et des SGID
ro : montage en lecture seule
rw : montage en lecture/écriture
remount pour remonter un système préalablement monté
defaults pour appliquer les options par défaut suivantes : rw, suid, dev, exec, auto, nouser, async.
-r montage en lecture seule, strictement identique à –o ro
-t pour préciser le type de système de fichiers à monter
Il faut savoir que la commande mount est assez souvent capable de le déterminer automatiquement.
Les divers types gérés par votre distribution sont dans le fichier /proc/filesystems
[[email protected] chantal]$ cat /proc/filesystems
ext2
minix
umsdos
msdos
nodev proc
nodev nfs
iso9660
-w montage en lecture écriture.
Pour monter un CD-ROM :
[[email protected] chantal]# mount -t iso9660 /dev/hdc /mnt/cdrom
mount: block device /dev/hdc is write-protected, mounting read-only
Il est utilisé par les commandes mount, umount, fsck ou df.
Son rôle est de permettre un montage automatique lors du démarrage ou de faciliter le montage manuel, en dispensant l’administrateur de la saisie d’un certain nombre d’éléments.
De ce fait, sous réserve de l’avoir décrit dans le fichier /etc/fstab, il suffira de donner le nom du fichier spécial ou le point de montage à la commande mount .
[[email protected] chantal]#cat /etc/fstab
/dev/hda1/ext2defaults01
/proc/procprocdefault00
/dev/hda2noneswapdefaults00
#
/dev/fd0/mnt/floppyext2defaults,noauto00
#
/dev/hdc/mnt/cdromiso9660ro,noauto00
Chaque ligne du fichier comprend 6 champs :
champ1 nom du fichier spécial ou du système de fichier distant
champ2 nom du point de montage ou none pour les partitions swap
champ3 type du système de fichier
ext2 linux
msdos
vfat pour windows
iso9660 pour les CD-ROM
nfs pour le système de fichiers réseau
swap pour la partition swap
ignore pour inhiber la ligne – idem si elle est en commentaire
champ4 options de montage, séparées par une virgule
les mêmes que pour la commandes mount, plus :
auto pour monter automatiquement le système
noauto inhibe le montage automatique
user autorise tout utilisateur à monter le système de fichiers. ceci implique les options noexec, nosuid et nodev
nouser seul l’administrateur peut monter ce système de fichiers
sw doit être indiqué pour permettre l’activation automatique de la zône de swap
usrquota pour permettre l’activation du mécanisme des quotas utilisateurs
grpquota pour permettre l’activation du mécanisme des quotas sur les groupes
champ5 précise comment le système de fichiers doit être pris en compte par la commande dump. Cette commande assure la sauvegarde des systèmes de fichiers. (valeur de 0 (sauver tout) à 9 (par défaut – sauvegarde incrémentielle)
1 généralement pour le système racine et une valeur > 1 pour le reste.
umount [options] {<device>ou <point de montage>}
Le démontage se fait soit en indiquant le device soit en précisant le point de montage. Attention, on ne peut pas démonter un système si l’on n’est pas positionné ailleurs que dans le répertoire de montage : on ne coupe pas la branche sur laquelle on est assis ! !
Parmi les options :
-a pour démonter tous les systèmes de fichiers
-n démontage sans mise à jour du fichier /etc/mtab
-r remonte le système de fichiers en lecture seule si le démontage échoue
-t <type> démonte uniquement les sytèmes de fichiers du type cité
[[email protected] chantal]#umount /dev/fd0
Il arrive quelquefois que l’on ne puisse pas démonter un système de fichiers, l’un des fichiers étant en cours d’utilisation.
Pour connaître les fichiers et les processus concernés :
fuser [options] <nom de fichiers ou de répertoires ou de fichiers spéciaux>
Par défaut, la commande indique la liste des PID utilisant l’argument cité.
Chaque PID est suivi d’un caractère précisant le type d’accès :
c répertoire courant
e c’est un exécutable
f fichier ouvert
r répertoire racine
m librairie partagée
Parmi les options :
-k envoi le signal SIGKILL aux processus utilisant le nom cité
-<signal> précise le signal à envoyer à la place du signal kill
-i demande confirmation avant d’envoyer le signal aux processus
-m pour spécifier que l’argument est un système de fichiers
-u pour avoir le nom de l’utilisateur pour chaque processus
[[email protected] chantal]#fuser-u/home/chantal
/home/chantal:713c(chantal)733c(root)734c(root)
fsck [options] <point de l’arbre à vérifier>
Quelquefois, les informations du super bloc ne correspondent à la structure réelle du système de fichiers : il y a incohérence.
La commande fsck permet d’y rémédier en activant divers utilitaires.
Il est conseillé d’exécuter cette commande en mode maintenance (mono utilisateur) et sur des systèmes de fichiers démontés.
Parmi les options :
-A vérifieles systèmes de fichiers présents dans /etc/fstab
-R combiné à A,demande à ne pas vérifier le système racine
-P combinée, pour avoir une vérification en parallèle de plusieurs systèmes de fichiers
-t pour spécifier le type des systèmes de fichiers à vérifier
-a pour demander une réparation automatique sans en référer à l’utilisateur ( attention, ce peut être risqué)
Le mécanisme de swapping utilise soit un fichier soit une partition entière.
Dans le second cas, la zône de swap se gère comme un système de fichiers même si ce n’est pas tout à fait le cas.
De ce fait, il est nécessaire de la monter à l’amorçage du système.
Voici toutes les opérations qui vous permettront d’optimer votre swapping :
- créer une partition : fdisk ….
- typer la partition en linux swap (type 82)
- initialiser cette partition :
mkswap [options] <fichier spécial>
avec -c pour vérifier la partition
- activer la zône de swap :
manuellement
swapon <fic spécial>
automatiquement
dans /etc/fstab rajouter :
/dev/hd…noneswapsw
Si vous souhaitez désactiver une zône de swapping :
swapoff <fic special>
Il ne correspond pas à un emplacement sur disque mais simplement à un lien entre diverses informations du noyau du système, au travers de pseudo-fichiers.
Ces fichiers ne sont accessibles qu’en lecture, le plus souvent avec la commande cat.
[[email protected] chantal]# ls -l /proc
dr-xr-xr-x3 rootroot0 Mar 25 19:21 1
dr-xr-xr-x3 rootroot0 Mar 25 19:21 2
dr-xr-xr-x3 rootroot0 Mar 25 19:21 21
dr-xr-xr-x3 rootroot0 Mar 25 19:21 22
dr-xr-xr-x3 rootroot0 Mar 25 19:21 24
dr-xr-xr-x3 rootroot0 Mar 25 19:21 3
dr-xr-xr-x3 rootroot0 Mar 25 19:21 361
dr-xr-xr-x3 binroot0 Mar 25 18:27 363
dr-xr-xr-x3 rootroot0 Mar 25 18:27 370
dr-xr-xr-x3 rootroot0 Mar 25 18:27 371
dr-xr-xr-x3 rootroot0 Mar 25 18:27 386
dr-xr-xr-x3 rootroot0 Mar 25 18:27 389
dr-xr-xr-x3 rootroot0 Mar 25 18:27 398
dr-xr-xr-x3 rootroot0 Mar 25 19:21 4
dr-xr-xr-x3 rootroot0 Mar 25 18:27 406
…
-r--r--r-- 1 root root 0 Mar 25 19:21 cmdline
-r--r--r-- 1 root root 0 Mar 25 19:21 cpuinfo
-r--r--r-- 1 root root 0 Mar 25 19:21 devices
-r--r--r-- 1 root root 0 Mar 25 19:21 dma
-r--r--r-- 1 root root 0 Mar 25 19:21 filesystems
-r--r--r-- 1 root root 0 Mar 25 19:21 interrupts
-r--r--r-- 1 root root 0 Mar 25 19:21 ioports
-r-------- 1 root root 33558528 Mar 25 19:21 kcore
-r-------- 1 root root 0 Mar 25 11:55 kmsg
-r--r--r-- 1 root root 0 Mar 25 19:21 ksyms
-r--r--r-- 1 root root 0 Mar 25 18:29 loadavg
-r--r--r-- 1 root root 0 Mar 25 19:21 locks
-r--r--r-- 1 root root 0 Mar 25 19:21 mdstat
-r--r--r-- 1 root root 0 Mar 25 19:21 meminfo
-r--r--r-- 1 root root 0 Mar 25 19:21 modules
-r--r--r-- 1 root root 0 Mar 25 19:21 mounts
dr-xr-xr-x 2 root root 0 Mar 25 18:27 net
-r--r--r-- 1 root root 0 Mar 25 19:21 pci
dr-xr-xr-x 2 root root 0 Mar 25 19:21 scsi
-r--r--r-- 1 root root 0 Mar 25 19:21 stat
dr-xr-xr-x 5 root root 0 Mar 25 19:21 sys
-r--r--r-- 1 root root 0 Mar 25 18:56 uptime
-r--r--r-- 1 root root 0 Mar 25 19:21 version
On voit que pour chaque process un répertoire est créé, dans lequel figurent des pseudo fichiers permettant l'accès aux variables internes du noyau.
Même si la taille de ces derniers est toujours 0, un contenu existe.
Dans chaque répertoire relatif à un processus en exécution, on a :
[[email protected] chantal]# ls -l /proc/1
total 0
-r--r--r-- 1 root root 0 Mar 25 19:24 cmdline
lrwx------ 1 root root 64 Mar 25 19:24 cwd -> [0301]:2
-r-------- 1 root root 0 Mar 25 19:24 environ
lrwx------ 1 root root 64 Mar 25 19:24 exe -> [0301]:162576
dr-x------ 1 root root 0 Mar 25 19:24 fd
pr--r--r-- 1 root root 0 Mar 25 19:24 maps
-rw------- 1 root root 0 Mar 25 19:24 mem
lrwx------ 1 root root 64 Mar 25 19:24 root -> [0301]:2
-r--r--r-- 1 root root 0 Mar 25 19:24 stat
-r--r--r-- 1 root root 0 Mar 25 19:24 statm
-r--r--r-- 1 root root 0 Mar 25 19:24 status
cmdline donne la ligne de commande du processus
cwd c'est un lien sur le répertoire courant du processus
environ contient l'environnement du processus
exe c'est un lien sur le fichier exécutable
fd répertoire contenant les liens sur les fichiers ouverts
maps liste des zônes mémoire du processus
mem contenu de l'espace d'adressage du processus
stat,statm,status informations sur l'état du processus
[[email protected] 588]#cat cmdline
/bin/login-h192.168.1.41-p[[email protected] 588]
[[email protected] 588]#cd cwd
[[email protected] cwd]#ls -l
drwxr-xr-x5 400users1024 Mar 17 13:14 anatole
dr-xr-xr-x2 rootroot512 Apr1 10:09 auto
drwxr-xr-x2 rootroot2048 Mar 31 19:25 bin
drwxr-xr-x2 rootroot1024 Oct 10 15:39 boot
drwxr-xr-x2 rootroot1024 Oct 10 14:30 bru
-rw-r--r--1 rootroot1474560 Oct 13 15:00 chantal
drwxr-xr-x3 rootroot16384 Apr1 10:09 dev
drwxr-xr-x27 rootroot3072 Apr1 10:20 etc
drwxr-xr-x12 rootroot1024 Mar 31 19:10 home
[[email protected] 588]#cd fd
[[email protected] fd]#ls -l
total 0
lrwx------1 rootroot64 Apr1 10:44 0 -> [0301]:144809
lrwx------1 rootroot64 Apr1 10:44 1 -> [0301]:144809
lrwx------1 rootroot64 Apr1 10:44 2 -> [0301]:144809
lrwx------1 rootroot64 Apr1 10:44 3 -> [0000]:1002
[[email protected] 588]#cat maps
08048000-0804c000 r-xp 00000000 03:01 50862
0804c000-0804d000 rw-p 00003000 03:01 50862
0804d000-0804f000 rwxp 00000000 00:00 0
40000000-40006000 r-xp 00000000 03:01 65040
40006000-40007000 rw-p 00005000 03:01 65040
40007000-40008000 rw-p 00000000 00:00 0
40009000-4000a000 rwxp 00000000 03:01 34572
…
[[email protected] 588]#cat statm
183 183 107 5 0 178 75
[[email protected] 588]#cat status
Name:login
State:S (sleeping)
Pid:588
PPid:587
Uid:500500500500
Gid:500500500500
VmSize:1088 kB
VmLck:0 kB
VmRSS:728 kB
VmData:256 kB
VmStk:12 kB
VmExe:16 kB
VmLib:588 kB
SigPnd: 00000000
SigBlk: 00000000
SigIgn: 80080002
SigCgt: 00000000
Hors mis les informations sur chacun des processus, les fichiers principaux sont :
devices liste des pilotes
dma liste des canaux dma utilisés
interrupts liste des interruptions utilisées
ioports liste des ports utilisés
loadavg charge moyenne du système
meminfo état de la mémoire
modules liste des modules chargés
net répertoire contenant les informations sur le réseau
scsi répertoire contenant les informations sur les périphériques scsi
sys répertoire contenant des variables du noyau
Quelques informations sur la mémoire :
[[email protected] /proc]# cat meminfo
total: used: free: shared: buffers: cached:
Mem: 31625216 12656640 18968576 10555392 1216512 6127616
Swap: 2060288 0 2060288
MemTotal: 30884 kB
MemFree: 18524 kB
MemShared: 10308 kB
Buffers: 1188 kB
Cached: 5984 kB
SwapTotal: 2012 kB
SwapFree: 2012 kB
Sur la version du noyau :
[[email protected] /proc]# cat version
Linux version 2.0.35 () (gcc version 2.7.2.3) #1 We
d Aug 19 12:57:30 MST 1998
Sur les modules actifs :
[[email protected] /proc]#cat modules
iBCS260
fet304321
ipx31
misc10
ppp50
slip20
slhc2[ppp slip]0
lp20
isofs50
nfs125
sg10
st60
sr_mod40
sd_mod40
scsi_mod10[sg st sr_mod sd_mod]4
839020
Les informations retournées par le pseudo-fichier stat sont:
cpu temps passé dans les états user, nice, system et idle en 1/100 de seconde
disk pour les quatre premiers disques, le résumé des opérations effectuées
disk_rio lecture
disk_wio écriture
disk_rblk lecture blocs
disk_wblk écriture blocs
page pages lues et écrites
swap compte des échanges en lecture et écriture
intr total des interruptions depuis le démarrage
ctxt nombre de changements de contexte
btime heure du démarrage
processes dernier PID utilisé
[[email protected] /proc]#cat stat
cpu38501418320280
disk 2130000
disk_rio 1407000
disk_wio 723000
disk_rblk 2820000
disk_wblk 1446000
page 4993975
swap 10
intr 337373 322083 81 0 0 0 0 2 0 0 0 0 3261 0 1 11945 0
ctxt 20115
btime 986119726
processes 676
Par exemple, extrait du fichier des utilisateurs, on trouve un utilisateur du nom de bin, de lp, de daemon ..
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
lp:x:4:7:lp daemon:/var/spool/lpd:/bin/bash
games:x:12:100::/var/games:/bin/bash
man:x:13:2::/var/cache/man:/bin/bash
at:x:25:25::/var/spool/atjobs:/bin/bash
postgres:x:26:2:Postgres Database Admin:/var/lib/pgsql:/bin/bash
La gestion des utilisateurs tourne principalement autour de 3 fichiers :
/etc/passwd
/etc/group
/etc/shadow
Le premier fichier correspond aux utilisateurs et à la définition de leur environnement de travail. Le deuxième englobe la définition des groupes d’utilisateurs et l’association utilisateur – groupe.
Le dernier fichier est arrivé plus tard dans la conception des systèmes du monde Unix. Il renferme les mots de passe, qui auparavant étaient stockés dans le fichier /etc/passwd.
L’étape de création d’un utilisateur passe par plusieurs phases :
- donner un nom de connexion à l’utilisateur, ce qui suppose que l’on applique des règles d’ «appellation » et dans tous les cas que l’on vérifie la non existence du pseudo choisi,
- affecter l’utilisateur à un groupe primaire et éventuellement à des groupes secondaires,
- lui définir des paramètres de vieillissement de sont mot de passe,
- créer son répertoire de connexion
- placer dans ce répertoire, les fichiers d’initialisation (assez souvent en /etc/skel)
Bien évidemment, on pourrait éditer les 3 fichiers cités ci-dessus et les modifier pour y insérer un nouvel utilisateur.
Certes il faudrait connaître parfaitement l’algorithme de cryptage des mots de passe et n’avoir que cela à faire. De plus, il y a un risque non négligeable d’erreur de saisie et d’accès multiples à un même fichier à l’instant « t ».
Pour toutes ces raisons, il est conseillé d’utiliser les commandes ou outils de création ou modification des utilisateurs, mais ceci n’empêche pas le contrôle de ce qui est fait. C’est pourquoi nous nous attacherons aussi à la structure des fichiers.
[email protected]:~ > cat /etc/passwd
nobody:x:65534:65534:nobody:/var/lib/nobody:/bin/bash
chantal:x:500:100:tsmsi cfpa:/home/chantal:/bin/bash
news:x:9:13:News system:/etc/news:/bin/bash
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
roland:x:501:101::/home/roland:/bin/bas
Chaque enregistrement est constitué de 7 champs, séparés par le symbole :
Syntaxiquement, voici la signification de ces champs :
nom :x :UID :GID :information :répertoire de connexion :shell de connexion
nom de connexion de l’utilisateur.
8 caractères maximum, quelque fois un minimum à 3 ou 5 caractères suivant les distributions.
anciennement, emplacement du mot de passe qui est donc maintenant dans le fichier /etc/shadow, pour une plus grande sécurité.
Si l’enregistrement correspond à un compte désactivé, on retrouve * dans ce champ.
Cet emplacement a été gardé par souci de portabilité des différents Unix et des divers scripts développés avec l’ancienne structure d’enregistrement.
identificateur numérique du compte
En fait, il existe une plage d’identificateurs prédéfinis :
0 root
1 – 99 comptes système
? 100 comptes utilisateurs
-1 compte nobody, utilisé par NFS (Network File System)
ou 65534
identificateur numérique du groupe principal auquel appartient l’utilisateur
pages de valeurs prédéfinies suivant la même logique que pour l’UID
0 root
A l’origine ce champ contenait un certain nombre d’informations sur l’utilisateur.
[email protected]:~ > finger chantal
Login: chantal Name: tsmsi cfpa
Directory: /home/chantal Shell: /bin/bash
Last login Thu Mar 15 15:02 (CET) on 2 from 192.168.1.40
No Mail.
No Plan.
C’est le répertoire dans lequel se retrouve l’utilisateur, dès que la procédure de connexion a réussie.
Il est exécuté une fois la connexion établie. Généralement, pour linux, il s’agit du bash, mais rien n’empêche de préciser un autre shell. Seule précaution à prendre, s’assurer qu’il figure dans le fichier /etc/shells, sinon il faudra le rajouter.
[email protected]:~ > cat /etc/shells
/bin/ash
/bin/bash
/bin/bash1
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/true
/usr/bin/csh
/usr/bin/ksh
/usr/bin/rbash
/usr/bin/tcsh
/usr/bin/zsh
[email protected]:~ > cat /etc/shadow
dpbox:*:8902:0:10000::::
ingres:*:8902:0:10000::::
codadmin:*:8902:0:10000::::
zope:*:8902:0:10000::::
nobody:*:0:0:10000::::
chantal:5xT4RY1nbrRRk:11390:0:99999:7:0::
roland:ee2tteBxaxpKc:11389:0:99999:7:0::
Un enregistrement par utilisateur et 8 champs par enregistrement.
Syntaxiquement, les enregistrements sont de la forme :
nom:mot de passe: changement: au plus tôt: au plus tard: avertissement: inactivé le: inactif le: réservé
le nom de l’utilisateur
il peut être préfixé par LK pour un compte verrouillé ou avoir la valeur « RETIRED » pour un compte supprimé
date de la dernière modification du mot de passe, exprimé en nombre de jours à compter du 01/1/1970
nombre de jours à partir duquel l’utilisateur peut changer le mot de passe.
nombre de jours à partir duquel l’utilisateur doit changer le mot de passe. En deça, le mot de passe reste valide.
nombre de jours, avant la date d’expiration du mot de passe, à partir desquels l’utilisateur est averti qu’il doit changer son mot de passe
nombre de jours, depuis le 01/01/1970, au bout desquels le compte est automatiquement désactivé.
pwck
Il ne s’agit que d’une vérification, mais en rien une modification profonde de l’existant, simplement quelquefois des propositions.
Charge à l’administrateur d’apporter les rectifications.
Les vérifications portent sur :
- le nombre de champs,
- l’unicité des noms d’utilisateur
- la validité des UID et GID
- la validité du groupe primaire,
- la validité du répertoire de connexion,
- la validité du shell de connexion.
Cette commande n’est acceptée par le système que si vous en êtes l’administrateur.
[[email protected] chantal]$ pwck
bash: pwck: command not found
[[email protected] chantal]# pwck
user gopher: directory /usr/lib/gopher-data does not exist
user stephane: directory /home/stephane/(null) does not exist
no matching password file entry
delete line `toto:1NZn8bdk8GWso:11345:0:10000:-1:-1:-1:1073905584'? n
pwck: no changes
[email protected]:~ > cat /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:
sys:x:3:
tty:x:5:
disk:x:6:
lp:x:7:
wwwadmin:x:8:
kmem:x:9:
Syntaxiquement :
nom : mot de passe :GID :liste des utilisateurs
soit laissé vierge,
soit avec x ce qui correspond à une absence de mot de passe
soit avec *, si le groupe est verrouillé
les divers noms d’utilisateurs sont séparés par une virgule. Il n’existe aucune hiérarchie quand à l’ordre des noms dans la liste.
grpck
Mêmes principes que pour la commande pwck :
- être l’administrateur,
- quelques propositions de modification.
[[email protected] chantal]# grpck
group users: no user -p
delete member `-p'? n
group users: no user toto
delete member `toto'? n
group toto: no user toto
delete member `toto'? n
Elle peut se faire par deux commandes :
- adduser <nom user>, assez ancienne, ne permettant pas de tout faire, et pas toujours implémentée
- useradd [options] <nom user>, à utiliser de préférence
-c <commentaire> remplit le champ information
-d <répertoire> indique le répertoire de connexion du compte à créer
-e <date> définit la date d’expiration du compte sous la forme MM/JJ/A
-f <inactif> précise le nombre de jours maximum au bout desquels le compte sera désactivé, après l’expiration du mot de passe
0 désactive immédiatement à l’expiration
-1 ne désactive jamais après l’expiration
-g <groupe primaire> groupe primaire, sous la forme GID ou par le nom du groupe primaire
-G <groupe1, groupe2…> définit la liste des groupes secondaires auxquels appartient l’utilisateur. Attention, cette option n’est pas toujours acceptée suivant les distributions, auquel cas il suffit d’utiliser la commande usermod.
-m demande la création du répertoire de connexion s’il n’existe pas
-s <shell> définit le shell de connexion
-u uid attribue l’UID (unique et positive) au compte
Si certaines des données spécifiques ne sont pas mentionnées, linux prend les valeurs par défaut.
Ces valeurs sont mémorisées dans un fichier qui, malheureusement, n’est pas toujours le même suivant les distributions.
Assez souvent il s’agit de /etc/default/useradd (Suse par exemple) ou bien de (Caldera par exemple).
Dans le pire des cas, il vous reste la ressource de passer la commande « man useradd » pour connaître le fichier des valeurs par défaut.
useradd –D sans aucun autre paramètre, permet d’afficher les valeurs par défaut qui seront retenues lors de la création d’un utilisateur.
[[email protected] /anatole]# useradd -D
GROUP=100
SHELL=/bin/sh
SKEL=/etc/skel
PASS_MIN_DAYS=0
PASS_MAX_DAYS=-1
PASS_WARN_DAYS=7
PASS_INACTIVE=-1
PASS_EXPIRE=-1
Voici le contenu du fichier des valeurs par défaut, l’un extrait de la distribution de Suse v7.0, l’autre extrait de la distribution de caldera v1.3.
[email protected]:~ > cat /etc/default/useradd
GROUP=100
INACTIVE=0
SHELL=/bin/bash
SKEL=/etc/skel
[[email protected] chantal]# cat
###
# Password aging controls: (used by useradd and pwconv)
# Maximum number of days a password may be used:
# (-1 = no password changes are necessary)
PASS_MAX_DAYS -1
# Minimum number of days allowed between password changes:
PASS_MIN_DAYS 0
# Number of days warning given before a password expires:
PASS_WARN_AGE 7
# Number of days till account is closed after password has expired:
PASS_INACTIVE -1
# Force expiry at given day: (in days after 70/1/1, -1 = don't force)
PASS_EXPIRE -1
###
# Default values for useradd
# default group:
GROUP 100
# user´s home directory: (%s = name of user)
HOME /home/%s
# default user shell:
SHELL /bin/sh
# directory where the home directory skeleton is located:
SKEL /etc/skel
###
# Min/max values for automatic gid selection in groupadd
#
GID_MIN 100
GID_MAX 60000
Vous remarquerez l’utilisation de variables système.
Pour celles qui sont communes au deux fichiers :
GROUP identifiant du groupe principal
HOME répertoire qui contient le répertoire de connexion du compte
SHELL shell de connexion attribué au compte
SKEL répertoire contenant les fichiers copiés par défaut dans le répertoire de l’utilisateur
Créons maintenant deux utilisateurs.
Le premier, anatole, ne sera pas défini avec les valeurs par défaut.
Le second, Jules, sera créé le plus simplement possible.
[[email protected] chantal]# useradd -c "creation avec commentaires" -d /anatole -e
03/19/01 -f 3 -g 100 -m -u 475 anatole
On vérifie dans le fichier /etc/passwd et dans le fichier /etc/shadow que les paramètres aient été intégrés, sans oublier que les dates du second fichier sont exprimées par rapport au 01/01/1970 :
[[email protected] chantal]#cat /etc/passwd
anatole:x:475:100:creation avec commentaires:/anatole:/bin/sh
[[email protected] chantal]#cat /etc/shadow
anatole:*not set*:11398:0:-1:7:3:-24653:
Le répertoire /anatole a bien été créé :
[[email protected] /]#ls -l
drwxr-xr-x5 400users1024 Mar 17 13:14 anatole
Création de l’utilisateur Jules :
[[email protected] /anatole]#adduser Jules
Looking for first available UID 502
Looking for first available GID 504
Adding login: Jules done.
Creating home directory: /home/Jules done.
Creating mailbox: /var/spool/mail/Jules done.
Don't forget to set the password.
[[email protected] /anatole]#cat /etc/passwd
Jules:x:502:504:Caldera OpenLinux User:/home/Jules:/bin/bash
[[email protected] /anatole]#cat /etc/shadow
Jules:*notset*:9000:0:10000::::
usermod [options] <nom user>
Cette commande reprend l’ensemble des options de la commande useradd, avec en plus :
-l pour modifier le nom d’un utilisateur, sous réserve qu’il ne soit pas connecté
Même si cela est possible, il n’est pas conseillé de modifier le nom d’un utilisateur. il est préférable dans ce cas de le recréer.
De la même façon, il est dangereux de modifier l’UID d’un utilisateur, sans se soucier de procéder à la même modification pour l’ensemble des fichiers lui appartenant.
Ne perdez pas de vue qu’en modifiant nom ou UID, certains jobs en attente risquent de se retrouver sans propriétaire, ce qui est fâcheux pour votre système (jobs cron, at et d’impression).
[[email protected] Jules]# usermod -l jules Jules
userdel [-r] <nom user>
Si l’option –r est précisée, le système supprime le répertoire de connexion de l’utilisateur et tous les fichiers qu’il contient.
Par contre, les fichiers situés à un autre point de l’arborescence devront être supprimés manuellement.
Il est toujours possible de le faire manuellement, en supprimant l’enregistrement correspondant dans /etc/passwd et /etc/shadow et en recherchant tous les fichiers lui appartenant pour les supprimer.
Pensez aussi à effacer la partie de son système de fichiers :
rm –r /home/nom user
Si l’utilisateur supprimé appartenait à un certain nombre de groupes secondaires, la commande userdel ne modifie absolument pas les enregistrements concernés dans /etc/group.
Il y a donc trois possibilités :
- la correction manuelle du fichier /etc/group, hasardeuse et non garantie
- l’exécution de la commande grpck après la suppression du compte utilisateur, ce qui aura pour effet de mettre en exergue l’ensemble des enregistrements dans lesquels figurait l’utilisateur supprimé, avec une possibilité de rectifier ces enregistrements.
- l’utilisation de la commande gpasswd (voir plus loin)
groupadd -g GID<nom groupe>
[[email protected] Jules]# groupadd -g 102 essai
[[email protected] Jules]# cat /etc/group
…
essai::102:
Il est bien sûr possible de créer un groupe en insérant directement un enregistrement dans le fichier /etc/group, mais le risque d’erreur est non négligeable ; je vous laisse conclure ce que cela signifie en terme de sécurité et de cohérence …..
groupmod [-g GID [-o]] [-n <nouveau nom> ] <nom du groupe>
-g GID modifie le GID du groupe, qui doit être unique sauf si l’option –o est précisé
-n <nouveau nom> change le nom du groupe
[[email protected] Jules]# groupmod -g 504 -o -n essai2 essai
[[email protected] Jules]# cat /etc/group
essai2::504:
-p::501:-p
toto::502:toto
admin2::503:admin2
Jules::504:jules
Attention, la modification d’un groupe ne doit pas être faite à la légère et l’exemple ci-dessus est là à titre d’exemple à éviter. Imaginez les fichiers appartenant au groupe Jules vont soudainement appartenir au groupe essai2…
groupdel <nom groupe>
[[email protected] Jules]# groupdel essai2
Supprimer un groupe n’est en rien anodin ; Les fichiers dont le groupe est propriétaire vont soudainement se retrouver avec une ascendance erronée. Il faut, avant toute suppression, attribuer les fichiers à un autre groupe.
Il est toujours possible de supprimer un groupe en travaillant directement dans le fichier /etc/group
newgrp <nom du groupe secondaire>
L’intérêt est uniquement en terme de droits sur les fichiers et les répertoires, en fonction du groupe auquel on appartient.
[[email protected] chantal]$ ls -l fic1
-rw-rw-r-- 1 chantal chantal 23 Mar 17 17:56 fic1
[[email protected] chantal]$ newgrp root
[[email protected] chantal]$ cat > fic2
creat fic2
grp 0
[[email protected] chantal]$ ls -l fic2
-rw-r--r-- 1 chantal root 17 Mar 17 17:57 fic2
et pour un utilisateur appartenant à plusieurs groupes, on peut ainsi obtenir des fichiers, sous le même répertoire, mais avec des groupes propriétaire différents.
[[email protected] chantal]$ ls -l fic*
-rw-rw-r-- 1 chantal chantal 23 Mar 17 17:56 fic1
-rw-r--r-- 1 chantal root 17 Mar 17 17:57 fic2
-rw-r--r-- 1 chantal Jules 24 Mar 17 17:58 fic3
passwd[<nom user>]
Si vous êtes un simple utilisateur, vous pouvez changer votre mot de passe avec la commande passwd simplement.
gpasswd [option] <nom groupe>
Cette commande permet, dans son utilisation la plus simple de donner un mot de passe au groupe. Toutefois, pour réaliser ceci, il faut que le fichier /etc/gshadow existe. Pour un certain nombre de distributions, ce fichier est totalement inexistant. Il vous faut donc, avant toutes choses, en générer un vide.
[[email protected] chantal]# cat > /etc/gshadow
[[email protected] chantal]# gpasswd moi
Changing the password for group moi
New Password:
Re-enter new password:
Voici l’enregistrement du fichier /etc/gpasswd :
[[email protected] chantal]# cat /etc/gshadow
moi:2V3hvfYItJxFg::moi,chantal
et dans le fichier /etc/group, voici les transformations :
[[email protected] chantal]$cat /etc/group
moi:!:506:moi,chantal
L’administrateur peut désigner de 0 à n administrateurs par groupe. Ces derniers peuvent à leur tour gérer le groupe, en y intégrant ou en supprimer des membres du groupe.
Faute d’administrateur particulier, c’est root qui est d’office l’administrateur des groupes.
-A permet de désigner un ou des administrateurs pour un groupe
-M supprime un administrateur de groupe
-r permet de supprimer le mot de passe du groupe
[[email protected] chantal]# gpasswd -A chantal,totoche moi
[[email protected] chantal]# gpasswd -M chantal moi
[[email protected] chantal]#gpasswd -A chantal moi
Vous êtes utilisateur, administrateur d’un groupe :
-a pour ajouter un membre à votre groupe
-d pour supprimer un membre de votre groupe
[[email protected] chantal]$gpasswd -a totoche moi
Adding user totoche to group moi
[[email protected] chantal]$cat /etc/group
moi:!:506:moi,chantal,jules,totoche
[[email protected] chantal]$gpasswd -d totoche moi
Removing user totoche from group moi
id
Vous avez fait plusieurs manipulations et vous ne savez plus très bien sous quelle identité vous vous trouvez. La commande id vous apportera une réponse.
uid=500(chantal) gid=500(chantal) groups=500(chantal),506(moi)
[[email protected] chantal]$ newgrp moi
[[email protected] chantal]$ id
uid=500(chantal) gid=506(moi) groups=500(chantal),506(moi)
Vous avez créé les utilisateurs, les groupes, les mots de passe de chacun, les administrateurs de groupe…, bref maintenant tout ce beau doit pouvoir se connecter.
Il faut donc configurer correctement le processus de connexion (login).
Dans les versions plus anciennes d’Unix, la grosse partie devait se faire dans les scripts de shell et en très grande partie dans le fichier /etc/profile, sous la forme si …alors…sinon …
Maintenant avec la shadow-suite, le maximum d’éléments peut être intégré dans le fichier .
Nous avons vu, dans l’un des chapitres précédents, que les entrées du fichier /etc/inittab permettent de lancer la commande /sbin/getty ou /sbin/mgetty ou /sbin/mingetty suivant les distributions.
Ces programmes initialisent l’écran et affichent le message de connexion.
Dès qu’un nom est saisi, la commande /bin/login est lancée, avec comme argument le nom de l’utilisateur et comme fichier paramètres .
Le mot de passe est alors demandé, même si le nom de l’utilisateur n’est pas trouvé dans le fichier /etc/passwd.
Ce processus est fait volontairement pour éviter de donner des indications à toute personne tentant de se connecter frauduleusement à un système : ainsi elle ne saura pas si l’utilisateur est inexistant ou si le mot de passe est incorrect.
Le mot de passe saisi est crypté et comparé à celui qui est mémorisé dans /etc/shadow.
Soit il est erroné et le message « login failed » apparaît, soit il est correct et le système vérifie que le compte soit toujours valide.
La commande /bin/login exécute ensuite le shell défini dans le dernier champ de l’enregistrement user du fichier /etc/passwd ( /bin/bash ) et prend en charge le script d’initialisation.
- exécution du script /etc/profile,
- positionnement dans le répertoire de l’utilisateur,
- recherche de l’un des fichiers suivants, le premier rencontré étant celui qui sera exécuté (sachant que le shell exécuté est le bash et non le C-shell ou ..):
.bash_profile
.bash_login
.profile
- le script .bashrc est exécuté par l’un des 3 fichiers ci-dessus
Le fichier /etc/motd est affiché sauf si le fichier .hushlogin existe dans le répertoire de connexion de l’utilisateur. Seule l’existence de ce fichier importe, pas son contenu.
C’est le centre de définition pendant le processus de connexion.
Il est constitué
- soit de ligne commentaires commençant par #
- soit de ligne de définition, sous la forme :
<nom variable> valeur
Le contenu de ce fichier sera exploité par diverses commandes au cours de la session.
Voici les principales définitions :
? CONSOLE
Définit sur quel écran root peut se connecter. Ce peut être le nom d’un fichier contenant des noms de périphériques ou un nom de périphérique.
Si plusieurs fichiers sont utilisés, il faut séparer leur nom par le symbole :
Assez souvent la définition est faite dans le fichier /etc/securetty
[[email protected] chantal]$ cat /etc/securetty
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
?DEFAULT_HOME
Si la valeur est yes, la connexion se fera même si le répertoire de base de l’utilisateur n’est pas accessible ou n’existe pas.
?ENV_HZ(history size)HZ
?ENV_PATHPATH
?ENVIRON_FILE
Nom d’un fichier permettant de définir l’environnement du shell
?ERASECHAR
valeur exprimée en décimal, octal ou hexa pour indiquer le code du caractère d’effacement.
voir stty (erase)
?FAIL_DELAY
durée en secondes séparant une tentative de connexion et l’affichage de l’invite login
si cette variable est égale à yes, toutes les tentatives de login qui ont échoué sont enregistrées dans /var/log/faillog
? GID_MAX valeur maxi du GID
? GID_MIN valeur mini du GID
? HUSHLOGIN_FILE
Définition du nom du fichier évitant d’afficher /etc/motd
?ISSUE_FILE_ENAB
si la valeur est yes, le fichier /etc/issue sera affiché avant le message login:
? KILLCHAR
idem ERASECHAR mais pour le caractère permettant d’effacer l’ensemble de la ligne saisie.
?LASTLOG_ENAB
si la valeur est yes, les connexions sont enregistrées dans le fichier /var/log/lastlog
?LOG_UNKFAIL_ENAB
si la valeur est yes, en cas d’echec de la connexion du à un nom de user erroné, le système l’indiquera à l’utilisateur.
A éviter, faille de sécurité.
? LOGIN_RETRIES nombre de tentatives de connexion avant verrouillage
?LOGIN_TIMEOUT durée maxi du processus de connexion
?MAIL_CHECK_ENAB yes si contrôle d’arrivée de nouveaux messages
?MAIL_DIR chemin d’accès du répertoire contenant les messages
? MOTD_FILE liste des fichiers à afficher autre que /etc/motd (séparés par : )
? NOLOGINS_FILE
indique un nom de fichier dans lequel on précise un message. Ce message est affiché à tout utilisateur autre que root se connectant et la connexion lui est ensuite refusée.
?PASS_ALWAYS_WARM
si la valeur est yes, et si l’administrateur emploie un mot de passe trop court, un message est affiché
?PASS_CHANGE_TRIES nb tentatives pour changer le mot de passe
? PASS_MAX_DAYS durée de vie du mot de passe exprimée en jours
? PASS_MAX_LEN longueur maxi d’un mot de passe
? PASS_WARM_AGE nb jours afin de validité du mot de passe, pour message
? PORTTIME_CHECKS_ENAB
? UID_MAX valeur maxi UID
? UID_MIN valeur mini UID
? ULIMIT taille maxi d’un fichier
? UMASK valeur par défaut des droits des nouveaux fichiers et répertoires
C’est un réel problème pour un administrateur. Bon nombre d’utilisateurs quittent leur poste de travail sans se déconnecter et laissent ainsi une faille de sécurité importante.
Il est toujours possible de regarder minutieusement les process en activité et d’en déduire les postes qui sont connectés inutilement. Mais ceci représente quelquefois un risque de non satisfaction de l’utilisateur.
Une autre méthode permet de limiter les dégâts en précisant qui peut avoir accès, quand et par quel terminal (/etc/porttime - voir suite du cours)
Le processus démon logoutd, démarré à partir du fichier /etc/rc.. ou d’un autre script de connexion interroge régulièrement le fichier :etc/porttime. Ceci permet une déconnexion automatique des utilisateurs.
lastlog [option]
-u <nom user>
-t <nombre de jours>
Cette command analyse le contenu du fichier /var/log/lastlog.
[[email protected] chantal]# lastlog
Username Port From Latest
root tty4 Sun Mar 18 17:11:27 2001
bin **Never logged in**
…
ftp **Never logged in**
man **Never logged in**
majordom **Never logged in**
postgres **Never logged in**
col **Never logged in**
stephane **Never logged in**
admin2 ttyp0 192.168.1.41 Sun Feb 4 16:59:13 2001
totoche **Never logged in**
anatole **Never logged in**
jules tty2 Sun Mar 18 17:12:46 2001
moi tty1 Sun Mar 18 17:11:37 2001
[[email protected] chantal]# lastlog -u chantal
Username Port From Latest
chantal ttyp1 192.168.1.41 Sun Mar 18 12:58:49 2001
[[email protected] chantal]#lastlog -t 2
UsernamePortFromLatest
roottty4Sun Mar 18 17:11:27 2001
chantalttyp1192.168.1.41Sun Mar 18 12:58:49 2001
julestty2Sun Mar 18 17:12:46 2001
moitty1Sun Mar 18 17:11:37 2001
?les mots de passe:
pensez à leur construction
pensez aussi à leur expiration
? pensez aux perturbateurs et à la facilité de positionner le SUID et le SGID
Il suffit d’une fenêtre shell ouverte et de 3 commandes pour que les ennuis arrivent :
? copie du shell linux dans le répertoire courant
? sur le shell copié, on positionne le SUID. De ce fait, tout utilisateur exécutant ce shell obtient les droits du propriétaire du fichier et donc du programme. Ici, les droits de celui qui a f ait la copie
? il suffit maintenant de copier le shell dans son propre répertoire et le tour est joué ! ! Tout sera exécuté avec les droits de ce shell. Si c’est vous , administrateur, qui avez laissé la porte ouverte à ces manips, je vous laisse imaginer la suite des dégâts …
?Une parade
find / \(-perm –4100 – 0 – permm – 2100\) –print > liste
comparer la liste obtenu à la liste de la période précédente.
Il est possible de limiter l’accès à tout ou partie des terminaux en fonction des utilisateurs et de l’horaire de connexion dans le fichier /etc/porttime.
La prise en compte de ce fichier est assuré par le démon logoutd, activé dès la connexion d’un utilisateur.
Il y a 1 enregistrement par ligne, syntaxiquement constitué comme suit :
<nom du terminal> :<qui> :<quand>
nom du terminal ne pas préciser /dev
* signifie tous les terminaux
qui permet d’indiquer sous la forme d’une liste (caractère séparateur,), les utilisateurs auxquels appliquer la règle
quand liste de plage horaire, sous la forme HHMN-HHMN.
Il est possible de limiter la portée d’une plage à un ou plusieurs jours, en utilisant les termes suivants :
Mo lundi
Tu mardi
We mercredi
Th jeudi
Fr vendredi
Sa samedi
Su dimanche
Wk lundi à vendredi
Al tous les jours
# /etc/porttime
# To enforce login time policies with logoutd, configure
# login times here.
# Thefollowingentryallowsaccess to user jfh on every
# port during weekdays from 9am to 5pm.
#*:jfh:Wk0900-1700
*:jules:0800-1500
tty1:moi:Sa1500-1600
#
# The following entries allow access only to the usersroot
# andoperon/dev/console at any time.This illustrates
# how the /etc/porttime file is an orderedlistofaccess
# times.Any other user would match the second entry which
# does not permit access at any time.
#console:root,oper:Al0000-2400
#console:*:
# The following entry allows access for theusergameson
# any port during non-working hours.
#*:games:Wk1700-0900,SaSu0000-2400
Il peut s’agir de l’utilisation de la mémoire, du nombre de fichiers ouverts ou du nombre maximum de processus exécutables.
Si quelquefois cette surconsommation peut se justifier, souvent il vous faudra la prévenir.
Pour ce faire, on utilise la commande :
ulimit [option][valeur]
Ces commandes s’adressent à l’ensemble des utilisateurs.
Il existe deux types de limitations :
- logicielles : il s’agit des limitations d’utilisation des ressources quand un processus est créé
- matérielles : c’est un seuil haut que ne pourront franchir les limites logicielles
Ainsi, l’utilisateur peut donc dépasser les limites logicielles à concurrences des limites matérielles.
Les options principales sont les suivantes :
-a pour obtenir les valeurs des limitations logicielles
-Ha - matérielles
-f taille maximale des fichiers créés par le shell
-m taille maxi de la mémoire utilisée par un processus
-t temps d’exécution maxi d’un processus (en secondes)
-n nombre maxi de fichiers ouverts
-u nombre maxi de processus exécutés simultanément par un utilisateur
-p nombre maxi des pipes exprimée en blocs de 512 octets
-S permet de modifier la limitation logicielle de l’une des options
-H - matérielle
La modification intervient toujours par défaut sur la limitation logicielle ; en fait l’option S est implicite.
Attention, une fois qu’une limitation matérielle a été fixée, il n’est plus possible de l’augmenter.
[[email protected] chantal]# ulimit -a
core file size (blocks) 0
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
pipe size (512 bytes) 8
open files 256
virtual memory (kbytes) 2105343
[[email protected] chantal]# ulimit -Ha
core file size (blocks) unlimited
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes 256
pipe size (512 bytes) 8
open files 256
virtual memory (kbytes) 2105343
[[email protected] chantal]# ulimit -u 180 -n 210
[[email protected] chantal]# ulimit -a
core file size (blocks) 0
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes 180
pipe size (512 bytes) 8
open files 210
virtual memory (kbytes) 2105343
Il existe deux quotas :
- matériel on ne peut jamais le dépasser
- logiciel peut être temporairement dépassé.
Le quota matériel est la limite "dure", incontournable.
Par contre, le quota logiciel autorise un dépassement temporaire, ce qui peut être indispensable le temps de la création exceptionnelle d’un fichier temporaire.
C'est la limite "douce".
Le système affichera un message pendant un laps de temps avant de refuser toute autorisation de dépassement.
Les quotas peuvent s'affecter à un ou plusieurs utilisateurs ou groupes.
Il faudra activer automatiquement la gestion des quotas dans le processus d'initialisation du système ( ou rc.sysinit suivant les distributions).
Pour gérer les quotas et donc les ressources disques consommées parles uilisateurs, voici la démarche à suivre:
Il faudra modifier le fichier /etc/fstab ( voir détail de l'enregistrement plus avant dans le support).
device mount type options dump fsck
/dev/hda1/ext2rw00
Le champ option est celui qui nous interesse. Outre les accès autorisés, defaults ou rw, il faudra y rajouter les valeurs :
usrquota, pour gérer les quotas au niveau utilisateur,
grpquota si l'on souhaite gérer les quotas au niveau des groupes.
Supposons que l'on souhaite contrôler le file system des utilisateurs : /home, au niveau utilisateur.
Avant toute chose, rajoutons l'enregistrement concernant ce file system dans le fichier /etc/fstab, avec les options rw et usrquota.
[[email protected] chantal]#cat /etc/fstab
/dev/hda1 / ext2 defaults 0 1
/dev/hda1 /home ext2 rw,usrquota 2,1
/proc /proc proc defaults 0 0
/dev/hda2 none swap defaults 0 0
#
/dev/fd0 /mnt/floppy ext2 defaults,noauto 0 0
#
/dev/hdc /mnt/cdrom iso9660 ro,noauto 0 0
3. vérifier qu'il existe un fichier ou quota.group si l'on souhaite contrôler les ressources consommées par le groupe. Ce fichier doit se trouver dans la racine du file system à contrôler.
S'il n'existe pas, il suffit de le créer vide.
[[email protected] chantal]#cat >
4. Mettre en place les quotas des utilisateurs ou des groupes
C'est à ce niveau que tout se complique.
Pour mettre en place les quotas, il faut lancer la commande suivante, par utilisateur :
edquota–u <nom user>
L'option –g permet de définir les quotas des groupes.
edquota –g<nom groupe>
Voici les messages que vous risquez d'obtenir :
[[email protected] chantal]# edquota -u chantal
Warning: Quotas are not compiled into this kernel
/bin/ae: No such file or directory
Comme vous pouvez le constatez on se heurte à deux difficultés :
- d'une part le noyau ne semble pas avoir intégré systématiquement cette option,
Résolvons déjà le problème de l'éditeur. Pour se faire il suffit de créer un lien logique entre /bin/vi et /bin/ae, le tour est joué.
Concernant la compilation du noyau, veuillez vous reporter au chapître qui en parle.
Maintenant continuons le positionnement des quotas.
La commande edquota va vous permettre de créer un fichier temporaire dans lequel vous précisez le quota soft et le quota hard, en terme de blocks de données et d'inode.
Le point après le signe = du quota soft ou hard signifie : valeur à préciser.
Le 0 - : sans limite.
Voici le fichier modifié:
Quotas for user chantal:
/dev/hda1: blocks in use: 0, limits (soft =20, hard =30)
inodes in use: 0, limits (soft =8, hard =10)
"/tmp/EdP.aa00701" 3 lines, 132 characters written
[[email protected] chantal]#
Remarquez que l'information blocks in use est à 0, le noyau n'ayant pas été compilé avec l'option quota.
Voici un autre exemple, avec un noyau incluant l'option quota :
Quotas for user jules:
/dev/hda1:blocks in use: 165, limits (soft =166, hard =168)
inodes in use:121, limits (soft =122, hard =123)
L valeur blocks in use est spécifié et l'on a modifié les valeurs soft et hard des blocs uniquement.
5. si d'autres utilisateurs doivent avoir les mêmes quotas
Il est inutile d'ouvrir pour chacun d'eux un fichier temporaire avec la commande edquota –u ….
Il suffit de copier les quota définis autant de fois que de besoin, par la commande :
edquota –p<user dont quota à copier> <nom user1> <nom user2> ..
6. spécifier la période d'expiration du quota.
Il s'agit donc de déterminer le délai de grâce que l'on accorde au dépassement des quota soft, sachant qu'en aucun cas, ils ne pourront excéder les limites des quota hard.
edquota -t
Time units may be: days, hours, minutes, or seconds
Grace period before enforcing soft limits for users:
/dev/hda1: block grace period: 0 days, file grace period: 0 days
Il s'agit de le modifier en précisant un timing en days, hours minutes ou secondes.
Time units may be: days, hours, minutes, or seconds
Grace period before enforcing soft limits for users:
/dev/hda1: block grace period:2days, file grace period:2days
…
"/tmp/EdP.aa00703" 3 lines, 170 characters written
La valeur standard est généralement 7 days.
7. Activer les quotas ou les désactiver
la définition des quotas finie, il faut, pour les mettre en œuvre, les activer.
quotaon<nom du file system>
ou -a
De même la désactivation se ferait par la commande :
quotaoff<nom du file system>
ou -a
[[email protected] chantal]#quotaon -a
quotaon: using on /dev/hda1: Package not installed
Rappelez-vous, l'option n'est pas dans le noyau !!
8. Vérifier la cohérence des quotas :
quotacheck –v <nom du file system>
--va
L'option –v est importante, sinon, le laps de temps du contrôle, on aura le sentiment que la machine est bloqué, faute de voir un affichage quelconque.
[[email protected] chantal]#quotacheck -va
Scanning /dev/hda1 [/home] done
Checked 2769 directories and 50601 files
Using quotafile
9. Editer un rapport sur les quotas
repquota –v<nom du file system>
ou -va
[[email protected] chantal]#repquota -va
*** Report for user quotas on /dev/hda1 (/home)
Block limitsFile limits
Userusedsofthardgraceusedsofthardgrace
root--722978005253500
bin--1331006800
daemon--6001000
news--21050016200
uucp--864001500
man--43001600
majordom--280002900
postgres--1170002300
col--53003700
400--100100
anatole--52003600
chantal++2792030none157810none
stephane--000100
jules--1650012100
moi--55004000
nobody--8102007900
Vous remarquez que seul l'utilisateur chantal a eu des quotas définis, que ces derniers sont dépassés et qu'il n'y a plus de délai.
Bien entendu, les chifrres de cet exemple sont farfelus, puisque l'utilisateur avait déjà consommé des ressources disque et que les valeurs des quotas sont inférieures à la consommation initiale : ceci vient du fait que l'option quota n'étant pas incluse dans le noyau, lors de la commande edquota, on ignorait les blocs déjà utilisés, donc la valeur limite en devient erronée.
Voici les résultats après compilation du noyau pour y intégrer l'option quota. L'utilisateur jules a eu des quotas définis.
Block limitsFile limits
Userusedsofthardgraceusedsofthardgrace
root--722978005253500
bin--1331006800
daemon--6001000
news--21050016200
uucp--864001500
man--43001600
majordom--280002900
postgres--1170002300
col--53003700
400--100100
anatole--52003600
chantal++2792030none157810none
stephane--000100
jules--165166168121122123
admin2--54003900
moi--55004000
nobody--8102007900
[[email protected] jules]$cat > rajout
essai
/: warning, user disk quota exceeded
/: write failed, user disk limit reached.
ajout
un fichier
Non content du message, il tente une deuxième crétion :
[[email protected] jules]$cat > rajout2
/: warning, user file quota exceeded
…
Et le rapport des quotas, que devient-il ?
Block limitsFile limits
Userusedsofthardgraceusedsofthardgrace
root--722978005253500
bin--1331006800
daemon--6001000
news--21050016200
uucp--864001500
man--43001600
majordom--280002900
postgres--1170002300
col--53003700
400--100100
anatole--52003600
chantal++2792030none157810none
stephane--000100
jules--1661661682 days1231221232 days
admin2--54003900
moi--55004000
nobody--8102007900
Et à la tentative suivante de Jules:
[[email protected] jules]$cat > rajout3
bash: rajout3: Permission denied
Tout utilisateur de systèmes informatiques sait qu'il peut parfois perdre des fichiers :
- suppression accidentelle faite par les utilisateurs,
- problème dans un programme,
- défaillance matérielle..
Les dégâts peuvent être importants et il est essentiel pour un administrateur de se prémunir de ces pertes de fichiers. Pour ce faire, l'administrateur doit concevoir et planifier un système de sauvegardes.
Le développement d'une stratégie de sauvegardes efficace est un processus sans fin, à adapter et à améliorer au fil du temps, mais surtout à bien concevoir en y consacrant le temps nécessaire.
Une méthode de sauvegarde doit permettre de restaurer la totalité du ou des systèmes en un temps acceptable, sans perdre de vue que quelquefois la restauration de seulement un ou deux fichiers suffira à rendre le sourire à un utilisateur.
Pour développer une stratégie de sauvegarde, il faut se poser certaines questions, parmi lesquelles:
- quels fichiers doivent être sauvegardés ?
Tous ! me direz-vous, on s'assure ainsi un maximum de chance, mais est-ce bien raisonnable et utile ?
-où sont les fichiers importants, dans quels système de fichiers?
-qui sauvegardera ces fichiers?
Cela dépendra de l'emplacement des fichiers. Les utilisateurs peuvent être quelquefois responsables de leurs fichiers locaux.
-où, quand et sous quelles conditions faire les sauvegardes ?
il faut donc savoir sur quel support faire les sauvegardes, à quel moment et avec quelle périodicité.
-quelle est la fréquence de modification des fichiers ?
La réponse à cette question vous permettra d'établir correctement la périodicité de vos sauvegardes.
-à quelle rapidité doit être restauré un fichier important s'il venait à manquer?
Ceci vous permettra de choisir au mieux le support de sauvegarde
-à quel endroit les sauvegardes seront elles restaurées ?
La stratégie la plus simple et la plus complète est de copier tous les fichiers sur une bande. Mais il s'agit d'un processus long et peu pratique. La restauration d'un seul fichier est peu commode.
Les sauvegardes incrémentales sont en général plus fréquentes. Dans ce cas, on ne copie que les fichiers qui ont été modifiés depuis la dernière sauvegarde. Le monde Unix utilise un niveau de sauvegarde, pour identifier les différents types de sauvegarde.
Le niveau 0 correspond à une sauvegarde complète.
Le niveau 1 sauvegarde tous les fichiers modifiés depuis la dernière sauvegarde complète c'est-à-dire depuis la dernière sauvegarde de niveau 0
Le niveau 2 sauvegarde tous les fichiers modifiés depuis la dernière sauvegarde de niveau 1 ..
Un schéma classique consiste à effectuer une sauvegarde complète en début de semaine et une sauvegarde de niveau 1 tous les jours.
Quelque soit le schéma de sauvegarde retenu, il faudra penser au stockage de vos sauvegardes en gardant en tête ces quelques principes:
bien mémoriser où vous ranger vos sauvegardes et les ranger le plus clairement possible et le plus logiquement : pensez que vous ne serez peut-être pas seul(e) à en avoir l'utilité,
protégez vos supports en écriture pour éviter qu'ils ne soient écraser accidentellement
pensez à l'environnement de stockage : plutôt frais, sec et obscur
manipuler les supports avec précaution
prenez en compte les aspects de sécurité : le vol, le vandalisme, le feu ..
Il s'agit des outils les plus anciens du monde Unix mais suivant les distributions, les versions ne sont pas toujours très stables et fiables. A tester avant usage.
Les fichiers et répertoires sont sauvegardés physiquement c'est-à-dire avec leur numéro d'inode et seront restaurés, dans la mesure du possible, avec ces mêmes numéros.
dump[options] <rep ou fs>
Parmi les options principales :
-0 à 9 le niveau de sauvegarde
9 : par défaut
-u date et niveau de sauvegarde écrit dans /etc/dumpdates
-W ne fait pas de sauvegarde et incompatible avec les autres options
affiche les fichiers à sauvegarder avec des informations sur la dernière sauvegarde
-w idem W mais sans information
-f nom du fichier de sauvegarde
si vous êtes en réseau, ce sera du style
host:<nom fichier> ou fichier>
[[email protected] repe1]#dump -0uf essai /dev/fd0
DUMP: Date of this level 0 dump: Sun Apr1 19:28:31 2001
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping /dev/fd0 (/mnt/floppy) to essai
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 32 tape blocks on 0.00 tape(s).
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: DUMP: 19 tape blocks on 1 volumes(s)
DUMP: finished in less than a second
DUMP: level 0 dump on Sun Apr1 19:28:31 2001
DUMP: Closing essai
DUMP: DUMP IS DONE
[[email protected] repe1]#cat /etc/dumpdates
/dev/fd00 Sun Apr1 19:28:31 2001
[[email protected] repe1]#mkdir /asauver
[[email protected] repe1]#dump -0uf essai /asauver
DUMP: Date of this level 0 dump: Sun Apr1 19:31:32 2001
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping /dev/hda1 (/) to essai
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 96 tape blocks on 0.00 tape(s).
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: DUMP: 69 tape blocks on 1 volumes(s)
DUMP: finished in less than a second
DUMP: level 0 dump on Sun Apr1 19:31:32 2001
DUMP: Closing essai
DUMP: DUMP IS DONE
[[email protected] repe1]#cat /etc/dumpdates
/dev/fd00 Sun Apr1 19:28:31 2001
/dev/hda10 Sun Apr1 19:31:32 2001
[[email protected] repe1]#dump -1uf /dev/fd0 /asauver
DUMP: Date of this level 1 dump: Sun Apr1 19:32:42 2001
DUMP: Dumping /dev/hda1 (/) to /dev/fd0
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 92 tape blocks on 0.00 tape(s).
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: DUMP: 38 tape blocks on 1 volumes(s)
DUMP: finished in less than a second
DUMP: level 1 dump on Sun Apr1 19:32:42 2001
DUMP: Closing /dev/fd0
DUMP: DUMP IS DONE
[[email protected] repe1]#cat /etc/dumpdates
/dev/fd00 Sun Apr1 19:28:31 2001
/dev/hda10 Sun Apr1 19:31:32 2001
/dev/hda11 Sun Apr1 19:32:42 2001
restore [options] <nom fichier ou du device à restaurer>
-r restauration complète
-t liste le contenu d'une archive
-f nom du fichier ou périphérique contenant l'archive
-v verbose
Le rôle de cette commande est d'archiver une arborescence, à priori, sur une bande mais ce peut être en fait sur un fichier régulier.
Cette commande sert à la fois pour créer, visualiser et restaurer. Elle est de ce fait très utilisée.
tar [mode] [options] <fichiers ou répertoires>
les modes opératoires sont les suivants:
c crée une nouvelle archive
A ajoute le contenu d'une archive à une autre
t liste le contenu d'une archive
u ajoute à une archive les fichiers spécifiés s'ils sont plus récents que la version stockée dans l'archive
x extrait des fichiers d'une archive
les options générales:
f pour spécifier un fichier ou un périphérique (/dev/rmt0 par défaut)
v pour indiquer le nom des fichiers traités
w demande une confirmation à chaque action
z crée, liste ou traite une archive avec gzip
Z idem avec compress
[[email protected] repe1]#tar cf /dev/fd0 essai
[[email protected] repe1]#cd /arestaurer
[[email protected] /arestaurer]#tar xf /dev/fd0
[[email protected] /arestaurer]#ls -l
total 61
-rw-r--r--1 rootroot61440 Apr1 19:44 essai
cpio [mode] [option]
cpio [mode ] [option] [modèle ou critère de sélection]
cpio [mode ] [option] répertoire
Les modes:
-o lecture des noms sur l'entrée standard et résulta envoyé sur la sortie standard
-i pour extraire des fichiers à partir de l'entrée standard ou pour lister le contenu d'une archive dont le nom est fourni au clavier
-p transfert les fichiers indiqués sur son entrée vers le répertoire fourni
Cette commande est très souvent associé à un pipe et à une redirection pour définir l'entrée et la sortie.
Les options:
-t avec le mode i, affiche le contenu du répertoire
-v affiche le nom des fichiers copiés
-d si besoin, création des répertoires
-f critère de sélection
-c fichiers de sauvegarde au format ASCII
-l copie des fichiers sous forme de liens
[[email protected] /arestaurer]#ls | cpio -ov > /dev/fd0
essai
121 blocks
[[email protected] /arestaurer]#cpio -it </dev/fd0
essai
121 blocks
[[email protected] /arestaurer]#cpio -itv </dev/fd0
-rw-r--r--1 rootroot61440 Apr1 19:44 essai
121 blocks
[[email protected] chantal]#find . -type d -a -name "reper*" | cpio -p /asauver
0 blocks
[[email protected] chantal]#ls -l /asauver
total 2
drwxrwxrwT3 chantalchantal1024 Apr1 20:26 repert2
drwxrwxr-T3 chantalchantal1024 Apr1 20:26 repert3
Il s'agit d'un utilitaire de conversion de support, capable de copier bloc par bloc sans interprétation.
Exemple classique d'utilisation : la copie de disquette.
dd [option=valeur]
if nom du fichier d'entrée
of nom du fichier de sortie
ibs taille des blocs lus (512 par défaut)
obs taille des blocs écrits (512 par défaut)
cbs taille de la mémoire tampon de conversion
skip nombre de blocs à sauter avant de commencer la lecture
count nombre de blocs à lire
conv type de conversion
ascii, lcase,ucase ..
[[email protected] /]#dd if=/dev/fd0 of=/toto
2880+0 records in
2880+0 records out
2880+0 records in
2880+0 records out
[[email protected] /]#cat essai
essai
de fichier
en minuscules
[[email protected] /]#dd if=/essai of=/essaiM conv=ucase
0+1 records in
0+1 records out
[[email protected] /]#cat essaiM
ESSAI
DE FICHIER
EN MINUSCULES
[[email protected] /]#df
Filesystem1024-blocksUsedAvailableCapacityMounted on
/dev/hda18019217393832111197%/
/dev/fd0-49-490100%/mnt/floppy
Les options possibles:
-a pour afficher les pseudo systèmes de fichiers (/proc)
-i affichage en nombre d'inodes ou de fichiers mais pas en nombre de blocs
-T affiche le type de chaque système de fichiers
[[email protected] /]#df -ai
FilesystemInodesIUsedIFree%IUsed Mounted on
/dev/hda12072645340015386426%/
/proc0000%/proc
caldera13:(pid406)0000%/auto
/dev/fd00000%/mnt/floppy
[[email protected] /]#df -iaT
FilesystemTypeInodesIUsedIFree%IUsed Mounted on
/dev/hda1ext22072645340015386426%/
/procproc0000%/proc
caldera13:(pid406)
auto0000%/auto
/dev/fd0ext20000%/mnt/floppy
L'occupation du disque est détaillée par répertoire, soit pour tout le disque, soit à partir du répertoire cité dans la commande.
La valeur correspond à un nombre de blocs de 1024 octets.
Quelques options:
-a affiche l'occupation pour tous les fichiers et pas seulement les répertoires.
-b valeur exprimée en octets.
-c fait la somme de l'occupation disque des arguments passés
-k valeur exprimée en blocs de 1024 octets
[[email protected] /]#du /home/chantal
14/home/chantal/.seyon
12
3/home/chantal/lg/lg_layouts
9/home/chantal/lg
3/home/chantal/repert2/repert1
5/home/chantal/repert2
4/home/chantal/repert3/repert1
5/home/chantal/repert3
1/home/chantal/disquette
1/home/chantal/r1/r2
2/home/chantal/r1
62/home/chantal/repe1
374/home/chantal
[[email protected] /]#du -ab /home/chantal
49/home/chantal/.bash_logout
935/home/chantal/.bashrc
650/home/chantal/.cshrc
7790/home/chantal/.gcalrc
186/home/chantal/.kshrc
392/home/chantal/.login
51/home/chantal/.logout
357/home/chantal/.profile
182
2407/home/chantal/.seyon/phonelist
…
[[email protected] /]#du -c /bin /sbin
4004/bin
3081/sbin
7085total
L'avantage d'un système fourni avec les sources est de permettre à quiconque d'apporter une solution à un problème, une amélioration au noyau sans compter une évolution très rapide des versions.
Au contraire de Windows où l'installation d'un seul pilote défectueux peut quelquefois empêcher le démarrage du système, voire imposer une réinstallation au risque de perdre tout ou partie de la configuration, l'installation d'un nouveau noyau Linux est comparative moins risquée et pas plus difficile qu'un réinstallation.
Il existe des outils graphiques ou semi-graphiques pour vous aider à recompiler un noyau, nous nous attacheron, en tant qu'administrateur, à la compilation la plus simple.
Pourquoi créer un nouveau noyau ?:
- pour permettre la correction de certains problèmes,
- pour améliorer les performances,
- pour installer un ou plusieurs pilotes pour de nouveaux périphériques,
- pour tirer pari de nouvelles fonctionnalités,
- pour avoir une version plus récente du noyau.
Pensez toujours qu'il vaut mieux un noyau stable et donc fiable, qu'un noyau "new look" mais instable.
uname [option]
-r version du noyau
-v date du noyau
[[email protected] /]#uname -r
2.0.35
[[email protected] /]#uname -v
#1 Wed Aug 19 12:57:30 MST 1998
[[email protected] /boot]#ls –l /boot
total 462
lrwxrwxrwx1 rootroot32 Oct 10 15:21 -2.0.35 -> /usr
-rw-r--r--1 rootroot23645 Aug 191998 WHATSIN-2.0.35-modular
-rw-r--r--1 rootroot512 Oct 10 15:39 boot.0301
-rw-r--r--1 rootroot4548 Aug 191998 boot.b
-rw-r--r--1 rootroot300 Aug 191998 chain.b
-rw-------1 rootroot8704 Oct 10 15:39 map
-rw-r--r--1 rootroot308 Aug 191998 os2_d.b
-rw-r--r--2 rootroot424687 Aug 191998 vmlinuz-2.0.35-modular
Attention, avant toute modification, pensez toujours à sauvegarder le noyau.
Pour reconstruire un noyau, il faut en posséder les sources, qui se présentent généralement sous la forme d'un fichier au format tar, compressé par gzip ou bzip2.
Ce fichier trouvé, il faut le décompresser et en extraire l'arborescence.
Toutefois, si vous recompilez le noyau pour y intégrer des drivers, modules …, sachez que les sources sont en principe en :/usr/src/linux ….La suite de cette arborescence dépend de votre distribution et de la version de votre noyau.
Par rapport à la distribution de Caldera 1.3:
[[email protected] src]#ls -l
total 3
drwxr-xr-x7 rootroot1024 Oct 10 14:33 OpenLinux
lrwxrwxrwx1 rootroot12 Oct 10 15:21 linux -> linux-2.0.35
drwxr-xr-x15 rootroot1024 Oct 10 15:02 linux-2.0.35
drwxr-xr-x2 rootroot1024 Oct 10 15:05 sox
[[email protected]linux-2.0.35]#ls –l
total 1217
-rw-r--r--1 rootroot18458 Jul 131998 COPYING
-rw-r--r--1 rootroot39338 Jul 131998 CREDITS
drwxr-xr-x6 rootroot1024 Oct 10 14:32 Documentation
-rw-r--r--1 rootroot10221 Jul 131998 MAINTAINERS
-rw-r--r--1 rootroot10233 Aug 191998 Makefile
-rw-r--r--1 rootroot12056 Jun 261996 README
-rw-r--r--1 rootroot4526 Sep 201996
-rw-r--r--1 rootroot103135 Aug 191998
drwxr-xr-x8 rootroot1024 Oct 10 15:03 arch
drwxr-xr-x12 rootroot1024 Oct 10 15:02 drivers
drwxr-xr-x20 rootroot2048 Oct 10 15:02 fs
drwxr-xr-x11 rootroot1024 Oct 10 15:21 include
drwxr-xr-x2 rootroot1024 Oct 10 15:02 init
drwxr-xr-x2 rootroot1024 Oct 10 15:02 ipc
drwxr-xr-x2 rootroot1024 Oct 10 15:02 kernel
drwxr-xr-x2 rootroot1024 Oct 10 15:02 lib
drwxr-xr-x2 rootroot1024 Oct 10 15:02 mm
drwxr-xr-x2 rootroot1024 Oct 10 15:44 modules
drwxr-xr-x15 rootroot1024 Oct 10 15:02 net
drwxr-xr-x3 rootroot1024 Oct 10 15:02 scripts
-rwxr-xr-x1 rootroot1022226 Aug 191998 vmlinux
find/mnt/cdrom-name "*.gz"
…..
Voici ce que pourriez avoir comme réponse du système:
Il s'agit bien d'un fichier tar, compressé par gzip.
Si nous avons déjà les sources, on passera à l'étape 5, sinon :
tar xvzf <nom du fichier compressé>
par exemple: tar xvzf
make mrproper
rm -f include/linux/autoconf.h include/linux/version.h
rm -f drivers/sound/local.h drivers/sound/.defines
rm -f drivers/char/conmakehash
rm -f drivers/net/soundmodem/sm_tbl_{afsk1200,afsk2666,fsk9600}.h
rm -f drivers/net/soundmodem/sm_tbl_{hapn4800,psk4800}.h
rm -f drivers/net/soundmodem/sm_tbl_{afsk2400_7,afsk2400_8}.h
rm -f drivers/net/soundmodem/gentbl
rm -f .version .config*
rm -f scripts/tkparse
rm -f scripts/lxdialog/*.o scripts/lxdialog/lxdialog
rm -f .menuconfig
rm -f include/asm
rm -f .depend `find . -name .depend -print`
rm -f .hdepend scripts/mkdep
rm -f /usr/src/linux-2.0.35/include/linux/modversions.h
rm -f /usr/src/linux-2.0.35/include/linux/modules/*
make config si vous utiliser un terminal ne gérant ni couleur ni graphisme
make menuconfig commande plus conviviale utilisée sur un terminal texte gérant les couleurs
make xconfig qui ne peut être exécutée que sur un serveur X.
A la commande make menuconfig, voici ce que vous obtiendrez :
Linux Kernel v2.0.35 Configuration
Main Menu
Arrow keys navigate the menu.<Enter> selects submenus --->.
Highlighted letters are hotkeys.Pressing <Y> includes, <N> excludes,
<M> modularizes features.Press <Esc><Esc> to exit, <?> for Help.
Code maturity level options--->
Loadable module support--->
General setup--->
Floppy, IDE, and other block devices--->
Networking options--->
SCSI support--->
Network device support--->
ISDN subsystem--->
CD-ROM drivers (not for SCSI or IDE/ATAPI drives)--->
Filesystems--->
Character devices--->
Sound--->
Kernel hacking--->
STREAMS subsystem--->
Load an Alternate Configuration File
Save Configuration to an Alternate File
<Select>< Exit >< Help >
A vous de choisir l'option qui vous intéresse et d'évoluer au sein des divers sous menu.
En supposant que l'on souhaite ajouter la gestion des quota aux files systems.
On choisit donc file system et un nouveau sous menu s'affiche, il suffit d'en suivre les instructions.
Cochons l'option quota, par l'intermédiaire de la touche espace ou en saisissant Yes.
Le symbole * s'inscrit face à loption.
Vous remarquerez qu'il y a deux manières d'inclure une fonctionnalité :
- en statique, réponse Y
- en dynamique, réponse M.
Rien d'autre à modifier, donc exit pour sortir du sous-menu.
Filesystems
Arrow keys navigate the menu.<Enter> selects submenus --->.
Highlighted letters are hotkeys.Pressing <Y> includes, <N> excludes,
<M> modularizes features.Press <Esc><Esc> to exit, <?> for Help.
Legend: [*] built-in[ ] excluded<M> module< > module capable
-------------------------------------------------------------------------------------------------------------------------------------
[*] Quota support³
<*> Minix fs support
<M> Extended fs support
<*> Second extended fs support
<M> xiafs filesystem support
<*> Native language support (Needed for FAT and ISO9660)
<M> ISO9660 cdrom filesystem support
<*> DOS FAT fs support
<*> MSDOS fs support
A nouveau exit pour sortir du menu et le système nous demande si l'on souhaite sauvegarder les modifications:
Do you wish to save your new kernel configuration?
< Yes ><No>
The linux kernel is now hopefully configured for your setup.
Check the top-level Makefile for additional configuration,
and do a 'make dep ; make clean' if you want to be sure all
the files are correctly re-made.
8. Déterminer les dépendances
make dep
….
if [ -n "" ]; then \
/usr/src/linux-2.0.35/scripts/mkdep *.[chS] > .depend; fi
set -e; for i in block char netpci sbus scsi sound cdrom isdn streams;
do make -C $i fastdep; done
make[2]: Entering directory `/usr/src/linux-2.0.35/drivers/block'
gcc -D__KERNEL__ -I/usr/src/linux-2.0.35/include-Wall -Wstrict-prototypes -O2
-fomit-frame-pointer -fno-strength-reduce -pipe -m386 -DCPU=386 -E -D__GENKSYMS_
…
9. supprimer les anciens objets
make clean
…
make[2]: Entering directory `/usr/src/linux-2.0.35/arch/i386/boot/compressed'
rm -f xtract piggyback vmlinux bvmlinux
make[2]: Leaving directory `/usr/src/linux-2.0.35/arch/i386/boot/compressed'
make[1]: Leaving directory `/usr/src/linux-2.0.35/arch/i386/boot'
make -C arch/i386/kernel clean
make[1]: Entering directory `/usr/src/linux-2.0.35/arch/i386/kernel'
rm -f trampoline hexify
make[1]: Leaving directory `/usr/src/linux-2.0.35/arch/i386/kernel'
rm -f include/linux/compile.h
rm -f core `find . -name '*.[oas]' ! -regex '.*lxdialog/.*' -print`
rm -f core `find . -type f -name 'core' -print`
rm -f vmlinux
rm -f .tmp* drivers/sound/configure
rm -fr modules/*
rm -f submenu*
…
10. Reconstruction de l'image du noyau
make zImage
ou si le noyau est trop gros (message du système)
make bzImage
Cette opération prend un peu de temps.
Le nouveau noyau est mis dans : /usr/src/linux/arch/i386/boot
11. compiler les modules
make modules
make modules_install
…
Root device is (3, 1)
Boot sector 512 bytes.
Setup is 4332 bytes.
System is 413 kB
sync
make[1]: Leaving directory `/usr/src/linux-2.0.35/arch/i386/boot'
Remarquez que le chemin du noyau vous est indiqué
cp /usr/src/linux-2.0.35/arch/i386/boot/zImage<nom nouveau noyau>
[[email protected] linux]#cp /usr/src/linux-2.0.35/arch/i386/boot/zImage/noyquota
[[email protected] /]#ls -l noyquota
-rw-r--r--1 rootroot428776 Apr1 22:59 noyquota
En cas de problème, vous pourrez toujours faire machine arrière.
Pour ce faire, il vous faudra modifier le fichier , et y insérer les lignes suivantes :
image = <nom du nouveau noyau>
label = <nom choisi pour l'activer>
root = /dev/hda1
read-only
Attention au nom choisi au niveau du label.
C'est ce nom qu'il faudra saisir au clavier au moment du boot.
Le problème (si problème il y a ) est que vous démarrez avec un clavier en qwerty, donc réfléchissez bien au choix des lettres constituant votre label.
lilo
[[email protected] /]#lilo
Added linux *
Added quota
Plus on souhaite intégrer des éléments au noyau et plus sa taille risque d'être importante.
En fait, il y a deux manières d'inclure un élément :
- en statique
- en dynamique.
Si la première approche intègre tout au noyau, la deuxième crée un ensemble de modules objets (<nom de fichier>.o) non inclus dans le noyau mais chargés en mémoire à la demande.
Ceci permet donc de générer un noyau de taille minimale et de plus, on peut rajouter des périphériques sans avoir à recompiler le noyau.
Nous avons déjà réalisé la phase de la compilation des modules:
make modules
Une fois les modules compilés il reste à les installer :
make modules_install
[[email protected] 2.0.35]#ls –l/lib/modules/2.0.35
total 9
drwxr-xr-x2 rootroot1024 Oct 10 14:32 block
drwxr-xr-x2 rootroot1024 Oct 10 14:32 cdrom
drwxr-xr-x2 rootroot1024 Oct 10 14:32 fs
drwxr-xr-x2 rootroot1024 Oct 10 14:32 ipv4
drwxr-xr-x2 rootroot1024 Oct 10 14:32 misc
drwxr-xr-x2 rootroot1024 Oct 10 15:44 net
drwxr-xr-x2 rootroot1024 Oct 10 14:33 pcmcia
drwxr-xr-x2 rootroot1024 Oct 10 14:32 scsi
drwxr-xr-x2 rootroot1024 Oct 10 14:32 sound
Vous remarquerez que les modules font en fait l'objet de différents répertoires.
[[email protected] 2.0.35]#ls net
3c501.oatp.oeepro100.olance.oslip.o
3c503.obsd_comp.oeexpress.one.osmc-ultra.o
3c505.ode4x5.oepic100.one2k-pci.osmc-ultra32.o
3c507.ode600.oeql.onew_tunnel.osmc9194.o
3c509.ode620.oeth16i.oni52.otlan.o
3c515.odepca.oewrk3.oni65.otulip.o
3c59x.odgrs.ofet3043.opcnet32.owd.o
8390.odlci.ofmv18x.oplip.oyellowfin.o
ac3200.odummy.ohp-plus.oppp.o
apricot.oe2100.ohp.ortl8139.o
arcnet.oeep10pci.ohp100.osdla.o
at1700.oeepro.oibmtr.oslhc.o
Chaque fois qu'une fonction, remplie par un module chargeable, est requise, il faut intégré ce module au noyau.
Ce chargement est fait manuellement, automatique au démarrage ou uniquement au moment voulu.
Le chargement peut parfois échouer à cause de la dépendance des modules entre eux. Il faut dans ce cas, vérifier les modules chargés, les modules dépendants et charger le tout.
La commande lsmod vous permet de connaître l'ensemble des modules chargés, avec par module :
- la taille,
- l'usage qui en est fait et par quel autre module, donc quel module en dépend.
Ces informations sont le reflet du contenu de /proc/modules.
[[email protected] 2.0.35]#lsmod
Module:#pages:Used by:
vfat40
iBCS260
fet304321
ipx31
misc10
ppp50
slip20
slhc2[ppp slip]0
lp20
isofs50
nfs125
sg10
st60
sr_mod40
sd_mod40
scsi_mod10[sg st sr_mod sd_mod]4
839020
Cette commande est généralement activée lors du démarrage du système, à l'aide du script d'initialisation /etc/rc.d/rc.sysinit ou /etc/rc.d/rc.modules suivant les distributions.
Le résultat de cette consiste en la création du fichier
[[email protected] 2.0.35]#cat
/lib/modules/2.0.35/fs/binfmt_java.o:
/lib/modules/2.0.35/fs/ext.o:
/lib/modules/2.0.35/fs/hpfs.o:
/lib/modules/2.0.35/fs/isofs.o:
/lib/modules/2.0.35/fs/ncpfs.o:
/lib/modules/2.0.35/fs/nfs.o:
/lib/modules/2.0.35/misc/aten.o:/lib/modules/2.0.35/block/paride.o
/lib/modules/2.0.35/misc/atixlmouse.o:/lib/modules/2.0.35/misc/misc.o
/lib/modules/2.0.35/misc/awe_wave.o:/lib/modules/2.0.35/sound/sound.o
/lib/modules/2.0.35/misc/b1pci.o:/lib/modules/2.0.35/misc/kernelcapi.o
…
Cette commande permet de charger un module et les modules dont il dépend, en s'appuyant sur le fichier .
Cette commande permet donc un chargement automatique des modules dès le démarrage, sans se soucier des dépendances.
Il suffit de l'exécuter dans le script d'initialisation /etc/c.d/rc.modules ou /etc/rc.d/rc.sysinit.
Avant de supprimer un module, il est préférable de s'assurer qu'il n'est pas utilisé.
L'option –a permet supprimer un module sous réserve qu'il ne soit pas utilisé et qu'aucun autre module n'en dépende.
On pourrait obtenir la même chose avec modprobe –r <nom module>.
C'est le cas lorque vous voulez créer des modules qui ne font pas partie des sources du noyau, comme par exemple des drivers de carte réseau.
Pour cela, il faut se positionner dans le répertoire /usr/local/src et décompréssez l'archive *.tgz.
Par exemple: tar xzf /mnt/cdrom/divers/<nom module>.tgz
Le système crée un répertoire: /usr/local/src/<nom du module>.
Positionnez vous dans ce nouveau répertoire.
Cherchez un script de configuration, généralement configure.
Exécutez le : ./configure
./ indique que le script est dans le répertoire courant.
L'installation est terminée.
Pour pouvoir l'utiliser, il faudra, tout comme un autre module, le charger par la commande insmod.
Vérifiez votre opération par lsmod.
On a l'habitude de gérer les packages par la commandes rpm (Red hat Package Manager), largement répandue au sein des diverses distributions.
Il existe cependant d'autres outils qui vous éviteront la syntaxe de la commande rpm, outil tel que lisa avec les versions de Caldera, entre autres.
La commande rpm permet d'installer, de supprimer et de mettre à jour un aplicatif.
Avant toute chose, regardons comment se présente un package, sous quel format d'un point de vue symbolique :
Nom version release architecture matérielle extension
quota-1.55-4;
Les packages sont situés en principe dans le répertoire /RPMS.
La commande n'est accessible qu'au super utilisateur.
rpm –i<nom du package.rpm>
-ivh
La deuxième option permet de suivre l'avancement de l'installation par l'affichage d'une barre de progression constituée du symbole #.
Les fichiers contenus dans le package sont installés et la base de données est mise à jour.
Le système contrôle les dépendances et vérifie qu'il n'y ait pas de conflit pendant l'installation.
S'il existe déjà une version du package sur votre système, il faudra le supprimer, l'installation vous générant une erreur bloquante.
Si d'autres packages sont liés, le système vous en affiche le nom et vous invite à les insatller.
rpm –e<nom du packagesans l'extension rpm>
-ev
Attention ne désinstaller que les packages "libres", c'est-à-dire non utilisés par d'autres packages.
Le cas échéant, vous aurez un message d'erreur et la désinstallation s'arrête.
rpm –U<nom du package.rpm>
-Uvh
Lister les packages installés : rpm –qa
Description d'un package rpm –qi <nom du package sans extension rpm>
A quel package appartient un fichier ? rpm –qf <nom fichier>
Informations sur un package non installé : rpm –qpl <nom du >
Liste des fichiers d'un package : rpm –ql <nom du package sans extension rpm>
rpm –V<nom du packagesans extension rpm>
La gestion des processus est hiérarchique et chacun d’eux sait par quel processus il a été généré.
Un processus a son espace d’adressage virtuel et en aucun cas il ne gênera un autre processus.
Chaque processus accède au processeur pendant un laps de temps et c'est le schéduler qui gère l'ordre et l'accès.
Les processus peuvent communiquer entre eux.
Un processus se compose:
- du code programme,
- de l'environnement.
Par processus, un certain nombre d'informations sont stockées, essentiellement dans la table des processus.
Les processus doivent pouvoir se différencier et pour ce faire, linux leur attribue un numéro d'identification unique.
Chaque processus peut en créer plusieurs : ceus sont ses processus enfants. Pour que les enfants connaissent leur origine, le système leur communique l'identification de leur processus père, c'est-à-dire le PPID.
Tous les processus sont créés par un père, sauf bien évidemment le processus ou plutôt pseudo processus qui engendre l'arborescence des processus et dont le PID est égal à 0.
Le processus d'initialisation, PID égal à 1, sera responsable directement ou indirectement (par descendance) de tous les autres processus.
A sa naissance, un processus reçoit un UID et un GID qui lui permettent de justifier, à chaque accès à un fichier, des droits auxquels il prétend.
Les UID et GID sont hérités par les processus enfant et ce n'est qu'exceptionnellement qu'un processus peut refuser cet héritage.
Pour permettre ce passage d'un processus à l'autre, chacun est doté d'une priorité et le processus ayant la plus haute priorité sera traité en premier.
La priorité de base avec laquelle tous les processus démarrent est généralement un paramètre qui ne peut pas être modifié, mais il est possible d'intervenir sur cette priorité avec la commande nice.
Pour permettre aux processus d'accéder en lecture – écriture à des fichiers, il faut qu'ils aient les références des fichiers ouverts en mémoire de travail.
C'est pourquoi une table des fichiers ouverts est créée par chaque processus.
Ce problème a déjà été abordé dans le fascicule "linux utilisateur".
Pour lancer un processus en tâche de fond il suffit d'ajouter le symbole & à la fin de la ligne de commande.
Le shell et son processus enfant fonctionnent alors en parallèle, sans aucune coordination entre les deux : c'est une exécution de processus asynchrone.
[[email protected] chantal]#who > qui&
[1] 673
[[email protected] chantal]#ls -lR > liste &
[2] 674
[1]Donewho >qui
[[email protected] chantal]#jobs -l
[2]+674 Donels -lR >liste
Chaque tâche de fond se voit affecté un numéro de job, indépendamment du PID. C'est ce que l'on retrouve par la commande jobs –l.
Voici les précautions à prendre avant de passer un processus en tâche de fond:
- il ne doit pas y avoir de saisie au clavier,
- pas de résultats à l'écran ou les sorties risquent d'être en conflit avec celles du shell ou d'une autre commande
- rediriger le canal d'erreur aussi : 2>/dev/null par exemple.
Voici un exemple d'une tâche de fond dont on n'a pas dérouté la sortie.
[[email protected] chantal]# ls -lR&
repert3/repert1:
total 3
-rw-r--r--1 chantalchantal33 Jan 23 18:05
-rw-r--r--1 chantalchantal33 Jan 25 18:33
-rw-rw-r--1 chantalchantal14 Jan 25 18:48 toto
who
[3]+Donels -lR
Il est possible de basculer un processus entre le premier et l'arrière plan et inversement.
Premier plan – arrière plan:
- suspendre d'abord le processus en cours d'exécution : Ctrl Z
- le processus suspendu, le passer en arrière plan : bg %numéro du job
Arrière plan – premier plan:
- fg %numéro de job
Suspendre un processus en arrière plan:
kill –STOP %numéro de job
Et le reprendre :
kill –CONT %numéro de job
Brefs rappels des premières réflexions engagées sur la commande ps, dans le fascicule linux utilisateur
Les options sont multiples, parmi les plus intéressantes :
auxw tous les processus (ax) avec nom de user (u) sans ligne tronquée (w)
axl liste longue
auxr processus actifs(r – running) avec nom du user
axf liste avec filiation
Des combinaisons :
ps ax | grep <nom d'un processus> teste si le processus tourne
ps axl –sort:-rss liste avec tri sur rss (kilobytes de programme en mémoire)
[[email protected] chantal]#ps
PID TTY STAT TIME COMMAND
5661 S0:00 /sbin/getty tty1 VC linux
5672 S0:00 /sbin/getty tty2 VC linux
5683 S0:00 /sbin/getty tty3 VC linux
5694 S0:00 /sbin/getty tty4 VC linux
5705 S0:00 /sbin/getty tty5 VC linux
5716 S0:00 /sbin/getty tty6 VC linux
589p0 S0:00 su root
590p0 S0:00 bash
680p0 R0:00 ps
Les processus avec précision de l'état, de l'UID, PID, PPID,
PRI – facteur de priorité ( plus la valeur est grande, moins le processus est prioritaire),
nice – délai de report- plus le nombre est élevé, moins le processus ne reçoit le temps CPU, SIZE – taille du programme en mémoire,
RSS (Resident Size Set) – taille réservée,
WCHAN (Waiting channel) – canal de communication avec les autres processus,
status du processus ..
[[email protected] chantal]#ps l
FLAGSUIDPIDPPID PRINISIZERSS WCHANSTA TTY TIME COMMAND
1000566100856324tty_ioctlS10:00/sbin/get
1000568100856324tty_ioctlS30:00/sbin/get
1000569100856320tty_ioctlS40:00/sbin/get
1000570100856320tty_ioctlS50:00/sbin/get
1000571100856320tty_ioctlS60:00/sbin/get
1001000589574001068680wait4Sp00:00su root
10005905891501160620wait4Sp00:00bash
1001000682590160980376Rp00:00ps l
[[email protected] chantal]#ps alx
FLAGSUIDPIDPPID PRINISIZERSS WCHANSTA TTY TIME COMMAND
10001000828316 do_selectS?0:03init [3]
400210000bdflushSW?0:00(kflushd)
40031-12 -1200kswapdSW< ?0:00(kswapd)
400410000UMSDOS_rmdi SW?0:00(md_threa
400510000UMSDOS_rmdi SW?0:00(md_threa
10004002110000endSW?0:00(nfsiod)
10004002210000endSW?0:00(nfsiod)
10004002310000endSW?0:00(nfsiod)
10004002410000endSW?0:00(nfsiod)
140055100808240sigsuspendS?0:00update (b
1001400361100828316do_selectS?0:00inetd
1001401363100840292do_selectS?0:00rpc.portm
1001400370100884356do_selectS?0:00ypserv
1001400371100960320do_selectS?0:00yppasswdd
1400386100840364do_selectS?0:00syslogd
10014003891001016512syslogS?0:00klogd -k
1400398100868352do_selectS?0:00ipxripd -
1001400406100932492do_selectS?0:00amd -P /v
14004311001180980do_selectS?0:00xntpd
10004024371001156560do_selectS?0:00lpd
1400444100844360sigsuspendS?0:00cron
[[email protected] run]#ps axf
PID TTY STAT TIME COMMAND
1?S0:03init [3]
2?SW0:00(kflushd)
3?SW<0:00(kswapd)
4?SW0:00(md_thread)
5?SW0:00(md_thread)
21?SW0:00(nfsiod)
22?SW0:00(nfsiod)
23?SW0:00(nfsiod)
24?SW0:00(nfsiod)
55?S0:00update (bdflush)
361?S0:00inetd
575?S0:00\_ telnetd: 192.168.1.41 [vt100]
576p0 S0:00|\_ /bin/login -h 192.168.1.41 -p
577p0 S0:00|\_ -bash
594p0 S0:00|\_ more
595?S0:00\_ telnetd: 192.168.1.41 [vt100]
596p1 S0:00\_ /bin/login -h 192.168.1.41 -p
597p1 S0:00\_ -bash
612p1 S0:00\_ su root
613p1 S0:00\_ bash
666p1 R0:00\_ ps axf
[[email protected] /bin]$ps auxr
USERPID %CPU %MEMSIZERSS TTY STAT STARTTIME COMMAND
chantal6680.01.0840328p0R21:240:00ps auxr
FLAGSUIDPIDPPID PRINISIZERSSWCHANSTA TTY TIME COMMAND
14004311001180980do_selectS?0:00xntpd
100100500576575001088728wait4Sp00:00/bin/logi
100100500596595001088728wait4Sp10:00/bin/logi
1001000612597001068696wait4Sp10:00su root
1000613612201156640wait4Sp10:00bash
05005775761701156624wait4Sp00:00-bash
405006815771701156624Rp00:00-bash
0500597596001156620wait4Sp10:00-bash
10004024371001156568do_selectS?0:00lpd
1001000575361101108528do_selectS?0:00telnetd:
1001000595361001108528do_selectS?0:00telnetd:
10014003891001016520syslogS?0:00klogd –k
Plusieurs autres options existent, regardez dans le man.
Le numéro de PID peut être stocké dans un fichier se trouvant dans /var/run sous le nom du dé.
[[email protected] run]#ls /var/run
utmp
xlaunch
[[email protected] run]#cat
406
[[email protected] run]#kill `cat `
[[email protected] run]# ps 406
PID TTY STAT TIME COMMAND
No processes available.
[[email protected] /root]$ pstree
init-+-atd
|-cron
|-5*[getty]
|-inetd-+-in.telnetd---login---bash---pstree
| `-in.telnetd---login---bash---su---bash---more
|-ipxd
|-kflushd
|-klogd
|-kswapd
|-login---bash
|-logoutd
|-lpd
|-2*[md_thread]
|-4*[nfsiod]
Certains processus sont précédés d'une valeur numérique, indiquant q'il existe n processus exécutant la même commande.
Cette commande permet d'obtenir des informations générales et un affichage automatique et en continu des processus.
Les premières lignes apportent une information sur le temps depuis le démarrage du système, des statistiques sur le nombre total de processus, sur l'utilisation du CPU, de la mémoire et de l'espace de pagination.
[[email protected] /root]$top
22:03:32 up1:35,3 users,load average: 0.00, 0.00, 0.00
CPU states:0.9% user,1.9% system,0.0% nice, 97.1% idle
Mem:30884K av,12620K used,18264K free,12236K shrd,964K buff
Swap:2012K av,0K used,2012K free5580K cached
PID USERPRINISIZERSS SHARE STATLIB %CPU %MEMTIME COMMAND
720root160588588436R02.91.90:00top
1root00328328260S00.01.00:03init
2root00000SW00.00.00:00kflushd
3root-12 -12000SW<00.00.00:00kswapd
4root00000SW00.00.00:00md_thread
5root00000SW00.00.00:00md_thread
566root10724724420S00.02.30:00login
567root00332332268S00.01.00:00getty
568root00332332268S00.01.00:00getty
21root00000SW00.00.00:00nfsiod
22root00000SW00.00.00:00nfsiod
23root00000SW00.00.00:00nfsiod
24root00000SW00.00.00:00nfsiod
361root00324324256S00.01.00:00inetd
nice[-n valeur] [<commande>]
Chaque utilisateur peut décider que son processus a besoin d'une priorité moindre. Il lui faudra alors plus de temps pour se terminer.
Ceci est interessant pour des commandes longues et non urgents.
Sans argument, nice permet de connaître le facteur actuel par défaut.
[[email protected] chantal]#nice
0
La commande nice permet de rabaisser la priorité d'un processus en augmentant son facteur de priorité.
Le premier paramètre donne le nombre d'unités de priorité à soustraire au processus (1 à 19).
Le deuxième paramètre précise la commande dont la priorité est à baisser.
PID TTY STAT TIME COMMAND
5661 S0:00 /sbin/getty tty1 VC linux
5672 S0:00 /sbin/getty tty2 VC linux
5683 S0:00 /sbin/getty tty3 VC linux
5694 S0:00 /sbin/getty tty4 VC linux
5705 S0:00 /sbin/getty tty5 VC linux
5716 S0:00 /sbin/getty tty6 VC linux
774p1 S0:00 su root
775p1 S0:00 bash
798p1 R0:00 ps
[[email protected] chantal]#nice ls -lR / > sortie 2>/dev/null &
[1] 799
[[email protected] chantal]#ps
PID TTY STAT TIME COMMAND
5661 S0:00 /sbin/getty tty1 VC linux
5672 S0:00 /sbin/getty tty2 VC linux
5683 S0:00 /sbin/getty tty3 VC linux
5694 S0:00 /sbin/getty tty4 VC linux
5716 S0:00 /sbin/getty tty6 VC linux
774p1 S0:00 su root
775p1 S0:00 bash
799p1 RN0:02 ls -lR /
800p1 R0:00 ps
[[email protected] chantal]#ps l
FLAGSUIDPIDPPIDPRINISIZERSS WCHANSTA TTY TIME COMMAND
1000566100856324 tty_ioctlS10:00 /sbin/get
1000567100856324 tty_ioctlS20:00 /sbin/get
1000568100856324 tty_ioctlS30:00 /sbin/get
1000569100856304 tty_ioctlS40:00 /sbin/get
1000570100856304 tty_ioctlS50:00 /sbin/get
1000571100856304 tty_ioctlS60:00 /sbin/get
1001000774759001068696 wait4Sp10:00 su root
10007757741001160624 wait4Sp10:00 bash
100100079977517101180588R N p10:14 ls -lR /
1001000801775120980376Rp10:00 ps l
[[email protected] chantal]#nice -n 20 ls -lR / > sortie 2>/dev/null &
[2] 802
[[email protected] chantal]#ps l
FLAGSUIDPIDPPID PRINISIZERSS WCHANSTA TTY TIME COMMAND
1000566100856324 tty_ioctlS10:00/sbin/get
1000567100856324 tty_ioctlS20:00/sbin/get
1000568100856324 tty_ioctlS30:00/sbin/get
1000569100856304 tty_ioctlS40:00/sbin/get
1000570100856304 tty_ioctlS50:00/sbin/get
1000571100856304 tty_ioctlS60:00/sbin/get
1001000774759001068696 wait4Sp10:00su root
10007757741001160624 wait4Sp10:00bash
100100080277519191200620R N p10:05ls -lR /
Il est quasi impossible de prévoir à l'avance de combien le processus sera ralenti en jouant sur le facteur nice.
L'administrateur peut accélérer l'exécution de ces commandes en augmentant la priorité donc en diminuant la valeur, c'est-à-dire en passant une valeur négative à la commande nice.
Il existe une autre commande, renice, permettant de modifier le facteur de priorité d'une commande même après son lancement.
renice[priorité] [p pid] [g gid] [-u user]
[[email protected] chantal]#nice -n 5 ls -lR / > sortie 2>/dev/null &
[1] 838
[[email protected] chantal]#ps l
FLAGSUIDPIDPPID PRINISIZERSS WCHANSTA TTY TIME COMMAND
1000566100856324 tty_ioctlS10:00/sbin/get
1000567100856324 tty_ioctlS20:00/sbin/get
1000569100856304 tty_ioctlS40:00/sbin/get
1000570100856304 tty_ioctlS50:00/sbin/get
1000571100856304 tty_ioctlS60:00/sbin/get
1001000823808001068696wait4Sp00:00su root
10008248231001160624wait4Sp00:00bash
10010008388241651116540R N p00:03ls -lR /
1001000839824120980376Rp00:00ps l
[[email protected] chantal]#renice 10 845
845: old priority 5, new priority 10
[[email protected] chantal]#ps l
FLAGSUIDPIDPPID PRINISIZERSS WCHANSTA TTY TIMECOMMAND
1000566100856320 tty_ioctlS10:00/sbin/get
1000567100856320 tty_ioctlS20:00/sbin/get
1000568100856320 tty_ioctlS30:00/sbin/get
1000569100856304 tty_ioctlS40:00/sbin/get
1000570100856304 tty_ioctlS50:00/sbin/get
1000571100856304 tty_ioctlS60:00/sbin/get
1001000823808001068696 wait4Sp00:00su root
10008248231001160624 wait4Sp00:00bash
100100084582418101180596R N p00:12ls -lR /
1001000848824120980376Rp00:00ps l
La commande time permet de mesurer le temps nécessaire à une commande.
Elle retourne trois valeurs:
- le temps réel écoulé entre lancement de la commande et sa fin
- le temps utilisateur, c'est-à-dire le temps qu'il faut au processeur pour exécuter les ordres du programme
- le temps système, c'est-à-dire le temps qu'il faut au processeur pour exécuter les ordres système lancés par le programme lui-même, par exemple via une lecture ou une écriture de fichier.
time [option] <commande>
-o <nom fichier> pour mémoriser les résultats
-v verbose – affichage des résultats en fin de commande
[[email protected] chantal]#time -o temps ls -lR> sortie 2>/dev/null
[[email protected] chantal]#cat temps
0.02user 0.01system 0:00.03elapsed 88%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (97major+24minor)pagefaults 0swaps
[[email protected] info]#time -v ls -ld
Command being timed: "ls -ld"
User time (seconds): 0.01
System time (seconds): 0.00
Percent of CPU this job got: 100%
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 88
Minor (reclaiming a frame) page faults: 16
Voluntary context switches: 0
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
Vous trouverez un certain nombre d'informations dans après l'avoir décompressé.
L'utilisation du CPU est la première chose que l'on considère lorsque l'on essaie de résoudre un problème de performance.
La commande vmstat affiche l'activité du CPU.
vmstat [intervalle] [nombre]
intervalle désigne le nombre de secondes qui sépare les affichages consécutifs
nombre nombre de rapports que doit produire la commande
[[email protected] /root]$vmstat
procsmemoryswapiosystemcpu
r b wswpdfreebuffcachesisobiboincsussyid
0 0 0018280102857680010103500100
Avec production de 4 rapports, espacés de 5 secondes chacun.
[[email protected] /root]$vmstat 5 4
procsmemoryswapiosystemcpu
r b wswpdfreebuff cachesisobiboincsussyid
0 0 0018280102857680010103500 100
0 0 0018284102857680000101400 100
0 0 0018284102857680001103400 100
0 0 0018284102857680000101400 100
Quelques explications:
procs : nombre de processus
r prêt à l'exécution
b bloqué en attente d'E/S
w prêt à l'exécution mais swappéswappé
meory en Kb
swpd utilisé pour le swap
free
buff utilisé pour les buffer
cache
taille du cache sur disque
io
bi blocs envoyés à un device
bo blocs reçus d'un device
% temps CPU
utilisé par l'utilisateur
par le système
- les priorités des processus (nice – renice)
- un déplacement d'une partie de la charge du travail sur un autre système
- un décalage dans le temps de certaines tâches ( at )
Syslogd est un démon qui journalise les évènements du système. En lançant syslog, on démarre syslogd et klogd qui journalise les messages d'erreur du noyau.
Tous les programmes n'utilisent pas automatiquement syslog.
Par défaut les fichiers de log se trouvent dans /var/log.
Parmi les fichiers log principaux, nous trouvons:
/var/log/messages qui récupère tout.
/var/log/secure contient les informations des connexions
/var/log/maillog contient un enregistrement du trafic de courrier entrant et sortant
/var/log/spooler contient les messages d'erreur des démons uucp
[[email protected] log]#cat messages
Apr2 22:05:40 caldera13 syslogd 1.3-3: restart.
Apr2 22:05:42 caldera13 kernel: klogd 1.3-3, log source = /proc/kmsg started.
Apr2 22:05:43 caldera13 kernel: Loaded 4157 symbols from -2.0.
35.
Apr2 22:05:43 caldera13 kernel: Symbols match kernel version 2.0.35.
Apr2 22:05:43 caldera13 kernel: Loaded 81 symbols from 15 modules.
Apr2 22:05:43 caldera13 kernel: Console: 16 point font, 400 scans
Apr2 22:05:43 caldera13 kernel: Console: colour VGA+ 80x25, 1 virtual console
(max 63)
Apr2 22:05:43 caldera13 kernel:
Apr2 22:05:43 caldera13 kernel: >>> kernel: initializing PCI devices <<<
Apr2 22:05:43 caldera13 kernel: pcibios_init : BIOS32 Service Directory struct
ure at 0x000fac70
Apr2 22:05:43 caldera13 kernel: pcibios_init : BIOS32 Service Directory entry
at 0xfb0f0
Apr2 22:05:43 caldera13 kernel: pcibios_init : PCI BIOS revision 2.10 entry at
0xfb120
Apr2 22:05:43 caldera13 kernel: Probing PCI hardware.
[[email protected] log]#cat secure
hantal(uid=502)
Apr3 00:01:17 caldera13 PAM_pwdb[702]: (su) session closed for user jules
Apr1 00:00:04 caldera13 PAM_pwdb[727]: (su) session opened for user jules by c
hantal(uid=502)
Apr1 00:02:08 caldera13 PAM_pwdb[727]: (su) session closed for user jules
Apr1 00:02:08 caldera13 PAM_pwdb[616]: (su) session closed for user root
Apr1 00:02:08 caldera13 PAM_pwdb[597]: (su) session closed for user jules
Apr1 00:02:08 caldera13 PAM_pwdb[572]: (su) session closed for user root
Apr1 00:18:07 caldera13 PAM_pwdb[549]: (login) session opened for user root by
(uid=0)
Apr1 00:18:13 caldera13 getty[550]: exiting on TERM signal
Apr1 00:18:13 caldera13 getty[551]: exiting on TERM signal
Apr1 00:18:13 caldera13 getty[552]: exiting on TERM signal
Apr1 00:18:13 caldera13 getty[553]: exiting on TERM signal
Apr1 00:18:13 caldera13 getty[554]: exiting on TERM signal
Apr2 22:06:07 caldera13 login[566]: FAILED LOGIN 1 FROM (null) FOR root, Authe
ntication failure
Normalement le démon est lancé au démarrage de la machine. Si ce n'est pas le cas, vous pouvez le lancer avec la commande : /etc/rc.d/init.d/syslog start
La configuration se fait par le fichier .
[[email protected] /root]$cat
# Log debugging too
#*.debug;news,mail,authpriv,-/var/log/debug
# The authpriv file has restricted access.
authpriv.*;auth.*/var/log/secure
# true, 'auth' in the two previous rules is deprecated,
# but nonetheless still in use
# Log all the mail messages in one place.
mail.*/var/log/mail
# As long as innd insists on blocking /var/log/news
# (instead of using /var/log/news.d) we fall back to
news.*
# Save uucp and news errors of level err and higher
# in a special file.
uucp,/var/log/spooler
…
Par ligne, on indique :
- le service,
- le niveau de gravité
- le fichier vers lequel diriger les logs.
Les divers services sont :
- cron messages de crontab et at
- ftp messages du serveur ftp
- kern messages du noyau
- lpr messages du serveur d'impression
- mail - de messagerie
- syslog - syslog lui-même
- user - générés par le programme en cours d'un utilisateur
Les niveaux de sécurité :
* tous les messages
7 debug messages de débogage
6 info messages d'information
5 notice justes plus importants que les infos
4 warm avertissement
3 err messages d'erreur
2 crit situation critique
1 alert situation nécessitant une intervention immédiate
0 panic système inutilisable.
Si vous indiquez dans un fichier inexistant, le démon syslog n'est pas capable de le créer. Pensez donc à le créer tout d'abord.
CDD Istres TSMSI / TSRIT 1
1