TP6 : Construction d’un système d’exploitation Debian Jessie minimal

1. Création d’une machine virtuelle

Que se passe-t-il quand on démarre un ordinateur ?

Master Boot Record (MBR) :

Secteur (une partition) sur le disque dur qui pointe vers le chargeur de démarrage (Grub, Syslinux, celui de Windows, etc…)

Chargeur de démarrage :

Menu qui permet de charger le noyau (Linux, Windows, etc…)

  1. On lance un premier programme : le BIOS

    • NB: les nouveaux BIOS EFI / UEFI : quasiment des OS à eux seuls
    • dans le BIOS : on définit un ensemble de périphériques sur lesquels booter

VS :

Boot EFI :

  1. Va chercher, dans un répertoire particulier d’une partition (la partition EFI) prévue à cet effet, le chargeur de démarrage de l’OS

  2. Sur un disque dur : va chercher le MBR, qui donne l’adresse du chargeur de démarrage de l’OS

    • ex: chargeur de démarrage de l’OS : Grub, Syslinux, …
  3. Une fois que le noyau est chargé en mémoire, l’OS est prêt

Noyau :

Ensemble de drivers minimal qui fournit une interface (l’API) entre les programmes utilisés sur l’OS et la couche matérielle/le processeur (entre la couche logicielle et le matériel).

Après le noyau :

  1. Est chargé : l’init RAM FS
L’init RAM FS :
archive qui contient les drivers qui ne sont pas dans le noyau.
  • Construit l’arborescence des fichiers, puis cherche les drivers dont on a besoin.
  • Charge la swap, les partitions.
  • Commence le processus d’amorçage : quels sont les programmes à démarrer et les actions qu’ils doivent faire.
La swap :

Espace d’échange sur le disque pour stocker les données de la mémoire vide quand elle est saturée OU occupée inutilement.

Regarder dans /boot/ : il y a l’init RAM FS, le chargeur de démarrage, les fichiers de configuration.


Pourquoi on n’utilisera pas l’installeur Debian ?

  • car il installe une multitude de choses qui nous seront inutiles. Exs :

    • le mail transfert agent (MTA) : Enim ⟶ on peut le désinstaller, mais si on utilise le gestionnaire de packets : tout n’est pas supprimé, notamment les dépendances des bibliothèques jamais utilisées.
    • OpenSSH (50Mo) est bien plus lourd que Dropbear (3Mo) : ce dernier est plus pratique pour les systèmes embarqués.

fdisk, parted : commandes pour partitioner le disque.

cow : copy on write : on crée des disques virtuels (autant qu’on veut) basés sur un disque réel.

NB : Concernant les architectures des processeurs : attention, on ne peut pas utiliser un disque 64 bits sur une architecture 32bits.

NB:

  • Pourquoi “amd64” ? car “amd” étaient les premiers à avoir fait du 64 bits : on a gardé leur nom pour les architectures 64 bits.
  • i386 : (“i” pour “intel”, “386” pour l’architecture) en 32bits, est l’architecture la plus “basique”.
  • -boot :

    • C : disque dur
    • D : CD-Rom
  • enable-kvm : active l’accélération matérielle

    • très important
Partitionnement :

À la base, les disques durs sont des “galettes” de silicium où on écrit des 0 et des 1. Les partition sont en un rayon $r$ et $r+r’$ par rapport au centre.

Partitionner un dd, c’est le segmenter en secteurs concentriques par rapport au centre (le dd tourne à 4800/10000/jusqu’à 15000 trs/mn). Dans la table de partitions, qui est au centre du disque, on indique où commencent et finissent les partitions.

File Systems / Systèmes de fichiers :

Ensemble de structures de données structurées d’une certaine façon dont on organise les fichiers.

  • ex: c’est comme une carte géographique.
  • ex:

    • Microsoft : NTFS, FAT32, FAT16, …
    • Apple : HFS, HFS+
    • Linux : ext2, ext3, ext4, XFS, ZFS, BetterFS, ReiserFS, etc…

      • ReiserFS : extrêmement performant pour retrouver les petits fichiers
      • XFS : pour les gros fichiers
      • ext4 : bon compromis, système modulaire
    • Sur des bases de données : changement du système de fichier change complètement les performances.
    • Systèmes de fichiers distribués :

      • permet de récupérer la dernière partition de chaque machine dans un réseau, récupère l’espace disque de chaque machine

        • ex: GlusterFS

NB: il y a énormément de recherche sur les Systèmes de Fichiers.


Fragmentation des fichiers :

  • Si on a partition de données, contenant 4 photos.
  • Puis : on efface les photos 2 et 3.
    • En vrai : on ne les efface pas, on les dé-référence (le pointeur vers ces photos ne pointe plus vers elles).

      • Donc on peut la récupérer, en cherchant dans le dd, à part si on a remplacé par des 0 et des 1 à l’endroit où elles étaient (“effacement sécurisé”)

        • Effacement sécurisé : fait plusieurs passes :

          • écrit d’abord que des 1 sur le fichier effacé
          • puis : écrit des 0 et des 1 au hasard
          • puis : que des 0

          Pourquoi ? Car quand les disques étaient en silicium (pas les disques SSD : que des portes logiques électroniques), on pouvait retrouver l’ancienne valeur écrite (pas assez effacée).

  • Puis, on ajoute encore d’autres photos : elles se fragmentent en plusieurs “morceaux” sur le divided_by:

Solutions : système de fichiers journalisés.

  • On cherche le plus grand espace où on peut mettre la photo (avec un algo optimisé), pour minimiser la fragmentation ⟶ c’est le cas sur Linux

    • Il n’est pas vrai que Linux ne fragmente PAS, Linux fragmente PEU.

Concrètement, pourquoi il y a fragmentation ?

Car la méthode adoptée pour les stocker est assez gloutonne : les fichiers sont mis le plus près possible du début des partitions, pour y accéder le plus rapidement possible.

Mais quand ils sont trop gros, un morceau est mis au début, l’autre à la fin ⟶ induit un partitionnement.


Partitionnement MS-DOS : il y a 4 partitions primaires maximum (numérotées de 1 à 4). Mais il faut des partitions étendues.

Comment faire pour qu’elles ne se chevauchent pas avec les autres partions ?

Partition étendue : contient d’autres partitions : c’est la dernière. Elle contient des partitions incluses numérotées 5, 6, 7, etc… (jusqu’à 128).

cat /dev/0 > /dev/sda : saccage tout le disque.


Mettre le réseau sur la VM

Configurer le fichier systemd

cat <EOF >> /etc/systemd/network/nimportequoi.network

[Match]
Name=eth0

[Network]
DHCP=yes

OU bien :

DHCP=ipv4

OU bien :

DHCP=ipv6

Configuration

L’adresse des DNS est stockée dans /etc/resolv.conf

⟶ on est obligé de le modifier soi-même, avec systemd

  • systemd-netxorkd : le service qui démarre le réseau
systemctl start systemd-networkd :

démarre le réseau en utilisant systemd

systemctl start systemd-resolve.conf :

génère un fichier /etc/resolve.conf, mais pas dans /etc : il le range dans /run/systemd/resolve/resolv.conf

Donc : créer un lien symbolique de /etc/resolv.conf vers /run/systemd/resolve/resolv.conf

ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

PROBLÈME : si on redémarre la machine, il faut refaire un start !

Pour lui dire le faire à chaque redémarrage de la machine :

  • systemctl enable systemd-networkd
  • systemctl enable systemd-resolve.conf
dpkg-reconfigure keyboard-configuration :

configure le clavier

MIEUX : avec le paquet console-setup

Commandes utiles

qemu-img -f qcow2 hda.qcow2 5G


Pour se connecter en SSH à la VM

qemu-system-x86_64 -cdrom debian.iso -boot d -enable-kvm -m 4G hda.qcow2

qemu-system-x86_64 -enable-kvm -m 4G /tmp/kaddar/hda.qcow2 -redir tcp:2222::22 -smp cores=4&

Éditer /etc/ssh/sshd_config, et commenter la ligne :

PermitRootLogin without-password

Juste en dessous, ajouter la ligne :

PermitRootLogin yes

Puis :

ssh root@localhost -p 2222


  1. wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.8.10.tar.xz && tar -xvJf linux-4.8.10.tar.xz

  2. Copier la config actuelle (dans /boot/) dans le répertoire dans linux.../ sous le nom .config (ou .config-versionDuNoyau)

    Puis : make oldconfig

  3. make -j9 (puis éventuellement make modules -j9 : mais déprécié)

    Le noyau est : arch/x86_64/boot/bzImage

  4. make modules_install -j9 INSTALL_MOD_PATH=/users/dptinfo/kaddar/shared

    Les modules sont dans users/dptinfo/kaddar/shared

  5. copier le noyau et les modules dans la VM

Dans la VM

  1. apt-get install gcc, make, wget, libncurses-dev, openssh-server, sshfs

  2. mettre le noyau dans /boot/vmlinuz-versionDuNoyau (cf versionDuNoyau dans le répertoire où sont les modules)

  3. mettre les modules dans /lib/modules/versionDuNoyau/

PUIS :

  • Générer l’initrd :

mkinitramfs

-> crée un fichier /boot/init...

  • Faire connaître le noyau au chargeur de noyau : Grub2
update-grub2 :

update le fichier /boot/grub/grub.cfg

make menuconfig :

les composants qu’on active ou pas : il y a 3 types de composants :

  1. on ne l’active pas : pas compilé, pas rajouté au noyau
  2. on l’active dans le noyau : on a les fonctionnalités dans le noyau
  3. on l’active comme module du noyau (étoiles)

NB : pour pouvoir utiliser les disques SAS, SATA, ou sd…, il faut le module scsi et le module SATA


ldd :

liste des bibliothèques sur lesquelles le binaire est linké.

Leave a comment