Le noyau Linux supporte maintenant deux types de systèmes de fichiers
pour les disques racines à copier automatiquement sur disque
mémoire. Ce sont minix et ext2, ext2 étant le système de fichier
préféré. Ce support ext2 a été rajouté quelque part entre les versions
1.1.17 et 1.1.57, je ne sais pas exactement quand. Si vous avez un
noyau parmi ces versions, éditez
/usr/src/linux/drivers/block/ramdisk.c
et cherchez le mot ``ext2''. Si
vous ne le trouvez pas, vous aurez à utiliser un système de fichiers
minix, créé au moyen de la commande mkfs
. Si vous utilisez
ext2, vous pourrez trouver pratique d'utiliser l'option -i
pour
allouer plus d'i-noeuds que par défaut ; on recommande -i 2000
pour ne pas manquer d'i-noeuds. Sinon, vous pouvez économiser des
i-noeuds en supprimant les nombreux fichiers inutiles de
/dev
. Mke2fs
créera par défaut 360 i-noeuds sur une
disquette 1.44 Mo. Pour ma part, 120 i-noeuds sont suffisants sur mon
actuelle disquette de secours racine, mais si vous incluez tous les
périphériques dans le répertoire /dev
, vous dépasserez
allègrement 360. Utiliser un système de fichiers compressé pour la
racine permet un système plus grand, et donc plus d'i-noeuds par
défaut, mais vous pourriez cependant devoir réduire le nombre de
fichiers ou bien augmenter le nombre d'i-noeuds.
Pour créer un système de fichiers ext2 sur une disquette, sur ma machine, je lance la commande suivante :
mke2fs -m 0 /dev/fd0
La commande mke2fs
va automatiquement détecter l'espace disponible et
se configurer en fonction. Eventuellement, la taille de la disquette
en blocs de 1Ko peut être spécifiée pour accélérer l'opération de
mke2fs
. Le paramètre -m 0
évite à mke2fs
de réserver de
la place pour root, ce qui laisse plus de place disponible sur le disque.
Une manière simple de tester le résultat est de créer un système en utilisant la commande ci-dessus ou une commande approchant, et d'essayer ensuite de monter la disquette. S'il s'agit d'un système ext2, alors la commande :
mount -t ext2 /dev/fd0 /<point d'entree>
devrait fonctionner.
Dans la plupart des cas, il serait possible de copier votre noyau actuel et d'amorcer la disquette avec ça. Cependant, il peut y avoir des cas où vous souhaitez construire un noyau différent.
Une raison peut être la taille. Le noyau est un des plus gros fichiers, sur un système de taille minimale, et si vous souhaitez créer une disquette amorce/racine, vous aurez à réduire la taille du noyau autant que possible. Le noyau supporte désormais le changement de disquette après amorçage et avant de monter la racine, et comme il n'est donc plus nécessaire d'entasser le noyau sur le même disque que tout le reste, ces commentaires ne s'appliquent que si vous décidez de construire une disquette amorce/racine.
Il y a deux manières de réduire la taille du noyau :
make zImage
Reportez vous à la documentation incluse avec les sources du noyau
pour une information à jour sur la construction de noyaux
compressés. Notez que les sources du noyau sont généralement dans
/usr/src/linux
.Une fois choisi le minimum d'options à inclure dans un noyau, vous devez choisir quoi remettre dedans. L'utilisation la plus commune d'une disquette amorce/racine est probablement d'examiner et restaurer un système de fichiers racine corrompu, et cela nécessite éventuellement du support dans le noyau.
Par exemple, si vos sauvegardes sont stockées sur bandes en utilisant
Ftape
pour accéder au lecteur et que vous perdez votre disque racine
ainsi que les disques contenant Ftape
, vous ne pourrez alors pas
restaurer votre système à partir des bandes de sauvegarde. Vous devrez
réinstaller Linux, récupérer et réinstaller Ftape
, et seulement alors
essayer de relire vos sauvegardes.
Il est souhaitable de maintenir une copie des mêmes versions des utilitaires servant à écrire les sauvegardes, afin de ne pas perdre de temps à essayer d'installer des versions ne pouvant pas lire vos bandes de sauvegarde.
Ce qu'il faut comprendre, c'est que tout support d'entrées/sorties que vous avez ajouté à votre noyau pour réaliser des sauvegardes doit aussi être ajouté à votre noyau d'amorce/racine.
La procédure pour reconstruire le noyau est decrite dans la
documentation accompagnant le noyau. C'est assez simple à suivre, donc
commencez par regarder dans /usr/src/linux
. Si vous avez des problèmes
pour construire un noyau, vous ne devriez probablement pas essayer de
construire des disques amorce/racine de toute manière.
Tout système Linux nécessite un répertoire /dev
contenant un fichier
spécial pour tous les périphériques utilisées par le système. Le
répertoire lui-même est un répertoire normal, et peut être créé avec
la commande mkdir
de la manière habituelle. Les fichiers spéciaux de
périphériques doivent par contre être créés d'une certaine manière,
avec la commande mknod
.
Il y a un raccourci cela dit - copiez votre répertoire
/dev
existant, et supprimez ceux dont vous n'avez pas
besoin. La seule chose à faire est de copier les fichiers spéciaux de
périphériques en utilisant l'option -R
.
Attention : la commandecp
fournie avec la plus récente version des fileutils (3.13) semble ne pas respecter l'option-R
.
Cela copie le répertoire sans essayer de copier le contenu des
fichiers. Si vous utilisez un r
minuscule, à savoir ``-r
'', le
comportement sera très différent, puisque vous essaierez de copier
tout le contenu de tous vos disques - ou tout au moins ce qui tiendra
sur une disquette ! Faites donc attention, et utilisez la commande :
cp -dpR /dev /mnt
en supposant que la disquette est montée sur /mnt
. Les options dp
conservent les liens symboliques en tant que tels lors de la copie (au
lieu de copier le fichier pointé) ainsi que les attributs des fichiers
originaux, préservant donc les informations de propriété.
Vous pouvez aussi utiliser l'option -p
de cpio
, car
cpio
traitera les fichiers spéciaux de périphériques correctement
et n'essaiera pas d'en copier le contenu.
Par exemple :
cd /dev
find . -print | cpio -pmd /mnt/dev
copiera tous les fichiers spéciaux de /dev
sur
/mnt/dev
. En fait, cela copiera tous les fichiers dans
l'arborescence de répertoires commençant à /dev
, et créera
tous les sous-répertoires nécessaires dans l'arborescence cible.
Si vous cherchez la complexité, utilisez ls -l
pour connaître les
numéros de périphériques majeurs et mineurs de ceux que vous voulez,
et créez les sur la disquette en utilisant mknod
.
De nombreuses distributions incluent un script shell appelé MAKEDEV
dans le répertoire /dev
. Ce script shell pourrait être utilisé les
périphériques, mais il est sans doute plus facile de copier ceux
existant, surtout pour un disque de secours.
Quelle que soit la manière dont le répertoire de périphériques est
copié, cela vaut la peine de vérifier que tous les fichiers spéciaux
dont vous avez besoin sont présents sur la disquette de secours. Par
exemple, Ftape
utilise des périphériques de bande, et vous devrez donc
copier tous ceux-là.
Notez qu'un i-noeud est requis pour chaque fichier spécial et que les
i-noeuds peuvent parfois être rares, surtout pour des systèmes de
fichiers sur disquette. Il est donc utile de supprimer tous les
fichiers spéciaux dont vous n'avez pas besoin dans le répertoire /dev
de la disquette. De nombreux périphériques sont clairement inutiles
sur des systèmes spécifiques. Par exemple, si vous n'avez pas de
disques SCSI, vous pouvez supprimer sans problèmes tous les fichiers
de périphériques commençant par ``sd
''. De même, si vous n'avez pas
l'intention d'utiliser le port série, tous les fichiers commençant par
``cua
'' peuvent disparaître.
Il est peut-être possible de faire fonctionner un système Linux
uniquement avec /dev
, /proc
et /etc
. Je ne
sais pas - je n'ai jamais essayé. Toutefois, cela risque de
s'avérer difficile, car sans bibliothèques partagées tous vos
exécutables devraient être compilés statiquement. Il est raisonnable
d'avoir au minimum les répertoires :
Nécessaire pour les entrées/sorties avec les périphériques
Nécessaire pour la commande ps
Fichiers de configuration du système
Exécutables des utilitaires considérés comme faisant partie du système
Bibliothèques partagées nécessaires au fonctionnement
Un point de montage pour effectuer des opérations de maintenance sur d'autres disques
Utilitaires et applications supplémentaires
L'arborescence présentée ici n'est à utiliser que sur une disquette racine. Consultez le Standard de Système de Fichiers Linux (Linux File System Standart) pour de plus amples informations sur la structure des systèmes de fichiers sur des systèmes Linux ``standards''.
Quatre de ces répertoires peuvent être créés facilement :
/dev
est décrit ci-dessus dans la section intitulée
Périphériques./proc
doit juste être présent. Il n'y a juste qu'à créer le
répertoire avec mkdir
./mnt
et /usr
sont uniquement inclus dans cette
liste comme points de montage à utiliser une fois que le système amorce/racine
fonctionne. Ici aussi, ces répertoires n'ont qu'à être créés.Les 3 répertoires restants sont décrits dans les sections suivantes.
Ce répertoire doit contenir un certain nombre de fichiers de configuration. Sur la plupart des systèmes, on peut les répartir en 3 groupes :
rc
, fstab
, passwd
.Les fichiers non essentiels peuvent être identifiés avec la commande :
ls -ltru
On obtient la liste des fichiers dans l'ordre inverse de leur date de
dernier lecture, et si des fichiers ne sont jamais lus, ils peuvent
être omis de la disquette racine.
Sur mes disquettes racine, je n'ai conservé que 15 fichiers de configuration. Mon travail se trouve réduit à trois groupes de fichiers :
rc.d/* scripts de demarrage et de changement de niveau de
fonctionnement (run level)
fstab liste de systemes de fichiers a monter
inittab parametres pour le processus init_- le premier
processus lance au demarrage.
passwd liste des utilisateurs
shadow qui contient les mots de passe
Ces fichiers doivent être nettoyés sur des systèmes sécurisés afin de
ne pas copier les mots de passe des utilisateurs ailleurs que sur le
système, et pour que lorsque vous démarrez depuis une disquette, les
logins invalides soient rejetés.
Notez qu'il y a une raison pour ne pas nettoyerpasswd
etshadow
.Tar
(et probablement d'autres programmes d'archives) stocke les noms d'utilisateurs et de groupes avec les fichiers. Si vous restaurez des fichiers sur votre disque dur depuis une bande, les fichiers seront restaurés avec leurs noms originaux, Si ces noms n'existent pas danspasswd
/group
quand ils sont restaurés, les IUD/GID ne seront pas corrects.
Parmi tout ça, je n'ai réellement que deux fichiers à configurer, et leur contenu est étonnamment petit.
rc
doit contenir :
#!/bin/sh
/etc/mount -av
/bin/hostname boot_root
où je n'ai pas vraiment besoin de lancer hostname
- ça a juste
meilleure allure si je le fais. Même mount
est uniquement nécessaire
pour monter /proc
pour que ps
fonctionne - Linux
fonctionne sans ça, bien que les opérations de secours soient assez
limitées sans mount
!fstab
doit contenir :
/dev/ram / ext2 defaults
/dev/fd0 / ext2 defaults
/proc /proc proc defaults
Je ne crois pas que la première ligne soit vraiment nécessaire, mais
j'ai remarqué que si je ne la mets pas, mount
ne monte pas /proc
.Inittab
devrait convenir tel quel, sauf si vous voulez vous assurer
que les utilisateurs par port série ne peuvent pas se connecter. Pour
éviter cela, commentez toutes les lignes avec /etc/getty
contenant un
périphérique tty
ou ttyS
au bout de la ligne. Laissez les
ports tty
pour pouvoir vous connecter sur la console.
Inittab
définit ce que le système lance ou relance à différents
moments, comme le démarrage, le passage en mode multi-utilisateurs,
les pertes d'alimentation, etc. Il faut faire s'assurer que les
commandes présentes dans inittab
correspondent à des programmes
présents, ainsi qu'au bon répertoire. Si vous placez vos fichiers de
commandes sur le disque de secours en utilisant l'exemple de contenu
de répertoires fourni dans ce HOWTO comme guide, puis copiez votre
inittab
sur le disque de secours sans le vérifier, il y a de fortes
chances que cela ne fonctionne pas, car la moitié des lignes de
l'inittab
feront référence à des programmes inexistants ou placés dans
le mauvais répertoire.
Il faut aussi noter que certains programmes ne peuvent être déplacés
d'un répertoire vers un autre sans mal fonctionner au démarrage car
ils référencent directement dans leur code le nom d'un autre programme
qu'ils essayent de lancer. Par exemple sur mon système,
/etc/shutdown
contient directement le chemin
/etc/reboot
. Si je déplace reboot
vers
/bin/reboot
puis que je lance une commande shutdown
,
elle ne va pas marcher puisqu'elle ne pourra pas trouver le fichier
reboot
.
Pour le reste, copiez simplement tous les fichiers texte dans votre
répertoire /etc
, ainsi que tous les exécutables dans votre répertoire
/etc
dont vous n'êtes pas sûr de pouvoir vous débarrasser. Pour vous
guider, consultez la sortie exemple de ls
dans ``Contenu des
répertoires du disque racine (ls -lR
)'' - c'est ce que j'ai, et ça
devrait donc vous suffire si vous copiez ces fichiers - mais notez
que les systèmes peuvent être très différents, et on ne peut donc pas
être certain qu'un ensemble de fichiers sur votre système est
équivalent au même sur le mien. La seule méthode sure est de démarrer
avec inittab et déterminer ce qui est nécessaire.
La plupart des systèmes utilisent maintenant un répertoire /etc/rc.d
contenant des scripts shell pour les différents niveaux de
fonctionnement (run levels). Le minimum absolu est un fichier rc
unique, mais il sera sans doute beaucoup plus simple en pratique de
copier le fichier inittab
et le répertoire /etc/rc.d
de
votre système, et nettoyer les scripts shell dans rc.d
pour supprimer
tous les traitements inutiles à un environnement système sur disquette.
C'est le bon endroit pour placer les autres utilitaires dont vous avez
besoin pour les opérations de base, tels que ls
, mv
,
cat
, dd
, etc.
Voir la section intitulée ``Exemple de ls -lR
pour amorce/racine'' pour
une liste des fichiers que je place dans le répertoire /bin
de ma
disquette amorce/racine. Vous pourrez remarquer qu'aucun des
utilitaires nécessaires à la restauration d'une sauvegarde, tels que
cpio
, tar
, gzip
, etc, ne s'y trouvent. C'est parce que
je les place sur une disquette utilitaire séparée, pour garder de la
place sur la disquette amorce/racine. Après avoir démarré sur ma disquette
amorce/racine, son contenu est copié dans le disque mémoire, laissant
le lecteur de disquette libre pour monter une autre disquette, la
disquette utilitaire. Je la monte en général sur /usr
.
La création d'une disquette utilitaire est décrite ci-dessous dans la section intitulée ``Ajouter des disquettes utilitaires''.
Dans /lib
vous placez certaines bibliothèques partagées ainsi que les
chargeurs. Si les bibliothèques nécessaires ne sont pas trouvées dans
votre répertoire /lib
, le système ne pourra pas démarrer. Si vous avez
de la chance, vous verrez un message d'erreur vous expliquant
pourquoi.
Pratiquement tous les programmes nécessitent au moins la bibliothèque
libc
:
libc.so.X
où X représente le numéro de version courante. Vérifiez dans votre
répertoire /lib
. Notez que libc.so.4
peut être un lien
symbolique vers une bibliothèque libc
avec un numéro de version
dans le nom. Si vous lancez la commande :
ls -l /lib
vous obtiendrez quelque chose du genre :
libc.so.4 -> libc.so.4.5.21
Dans ce cas, la bibliothèque libc
dont vous avez besoin est
libc.so.4.5.21
. Ce n'est qu'un exemple - la bibliothèque
libc
ELF est actuellement libc.so.5.xxxx
.
Pour trouver d'autres bibliothèques, vous devrez tester les
dépendances de tous les binaires que vous souhaitez utiliser. La
commande ldd
sert à ça. Par exemple, sur mon système la commande :
ldd /bin/mount
renvoie comme résultat :
/bin/mount:
libc.so.5 => /lib/libc.so.5.2.18
indiquant que /bin/mount
a besoin de la bibliothèque
libc.so.5
, qui est un lien symbolique sur libc.so.5.2.18
.
Vous devez aussi placer dans /lib
un ou plusieurs chargeurs pour
charger les bibliothèques. Le fichier du chargeur est soit ld.so
(pour
les bibliothèques au format a.out), soit ld-linux.so
(pour
les bibliothèques ELF). Si vous n'êtes pas sûr duquel vous avez
besoin, lancez la commande ``file
'' sur la bibliothèque. Par
exemple, sur mon système :
file /lib/libc.so.5.2.18
me répond :
/lib/libc.so.5.2.18: ELF 32-bit LSB shared object ...
et par conséquent elle a besoin d'un chargeur ELF. Si vous avez une
bibliothèque a.out, vous obtiendrez un résultat du genre :
/lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC) ...
Copiez le(s) chargeur(s) spécifique(s) dont vous avez besoin.
Il faut vérifier que les bibliothèques et chargeurs correspondent bien aux binaires utilisés. Si le noyau ne peut pas charger une bibliothèque indispensable, il plantera en général sans message d'erreur.
Pour que l'amorce/racine soit utilisable, elle doit être amorçable. Pour ce faire, le plus simple est d'installer un chargeur, qui est un morceau de code executable stocké sur le secteur 0 du cylindre 0 de la disquette. Voir la section ci-dessus intitulée ``Disquettes de boot'' pour une description du processus.
LILO est un chargeur longuement testé et éprouvé disponible sur tout site miroir Linux. Il vous permet de configurer le chargeur, en particulier :
Cela permet de spécifier au noyau comment il doit démarrer. Mon fichier de configuration de LILO pour l'amorce/racine, utilisé avec LILO 0.15, est :
boot = /dev/fd0
install = ./mnt/boot.b
map = ./mnt/lilo.map
delay = 50
message = ./mnt/lilo.msg
timeout = 150
compact
image = ./mnt/zImage
ramdisk = 1440
root = /dev/fd0
Notez que je ne l'ai pas testé récemment, car je n'utilise plus de disquettes amorce/racine utilisant LILO. Il n'y a aucune raison de supposer que cela ne fonctionne plus, mais si vous essayez et que cela ne marche pas, vous devez lire la documentation de LILO pour savoir pourquoi.
Notez aussi que les systèmes amorce/racine n'ont plus besoin de LILO, car depuis la version 1.3.48, le noyau supporte le chargement d'un système de fichiers compressé depuis la même disquette que le noyau. Voire la section Création de disquette de démarrage élaborée pour les détails.
Si vous avez un noyau postérieur à la version 1.3.48, la ligne
``ramdisk = 1440
'' est inutile et doit être retirée.
Notez que boot.b
, lilo.msg
et le noyau doivent préalablement
avoir été copiés sur la disquette en utilisant une commande du genre :
cp /boot/boot.b ./mnt
Si cela n'est pas fait, LILO ne fonctionnera pas correctement au démarrage si le disque dur n'est pas disponible, et un disque de secours qui nécessite la présence du disque dur pour démarrer est d'une utilité douteuse.
Je lance lilo
avec la commande :
/sbin/lilo -C <fichier de configuration>
Je le lance depuis le répertoire contenant le répertoire mnt
où la
disquette est montée. Cela signifie que je demande à LILO d'installer
un chargeur sur le périphérique de démarrage (/dev/fd0
dans ce cas),
pour démarrer un noyau situé dans le répertoire racine de la
disquette.
J'ai aussi spécifié que je veux utiliser la disquette comme périphérique racine, et que je veux qu'un disque mémoire de 1440 blocs de 1 Ko soit créé, à savoir la taille de la disquette. Puisque j'ai créé un système de fichiers ext2 sur la disquette, toutes les conditions sont remplies pour que Linux utilise automatiquement le disque mémoire comme périphérique racine, et y copie le contenu de la disquette.
Les possibilités de Linux concernant les disques mémoires sont décrites de manière plus poussées dans la section ci-dessus intitulée ``Disques mémoires et systèmes amorce/racine''.
On peut aussi envisager d'utiliser le paramètre ``single
'' pour démarrer
Linux en mode mono-utilisateur. Cela permet d'empêcher les
utilisateurs de se connecter par les ports série.
J'utilise aussi les instructions ``DELAY
'', ``MESSAGE
'' et
``TIMEOUT
'' pour que lorsque je démarre le disque, LILO me laisse
la possibilité d'entrer des options en ligne de commande si je le
souhaite. Je n'en ai pas besoin actuellement, mais on ne sait jamais
si l'on ne souhaitera pas changer de périphérique racine ou monter un
système de fichiers en lecture seule.
Le fichier de messages que j'utilise contient le message :
Disquette amorce/racine Linux
=============================
Entrez une ligne de commandes de la forme_:
zImage [ options en ligne ]
Si rien n'est entre, Linux sera charge avec les parametres
par defaut dans 15 secondes.
Il ne s'agit que d'un aide-mémoire pour me rappeler mes options.
Les lecteurs sont invités à lire la documentation de LILO de manière
attentive avant d'essayer d'installer quoi que ce soit. Il est assez
facile de détruire des partitions si vous utilisez le mauvais
paramètre ``boot =
''. Si vous manquez d'expérience, NE LANCEZ PAS LILO
avant d'être sûr que vous le comprenez et d'avoir vérifié de
nombreuses fois vos paramètres.
Notez que vous devez relancer LILO à chaque fois que vous changez le noyau, pour que LILO puisse mettre à jour sa cartographie en fonction du nouveau noyau. Il est en fait possible de remplacer le noyau par un autre quasiment identique sans relancer LILO, mais mieux vaut ne pas parier la dessus - si vous changez de noyau, relancez LILO.
Je peux aussi ajouter ceci tant que j'en suis à parler de LILO : si vous installez par erreur LILO sur un disque contenant DOS, vous pouvez toujours remplacer le secteur d'amorce par le chargeur du DOS en tapant la commande DOS :
FDISK /MBR
où MBR signifie ``Master Boot Record''. Notez que quelques puristes ne sont pas d'accord, éventuellement avec raison, mais cela marche.
LILO a plusieurs options utiles qu'il est bon de se rappeler lorsque l'on crée des disques de démarrage :
DELAY = nn
'' dans votre fichier de
configuration LILO, LILO fera alors une pause pour vous permettre de
sélectionner une image noyau à amorcer, et d'entrer sur la même ligne,
des options. Par exemple :
zImage aha152x=0x340,11,3,1 ro
passera les paramètres aha152x jusqu'au gestionnaire de disque SCSI
aha152x
(à condition que ce gestionnaire ait été inclus à la
construction du noyau) et demandera à ce que le système de fichiers
racine soit monté en lecture seule.lock
'' - cette option
demande à LILO de stocker la ligne de commande entrée comme ligne de
commande par défaut pour tous les démarrages futurs. C'est
particulièrement utile lorsque vous utilisez un périphérique qui ne
peut pas être auto-sélectionné. En utilisant ``lock
'' vous évitez
d'avoir à taper la chaîne de paramètre du gestionnaire à chaque
démarrage.
Par exemple :
zImage aha152x=0x340,11,3,1 root=/dev/sda8 ro lock
APPEND
- cela permet de
stocker des chaînes de paramètres pour gestionnaires dans la
configuration, comme alternative à l'utilisation de l'option
``lock
''. Notez que tous les mots clés de la forme mot=valeur DOIVENT
être entourés par des guillemets. Par exemple :
APPEND = "aha152x=0x340,11,3,1"
DELAY
- cela provoque une pause
de DELAY
dixièmes de secondes et permet à l'utilisateur d'interrompre
le démarrage automatique de la ligne de commande par défaut, afin
qu'il puisse en entrer une autre.Chapitre suivant, Chapitre Précédent
Table des matières de ce chapitre, Table des matières générale
Début du document, Début de ce chapitre