DOLINUX Protokoll vom 21.11.2001

RPM-Patches bauen

Warum sind Patches nötig?

Wie erstelle ich Patches?

  1. cp datei datei.orig
    alte Datei vor der Änderung sichern
  2. alte Datei ändern
  3. diff -u datei.orig datei > datei.patch
    patch erzeugen

Beispiel:

datei.orig datei
Mit dieser Datei soll 
das Patchen gezeigt werden.
Dies koennte auch ein 
Source-File, Makefile... sein.
bla 1
bla 2
bla 3
Das ist der "Desd".
Hier muss was geaendert werden.
bla 4
bla 5
bla 6
bla 7
			
Mit dieser Datei soll 
das Patchen gezeigt werden.
Dies koennte auch ein 
Source-File, Makefile... sein.
bla 1
bla 2
bla 3
Das ist der "Test".
Hier muss was geaendert werden.
bla 4
bla 5
bla 6
bla 7
			
datei.patch mit -u datei.patch ohne -u
--- datei.orig	Wed Nov 21 17:13:02 2001
+++ datei	Wed Nov 21 17:13:58 2001
@@ -5,7 +5,7 @@
 bla 1
 bla 2
 bla 3
-Das ist der "Desd".
+Das ist der "Test".
 Hier muss was geaendert werden.
 bla 4
 bla 5
			
8c8
< Das ist der "Desd".
---
> Das ist der "Test".
			

Wird diff ohne die Option -u aufgerufen, werden nur die Zeilennummer und die Änderung angegeben. Dies kann vor Allem dann zu Problemen führen, wenn mehrere Patches angewendet werden, da sich die Zeilenzahl dabei ändern kann (z.B. 65 Zeilen einfügen).
Um dies zu verhindern, sollte man diff -u benutzen, sodass die Änderungen im Kontext angezeigt werden. Folgende Einträge sind dann pro Änderung in der Datei:

Eine weitere Möglichkeit:
gendiff [dir] .endung > datei.patch
Hierbei wird diff -u auf alle Files mit .endung im Verzeichnis [dir] angewendet. Die Unterschiede werden dann in datei.patch umgeleitet.

Neue Dateien werden erstellt, indem man diff auf eine leere Datei mit Endung .orig und die neu erstellte Datei anwendet.

Dateien werden gelöscht, indem man diff auf die alte Datei mit Endung .orig und eine leere Datei anwendet.

Wie füge ich Patches ins Spec-File ein?

PatchX: datei.patch
muss am Anfang ins Spec-File eingetragen werden, wobei X die Patches durchnummeriert.
Zum Aufrufen der Patches gibt es mehrere Möglichkeiten:

  1. patch < %{PATCHX}
    Patch wird eingefügt
  2. patch -b -z .orig
    -b: erstellt vorher ein Backup
    -z .orig: benutzt als Suffix .orig
  3. patch -p1 -b -z .orig < %{PATCHX}
    -p1: schneidet 1.Teil des Dateinamen ab
  4. %patchX -p1 -b .orig
    bewirkt das gleiche wie 3., ist nur kürzer, da es ein Makro ist

Base-System erzeugen

unglückliche Methoden:

gute Methode:

  1. rpm --initdb --root <root>
    ACHTUNG: Nicht auf laufenden Systemen testen!!
    /var/lib/rpm/.../lib.db wird erzeugt.
    --root <root>: ändert das Root-System von rpm.
    Die geschaffene Datenbank beinhaltet, den momentanen Zustand des Systems (was ist installiert?, checksum ...).
  2. /etc/passwd, /etc/group, /etc/nsswitch.conf vom laufenden System kopieren
    rpm-Pakete speichern die Namen und die Gruppen. Diese werden mit Hilfe von /etc/passwd und /etc/group in usr- und grp-Ids umgewandelt. Ist nichts vorhanden, wird alles einfach als root installiert!
    /etc/nsswitch.conf legt die Suchreihenfolge fest (i.d.R. erst /etc/passwd, dann Netzwerk).
  3. rpm -i --root <root> --nodeps --noscripts <pkg>
    Pakete des Grundsystems installieren.
    --nodeps: rpm installiert einfach, kontrolliert keine Abhängigkeiten, Benutzer muss sicher stellen, dass am Schluss alles stimmt.
    --noscripts: anfangs werden keine Scripte ausgeführt (würden Shell benötigen).
  4. rpm -qp -qf '%{POSTIN}\n' <pkg> > x
    Erzeugt Shell-Script x, das die oben noch nicht ausgeführten Scripte enthält.
    -qf '%{POSTIN}\n': Ausgabeformat
    -qp : Pfadangabe
  5. ./x
    Oben erzeugtes Script ausführen.

weitere in diesem Zusammenhang nützliche Befehle:



Letzte Änderung: 28-Nov-01
Autoren: Gerhard Fuchs, Anna Kruszynski