Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
utilisateurs:hypathie:tutos:kernel-linux [21/08/2014 13:43] Hypathie créée |
utilisateurs:hypathie:tutos:kernel-linux [22/08/2014 08:46] Hypathie [Patch] |
||
---|---|---|---|
Ligne 7: | Ligne 7: | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | ====Récupération des sources du noyau ==== | + | |
- | ===Archives téléchargeables=== | + | ==== Récupération des sources du noyau ==== |
+ | |||
+ | === Archives téléchargeables=== | ||
Les sources du noyau sont archivées à cette adresse : [[https://www.kernel.org/|The Linux Kernel Archives]].\\ | Les sources du noyau sont archivées à cette adresse : [[https://www.kernel.org/|The Linux Kernel Archives]].\\ | ||
Ligne 14: | Ligne 17: | ||
-stable [EOL] : versions qui ne sont plus supportées | -stable [EOL] : versions qui ne sont plus supportées | ||
-longterm : support étalé dans le temps | -longterm : support étalé dans le temps | ||
- | -stable : pour récupérer le noyau télécharger [tar.xz] | + | -stable : pour récupérer le noyau téléchargé [tar.xz] |
-mainline (...-rc) : version testée | -mainline (...-rc) : version testée | ||
Ligne 23: | Ligne 26: | ||
<code root>wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.1.tar.xz</code> | <code root>wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.1.tar.xz</code> | ||
<code root>tar -xvJf linux-3.16.1.tar.xz</code> | <code root>tar -xvJf linux-3.16.1.tar.xz</code> | ||
- | <code root>ls</code | + | <code root>ls</code> |
<code> | <code> | ||
linux-3.16.1 linux-3.16.1.tar.xz | linux-3.16.1 linux-3.16.1.tar.xz | ||
Ligne 41: | Ligne 44: | ||
</code> | </code> | ||
- | ===Remarques sur Décompression/Compression=== | + | === Remarques sur Décompression/Compression === |
- | * **Plusieurs programme de compression**\\ compression/décompression d'un seul fichier à la fois:\\ | + | |
+ | * **Plusieurs programmes de compression**\\ compression/décompression d'un seul fichier à la fois:\\ | ||
* **gunzip** ; pour le format gz | * **gunzip** ; pour le format gz | ||
* **bzip2** ; pour le format bz2. | * **bzip2** ; pour le format bz2. | ||
Ligne 144: | Ligne 148: | ||
- ''Documentation'' : sur les fonctionnalités du kernel, très technique : dans cette documentation commencer par lire les fichiers "INDEX" qui sont des résumés de chaque fichier de "technique" de la doc. | - ''Documentation'' : sur les fonctionnalités du kernel, très technique : dans cette documentation commencer par lire les fichiers "INDEX" qui sont des résumés de chaque fichier de "technique" de la doc. | ||
- | =====Patch ===== | + | ===== Patch ===== |
Un patch permet de modifier un logiciel existant.\\ Cela permet corriger un noyau manuellement, mais aussi de "passer à une version supérieure".\\ | Un patch permet de modifier un logiciel existant.\\ Cela permet corriger un noyau manuellement, mais aussi de "passer à une version supérieure".\\ | ||
- | Par exemple on a un version du noyau 3.8 et on se sert du patch pour la faire passer à la version 3.9.\\ Il y a aussi des patch pour modifier le comportement du kernel par exemple rt (temps réel). | + | Par exemple on a une version du noyau 3.8 et on se sert du patch pour la faire passer à la version 3.9.\\ Il y a aussi des patch pour modifier le comportement du kernel par exemple rt (temps réel). |
+ | |||
+ | ==== Patch correctif ==== | ||
+ | |||
+ | === Préparation d'une ancienne version à patcher=== | ||
- | ====Patch correctif ==== | ||
- | ===Préparation d'une ancienne version à patcher=== | ||
aller sur [[https://www.kernel.org/pub/]] -> "linux" puis v3.x -> cliquer sur "Last modified". | aller sur [[https://www.kernel.org/pub/]] -> "linux" puis v3.x -> cliquer sur "Last modified". | ||
Ligne 169: | Ligne 176: | ||
>Il existe le patch "patch-3.8.13.xz" | >Il existe le patch "patch-3.8.13.xz" | ||
+ | |||
* Télécharger le patch : | * Télécharger le patch : | ||
<code user> | <code user> | ||
Ligne 225: | Ligne 233: | ||
__**Patcher avec un patch de version supérieure**__ :\\ | __**Patcher avec un patch de version supérieure**__ :\\ | ||
- | Par exemple pour la version 3.8 on voulait appliquer un patch 3.9.4, il faut d'abord passer à la version 3.9 (sur une 3.8.0 -> patch -p1 < 3.9).\\ | + | S'il est possible à partir d'une version .0 (par exemple 3.8.0)((qu'on trouve sous le nom de 3.9 sur le site "Index of/pub/kernel")) à un correctif éloigné (par exemple 3.8.13), pour une version déjà corrigée (par exemple 3.8.1) il faut passer par tous les intermédiaires (par exemple 3.8.2 ; 3.8.3 ; ... 3.8.13). |
- | Puis à partir de la 3.9.0, on peut appliquer un patch 3.9.4. | + | Pour passer à une version supérieure ("upgrader" de 3.8 à 3.9), il faut par exemple appliquer le patch 3.9 à la version 3.8, mais appliquer un patch 3.9 à une version 3.8.4). |
- | **__Lancer un test de patch__** : | + | Par exemple, pour passer de la version 3.8 à la 3.9 avec le patch "patch-3.9.xz" : |
+ | |||
+ | <code root>cd /usr/src/</code> | ||
+ | <code root>wget https://www.kernel.org/pub/linux/kernel/v3.x/patch-3.9.xz</code> | ||
+ | <code root>unxz patch-3.9.xz</code> | ||
+ | Décompresser "linux-3.8.tar.xz" (ce qui supprime l'ancienne "linux-3.8", qui était une 3.13, du fait qu'on avait déjà appliqué le patch) | ||
+ | <code root>tar -xvJf linux-3.8.tar.xz</code> | ||
+ | <code root>cd linux-3.8</code> | ||
+ | <code root>make kernelversion</code> | ||
+ | <code>3.8.0</code> | ||
+ | <code root>patch -p1 < ../patch-3.9</code> | ||
+ | <code root>make kernelversion</code> | ||
+ | <code>3.9.0</code> | ||
- | <code root>patch -p1 -dry-run < fichier-du-patch</code> | ||
- | S'il est demandé "Reversed (or previous applied) patch detected)! Assume -R? [n]"\\ | ||
- | Il faut taper **''y''** pour avancer jusqu'au bout. Ce message apparaît quand on applique un patch d'une version supérieure ou q'un a déjà appliqué le patch, ou autre erreur. | ||
</note> | </note> | ||
+ | |||
+ | ===Lancer un test avant d'appliquer un patch=== | ||
+ | |||
+ | <code>patch -p1 --dry-run < fichier-du-patch</code> | ||
+ | |||
+ | Par exemple : | ||
+ | <code root>cd linux-3.8 && patch -p1 --dry-run < ../patch-3.8.12</code> | ||
+ | Il est demandé "Reversed (or previous applied) patch detected)! Assume -R? [n]"\\ | ||
+ | Il faut taper **''y''** pour avancer jusqu'au bout. Ce message apparaît quand on applique un patch d'une version supérieure ou qu'on a déjà appliqué un patch, ou autre erreur. | ||
+ | Cette version avait déjà été patchée. On supprime le dossier source "linux-3.8" et on décompresse "linux-3.8.tar.xz". | ||
+ | |||
+ | On essaie à nouveau : | ||
+ | <code root>cd linux-3.8 && patch -p1 --dry-run < ../patch-3.8.12</code> | ||
+ | |||
+ | C'est ok donc on lance la commande : | ||
+ | |||
+ | <code root>cd linux-3.8 && patch -p1 --dry-run < ../patch-3.8.12</code> | ||
+ | |||
+ | ====Revenir à une version antérieure ("dé-patcher") ==== | ||
+ | |||
+ | <code>patch -p0 -R < ./patch-version-à-retirer/code> | ||
+ | |||
+ | Par exemple, à la version "linux-3.8", | ||
+ | <code root>cd linux-3.8</code> | ||
+ | <code>make kernelversion</code> | ||
+ | <code>3.8.0</code> | ||
+ | |||
+ | *le patch-3.8.13((''cd linux-3.8'' puis ''patch -p1 < ../patch-3.8.13'' puis ''make kernelversion'' on a bien ''3.8.13'')) | ||
+ | |||
+ | Pour passer de la version linux-3.8.13 à la version linux-3.8.0, on fait : | ||
+ | |||
+ | <code root>/usr/src/linux-3.8# patch -p1 -R < ../patch-3.8.13</code> | ||
+ | |||
+ | Et voilà : | ||
+ | <code root>make kernelversion</code> | ||
+ | <code>3.8.0</code> | ||
+ | |||
+ | |||
+ | ====Effectuer une sauvegarde avant d'appliquer un patch==== | ||
+ | ===Création d'une sauvegarde des sources à patcher=== | ||
+ | |||
+ | <code>patch -p0 -B fichier-sauvegarde/ -b < ./patch-version</code> | ||
+ | |||
+ | Par exemple, avant d'appliquer un patch, | ||
+ | |||
+ | <code root>cd linux-3.8 && mkdir save-linux-3.8</code> | ||
+ | |||
+ | * Puis on applique le patch ainsi : | ||
+ | <code root>patch -p1 -B save-linux-3.8/ -b < ../patch-3.8.13</code> | ||
+ | |||
+ | **On vérifie la nouvelle version** : | ||
+ | <code root>make kernelversion</code> | ||
+ | <code>3.8.13</code> | ||
+ | |||
+ | Et on a une sauvegarde des sources de "linux-3.8.0": | ||
+ | <code root>ls save-linux-3.8/</code> | ||
+ | <code>arch Documentation include lib net sound | ||
+ | block drivers ipc Makefile scripts tools | ||
+ | crypto fs kernel mm security virt</code> | ||
+ | |||
+ | ===Revenir à la version "linux-3.8.0" avec la sauvegarde :=== | ||
+ | |||
+ | * créer un dossier de sauvegarde des modifications : | ||
+ | <code>diff -ur linux-version oldfiles/linux-version > fichier-de-récupération-du-patch</code> | ||
+ | |||
+ | >"fichier-de-récupération-du-patch" est un fichier contenant une comparaison entre la sauvegarde de linux-3.8.0 et le dossier actuel (les sources patchée en linux-3.8.13). | ||
+ | > -r : indiquer des répertoires | ||
+ | > -u : | ||
+ | |||
+ | Par exemple : | ||
+ | <code root>cd /usr/src/</code> | ||
+ | <code root>diff -ur . ./save-linux-3.8/ > patch-save</code> | ||
+ | |||
+ | * Se servir de ce fichier de comparaison pour récupérer l'ancienne version du noyau : | ||
+ | |||
+ | <code root>patch -p0 < ./patch-save</code> | ||
+ | |||
+ | **Vérifier** : | ||
+ | <code root>make kernelversion</code> | ||
+ | <code>3.8.0</code> | ||
+ | |||
+ | ====Autre méthode pour créer une sauvegarde lors de l'application d'un patch==== | ||
+ | |||
+ | Il s'agit d'appliquer le patch en demandant la création d'un dossier "Makefile.orig" dans le dossier le nouveau dossier des sources patché. | ||
+ | |||
+ | Par exemple, application à la version linux-3.8.0 | ||
+ | <code root>make kernelversion</code> | ||
+ | <code>3.8.0</code> | ||
+ | |||
+ | du patch-3.8.13 : | ||
+ | <code root>patch -p1 -b < ../patch-3.8.13</code> | ||
+ | |||
+ | Vérification de la nouvelle version du noyau: | ||
+ | <code root> make kernelversion</code> | ||
+ | <code>3.8.13</code> | ||
+ | |||
+ | Le fichier "Makefile.orig" a été créé dans le dossier des sources : | ||
+ | <code root>ls</code> | ||
+ | <code>arch drivers Kbuild Makefile.orig samples usr | ||
+ | block firmware Kconfig mm save-linux-3.8 virt | ||
+ | COPYING fs kernel net scripts | ||
+ | CREDITS include lib patch-save security | ||
+ | crypto init MAINTAINERS README sound | ||
+ | Documentation ipc Makefile REPORTING-BUGS tools</code> | ||
+ | |||
+ | ===Récupération de la version originale à partir de ce dossier "Makefile.orig"=== | ||
+ | |||
+ | Il faut utiliser un script shell. | ||
+ | <code bash> | ||
+ | for i in $(find linux-3.8 | grep "orig") | ||
+ | do | ||
+ | DOSSIER=$(echo $i | sed 's/\.orgig//') | ||
+ | mv -f $i $DOSSIER | ||
+ | done | ||
+ | </code> | ||
+ | |||
=====Personnalisation du noyau ===== | =====Personnalisation du noyau ===== |