Table of Contents
LKN Annexe A. Utilitaires utiles
Table of Contents
Source: Linux Kernel in a Nutshell: A. Helpful Utilities
La récupération, la construction, la mise à jour et la maintenance d'une arborescence de sources du noyau Linux impliquent de nombreuses étapes différentes. Les développeurs ont créé des programmes pour aider avec les différentes tâches de routine. Cette section décrit quelques-uns de ces outils utiles et les bases de leur utilisation.
Le développement du noyau Linux diffère à bien des égards du développement logiciel traditionnel. Certaines des exigences particulières imposées aux programmeurs du noyau incluent:
- Appliquer constamment les modifications à la cible mobile d'un calendrier de publication de développement de noyau rapide.
- Résoudre les conflits de fusion entre les modifications apportées et les modifications apportées par d'autres personnes.
- Exporter les modifications dans un format qui permet aux autres de les intégrer et de les utiliser facilement.
patch et diff
L'une des méthodes les plus courantes pour effectuer le travail du noyau consiste à utiliser les programmes de patch et de diff. Pour utiliser ces outils, deux arborescences de répertoires différentes: une arborescence clean
et une arborescence working
doivent être utilisées. L'arbre clean
est une version du noyau publiée, tandis que l'arbre working
est basée sur la même version mais contient les modifications. Ensuite, on peut utiliser patch et diff pour extraire les modifications et les transférer vers une nouvelle version du noyau.
Générer un patch d'origine
Par exemple, créer deux répertoires contenant la dernière version du noyau.
tar -zxf linux-2.6.19.tar.gz mv linux-2.6.19 linux-2.6.19-dity tar -zxf linux-2.6.19.tar.gz ls linux-2.6.19 / linux-2.6.19-dirty /
Maintenant, faire toutes les différentes modifications souhaitées dans le répertoire -dirty
et laisser le répertoire original du noyau clean
. Une fois les modifications terminées, il faut créer un patch pour l'envoyer à d'autres personnes:
diff -Naur -X linux-2.6.19/Documentation/dontdiff linux-2.6.19/ linux-2.6.19-dirty/ > my_patch
Cela va créer un fichier appelé my_patch
qui contient la différence entre le travail et une arborescence de noyau 2.6.19 propre. Ce patch peut ensuite être envoyé à d'autres personnes.
Nouvelles versions du noyau
Si une nouvelle version du noyau est publiée et que l'on souhaite transférer les modifications vers la nouvelle version, il faut essayer d'appliquer le correctif généré sur une version de noyau propre. Cela peut être fait dans les étapes suivantes:
- Générer le patch d'origine, comme dans l'exemple précédent.
- À l'aide du correctif officiel de kernel.org, déplacer l'ancienne version du noyau d'une version:
cd linux-2.6.19 patch -p1 < ../patch-2.6.20 cd .. mv linux-2.6.19 linux-2.6.20
- Déplacer le répertoire de travail d'une version vers l'avant en supprimant le correctif, puis appliquer la nouvelle mise à jour:
cd linux-2.6.19-dirty patch -p1 -R < ../my_patch patch -p1 < ../patch-2.6.20 cd .. mv linux-2.4.19-dirty linux-2.6.20-dirty
- Essayer d'appliquer lee patch en plus de la nouvelle mise à jour:
cd linux-2.6.20-dirty patch -p1 < ../my_patch
Si le correctif ne s'applique pas correctement, résoudre tous les conflits qui sont créés (la commande de correctif informe du rejet en produisant les fichiers .rej
et .orig
à comparer et à corriger manuellement). Ce processus de fusion peut être la partie la plus difficile si on a apporté des modifications à des parties de l'arborescence source qui ont été modifiées par d'autres personnes.
Si on utilise ce processus de développement, il est recommandé d'utiliser l'ensemble de programmes patchutils (disponible sur https://cyberelk.net/tim/patchutils). Ces programmes permettent de manipuler facilement les correctifs de texte de toutes sortes de manières utiles et ont permis aux développeurs du noyau d'économiser de nombreuses heures de travail fastidieux.
Gérer les patchs avec quilt
Le développement du noyau en utilisant patch et diff fonctionne généralement très bien. Mais après un certain temps, la plupart des gens en ont assez et recherchent une façon de travailler différente qui n'implique pas tant de corrections et de fusions fastidieuses. Heureusement, quelques développeurs du noyau ont proposé un programme appelé quilt qui gère beaucoup plus facilement le processus de manipulation d'un certain nombre de correctifs par rapport à une arborescence source externe.
L'idée de quilt est venue d'un ensemble de scripts écrits par Andrew Morton qu'il a utilisé pour maintenir d'abord le sous-système de gestion de la mémoire, puis plus tard l'ensemble de l'arborescence du noyau de développement. Ses scripts étaient très étroitement liés à son flux de travail, mais les idées derrière eux étaient très puissantes. Andreas Gruenbacher a repris ces idées et a créé l'outil de quilt.
L'idée de base derrière quilt est que l'on travaille avec un arbre source vierge et qu'on ajoute un tas de correctifs dessus. On peut pousser et faire disparaître différents correctifs de l'arborescence source et gérer cette liste de correctifs de manière simple.
Pour commencer, créez une arborescence source du noyau:
tar -zxf linux-2.6.19.tar.gz ls linux-2.6.19/
Et aller dans ce répertoire:
cd linux-2.6.19
Pour commencer, créer un répertoire appelé patches
qui contiendra tous les patchs du noyau:
mkdir patches
Dire ensuite à quilt de créer un nouveau patch appelé patch1:
quilt new patch1 Patch patches/patch1 is now on top
quilt doit être informé de tous les différents fichiers qui seront modifiés par ce nouveau patch. Pour ce faire, utilisez la commande add:
quilt add Makefile File Makefile added to patch patches/patch1
Modifiez le fichier Makefile
, modifiez la ligne EXTRAVERSION et enregistrer la modification. Après avoir terminé, dire à quilt d'actualiser le patch:
quilt refresh Refreshed patch patches/patch1
Le fichier patches/patch1
contiendra un patch avec les modifications que l'on viens d'apporter:
cat patches/patch1 Index: linux-2.6.19/Makefile =================================================================== --- linux-2.6.19.orig/Makefile +++ linux-2.6.19/Makefile @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 19 -EXTRAVERSION = +EXTRAVERSION = -dirty NAME=Crazed Snow-Weasel # *DOCUMENTATION*
On peut continuer, travailler avec ce patch unique, ou en créer un nouveau pour aller au-dessus de ce patch. Par exemple, si trois correctifs différents ont été créés, patch1, patch2 et patch3, ils seront appliqués les uns sur les autres.
Pour voir la liste des correctifs actuellement appliqués:
quilt series -v + patches/patch1 + patches/patch2 = patches/patch3
Cette sortie montre que les trois patchs sont appliqués et que le patch actuel est patch3.
Si une nouvelle version du noyau est publiée et que l'on souhaite transférer les modifications vers la nouvelle version, quilt peut gérer cela facilement avec les étapes suivantes:
- Retirer tous les correctifs actuellement sur l'arborescence:
quilt pop -a Removing patch patches/patch3 Restoring drivers/usb/Makefile Removing patch patches/patch2 Restoring drivers/Makefile Removing patch patches/patch1 Restoring Makefile No patches applied
- À l'aide du correctif officiel de kernel.org, déplacer l'ancienne version du noyau d'une version:
patch -p1 < ../patch-2.6.20 cd .. mv linux-2.6.19 linux-2.6.20
- Maintenant, demander à quilt de repousser tous les patchs au-dessus du nouvel arbre:
quilt push Applying patch patches/patch1 patching file Makefile Hunk #1 FAILED at 1. 1 out of 1 hunk FAILED -- rejects in file Makefile Patch patches/patch1 does not apply (enforce with -f)
- Comme le premier patch ne s'applique pas correctement, forcer l'application du patch, puis corriger:
quilt push -f Applying patch patches/patch1 patching file Makefile Hunk #1 FAILED at 1. 1 out of 1 hunk FAILED -- saving rejects to file Makefile.rej Applied patch patches/patch1 (forced; needs refresh) vim Makefile.rej Makefile
- Une fois le patch appliqué à la main, actualiser le patch:
quilt refresh Refreshed patch patches/patch1
continuer à pousser les autres patchs:
quilt push Applying patch patches/patch2 patching file drivers/Makefile Now at patch patches/patch2 quilt push Applying patch patches/patch3 patching file drivers/usb/Makefile Now at patch patches/patch3
quilt a également des options qui enverront automatiquement tous les correctifs de la série par e-mail à un groupe de personnes ou à une liste de diffusion, supprimer des correctifs spécifiques au milieu de la série, monter ou descendre la série de correctifs jusqu'à ce qu'un correctif spécifique soit trouvé et de nombreuses options plus puissantes.
quilt est fortement recommandé, pour n'importe quel type de développement du noyau, même pour suivre quelques patchs, au lieu d'utiliser la méthode diff et patch plus difficile. C'est beaucoup plus simple et ça fera économiser beaucoup de temps et d'efforts.
git
git est un outil de contrôle de code source qui a été écrit à l'origine par Linus Torvalds lorsque le noyau Linux cherchait un nouveau système de contrôle de code source. Il s'agit d'un système distribué, qui diffère des systèmes de contrôle de code source traditionnels tels que cvs en ce qu'il n'est pas nécessaire d'être connecté à un serveur pour effectuer une validation dans le référentiel.
git est l'un des systèmes de contrôle de code source les plus puissants, flexibles et rapides actuellement disponibles, et une équipe de développement active y travaille. La page Web principale de git se trouve à https://git.or.cz/. Il est recommandé à tout nouvel utilisateur de git de parcourir les tutoriels publiés afin de se familiariser avec le fonctionnement de git et comment l'utiliser correctement.
Le noyau Linux est développé à l'aide de git, et la dernière arborescence du noyau git peut être trouvée sur https://www.kernel.org/git/, avec une grande liste de référentiels git d'autres développeurs de noyau.
Il n'est pas nécessaire d'utiliser git pour faire le développement du noyau Linux, mais il est très pratique pour aider à traquer les bogues du noyau. Si on signale un bogue aux développeurs du noyau Linux, ils peuvent demander d'utiliser git bisect afin de trouver le changement exact qui a provoqué le bogue. Si c'est le cas, suivre les instructions de la documentation de git pour savoir comment l'utiliser.
ketchup
ketchup est un outil très pratique utilisé pour mettre à jour ou basculer entre les différentes versions de l'arborescence des sources du noyau Linux. Il a la capacité de:
- Trouver la dernière version du noyau, téléchargez-la et décompressez-la.
- Mettre à jour une version actuellement installée de l'arborescence des sources du noyau vers toute autre version, en corrigeant l'arborescence à la version appropriée.
- Gérer le développement différent et les branches stables de l'arbre du noyau, y compris les arbres -mm et -stable.
- Télécharger les correctifs ou tarballs nécessaires pour effectuer la mise à jour, s'ils ne sont pas déjà présents sur la machine.
- Vérifier les signatures GPG de l'archive tar et des correctifs pour vérifier qu'il a téléchargé un fichier correct.
ketchup peut être trouvé à https://www.selenic.com/ketchup/ et a beaucoup de documentation supplémentaire dans le wiki à https://www.selenic.com/ketchup/wiki/.
Voici un ensemble d'étapes qui montrent à quel point il est simple d'utiliser ketchup pour télécharger une version spécifique du noyau, puis de le faire basculervers une autre version du noyau avec seulement un nombre minimal de commandes.
Pour que ketchup télécharge la version 2.6.16.24 de l'arborescence des sources du noyau dans un répertoire et renomme le répertoire pour qu'il soit identique à la version du noyau, entrer:
mkdir foo cd foo ketchup -r 2.6.16.24 None -> 2.6.16.24 Unpacking linux-2.6.17.tar.bz2 Applying patch-2.6.17.bz2 -R Applying patch-2.6.16.24.bz2 Current directory renamed to /home/gregkh/linux/linux-2.6.16.24
Maintenant, pour mettre à niveau ce noyau pour qu'il contienne la dernière version stable du noyau, entrer simplement:
ketchup -r 2.6 2.6.16.24 -> 2.6.17.11 Applying patch-2.6.16.24.bz2 -R Applying patch-2.6.17.bz2 Downloading patch-2.6.17.11.bz2 --22:21:14-- https://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.17.11.bz2 => `/home/greg/.ketchup/patch-2.6.17.11.bz2.partial' Resolving www.kernel.org... 204.152.191.37, 204.152.191.5 Connecting to www.kernel.org|204.152.191.37|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 36,809 (36K) [application/x-bzip2] 100%[====================================>] 36,809 93.32K/s 22:21:14 (92.87 KB/s) - `/home/greg/.ketchup/patch-2.6.17.11.bz2.partial' saved [36809/36809] Downloading patch-2.6.17.11.bz2.sign --22:21:14-- https://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.17.11.bz2.sign => `/home/greg/.ketchup/patch-2.6.17.11.bz2.sign.partial' Resolving www.kernel.org... 204.152.191.37, 204.152.191.5 Connecting to www.kernel.org|204.152.191.37|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 248 [application/pgp-signature] 100%[====================================>] 248 --.--K/s 22:21:14 (21.50 MB/s) - `/home/greg/.ketchup/patch-2.6.17.11.bz2.sign.partial' saved [248/248] Verifying signature... gpg: Signature made Wed Aug 23 15:01:04 2006 PDT using DSA key ID 517D0F0E gpg: Good signature from "Linux Kernel Archives Verification Key >ftpadmin@kernel.org<" gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: C75D C40A 11D7 AF88 9981 ED5B C86B A06A 517D 0F0E Applying patch-2.6.17.11.bz2 Current directory renamed to /home/greg/linux/tmp/x/linux-2.6.17.11
Cela montre que ketchup a automatiquement déterminé que la dernière version stable était la 2.6.17.11 et a téléchargé les fichiers de correctifs nécessaires pour accéder à cette version.
Il est fortement recommandé d'utiliser ketchup lorqu'on souhaite télécharger des arborescences de source de noyau Linux. Il fait tout le travail pour trouver où sur le serveur se trouve le fichier correctif correct et appliquera automatiquement le correctif au format correct, après avoir vérifié que le fichier téléchargé est correctement signé. Combiner ketchup avec quilt et on dispose d'une configuration très puissante qui contient tout ce dont on a besoin pour gérer efficacement les sources du noyau en tant que développeur de noyau Linux.