Démarrer (sous) LINUX

Démarrage du noyau

  • Après le chargement du bios, il y a exécution du chargeur de système LILO (LInux LOader, installé le plus souvent dans le MBR). Le prompt LILO: s'affiche, et au bout de quelques secondes (durée réglable), le système par défaut s'installe, pour nous c'est Linux, version Mandrake 6.1 .

  • Usuellement, cette initialisation s'effectue en niveau 3, mode multi-utilisateurs avec les services réseau activés. Mais le niveau de chargement par défaut est réglable dans le fichier inittab.

  • Pendant ce court laps de temps, l'utilisateur peut donner des directives à LILO, notamment pour démarrer le système suivant un autre niveau que le niveau par défaut. Ainsi, on peut entrer :
    • linux 1 (single), si on veut travailler exclusivement en mode mono-utilisateur
    • linux 5, pour démarrer le serveur X, et un Window Manager, directement en niveau 5 graphique

  • Le compte-rendu de l'initialisation, en particulier des chargements des pilotes de périphériques, se trouve dans /var/log/dmesg
    Les messages générés pendant l'initialisation du système sont consultables avec la commande dmesg

Connexion

Travailler sous le système LINUX, même en dehors de tout contexte réseau, implique une connexion au système.
Une session monoposte n'est jamais anonyme.
Le processus d'identification est classique :
  • Donner le nom d'utilisateur (login :)
  • puis le mot de passe (password :)
  • Si le compte est authentifié sur la machine, il y a rappel de la précédente connexion sous le même nom.
  • Observer le prompt [user@machine rép-perso]
  • celui-ci est modifiable; sa notation symbolique, [\u@\h \W]\$, est donnée par echo $PS1voir sa définition dans /etc/profile
Lorsque nous sommes authentifiés, nous disposons des ressources du système selon les permissions (les droits des fichiers) que l'administrateur (le "root") a accordées.

Le shell

  • En connexion, le système nous connaît, a ouvert une session de travail à notre nom, et attend nos directives , nos commandes.
  • Plus précisément, il nous met sous le contrôle d'un programme qui joue le rôle d'interpréteur de commandes (semblable au rôle joué par command.com , vous vous souvenez ? ;-)
  • Cette interface utilisateur est un programme qui s'appelle le shell (ce qu'il faut comprendre comme la "coquille qui enveloppe le noyau").
    C'est notre interlocuteur, qui attend la saisie d'une ligne de commande et sa validation, pour analyser sa syntaxe et ... s'efforcer de comprendre notre demande pour l'exécuter (si possible !).
  • Le shell lancé à chaque connexion peut être choisi lors de la création de l'utilisateur (par exemple avec Linuxconf, choisir dans une liste les interpréteurs disponibles).
    Par défaut, il s'agit ici du shell BASH, le plus utilisé, lancé par la commande /bin/bash
  • Pour connaitre le shell et ses commandes internes, consulter son manuel : man bash (3923 lignes !)

Les commandes
Les commandes les plus simples sont les plus utilisées : elles sont internes au noyau , comme ls, cp ...
D'autres peuvent être des alias, des pseudos d'autres commandes.
Par exemple ll est défini comme alias de ls -l , x de startx, m de mc -c ...

Ce shell regarde si la commande que l'utilisateur lui lance est interne. Sinon, s'il s'agit d'un alias d'une autre commande.
Sinon, il recherche un programme sur le système de fichiers, portant le nom de la commande, en se servant des chemins listés dans la variable $PATH.
S'il trouve un tel programme, il l'exécute, en lui passant les arguments spécifiés sur la ligne de commande.



Exercice : Que font ces quelques commandes ?
pwd
who
ll
cd
echo Bonjour
echo -n Bonjour
echo $PATH
clear
date
startx


Multi-connexions

Le système Linux est multi-utilisateurs
Comment le voir si on ne dispose que d'une seule machine ?
On peut se connecter plusieurs fois sur une même machine sous des identités différentes.
Pour cela on peut ouvrir des terminaux ou consoles virtuelles avec Alt-Fx, x=1 à 6, puis passer de l'une à l'autre avec la même commande.



Exo : prise en main de la multi-connexion
Si aucun compte utilisateur n'a encore été créé, il faut (forcément) se connecter comme administrateur root.
Créer tout de suite les 2 comptes utilisateurs stagex et totox (x=1 ..9, selon le numéro de votre station).
Effectuez alors les multi-connexions suivantes :
  • root (passwd=cfipen) sur le terminal tty1
  • utilisateur (login = stagex, password=stgx) sur le terminal tty2.
  • dangereux (login = totox, password=zigx) sur le terminal tty3.
Puis :
  • Remarquez le prompt # qui distingue root d'un quelconque utilisateur, de prompt $
  • Comment passer de l'une à l'autre de vos identités ?
    Passez la commande w. Quelle est sa fonction ?
  • Sous l'identité stagex, avez vous la permission de fouiner partout ? essayez donc d'aller dans /root (commande cd /root), le rép. personnel de root !
  • totox, l'utilisateur à risque, essaie de supprimer quelques fichiers vitaux, comme /etc/passwd, le fichier définissant les comptes utilisateurs ou /etc/inittab, le fichier principal d'initialisation du système; y arrivera t-il ?
    [totox@p0x /totox]$ cd /etc --> pour aller dans le rép. /etc
    [totox@p0x /etc]$ rm passwd --> totox veut supprimer ce fichier
    "rm: détruire le fichier protégé en écriture 'passwd'?" --> y , il ose confirmer !
    "Permission non accordée" ouf !
    [totox@p0x /etc]$ ll passwd --> voilà l'explication !


Attention !
Les manipulations précédentes apparemment bien innocentes comportaient déjà des risques importants !
Si par mégarde, sous l'identité de root, vous aviez supprimé quelques fichiers ...
Il faut donc toujours se connecter et travailler comme utilisateur, même sur son propre système.

Si une tâche requérant les privilèges de root survient, on lance la commande su , qui place l'utilisateur en position de root, sur la même console (moyennant la fourniture du mot de passe); on quitte la commande su le plus vite possible par exit.

Manipulation

[stagex@p0x stagex]$ tty (où suis-je ?)
[stagex@p0x stagex]$ pwd (dans quel répertoire courant ?)
[stagex@p0x stagex]$ who am i (qui suis-je ?)
[stagex@p0x stagex]$ who (qui sommes-nous ?)
[stagex@p0x stagex] su (ouverture session superviseur)
password: cfipen
[root@p0x stagex] who am i --> conclusion ?


Déconnexion et arrêt (volontaire)

  • Pour se déconnecter, entrer exit ou logout

  • Cela relance l'attente de login.
  • Evidemment, il ne faut pas éteindre brutalement ou rebooter sauvagement ! Chaque processus actif doit recevoir du noyau du système la directive de s'arrêter proprement, les systèmes de fichiers doivent être démontés.
  • En cas de coupure brutale, le système effectuera des réparations au prochain démarrage, à l'aide de l'utilitaire fsck, avant de procéder à l'initialisation du système.
  • Si un user qcq peut se connecter au démarrage, bien entendu pour des raisons de sécurité, l'arrêt est une tâche d'administration.

  • Pour arrêter le système, l'administrateur root lance l'une des commandes suivantes :
    • arrêt immédiat
      halt (= shutdown -h now)
    • arrêt différé
      shutdown -h il s'écoule minutes entre l'avertissement et l'arrêt.
    • reboot
      shutdown -r [ | now] ou reboot ou ctrl-alt-del
  • On peut éteindre à l'invite du message : The system is halted


Annexe 1 : Le processus de connexion

Lors de la création de son compte, un utilisateur est associé à un type de shell
Pour s'en convaincre consulter le fichier /etc/passwd : le dernier champ contient le nom du fichier exécutable (le shell par défaut) /bin/bash
L'interpréteur de commande associé est ainsi lancé automatiquement dès la saisie du login utilisateur.
Il poursuit sa configuration en exécutant des scripts globaux à tous les utilisateurs et des scripts liés au compte et qui permettent une personnalisation.
Enfin, il affiche le prompt et se met en attente de la lecture d'une commande.
Jusqu'à la commande exit, pour quitter le shell (ce qui équivaut à se déconnecter (logout))

Les scripts de connexion

  1. d'abord le script /etc/profile communs à tous les users y compris root
  2. celui-ci cherche à exécuter tous les scripts /etc/profile.d/*.sh (percourir alias.sh et numlock.sh)
  3. puis il y a exécution de $HOME/.bash_profile (la variable $HOME contient le chemin vers le répertoire personnel). Il s'agit ainsi d'un fichier de démarrage personnel et paramétrable.
  4. A son tour il exécute $HOME/.bashrc dans lequel il est recommandé de placer toutes les fonctions ou alias personnels (car .bashrc est exécuté dans tout shell)
  5. Enfin le précédent exécute /etc/bashrc, dans lequel on place les alias globaux et la définition du prompt $PS1
  6. Puis le prompt utilisateur s'affiche et le shell attend une commande ...

Personnalisation du shell

/etc/bashrc est le dernier script d'initialisation du shell bash. Il contient des alias redéfinissables ou à compléter par l'utilisateur root.
Il suffit donc d'éditer et de compléter le fichier par défaut; par exemple :

# vi /etc/bashrc (ou bien sûr utiliser l'éditeur de Midnigth Commander, lancer mc )

alias l=""ls --color=tty -F -b -T 0"
alias ll="l -l"
alias lp="ll | more"
alias la="ll -a"
alias x="startx"
alias m="mc -c"

:wq (pour écrire dans le fichier et quitter vi)

Puis se reloguer (exit) pour relancer l'interpréteur du shell.

Personnalisation du login utilisateur

Chaque utilisateur peut ajouter des commandes shell au fichier de profil personnel, ~/.bash_profile
Par exemple, voici ce que j'ai mis à la fin de ce fichier :
clear
salut="Bonjour $USER !"
# $USER contient le nom de connexion
echo "Nous sommes le $(date)"
# $( .. ) permet d'obtenir le résultat de l'exécution de la commande incluse


Annexe 2 : le processus de démarrage

Voici dans ses grandes lignes les phases du démarrage.

Démarrage du noyau

  • A la mise sous tension, il y a la phase d'initialisation du BIOS de la carte mère : celle-ci fait l'inventaire de ses "petits", les divers périphériques dont elle se trouve dotée (bus, ram, disques, cartes ...).
    Puis il part à la recherche d'un système d'exploitation sur l'un des périphériques accessibles ...

  • Habituellement (si on ne démarre pas sur une disquette), le BIOS charge en mémoire le MBR (Master Boot Record, 1er secteur de la 1ère piste du 1er disque dur, 512 octets).
    Supposons que le chargeur de systèmes LILO (Linux Loader) s'y trouve, une première partie de LILO est chargée et exécutée (A noter que le chargeur LILO peut se trouver sur une disquette ou sur la partition active du disque)

  • Sa tâche consiste à charger en mémoire la 2ème partie de LILO (environ 5 Ko). 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 (pb de géométrie du disque)que cette 2ème partie est ce qui va permettre à l'utilisateur de choisir le système à lancer.
  • Le noyau de ce système quel qu'il soit (Linux, Windows ..) est décompressé "à la volée" et est chargé en mémoire. Ceci est accompagné de l'affichage du message "Uncompressing Linux ...done. Now booting the kernel .."
  • Dès lors c'est le noyau qui prend les affaires en main et inspecte son environnement matériel !

Les niveaux de fonctionnement

Ces 6 niveaux sont décrits au début du fichier /etc/inittab
  • 0 : provoque un arrêt (shutdown) de la machine
  • 1 : pour rentrer en mode mono-utilisateur, réservé à root
  • 2 : mode multi-utilisateurs, sans NFS
  • 3 : mode multi-utilisateurs avec tous les services réseaux
  • 5 : démarrage du serveur graphique X11 en plus
  • 6 : redémarrage de la machine (la commande reboot lance le niveau 6).
La ligne qui suit définit le niveau de fonctionnement par défaut au démarrage (Default runlevel), ici le niveau 3
id:3:initdefault
Donc pour changer de niveau par défaut, il suffit tout simplement de changer ce numéro !

Le premier processus, init

Le noyau du système chargé et décompressé, s'exécute et s'initialise : réservation mémoire, prise en compte de la zone d'échange (swap), détection du matériel et chargement des pilotes des périphériques, montage du système de fichiers et enfin lance le 1er processus /sbin/init
Le paramétrage de ce processus fondamental est entièrement assuré par l'exécution de ce fichier script /etc/inittab dont voici la suite :
# niveau d'exécution 3 par défaut
id:3:initdefault
# il y a ensuite exécution des scripts rc.sysinit
--> initialisation du PATH pour les autres scripts, activation swap,
montage systèmes fichiers, gestion des quotas..

si::sysinit:/etc/rc.d/rc.sysinit
# exécution du script etc/rc.d/rc avec le niveau en paramètre
--> lancement des divers services du niveau choisi, ici 3,

etc/rc.d/rc 3
# ceci lance tous les liens symboliques du rép rc3.d
/etc/rc.d/rc3.d/S*
# par exemple /etc/rc.d/rc3.d/S01kerneld*fait référence
au script /etc/rc.d/init.d/kerneld

# les scripts de /etc/rc.d/init.d/ sont appelés avec un paramètre
start, stop, status, restart
Par exemple si on a modifié la configuration du serveur Samba dans le
fichier smb.conf, il faut relancer ce service par la commande
/etc/rc.d/init.d/smb restart

# le fichier inittab se termine par
# exécute xdm qui lance X et le login graphique, si le "runlevel" est 5
x:5:respawn:/etc/X11/prefdm -nodaemon

Le dernier script d'initialisation à être exécuté est /etc/rc.d/rc.local
On y écrit à la fin d'éventuelles commandes pour charger des modules ou lancer des services supplémentaires.


Manipulations

  1. Examiner le fichier /var/log/dmesg qui contient le compte-rendu de l'initialisation.
    Bizarrement, la commande dmesg nous en dit un peu plus, notamment sur l'interface réseau.
  2. Examiner le fichier /etc/inittab avec mc
    Que faudrait-il y changer pour démarrer immédiatement au niveau X ?
  3. Si vous êtes intéressé, suivez le cheminement décrit ci-dessus.


Annexe 3 : Vie et mort des processus

Un processus est un programme en cours d'exécution.
Le noyau Linux lance, gère les processus et contrôle leur échanges avec les périphériques. Il tient à jour une table des processus en exécution
Le premier processus, ancêtre de tous les autres est init. Tous les processus successifs sont créés par un processus parent et appartiennent à un utilisateur. Chacun est identifié par un numéro, son PID
Il peut être important de connaître le PID d'un processus, ne serait-ce pour pouvoir le "tuer", s'il ne répond plus et bloque une console
Voici comment consulter la table des processus et si besoin agir !
ps liste des processus
ps aux : donne tous les processus, avec leur numéro PID
ps aux | less : pour contrôler le défilement
ps aux | grep X11 : pour n'afficher que les lignes concernant le processus cherché.
kill PID : met fin normalement à la tâche
kill -9 PID : action si nécessaire encore plus radicale !

Sous X-KDE, on peut utiliser TaskManager, qui montre l'arborescence des processus.

Manipulations

  1. Comment vérifier que le processus init est bien le tout premier lancé par le noyau ?

  2. Connexions root dans tty1 et stagex dans tty2
    Expliquer ce que signifie la commande suivante et noter les numéros PID
    ps aux | grep login
    Que se produira t-il si on supprime un processus login dans tty2 ? dans tty1 ? Vérifier.

  3. Connexion comme stagex dans tty1 et dans tty2
    Lancer mc dans tty1, afficher un fichier
    Dans tty2, repérer le numéro PID du processus mc, pour ensuite le supprimer kill PID.
    Vérifier le résultat.

  4. Lancer le serveur X-KDE par startx, passer en mode console dans un autre terminal, y repérer le PID de kfm, et le tuer.
    Mais qu'avez-vous donc fait ? pouvez vous lancer des programmes ?
    Ensuite, débarrassez-vous de kpanel .
    Bravo, admirez votre oeuvre, comment allez-vous pouvoir quitter proprement le serveur X maintenant ?
    Essayez de redémarrer le serveur X --> erreur : "remove /tmp/.X0-lock and start again".
    Il n'y a qu'une solution, se débarrasser du processus parent qui est /etc/X11/X ..
    ps aux |grep X  ---> root PID=2128 /etc/X11/X ...
    kill 2128


Annexe 4 : Le chargeur d'OS LILO

Exemple commenté de fichier /etc/lilo.conf

# lilo est installé dans le MBR du 1er disque

pour l'installer sur disquette, mettre boot=/dev/fd0

boot = /dev/hda
# transmission à LILO du fichier binaire contenant la description des noyaux
map=/boot/map
# fichier binaire utilisé comme secteur de démarrage
install=/boot/boot.b
# indique le label de l'image à chager, sinon c'est le premier rencontré
default=linux
# affiche un texte explicatif au démarrage
message=/boot/message
# vga spécifie l'affichage en mode texte
# normal (80x25), extended (132x44 ou 132x60) ou ask (choix au demarrage)

vga = normal
# active le mode interactif
prompt
# chargement automatique dans 5 secondes du premier système
timeout = 50
# fichier contenant l'image du noyau Linux à charger
image=/boot/vmlinuz-2.2.13-7mdk
label = linux
# partition où se trouve la racine / du système de fichiers
# Pour une disquette root=/dev/fd0
# Si rien n'est specifie, le système utilise le résultat de la commande rdev.
root = /dev/hda2
read-only

Le multi-boot

ou comment faire migrer en douceur son système de Windows9x vers Linux


Examiner le fichier /etc/lilo.conf de votre machine. Quelles en sont les infos essentielles ?
Voir l'utilitaire linuxconf/Configuration/mode de démarrage, plus convivial pour apporter des modifications à lilo.conf, et qui active les changements ...
Ou encore l'utilitaire KLILO sous KDE.