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 :
- Activer “64-bit kernel” avec la barre ESPACE
- “General setup > Initial RAM filesystem”, activer “RAM disk (initramfs/initrd) support”
- “General setup > Configure standard kernel features (expert users)”, activer “Enable support for printk”
- “Device Drivers > Character devices”, activer “Enable TTY”
- “Executable file formats > Kernel support for ELF binaries”, activer
- “Executable file formats > Kernel support for scripts starting with #! in the kernel”, activer
- 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
- “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 :
- mise en place du clavier fr
- configurations pratiques diverses
- …
Si l’on voulait ajouter d’autres programmes que ceux fournis par busybox
, comment faudrait-il faire ?