Updated Modifié

Le but de ce TP est de booter un mini-système Linux, puis de réviser les commandes shell sur ce système. Prendre des notes et déposer un compte-rendu de ce TP sur Ametice pour le 18 février 11 février. Ce CR reprend et explique le résultat des commandes principales effectuées.

Nous allons donc réaliser les 3 étapes minimales pour créer ce mini système.

1. Le Noyau

Nous allons créer un mini-système d’exploitation sur lequel booter (par virtualisation). On commence par créer un noyau Linux.

Créer un répertoire de travail

$ mkdir miniboot
$ cd miniboot

On télécharge une version LTS récente du code source de Linux (ça peut prendre un peu de temps …, vous pouvez lire la suite de l’énoncé en attendant)

$ git clone --depth=1 --branch=v6.12 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

On ne va pas voir ici les détails de la compilation du noyau, nous allons seulement utiliser quelques raccourcis afin de créer un noyau minimal.

$ cd linux
$ make tinyconfig
$ make menuconfig

La dernière commande vous place dans l’environnement où l’on peut configurer toutes les options de compilation, pas de panique : lire ce qui est écrit en haut !

Avec les flèches, la touche ESPACE pour sélectionner et TAB pour le menu du bas, vous allez activer les deux suivante :

  1. Activer “64-bit kernel” avec la barre ESPACE
  2. “General setup > Initial RAM filesystem”, activer “RAM disk (initramfs/initrd) support”
  3. “General setup > Configure standard kernel features (expert users)”, activer “Enable support for printk”
  4. “Device Drivers > Character devices”, activer “Enable TTY
  5. “Executable file formats > Kernel support for ELF binaries”, activer
  6. “Executable file formats > Kernel support for scripts starting with #! in the kernel”, activer
  7. Sauvegarder avec “Save”

Les indications de compilation nécessaire sont désormais bien dans le fichier .config, on peut donc lancer la compilation (là aussi, cela va prendre un peu de temps…)

$ make -j8

Si vous obtenez le message Kernel: arch/x86_64/boot/bzImage is ready (#1), bravo vous avez un “noyau” (dans un format compressé) dans ce sous-répertoire, sur lequel nous allons pouvoir booter.

Si cela ne compile pas bien, il est possible d’utiliser ce noyau.

2. Le Processus “init“

On lance notre noyau avec l’émulateur qemu

$ qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage

On obtient, à la fin, un message Kernel panic, no working init found. En effet, si on a effectivement bien un noyau, cela ne suffit pas pour avoir un système : il nous faut un premier programme, un premier processus. Le nom général de celui-ci est init.

Pour cette première séance, nous n’allons pas créer nous-même ce programme, mais utiliser un système minimal conçu pour cela : busybox.

$ cd ..
$ git clone --depth=1 --branch=1_37_0 git://git.busybox.net/busybox
$ cd busybox

Il faudra ici aussi configurer le système de compilation. Prendre la configuration par défaut

$ make defconfig

Il faut cependant ajouter une configuration pour obtenir un binaire statique (pourquoi ?). Cela se fait dans le propre menuconfig de busybox

$ make menuconfig

Activer l’option

  1. “Settings > Build static binary”

Puis lancer la compilation

$ make

3. Le Système de fichiers de démarrage

Après avoir créé init, nous allons devoir mettre en place son environnement, ie un système de fichier particulier, qui n’existera qu’en RAM. Cela s’appelle un “initial ram filesystem” (en abrégé initramfs).

$ cd ..
$ mkdir initramfs

Tout ce qui se trouve dans ce répertoire sera fourni au noyau pour lancer init. Nous allons donc créer un répertoire bin et y copier busybox.

Une fois que cela est réalisé, nous allons indiquer à busybox de s’exécuter comme s’il était un shell bin/sh

$ cd initramfs/bin
$ ln -s busybox sh
$ cd ..

Nous pouvons préparer notre image disque avec la commande suivante :

$ find . -print0 | cpio --null --create --verbose --format=newc | gzip --best > initrd

Et on lance avec

$ cd ..
$ qemu-system-x86_64 -kernel linux/arch/x86_64/boot/bzImage -initrd initramfs/initrd

Si qemu capture notre souris (attention!), faire Ctrl+Alt+G. Il faut noter également que le clavier est en QWERTY

Cependant, il semble manquer un environnement complet pour busybox. On va compléter notre image initrd.

$ cd initramfs/bin
$ rm sh

Copier le fichier suivant dans le répertoire bin.

Reconstruire l’image

$ find . -print0 | cpio --null --create --verbose --format=newc | gzip --best > initrd

Et relancer QEMU (et ignorer les messages No such file or directory pour l’instant).

4. Le Shell à la “busybox“

4.1. Révision des Commandes Shell

Si besoin, reprendre rapidement vos TPs de l’an dernier sur les commandes shell (si vous ne le retrouvez pas, vous pouvez utiliser celui-là et TP1/TP2 ici).

4.2. Préliminaire

Tester le shell (avec la commande ls par exemple). Un certain nombre de commandes fonctionnent mais en attendant d’explorer cela davantage, le clavier est en qwerty, c’est très ennnuyeux …

La commande qui permet de modifier la configuration du clavier est

# busybox loadkmap < /etc/fr.map

Cependant le fichier fr.map n’est pas (encore) présent sur le système. Il faut donc ajouter un répertoire etc à l’initramdisk, y copier le fichier fr.map, reconstruire initrd et relancer le système avec ce nouveau initrd.

4.3. Test du shell

Quel est la particularité de l’environnement busybox dans lequel vous êtes ? Quelles commandes ne sont pas présentes dans busybox ? Lesquelles ne fonctionnent pas bien.

Notez que certains programmes ne sont pas accesibles directement (ie ni intégrées au shell, ni installés dans /bin) mais accessible via

# busybox command

Par exemple

# busybox whoami

Vous pouvez voir l’ensemble des commandes accessibles via busybox --help. Il y a, par exemple, un mini éditeur de fichier, comment s’appelle-t-il ?

4.4. Compléter l’installation

Pour finir, compléter votre script init puis reconstruire votre initrd afin de rendre une partie de ces opérations automatiques :

  1. mise en place du clavier fr
  2. configurations pratiques diverses

Si l’on voulait ajouter d’autres programmes que ceux fournis par busybox, comment faudrait-il faire ?