v0.9, novembre 2000
Voici les instructions pour construire un système Linux minimum à partir du code source. Ce document faisait partie du guide pratique De la mise sous tension à l'invite de commande de Bash, mais j'ai choisi d'en faire un document indépendant, afin que chacun de ces 2 documents restent courts et concentrés. Le système que nous construisons ici est réduit au minimum et n'est pas apte à réaliser un vrai travail. Si vous voulez monter un vrai système, lisez plutôt le Comment faire un système Linux à partir de zéro (Linux from scratch - LFS).
Nous installerons une distribution de Linux telle que Red Hat sur une partition, et l'utiliserons pour construire un nouveau système Linux sur une autre partition. Je nommerai par la suite cible le système que nous construisons, et source le système que nous utilisons pour construire le système cible (à ne pas confondre avec code source que nous utiliserons aussi).
Vous allez donc avoir besoin d'une machine avec deux partitions libres. Si vous le pouvez, utilisez une machine qui ne contienne rien d'important. Vous pouvez utiliser un système Linux déjà existant comme système source, mais je le déconseille. Si vous oubliez un des paramètres des commandes que nous allons saisir, vous pourriez accidentellement réinstaller des choses sur votre système source. Cela peut mener à des incompatibilités, et des conflits.
Les BIOS des PC dont l'architecture est ancienne, pour la plupart des 486 et des machines antérieures, ont une limitation ennuyeuse. Ils ne peuvent lire les disques durs au-delà des 512 premiers méga-octets. Ce n'est pas vraiment un problème pour Linux, qui gère lui-même les disques une fois lancé. Mais pour que Linux soit chargé sur ces vieilles machines, le noyau doit résider quelque part en-dessous de 512 méga-octets. Si vous utilisez une de ces machines, vous devrez créer une partition distincte en-dessous de 512Mo, à monter sur /boot pour chaque système dont la partition racine se situe au-dessus de la limite des 512Mo.
La dernière fois que je l'ai fait, j'ai utilisé Red Hat 6.1 comme système source. J'ai installé le système de base plus:
cpp
egcs
egcs-c++
patch
make
dev86
ncurses-devel
glibc-devel
kernel-headers
J'ai aussi installé X-Window et Mozilla pour pouvoir lire la documentation facilement, mais ce n'est pas vraiment nécessaire. À la fin de mon travail, celui-ci avait pris environ 350Mo d'espace disque (cela semble un peu élevé, je me demande pourquoi).
Le système cible achevé prenait 650Mo, mais comprenait tout le code source et les fichiers intermédiaires. Si l'espace est limité, je vous conseille de faire un make clean après la construction de chaque paquet. Cela dit, cette taille surprenante est un peu inquiétante.
MAKEDEV: ftp://sunsite.unc.edu/pub/Linux/system/admin/ (USA), ftp://ftp.lip6.fr/pub/linux/sunsite/system/admin/ (France).
Lilo: ftp://lrcftp.epfl.ch/pub/linux/local/lilo/ (Suisse), ftp://ftp.lip6.fr/pub/linux/sunsite/system/boot/lilo/ (France).
Noyau Linux: utilisez un des miroirs listés sur http://www.kernel.org plutôt que ftp://ftp.kernel.org/pub/linux/kernel/ (USA) car ils sont toujours en surcharge; ftp://ftp.fr.kernel.org/pub/linux/kernel/ (France).
GNU libc: la bibliothèque elle-même, ainsi que les extensions linuxthreads sont sur ftp://ftp.gnu.org/pub/gnu/glibc/ (USA), ftp://ftp.lip6.fr/pub/gnu/glibc/ (France).
Extensions de la libc GNU: vous aurez aussi besoin des linuxthreads et des extensions libcrypt. Si libcrypt est absente du fait des lois américaines sur l'exportation, vous pouvez la récupérer sur ftp://ftp.gwdg.de/pub/gnu/glibc les extensions linuxthreads sont au même endroit que la libc proprement dite.
GNU ncurses: ftp://ftp.gnu.org/gnu/ncurses (USA), ftp://ftp.lip6.fr/pub/gnu/ncurses (France).
SysVinit: ftp://sunsite.unc.edu/pub/Linux/system/daemons/init/ (USA), ftp://ftp.lip6.fr/pub/linux/sunsite/system/daemons/init/ (France).
GNU Bash: ftp://ftp.gnu.org/gnu/bash/ (USA), ftp://ftp.lip6.fr/pub/gnu/bash/ (France).
GNU sh-utils: ftp://ftp.gnu.org/gnu/sh-utils/ (USA), ftp://ftp.lip6.fr/pub/gnu/sh-utils/ (France).
util-linux: ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/ (Pays-Bas), ftp://ftp.lip6.fr/pub/linux/sunsite/system/misc/ (France). Ce paquet contient agetty et login.
Pour résumer, il vous faut:
Une machine avec deux partitions distinctes d'environ 400Mo et 700Mo respectivement, bien que vous puissiez sûrement vous en tirer avec un espace plus restreint.
Une distribution de Linux (par exemple, un CD Red Hat), et de quoi l'installer (par exemple, un lecteur de CD).
Les archives tar de code source listées ci-dessus. (Le format tar permet de regrouper plusieurs fichiers en un seul. Un fichier tar peut être compressé.)
Je pars du principe que vous pouvez installer le système source vous-même, sans aide de ma part. À partir de maintenant, je considère que c'est fait.
Les premiers pas de ce projet consistent à faire démarrer le noyau, et à le laisser paniquer (panic) car il ne trouve pas le programme init. Cela signifie que nous allons devoir installer un noyau, et installer Lilo. Pour que Lilo s'installe facilement, nous aurons besoin des fichiers spéciaux du répertoire /dev du système cible. Lilo en a besoin pour effectuer les accès bas niveau au disque, nécessaire pour écrire le secteur d'amorçage. MAKEDEV est le script qui crée ces fichiers spéciaux (vous pourriez bien sûr les recopier depuis le système source, mais ce serait tricher!). Mais d'abord, il nous faut un système de fichiers dans lequel les mettre.
Notre nouveau système a besoin d'un système de fichiers pour vivre. Donc, il nous faut tout d'abord créer ce système de fichiers en utilisant mke2fs. Ensuite il faut le monter quelque part. Je vous suggère /mnt/cible. Dans ce qui va suivre, je considère que votre système cible se trouve à cet endroit. Vous pouvez gagner un peu de temps en ajoutant une entrée dans /etc/fstab de façon à ce que le montage de votre système de destination se fasse automatique lors du démarrage de votre système source.
Lorsque nous démarrerons le système cible, ce qui se trouve dans /mnt/cible se trouvera alors dans / (la racine).
Nous avons besoin d'une structure de sous-répertoires sur la cible. Jetez un il au standard de hiérarchie des fichiers (File Hierarchy Standard - FHS, voir la section ) pour trouver vous-même ce qu'elle devrait être, ou faites simplement un cd vers l'endroit où la cible est montée et tapez aveuglément:
mkdir bin boot dev etc home lib mnt root sbin tmp usr var cd var; mkdir lock log run spool cd ../usr; mkdir bin include lib local sbin share src cd share/; mkdir man; cd man mkdir man1 man2 man3 man4 man5 man6 man7 man8 man9
Comme le standard de hiérarchie des fichiers et la plupart des paquets se contredisent en ce qui concerne l'endroit où les pages de manuel doivent se trouver, nous avons besoin d'un lien symbolique:
cd ..; ln -s share/man man
Nous mettrons le code source dans le répertoire /usr/src cible. Ainsi si votre système de fichiers cible est monté sur /mnt/cible, et que vos archives tar sont dans /root, il faudra faire