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.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
utilisateurs:hypathie:tutos:kernel-linux [22/08/2014 02:23] martinux_qc [Introduction] |
utilisateurs:hypathie:tutos:kernel-linux [22/08/2014 08:46] Hypathie [Patch] |
||
---|---|---|---|
Ligne 26: | 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 44: | 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 147: | 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 248: | Ligne 252: | ||
</note> | </note> | ||
- | ===Lancer un test de patch=== | + | ===Lancer un test avant d'appliquer un patch=== |
<code>patch -p1 --dry-run < fichier-du-patch</code> | <code>patch -p1 --dry-run < fichier-du-patch</code> | ||
Par exemple : | Par exemple : | ||
- | <code root>cd linux-3.8 && patch -p1 --dry-run < ../patch-3.8.13</code> | + | <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 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. | + | 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 a déjà été patchée. On supprime le dossier source "linux-3.8" et on décompresse "linux-3.8.tar.xz". | + | 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 : | On essaie à nouveau : | ||
- | <code root>cd linux-3.8 && patch -p1 --dry-run < ../patch-3.8.13</code> | + | <code root>cd linux-3.8 && patch -p1 --dry-run < ../patch-3.8.12</code> |
C'est ok donc on lance la commande : | C'est ok donc on lance la commande : | ||
- | <code root>cd linux-3.8 && patch -p1 --dry-run < ../patch-3.8.13</code> | + | <code root>cd linux-3.8 && patch -p1 --dry-run < ../patch-3.8.12</code> |
- | ===Revenir à une version antérieure ("dé-patcher") === | + | ====Revenir à une version antérieure ("dé-patcher") ==== |
- | <code>zcat patch-version | patch -p0 -R</code> | + | <code>patch -p0 -R < ./patch-version-à-retirer/code> |
- | ===Effectuer une sauvegarde avant le patch=== | + | Par exemple, à la version "linux-3.8", |
- | <code>patch -B oldfile/ -p0 < patch-file</code> | + | <code root>cd linux-3.8</code> |
+ | <code>make kernelversion</code> | ||
+ | <code>3.8.0</code> | ||
- | Récupération de la sauvegarde : | + | *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'')) |
- | <code>diff -ur linux-version oldfiles/linux-version > recover-version-patch</code> | + | |
+ | 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> | ||
- | ===Conserver les fichiers d'origine === | ||
- | <code>patch -b -p0 < fichier-patch</code> | ||
=====Personnalisation du noyau ===== | =====Personnalisation du noyau ===== | ||