Tape les commandes sans regarder, puis Entrée : la vérification compare au caractère près (espaces multiples ignorés), donc une variante valide peut être refusée, ouvre alors la réponse. Pour les autres questions, réponds avant d’ouvrir : c’est l’effort de rappel qui fait retenir.
Rappel actif
Restitue de mémoire, sans support.
Donne dans l’ordre les six étapes pour passer des sources d’un noyau à une machine qui démarre dessus, avec la commande ou le fichier clé de chaque étape.
- Récupérer les sources sur kernel.org et décompresser l’archive (
tar.gz,tar.bz2,tar.xz). - Générer le
.config:make menuconfig(ouconfig,xconfig,gconfig,defconfig,oldconfig). - Compiler :
make(oumake bzImagepuismake modules). - Installer :
make modules_install(modules vers/lib/modules/<version>) etmake install(image etSystem.mapvers/boot). - Créer le ramdisk :
mkinitramfs -o /boot/initramfs-<version>.img <version>(oumkinitrd). - Ajouter une entrée au gestionnaire de démarrage, sans rien retirer à l’existant.
Le piège habituel : oublier les étapes 5 et 6. Le noyau est en place mais rien ne le charge, ou il démarre sans les modules dont il a besoin.
- Récupérer les sources sur kernel.org et décompresser l’archive (
Cite les sept services de base que le noyau offre au reste du système, et par quel mécanisme un programme utilisateur y accède.
Gestion de la mémoire, des processus, du système de fichiers, des E/S, la communication interprocessus, l’accès aux périphériques, les protocoles réseau.
On y accède uniquement par des appels système, à travers la system call interface. Un programme en user mode n’a jamais d’accès direct au matériel.
Où vivent le cœur du noyau et ses modules sur le disque ? Donne l’extension d’un module et le nom des images du cœur.
- Cœur : un fichier de quelques Mo dans
/boot, nommézImageoubzImage(souventvmlinuz-<version>), chargé intégralement par le bootloader. - Modules : fichiers
.kodans/lib/modules/<version>/, rangés endrivers/,net/,sound/,fs/…
- Cœur : un fichier de quelques Mo dans
Tape la commande
Écris la commande exacte, puis Entrée pour vérifier.
Affiche seulement la version du noyau en cours d’exécution.
uname -r-sdonnerait le nom du système (Linux),-ple type de processeur,-atout. C’est aussiuname -rqui sert à construire le chemin/lib/modules/$(uname -r).Vérifie si le module
vfatest actuellement chargé en mémoire, en une seule ligne.lsmod | grep vfatlsmodliste les modules chargés,grepfiltre. Aucune sortie : le module n’est pas chargé.Charge le module
vfaten laissant le système résoudre et charger ses dépendances.modprobe vfatmodprobeprend un nom de module et lit les dépendances dansmodules.dep.insmodprendrait un chemin de fichier.koet ne charge aucune dépendance.Charge
vfatdirectement depuis son fichier.ko, sans passer parmodprobe, en construisant le chemin avec la version du noyau courant.insmod /lib/modules/$(uname -r)/kernel/fs/fat/vfat.koSi
vfatdépend defatet quefatn’est pas chargé,insmodéchoue : il ne gère pas les dépendances.Retire
vfatde la mémoire avec l’outil qui sait aussi retirer les dépendances devenues inutiles.modprobe -r vfatrmmod vfatretire aussi le module, mais seulement lui.Affiche les informations d’un module (fichier, description, dépendances, paramètres) pour
vfat, sans le charger.modinfo vfatTu as copié un module à la main dans
/lib/modules/<version>/etmodprobene le trouve pas. Régénère le fichier de dépendances.depmod -aIl reconstruit
modules.dep, le fichier que litmodprobe.Active le routage IPv4 à chaud avec
sysctl.sysctl -w net.ipv4.ip_forward=1Effet immédiat mais perdu au redémarrage. Pour le rendre permanent :
net.ipv4.ip_forward = 1dans/etc/sysctl.conf.Même chose, sans
sysctl: écris directement dans le fichier qui représente le paramètre.echo 1 > /proc/sys/net/ipv4/ip_forwardLes points du nom
sysctldeviennent des/sous/proc/sys.Configure le noyau pour qu’il redémarre automatiquement 20 secondes après un kernel panic, à chaud, via
/proc.echo 20 > /proc/sys/kernel/panicÉquivalent :
sysctl -w kernel.panic=20.Applique le patch
patch-5.10.2sur les sources, sachant que les chemins du patch ont un niveau de répertoire en trop.patch -p1 < patch-5.10.2-p1retire le premier composant de chaque chemin décrit dans le patch.Le noyau patché pose problème : retire ce même patch.
patch -p1 -R < patch-5.10.2-Rinverse le patch, avec le même niveau-pque pour l’appliquer.Génère le
.configd’un nouveau noyau en partant de celui de l’ancienne version, pour ne répondre qu’aux nouvelles options.make oldconfigTu es connecté en SSH, sans interface graphique. Lance l’outil de configuration du noyau en mode texte amélioré.
make menuconfigIl faut
libncurses-dev.xconfig(QT) etgconfig(GTK) demandent un affichage graphique.Crée l’image ramdisk avec
mkinitramfspour le noyau5.10.2, dans/boot/initramfs-5.10.2.img.mkinitramfs -o /boot/initramfs-5.10.2.img 5.10.2Le dernier argument est le nom du répertoire des modules dans
/lib/modules. Version historique :mkinitrd /boot/initrd-5.10.2.img 5.10.2.Tu viens de modifier une règle udev : recharge les règles puis redéclenche les événements, en une ligne.
udevadm control --reload-rules && udevadm triggerSans
trigger, les nouvelles règles ne s’appliquent qu’aux prochains événements, pas aux périphériques déjà présents.Affiche le détail du périphérique PCI situé à l’adresse
00:03.0.lspci -s 00:03.0 -v
Écris-le
Rédige la requête, la configuration ou le code, puis compare avec la réponse.
Le module
virtio-netdoit être chargé à chaque démarrage, que le matériel soit détecté ou non (Red Hat 7/8, systemd). Donne le chemin du fichier à créer et son contenu exact.Fichier
/etc/modules-load.d/virtio-net.conf:virtio-netUn nom de module par ligne, sans
.ko. C’estsystemd-modules-load.servicequi le lit au démarrage.Avec systemd, renomme en
eth0l’interface dont l’adresse MAC est00:0c:29:9c:00:76. Donne le fichier et son contenu./etc/systemd/network/70-custom-ifnames.link:[Match] MACAddress=00:0c:29:9c:00:76 [Link] Name=eth0Puis
reboot.[Match]dit quelle interface,[Link]dit quoi lui appliquer.Rends le routage IPv4 permanent, puis applique le fichier sans redémarrer.
Dans
/etc/sysctl.conf:net.ipv4.ip_forward = 1Puis
sysctl -ppour relire le fichier. (Le cours montre la ligne à0: c’est la valeur qui désactive.)
Distingue
Deux notions proches : dis ce qui les sépare vraiment.
Noyau modulaire et noyau monolithique : avantage de chacun, et pourquoi un serveur de production pourrait préférer l’un ou l’autre ?
- Modulaire : charge et décharge les modules à la demande, économise la mémoire, permet d’ajouter un pilote sans arrêter le système.
- Monolithique : tout est embarqué, d’où la haute disponibilité et le support d’un grand nombre de configurations, sans dépendre de fichiers externes au démarrage.
Choix : modulaire si le matériel change ou qu’on veut éviter les redémarrages, monolithique pour un matériel fixe où l’on veut un noyau autonome.
insmodetmodprobechargent tous deux un module. Donne deux différences concrètes.insmodmodprobeArgument chemin du fichier .konom du module Dépendances aucune, échoue si une manque résolues via modules.depRetrait rmmodmodprobe -r, qui retire aussi les dépendances inutiliséesKernel mode et user mode : qu’est-ce qui change quand un bug survient dans chacun ?
En kernel mode, le code a un accès complet au matériel et à toute la mémoire : un crash est catastrophique et arrête souvent la machine. En user mode, le code n’a pas d’accès direct et passe par les appels système : un crash est récupérable, seul le processus tombe. C’est l’isolation qui protège.
echo 1 > /proc/sys/...,sysctl -wet/etc/sysctl.conf: lesquels survivent à un redémarrage ?Seul
/etc/sysctl.confest permanent : il est lu au démarrage.echodans/proc/sysetsysctl -wmodifient la valeur en mémoire, perdue au reboot./proc/sysest un système de fichiers virtuel, rien n’y est écrit sur disque.makeseul,make bzImageetmake modules: que produit chacun ?make: le noyau et les modules.make bzImage(ouzImage) : seulement l’image du noyau.make modules: seulement les modules.
Explique pourquoi
Le mécanisme derrière la règle.
Pourquoi ne peut-on appliquer que le patch de la version qui suit exactement la version actuelle des sources ?
Un patch est la sortie d’un
diffentre deux arborescences précises : il décrit des modifications ligne par ligne par rapport à une version. Appliqué à une autre version, le contexte attendu ne correspond plus et le patch échoue ou corrompt les sources. Pour sauter plusieurs versions, on applique les patchs un par un, dans l’ordre.Pourquoi un noyau fraîchement installé a-t-il besoin d’un ramdisk (initrd / initramfs) ?
Au démarrage, le noyau doit charger les modules nécessaires (par exemple le pilote du disque qui contient
/lib/modules). Le ramdisk contient l’ensemble des modules et accélère la détection du matériel. Sans ramdisk construit pour cette version, le noyau peut ne pas trouver ses pilotes et ne pas monter la racine.Pourquoi le cours insiste-t-il pour ajouter une entrée au gestionnaire de démarrage plutôt que remplacer l’ancienne ?
Le nouveau noyau peut ne pas démarrer (option oubliée dans
.config, ramdisk incomplet). Garder l’entrée existante permet de redémarrer sur l’ancien noyau qui fonctionne. On ne touche pas à ce qui marche déjà.
Cas pratique
Choisis et justifie avec les critères du cours.
Une nouvelle carte réseau est branchée sur un serveur qui ne doit pas redémarrer. Le pilote existe déjà sous forme de module. Comment l’activer, et qu’est-ce que ça dit du type de noyau ?
modprobe <module>charge le pilote et ses dépendances à chaud. Vérification :lsmod | grep <module>, puislspci -vpour voir le pilote associé à la carte.C’est possible parce que le noyau est modulaire : ajouter un pilote ne demande pas d’arrêter le système.
Après une mise à jour, l’interface réseau s’appelle
ens33alors que tous les scripts attendenteth0. Quelles sont les deux approches vues en cours ?- Règle udev associant la MAC au nom (
... ATTR{address}=="<mac>", ... NAME="eth0"), puisudevadm control --reload-rules && udevadm trigger. - Fichier
.linksystemd (/etc/systemd/network/70-custom-ifnames.link,[Match] MACAddress=puis[Link] Name=eth0), puisreboot.
Le nom par défaut vient de
NamePolicydans99-default.link.- Règle udev associant la MAC au nom (
Trouve l'erreur
Chaque affirmation contient au moins une faute.
« Pour charger vfat avec ses dépendances, je tape
insmod vfat. »Deux erreurs :
insmodattend le chemin du fichier.ko, pas un nom, et il ne charge pas les dépendances. La bonne commande estmodprobe vfat.« J’ai tapé
echo 1 > /proc/sys/net/ipv4/ip_forward, le routage restera activé après le redémarrage. »/proc/sysest en mémoire : la valeur est perdue au reboot. Pour la rendre permanente, il fautnet.ipv4.ip_forward = 1dans/etc/sysctl.conf.« Mes sources sont en 5.10.1. Je télécharge le patch 5.10.3 et je l’applique directement pour gagner du temps. »
On ne peut appliquer que le patch de la version qui suit exactement : ici 5.10.2 d’abord, puis 5.10.3.
«
make installcopie l’image du noyau et les modules dans/boot. » (C’est ce que dit le résumé du cours.)Imprécis.
make installcopie l’image du noyau (avecSystem.map) dans/boot. Les modules vont dans/lib/modules/<version>/viamake modules_install. Pas dans/boot. Le cours le dit d’ailleurs lui-même pourmodules_install, et pour l’installation manuelle.Même remarque pour «
makeappelledepmod» : en pratique c’estmake modules_installqui lancedepmod.« udev est un composant du noyau qui crée les fichiers de
/dev. »udev tourne en mode utilisateur : le démon
udevdreçoit les uevents du noyau via le socketnetlinket s’appuie sursysfs. Le noyau émet les événements, udev décide des noms et des règles. Le cours dit qu’il « remplace devfs dans le noyau » : c’est devfs qui était dans le noyau, pas udev.
Classe
Range chaque élément et explique les cas limites.
Décompose la version
5.15.0.91selon le schémaX.Y.Z.adu cours.X Y Z a 5 (major) 15 (minor) 0 (revision) 91 (release) Range chaque outil de configuration du noyau selon ce dont il a besoin :
make config,make menuconfig,make xconfig,make gconfig,make defconfig,make oldconfig.- Aucune interaction :
defconfig(valeurs par défaut),oldconfig(repart de l’ancien.config, ne demande que les nouveautés). - Terminal, question par question :
config. - Terminal amélioré, utilisable en SSH :
menuconfig(libncurses-dev). - Graphique :
xconfig(QT,libqt3-mt-dev,g++),gconfig(GTK).
Et
make mrproperne configure rien : il supprime l’ancien.config.- Aucune interaction :
Et si...
Prévois la conséquence.
Et si on compile et installe un nouveau noyau, mais qu’on oublie de générer son initramfs ?
Le bootloader charge le noyau, mais ne trouve pas de ramdisk avec les modules de cette version. Si le pilote du disque racine est un module, le noyau ne peut pas monter
/: kernel panic au démarrage. D’où l’intérêt de garder l’ancienne entrée de boot.Et si on lance
make mrproperdans un dossier de sources déjà configuré, juste avantmake?mrpropersupprime le.config: toute la configuration personnalisée est perdue, etmaken’a plus de fichier de réponse. Il faut la refaire (menuconfig) ou repartir d’une sauvegarde avecoldconfig.