From madore@clipper.ens.fr Tue Dec 11 20:03:50 2001
Article: 14217 of ens.forum.alt.bavardage
Path: eleves!not-for-mail
From: madore@clipper.ens.fr (Gro-Tsen)
Newsgroups: ens.forum.alt.bavardage,ens.forum.informatique
Subject: partitionnement, bootloader, etc. (was: Re: double installation)
Followup-To: ens.forum.informatique
Date: Tue, 11 Dec 2001 19:03:50 +0000 (UTC)
Organization: Forum.
Lines: 313
Sender: madore@clipper.ens.fr
Message-ID: <9v5lam$4dg$1@clipper.ens.fr>
References: <9v4i7i$coq$1@clipper.ens.fr> <9v4ooj$4f$1@clipper.ens.fr> <9v4pdv$p4p$4@clipper.ens.fr> <9v4r57$cun$1@clipper.ens.fr> <9v5aqh$770$1@clipper.ens.fr> <9v5d6h$j7i$1@clipper.ens.fr>
NNTP-Posting-Host: clipper.ens.fr
X-Trace: clipper.ens.fr 1008097430 4528 129.199.129.1 (11 Dec 2001 19:03:50 GMT)
X-Complaints-To: forum@clipper.ens.fr
NNTP-Posting-Date: Tue, 11 Dec 2001 19:03:50 +0000 (UTC)
X-Newsreader: Flrn (0.5.0pre0 - 10/00)
X-Start-Date: 11 Dec 2001 17:10:45 GMT
X-Mark: BOG
Xref: eleves ens.forum.alt.bavardage:14217 ens.forum.informatique:4415

Gro-Tsen in litteris <9v5d6h$j7i$1@clipper.ens.fr> scripsit:
>				     Maintenant, les deux choses à
> connaître essentiellement, c'est comment fonctionnent les partitions
> et comment fonctionne le bootloader, et ce n'est pas démesurément
> compliqué non plus, il y a plein de gens (dont moi) qui seront prêts à
> expliquer ce qu'il faut.

Bon, voici un micro-HOWTO sur le partitionnement et les bootloaders.
Comme d'habitude, je vais avoir tendance à rentrer dans les détails,
parce que je n'aime pas laisser des choses sous silence, mais j'espère
que ça ne fera peur à personne.  Comme je crois que ces choses sont
plutôt mal expliquées en général, tout ceci n'est probablement pas
inutile.

D'abord, il faut savoir comment Linux désigne les disques durs.  Le
vieux format, c'est /dev/hda pour le maître de la première nappe IDE,
/dev/hdb pour l'esclave de la première nappe, /dev/hdc pour le maître
de la seconde nappe et /dev/hdd pour l'esclave de la seconde nappe ;
et les disques SCSI s'appellent /dev/sda, /dev/sdb et ainsi de suite
dans l'ordre (arbitraire).  L'important n'est pas de savoir comment
tel disque s'appellera mais de savoir retrouver le bon disque sur une
liste (si on n'a qu'un seul disque, ce qui est normalement le cas d'un
portable, c'est donc trivial).  Le nouveau format a des noms plus
longs :

/dev/ide/host0/bus0/target0/lun0/disc pour le maître du 1er IDE,
/dev/ide/host0/bus0/target1/lun0/disc pour l'esclave du 1er IDE,
/dev/ide/host0/bus1/target0/lun0/disc pour le maître du 2nd IDE,
/dev/ide/host0/bus1/target1/lun0/disc pour l'esclave du 2nd IDE,
/dev/scsi/host0/bus0/target3/lun0/disc pour l'id 3 sur le bus SCSI,
etc.

Notons que l'ancien format est encore très largement, même
majoritairement, utilisé.

Ensuite, chaque disque doit être divisé en partitions, qui sont des
régions consécutives à l'intérieur du disque.  Normalement, il y en a
quatre, pas forcément toutes utilisées, sur un disque donné.  Par
exemple, sur le disque /dev/hda, les partitions seront appelées
/dev/hda1, /dev/hda2, /dev/hda3 et /dev/hda4, mais il se peut très
bien que seule /dev/hda2 existe.  Avec le nouveau système de noms, il
faut remplacer le « disc » final du nom par « part1 » jusqu'à
« part4 ».  Notons aussi que les partitions 1 à 4 n'ont aucune raison
de figurer sur cet ordre dans le disque (la partition 4 peut très bien
contenir le début du disque, la partition 1 le milieu, la partition 2
la fin, et la partition 3 ne pas exister).  Enfin, ça ce sont les
partitions principales, parce qu'il y en a d'autres dont je parlerai
plus loin.

Chaque partition a un type, qui est un code entre 0 et 0xff (255 en
hexadécimal), qui indique le type de données qu'on s'attend à y
trouver.  Le type 0 indique que la partition n'existe pas.  Les autres
types indiquent, en gros, l'OS qui gère la partition.  Par exemple,
Linux utilise le code 0x83 (=131) pour les partitions de fichiers
(quel que soit le système de fichier effectivement présent - ext2,
ext3, ReiserFS ou autre chose) et 0x82 (=130) pour les partitions de
swap.  Ceci dit, en fait, Windows ignore complètement ce code qui sert
plutôt à ce que des programmes d'installation (par exemple) ne perdent
pas les pédales, ou que l'utilisateur s'y retrouve un peu.  MS-DOS et
Windows utilisent tout un tas de codes différents, et manifestement
ils en font réellement usage (par exemple pour savoir comment formater
la partition).

Par ailleurs, parmi les types de partitions, il y en a qui ont une
signification magique : ce sont les types dits « étendus ».  En effet,
parmi les partitions principales, on peut avoir une partition étendue
(je ne sais pas si on peut en avoir plus - certainement ça ferait tout
bugguer), c'est-à-dire une partition qui elle-même va contenir
d'autres partitions, dites alors « logiques ».  Ceci sert à dépasser
la limite de quatre partitions par disque, qui est manifestement
insuffisante.  La partition étendue, si elle existe, peut être l'une
quelconque des quatre partitions principales.  Les partitions logiques
sous la partition étendue sont appelées /dev/hda5, /dev/hda6 et ainsi
de suite autant qu'on veut (enfin, presque) ; cette fois c'est
toujours dans l'ordre (/dev/hda6 ne peut pas exister sauf si /dev/hda5
existe avant), et ça commence toujours à 5 même si les quatre
partitions principales n'existent pas.  En revanche, les partitions
logiques, comme les partitions principales, ne sont pas obligées de
figurer dans l'ordre sur lequel elles existent sur le disque (mais
elles doivent être adjacentes puisqu'elles forment la partition
étendue) ; et elles ont elles-mêmes un octet qui indique leur type,
exactement comme pour les partitions principales (en revanche, on ne
peut pas, en tout cas pas si on veut que tout marche normalement,
avoir de partition étendue parmi les partitions logiques).

Le type normal d'une partition étendue, c'est 5, mais apparemment
Windows a créé le type 0xf (=15), « Win95 Ext'd (LBA) », dont je ne
connais pas la différence avec le type 5 (mais je peux deviner pour le
LBA), et il existe aussi 0x85 (« Linux extended »), dont je ne connais
pas non plus le sens.

Je récapitule : quatre partitions principales (chacun ayant un type),
dont éventuellement une (de type 0x5 ou 0xf) est appelée partition
étendue, et qui se découpe à son tour en partitions logiques (chacune
ayant, de nouveau, un type).  Sous Linux, les partitions s'appellent
/dev/hda1 à /dev/hda4 pour les quatre principales, et à partir de
/dev/hda5, dans l'ordre, pour les étendues.

Sous Windows, je *crois* qu'il peut y avoir une seule partition
principale d'un type Windows, et que toutes les autres partitions
Windows (s'il y a lieu) doivent être rangées sous la partition
étendue, et qu'elles sont appelées « unités logiques » ; mais il
faudrait une confirmation pour ça.

Ensuite, il faut savoir comment le disque est organisé.

Traditionnellement, il est divisé en « cylindres », « têtes » et
« secteurs ».  L'image qu'il faut avoir, c'est que le disque se
compose de tant de plateaux, avec, pour chaque face d'un plateau une
tête de lecture ; et sur chaque face, le disque est divisé radialement
en cylindres et angulairement en secteurs.  Une « piste », c'est une
région circulaire sur une face donnée, tandis qu'un « cylindre »,
c'est la collection de toutes les pistes de même rayon, sur tous les
plateaux (autrement dit, la donnée d'une piste c'est la donnée d'une
tête et d'un cylindre).  Et l'ordre de lecture est le suivant : on
commence par la tête 0 du cylindre 0 (soit la piste 0 du disque) et on
lit chaque secteur dans l'ordre (soit un tour complet de la piste),
ensuite on passe à la tête 1 toujours du premier cylindre (soit la
piste 1 du disque) et on lit tous ses secteurs, et ainsi de suite
jusqu'à la dernière tête, après quoi on change de cylindre.  Chaque
secteur fait 256 octets, ça, ça ne change pas.  La capacité totale du
disque en octets est donc le produit du nombre de cylindres par le
nombre de têtes par le nombre de secteurs par piste par 256.

Bon, mais en fait ça ne correspond plus à rien, tout ça.  L'interface
logicielle cylindre/tête/secteur pour communiquer avec le disque n'est
plus qu'une abstraction qui ne recouvre plus du tout la réalité
physique qui est derrière (et on ne veut pas savoir ce que c'est,
cette réalité).  C'est ainsi que la plupart des disques déclarent
avoir 255 têtes de lecture, ce qui est évidemment physiquement
aberrant (déjà, le nombre de têtes réel est forcément pair !).  C'est
juste que c'est le nombre maximal qu'ils peuvent déclarer pour le
BIOS, de façon à « économiser » sur les cylindres, sachant qu'à cause
d'une aberration de l'interface du BIOS, seuls les 1024 premiers
cylindres seront accessibles en mode réel (avant le lancement d'un
vrai OS).

Les partitions doivent normalement commencer sur le début d'un
cylindre.  Ça signifie que, pour un disque typique qui déclare 255
têtes et 63 secteurs par piste, on dispose d'une granularité de 4Mo
(en fait, 3.92Mo) dans le partitionnement.  Il y a une exception pour
la première partition (dans l'ordre du disque), qui commence à la
deuxième tête du premier cylindre (tête 1 du cylindre 0) au lieu de la
tête 0, de façon à laisser place pour la table de partition,
justement.  Et de même, la première partition logique (dans l'ordre du
disque) commence une tête plus loin que la partition étendue
elle-même, pour laisser place aux données des partitions étendues.
Mais bon, tout ça, le programme de partitionnement le sait très bien,
et il va s'en occuper pour vous.

Ah oui, j'oubliais : il y a des gens qui ont l'idée stupide de
numéroter les cylindres à partir de 1, juste pour vous embêter.  Tout
le monde sait qu'en informatique on compte à partir de 0.  Le fdisk de
Linux est exceptionnellement grotesque : il compte à partir de 1 en
mode normal, et à partir de 0 en « mode expert » !  En revanche, en
fait, les secteurs sont typiquement comptés à partir de 1 et non de 0,
pour des raisons idiotes - mais peu importe, personne ne compte les
secteurs, en fait.

Bon, il faut encore que j'explique ce que c'est que le mode LBA.  Le
truc, c'est que les coordonnées (cylindre, tête, secteur), on en voit
vite le bout.  Précisément, le BIOS ne permet de déclarer que 255
têtes et 63 secteurs par piste, et ensuite il ne permet d'accéder
qu'aux 1024 premiers cylindres ; ce qui fait qu'au-delà de
1024×255×63×256 octets, soit 3.92Go, on se sent mal.  C'est pour ça
qu'on a inventé le mode LBA.  L'idée est vraiment ingénieuse : les
secteurs sont simplement numérotés de 0 à N-1, où N est le nombre
total de secteurs du disque.  Donc au lieu de parler du premier
secteur de la tête 0 du cylindre 1 (deuxième cylindre), on parlera par
exemple du secteur 16065 (sur un disque ayant 255 têtes et 63 secteurs
par tête).  Et normalement le mode LBA est prévu pour permettre
d'accéder aux secteurs suffisamment loin pour ne pas avoir de
problèmes avec la taille des disques dans un avenir trop proche.

En fait, toutes les informations de la table des partitions (i.e. le
début et la fin - ou la taille - de chaque partition) sont
dupliquées : elles sont données à la fois en mode CHS (cylindre, tête,
secteur) et en mode LBA.  Pour les partitions qui dépassent les 1024
premiers secteurs, on tronque le mode CHS (on indique le dernier
secteur du cylindre 1023) et seul le mode LBA fait foi, sachant que de
toute façon le BIOS ne pourra pas accéder aussi loin.

Linux, de toute façon, ne fait confiance qu'aux données LBA ; le
programme fdisk sous Linux écrira les données en double comme il se
doit.  Je suppose que Windows fait confiance au mode CHS pour les
partitions principales ainsi que pour les partitions logiques sous une
partition étendue de type 5, et au mode LBA pour les partitions
logiques sous une partition étendue de type 0xf ; mais ceci n'est que
pure spéculation de ma part.

Bon, je pense que ceci décrit à peu près tout ce qu'il y a à savoir
sur le partitionnement (je ne parle pas des disklabels BSD ou Solaris,
qui viennent énormément compliquer le problème, parce que ça
n'intervient ni pour Linux ni pour Windows).  Passons aux bootloaders.

Quand un PC démarre, le BIOS transfère le contrôle au premier secteur
(« secteur d'amorçage ») de l'unité de boot, que ce soit une disquette
ou un disque dur (le cas des CD est plus compliqué).  Sur un disque
dur, ce premier secteur (premier secteur de la tête 0 du cylindre 0),
appelé MBR (Master Boot Record) contient à la fois la table de
partition (pour ce qui est des quatre partitions primaires) et un code
d'amorçage.  Le code d'amorçage « par défaut » (celui qui est installé
par MS-DOS quand on fait « fdisk /mbr » par exemple) se contente de
chercher une partition qui possède le flag « bootable » dans la table
des partitions, et passe le contrôle au premier secteur de la dite
partition.

Pour un système MS-DOS (soit une partition « FAT »), si on a utilisé
la commande « sys », le premier secteur d'une partition FAT se charge
d'exécuter io.sys et msdos.sys, qui démarrent le système.  C'est en
gros la même chose qui doit se produire pour Win95 et apparentés.

Pour un OS comme Linux et NTFS, en revanche, on utilise un
bootloader.  Ce n'est pas que MS-DOS n'a pas de bootloader, c'est
juste qu'il est totalement primitif et qu'il n'a pas de nom - il sait
juste lancer io.sys et msdos.sys.  Pour Linux, on a le choix du
bootloader.

Pour lancer Linux, il s'agit en définitive de lancer le noyau, ce qui
signifie le charger en mémoire et lui transférer le contrôle.  Le
noyau lui-même possède un bootloader primitif : si on copie le noyau
Linux au début d'une disquette ou d'une partition ou d'un disque dur,
et qu'on démarre dessus, le premier secteur se charge de lire les
suivants et de démarrer l'ensemble (en revanche, il est impossible de
passer des options à ce noyau, ce qui est gênant pour lui expliquer où
aller chercher ses fichiers ensuite ; on peut quand même s'arranger
mais c'est compliqué).

Il y a donc plusieurs bootloaders possibles.  Le plus connu est LILO
(LInux LOader), qui est assez limité : il peut booter un noyau Linux
ou bien une partition bootable quelconque.  Le GRUB (GRand Unified
Bootloader), qui est au départ le bootloader de Hurd, est nettement
plus puissant : il est capable de booter d'autres OS que Linux
(notamment FreeBSD, NetBSD, OpenBSD et Hurd).  Enfin, Loadlin est
capable de démarrer Linux à partir de DOS (ce qui implique de booter
DOS d'abord).

Un bootloader est formé de deux parties : un « stage1 » qui réside
dans le secteur de boot (soit le MBR soit le premier secteur d'une
partition) et qui se charge simplement de charger le reste du
bootloader, et un « stage2 », c'est-à-dire le reste en question, qui
va offrir un menu de choix de boot.  Il faut noter que si le
bootloader a un problème pendant le stage1, il aura souvent du mal à
afficher un message d'erreur, tant les possibilités sont limitées (le
stage1 doit tenir entièrement dans les 256 octets du secteur de boot,
et encore en laissant place aux données d'amorçage ou de
partitionnement ; tout le monde n'est pas, comme apo, capable d'écrire
un tetris complet en 256 octets).  Par exemple, si LILO a un problème
pendant le stage1, il me semble qu'il écrit « LI » et il plante à ce
niveau-là.

Une différence qu'il faut noter entre LILO et GRUB, c'est que, pour
charger le noyau Linux, GRUB sait lire le système de fichiers : on lui
donne donc le nom du noyau (typiquement, /boot/vmlinuz) et il va le
chercher par son nom.  LILO, lui, est plus primitif : il enregistre
juste l'emplacement physique (numéros de secteurs) du noyau sur le
disque, et il le chargera d'après cet emplacement.  Il faut donc
lancer /sbin/lilo dès qu'on touche au nouau, pour que LILO enregistre
les changements (alors qu'avec GRUB on se contente d'éditer le fichier
de config, qui sera lu au boot).  Le stage2, en revanche, que ce soit
pour LILO ou GRUB, est toujours lu par positionnement absolu (car le
stage1 est trop primitif pour comprendre un système de fichiers).

Notons que GRUB sait lire plusieurs systèmes de fichiers : MS-DOS,
ext2/ext3 (le système normal de Linux), UFS (le système de *BSD) et
ReiserFS (un autre système de fichiers populaire sous Linux).

Ceci étant, quelles sont les stratégies possibles pour dual booter
Linux et Windows ?  Typiquement, on aura un bootloader (LILO ou GRUB)
dans le MBR du disque, qui offre un menu donnant le choix entre : soit
booter un noyau Linux (que le bootloader chargera là où il faut - si
c'est GRUB, en lisant le système de fichiers Linux, si c'est LILO en
regardant les secteurs absolus enregistrés précédemment), soit booter
une partition Windows, qui démarrera au secteur 0 « comme si »
celle-ci avait été démarrée de façon normale.  On peut aussi laisser
le MBR intact et mettre le bootloader sur le secteur 0 de la partition
Linux, marquée comme bootable (de sorte que le MBR par défaut va
lancer le secteur 0 de cette partition, et donc le bootloader), ce
qui, en gros, revient au même.  Une possibilité assez différente est
d'avoir un MBR par défaut qui lance toujours la partition Windows ; et
dans le config.sys on offre la possibilité de lancer Loadlin, qui peut
charger et démarrer le noyau Linux à partir de DOS - il se peut que ce
soit la solution la plus simple (mais je n'ai moi-même jamais installé
Loadlin, ne serait-ce que parce que je n'ai pas de DOS).

On peut avoir des systèmes d'amorçage assez compliqués.  Par exemple,
voir le fichier /root/adm/boot_procedure sur le 4a, qui explique
comment celui-ci est démarré, avec un GRUB dans le MBR et un LILO dans
le secteur 0 de la partition de boot (et qui, normalement, ne sert
pas).

L'ennui principal, c'est que quand on installe Windows, le programme
d'installation va écraser le MBR du disque pour y remettre le MBR
« par défaut » ; et, de plus, il va rendre amorçable la partition
Windows principale.  Donc, quand on boote, on se retrouve sous
Windows, qu'on ait installé un LILO dans le MBR ou dans le secteur 0
de la partition Linux auparavant.  Il faut donc avoir prévu soit un
Loadlin pour pouvoir booter Linux quand même, soit une disquette de
boot (le programme d'installation de la RedHat propose d'en faire
une), et, une fois qu'on est retourné sous Linux, réinstaller le
bootloader (pour LILO, taper /sbin/lilo et pour GRUB taper
/sbin/grub-install mais je ne suis pas totalement sûr du second).
S'il était dans le MBR, ça suffit.  S'il était sur la piste 0 de la
partition Linux, ce qu'il faut faire, c'est lancer fdisk et changer la
partition bootable pour que ce soit la partition Linux et non la
partition Windows (peut-être que ça peut se faire avec le fdisk de
Windows, je ne sais pas).

Finalement, les *opérations* à faire sont très très simples (installer
Linux, installer Windows, booter sur la disquette de boot Linux, taper
/sbin/lilo ou /sbin/grub-install, et rebooter une fois de plus).  Mais
pour expliquer tous les cas de figure possible, il y en a une
tartine...

