Kernel patchen

stoerfang

stoerfang

Doppel-As
hallo zusammen,

bevor ich anfange einen Kernel neu zu kompilieren, dachte ich es wäre besser erst einmal mit dem Patchen anzufangen. ( muss ja üben :headup: ).

habe einen Kernel 2.6.21.3 und habe mir den patch 2.6.21.4 geladen und nach /usr/src/linuxxxx/ kopiert.
Dann erfolgt der Befehl:
zcat patch-2.6.21.4.gz | patch -p0 2>&1 | tee patch.out

Um festzustellen ob Fehler vorhanden sind: find . -name *.rej
=> keine Ausgabe. :)

aber bei uname -a weiterhin 2.6.21.3

So habe ich mir die Datei patch.out angesehen und festfestellt, dass da sehr oft die Fehlermeldung :
" can't find file to patch at input line xxx" vorkommt.

Was habe ich falsch gemacht ?
 
ja erst patchen, dann erfolgt die normale Prozedur..

make, make modules, make modules_install .. OK !!

also kann ich trotz der Meldungen " can't ....." den oben genannten Befehl ausführen ?
 
Was willste denn patchen, wenn Du keine Sourcen hast, zum patchen?
Du hast das nicht wirklich verstanden, oder?
 
make, make modules, make modules_install .. OK !!
davor kommt ein 'make menuconfig' oder 'make xconfig', welches die eigentliche Arbeit beim Kernel erstellen darstellt.
Es gibt, soweit ich weiss, keine binaeren Flicken, zumindest nicht unter Linux. Der Patch, den Du angewendet hast, fuehrt die Quellen der Kernels der Version 2.6.121.3 in die Version 2.6.21.4 ueber. Da dies erst nur die Quellen sind, merkt das laufende Sustem daran nichts, erst, nachdem Du den neuen Kernel erstellt, installiert und (durch Neustart) aktiviert hast.

Falls Du Dir unsicher beim anwenden des Patches bist, kannst Du Dir auch gleich die Quellen der aktuellen Version runterladen.
 
danke erstmal,

aber kann ich trotz der Meldungen in der patch.out:
" can't find file to patch at input line xxx" mit den make-Befehlen anfangen ?
 
Nochmal langsam, zum Mitmeiseln:

Du kannst Deinen laufenden, kompilierten Kernel nicht Patchen!
 
ich habe einen Kernel und wollte diesen patchen.
Nach dem Patchen konnte ich über find . -name *.rej keine Fehler finden !

Aber in der patch.out ( zcat patch-2.6.21.4.gz | patch -p0 2>&1 | tee patch.out ) ist immer eine Zeile mit " can't find file to patch at input line xxx" .

Ist diese Meldung ok und kann ich dann trotzdem mit dem kompilieren anfangen ?

Was mache ich eigentlich, wenn ich beim find . -name *.rej auf Dateien mit *.rej
treffe ?

Und wenn ich mehrere Patches habe, muss ich dann erst jedes mal den Kernel neu kompilieren, bevor ich den nächsten Patch einspiele, oder reicht es, alle Patches nacheinander einzuspielen und dann einmal den Kernel neu zu kompilieren.

Sorry für die vielen Fragen, aber jeder fängt mal klein an...

Danke und Gruss
 
Du hast die Kernel-Sources auch installiert?

Die KERNEL-SOURCES wohlgemerkt!
 
Aber in der patch.out ( zcat patch-2.6.21.4.gz | patch -p0 2>&1 | tee patch.out ) ist immer eine Zeile mit " can't find file to patch at input line xxx" .
Was steht denn in der Zeile 'xxx' deines Patches? Welche Datei ist dort angegeben?
Ist der Quellcode, den Du flicken willst, ein Vanilla-Kernel oder der Deiner Distribution? Du musst naemlich streng darauf achten, dass Quelle und Patch zueinander passen, und viele Distributionen veraendern den Kernel.

Und wenn ich mehrere Patches habe, muss ich dann erst jedes mal den Kernel neu kompilieren, bevor ich den nächsten Patch einspiele, oder reicht es, alle Patches nacheinander einzuspielen und dann einmal den Kernel neu zu kompilieren.
Letzteres ist der richtige Weg. Es bringt nichts, den Kernel zwischen zwei Patches zu kompilieren, da die dabei erzeugten Dateien von dem Path voellig unberuehrt lassen.
(doch wie gesagt halte ich es fuer einfacher und sicherer, den vollen Quellcode neu runterzuladen).
 
ich habe die aktuelle zenwalk 4.6 installiert.

habe beim Patchen ( zcat patch-2.6.21.4.gz | patch -p0 2>&1 | tee patch.out ) eine Pipe gesetzt, siehe Anhang.

Wo gibt es denn Unterschiede zwischen dem Kernel der Distri und den von kernel.org ?
 

Anhänge

  • patch.txt
    30,4 KB · Aufrufe: 6
Mitunter patchen die Distributoren gern mal ihr eigenes Zeugs in die Kernel. Aber so, wie das bei dir ausschaut... keine Kernelsourcen. Haben die anderen ja auch schon gesagt, aber patch mal schon deinen Kernel weiter...
 
ich habe meine Kernelsourcen installiert, also muss es doch einen anderen Grund haben ?????
 
Wenn du einen Patch auf Sourcen anwendest ist es wichtig das der Patch auch fuer die richtigen Sourcen ist.

Also, es hat jemand Sourcen, macht davon eine Kopie, aendert die Kopie, und wenn seine Brust vor Stolz angeschwollen ist mach er mit dem Programm 'diff' eine Datei welche die Unterschiede zwischen Source und veraenderter Kopie listet.

Ein Patch ist also eine Datei die den Unterschied festhaelt, der mit 'patch' auf die (gleichen) Sourcen angewendet werden kann um sie dahingehend zu veraendern das sie der (wie oben beschrieben) veraenderten Kopie entspraechen.

Entscheidend ist das, speziell wenn ein Patch einen ganzen Sourcetree in Bezug nimmt, man entweder den Patch im richtigen Verzeichnis startet, oder dem Programm 'patch' das richtige Zielverzeichnis angibt.

Jetzt kann es sein das, wenn z.B. zwei Patches verschiednen Ursprungs (zwei Aenderungen mit unterschiedlichem Zweck von vllt. unterschiedlichen Programmieren) angewendet werden soll die sich ueberschneiden, dann kann 'patch' eine Beschreibung im Patch (wie sie 'diff' erzeugt hat) in den Sourcen nicht finden, und uebergeht im Patchvorgang diese, aber schreibt das in eine reject-Datei.

Manchmal funktioniert das kompilierte Programm aber hinterher trotzdem, ist also ein patch auch auf andere Versionen der Sourcen anwendbar - entscheidend ist das 'patch' die zu patchenden Dateien Vorfindet. Meiner Erfahrung nach sucht patch, wenn es die Dateien nicht in erwartetem Zustand vorfindet versucht die gesuchte Zeile ueber Pattern-Match zu finden und fragt nach ob es nach der Ihm (von koennern) beigebrachten Weisheit dem User eine Version vorlegen soll, mit dem er es auf gut Glueck ja mal Versuchen mag.

Bei dir koennte ich mir vorstellen das du im falschen Verzeichnis bist, oder der Patch auf die falsche Version der Sourcen angewendet wird.
 
Zuletzt bearbeitet:
ich habe die aktuelle zenwalk 4.6 installiert.
habe beim Patchen ( zcat patch-2.6.21.4.gz | patch -p0 2>&1 | tee patch.out ) eine Pipe gesetzt, siehe Anhang.

Wo gibt es denn Unterschiede zwischen dem Kernel der Distri und den von kernel.org ?

Auf die Gefahr hin, dass du das Kernel-patchen längst aufgegeben hast...

Ich gehe mal davon aus, dass du obiges Kommando im Verzeichnis /usr/src/linux-2.6.21/ ausgeführt hast (und dass sich darin die entsprechenden Kernel-Quellen befunden haben). Zum Inhalt deiner Textdatei:

Code:
can't find file to patch at input line 5
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff --git a/Makefile b/Makefile
|index d970cb1..e5c5531 100644
|--- a/Makefile
|+++ b/Makefile
--------------------------
[...]
Im Patch steht anscheinend drin, dass zunächst die Differenzen zwischen Datei "a/Makefile" und "b/Makefile" folgen. Wohlgemerkt mit den Pfadangaben "a/" (fürs Original) und "b/" (für die neue Version). Um diese Pfadangaben wegzuschneiden, muss beim Patch-Befehl die Option "-p1" angegeben werden. "patch -p0" bewirkt in dem Fall, dass patch versucht, die Datei /usr/src/linux-2.6.21/a/Makefile durch /usr/src/linux-2.6.21/b/Makefile zu ersetzen, was offenbar fehlschlägt. In deinem Fall ist also garnichts gepatcht worden, weil keine einzige der gesuchten Dateien gefunden wurde.

Nun gibts evtl. noch eine weitere Hürde. Angenommen, du willst von Kernelversion 2.6.21.3 auf Version 2.6.21.4 patchen. Die Patches von www.kernel.org sind aber nicht (mehr) inkrementell (beim 2.4er Kernel waren sie es afaik noch). D.h. der Patch-2.6.21.4 bezieht sich auf Version 2.6.21, nicht auf Version 2.6.21.3. Also müsstest du, bevor du Patch-2.6.21.4 anwenden kannst, zunächst von Version 2.6.21.3 auf Version 2.6.21 "zurück-patchen". Das geht mit der Patch-Option "-R". Angenommen, beide Patches liegen mit gzip gepackt im Verzeichnis /tmp/, müsstest du also folgende Befehle ausführen:

Code:
cd /usr/src/linux-2.6.21.3
zcat /tmp/patch-2.6.21.3.gz | patch -p[b]1 -R[/b]
zcat /tmp/patch-2.6.21.4.gz | patch -p[b]1[/b]
# cd ..
# mv linux-2.6.21.3 linux-2.6.21.4

Das "2>&1 | tee patch.out" (aus dem Kernel kompilier Howto?) kannst du natürlich nach Belieben noch dranhängen. ;)
 
Zurück
Oben