L’objectif de cette séance est de mettre en place un OS que vous contrôlerez entièrement, puis de le configurez et de l’utiliser afin de revoir les bases dans un premier temps. Il est recommandé de prendre des notes, celle-ci pourront être envoyées à votre chargé de TP (prenom.nom@univ-amu.fr) à la fin de la journée pour avoir un retour.
choisir LUNIX comme système de travail (d’ailleurs qu’est-ce que thinOS
?)
1. Installation d’un OS (virtuel)
Qu’est-ce que la virtualisation ?
Nous allons manipuler des machines virtuelles (VMs). Le système sous lequel vous êtes actuellement sera dénommé système hôte. Comme toute machine physique, une machine virtuelle est composée de
- un CPU (partagé avec le système hôte et les autres VMs)
- de la RAM (non partagée)
- un disque dur virtuel sur lequel est installé un système d’exploitation
- des périphériques :
- partagés (clavier, souris, écran, …)
- dédiés, virtuels (comme les cartes réseaux)
1.1. Installation “à la main”
Facultatif si vous avez déjà effectué ce type d’installatuon
- télécharger l’image ISO d’installation debian
- lancer virtualbox
- avec l’interface graphique, créer une nouvelle machine virtuelle (quels sont les “bons” paramètres ?)
- démarrer la machine et choisir comme “CD” l’image ISO précédemment téléchargée
- faire l’installation du système
- prendre les options par défaut
- choisir comme environnement XFCE4
- il y a de la documentation, et pour aller plus loin, là aussi
Notez tous les points de la procédure en lien, selon vous, avec les aspects “système”.
Attention, vérifier s’il vous reste assez de place pour la suite avec la commande
$ quota -s
Supprimer cette VM si nécessaire. Supprimer également l’image ISO téléchargée.
2. Mise en place d’un mini-système
Le but de cette section est de booter un mini-système Linux, puis de réviser les commandes shell sur ce système. Nous allons donc réaliser les 3 étapes minimales pour créer ce mini système.
2.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.2. Le Processus “init“
On lance notre noyau avec l’émulateur qemu
$ qemu-system-x86_64 -nic none -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
S’il y a des erreurs, vous pouvez utiliser celui-ci.
2.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 -nic none -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).
3. Le Shell à la “busybox“
3.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à.)
3.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
.
3.3. Test du shell
Quelle 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 ?
3.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 ?