...ausgeschlafen und immer noch hungrig geht's weiter... Zugegeben, das Paket ist alles andere als perfekt. - Es ist ein Anfang.
2 Erstellung eines SVR4-Paketes2.1 Schritte zur Erstellung eines Paketes- Organisation des Paketinhaltes in einer hierarchischen Verzeichnisstruktur
- Vergabe/Anpassung von UID, GID und Datei-Rechten auf alle Paketobjekte (für Zielumgebung)
- Erzeugung der benötigten Informationsdatei pkginfo
- [OPTIONAL] Erzeugen von optionalen Informationsdateien, z.B. Definition von Paketabhängigkeiten (-> depend), Einbindung von Copyright-Texten (-> copyright), Reservierung von zusätzlichen Speicherplatz auf den Zielsysteme (-> space)
- [OPTIONAL] Erzeugen von Installtionsskripten pre-/postinstall sowie pre-/postremove (benutzerspezifische Installation/Deinstalltion)
- Erzeugen der Informationsdatei prototype
- Erzeugen des Paketes mit dem Kommando pkgmk
- Verifizierung/Test der Integrität des erzeugten Paketes mit den Kommandos pkgchk und pkgparam
- Transfer des Paketes im Paketformat auf ein Distributionsmedium mit dem Kommando pkgtrans
2.1 Organisation der Verzeichnisstruktur und Anpassungen der PaketobjekteDa die Verzeichnisstruktur bereits angepasst wurde (-> siehe
hier), fehlt noch die Vergabe entsprechender Privilegien auf die Paketobjekte für die spätere Zielplattform/-installation. In diesem Beispiel wurde das Paket nach /opt/gnu installiert, was für ein Paketbau keine gute Idee war. Somit ist zusätzlich ein
su erforderlich.
sypho% cd /opt/gnu
sypho% su
Password:
# chown -R bin:bin ./*
# chmod -R 755 ./*
# ^D
logout
sypho%
Folgende Richtlinien sind zu beachten:
- Der Paketinhalt ist stets in einem eigenen Verzeichnis organisiert.
- Das Verzeichnis weist die Struktur des späteres Zielsystems auf (/usr, /bin, usw.)
- Die Zugriffsrechte sollten denen des späteren Zielsystems entsprechen.
2.2 Erstellung der Informationsdatei pkginfoDie Informationsdatei
pkginfo ist eine ASCII-Datei die einige Eigenschaften (Charakteristika) des Paketes beschreibt, die für den weiteren Installationsverlauf benötigt werden. Da es hier keinerlei mitgelieferten Automatismus (Skript o.ä.) gibt, der einen das Tippen teilweise abnimmt, muss man mit seinem bevorzugten Editor die Datei selbst zusammenstellen:
sypho% cd $HOME
sypho% pwd
/home/schaarst
sypho% mkdir InfoFiles
sypho% cd InfoFiles
sypho% pwd
/home/schaarst
sypho% vi pkginfo
Jeder Eintrag beziehungsweise jede Zeile besteht aus einem Schlüssel-Werte-Paar im Format "
PARAM=Value". Bei mehr als einer Wertangabe muss diese in einfache oder doppelte Anführungszeichen eingeschlossen werden ("Wert1 Wert" oder 'Wert1 Wert 2'). Sollten Sonderzeichen verwendet werden, so muss dieses im Format "
\x" erfolgen.
Folgende Standard-Parameter müssen in der Datei pkginfo definiert werden: PKG, NAME, ARCH, VERSION und CATEGORY. Folgende Einträge habe ich hinzugefügt:
PKG="GNUccomp"
NAME="GNU C Compiler (created on Solaris 2.5.1)"
ARCH="sparc"
VERSION="2.95.3"
CATEGORY="application"
DESC="GNU C Compiler for program development on the Solaris 2.5.1 Operating Environment and compatible operating systems on SPARC V8 platforms."
VENDOR="Free Software Foundation, Inc."
EMAIL="escimome-please@yahoo.de"
PSTAMP="escimo for sonnenblen.de"
ISTATES="S 2"
RSTATES="S 2"
BASEDIR="/usr/local"
Erklärung zu den Parametern in der pkginfo-Datei:
- PKG -> Kürzel für Paketnamen (z.B. GNUapp); max. 32 Zeichen
- NAME -> voller Name des Paketes
- ARCH -> Ziel-Architekur des Paketes
- VERSION -> Paketversion (kann alternativ auch für Programmversion verwendet werden)
- CATEGORY -> Zugehörigkeit zu Software-Kategorie ("system", "application")
- DESC -> Beschreibung zum Paketinhalte
- VENDOR -> Hersteller der Paketquellen
- EMAIL -> Kontakt-Adresse einer Ansprechperson für Fragen/Support
- PSTAMP -> kann zum Erzeugen einen "package prducer stamps" genutzt werden
- ISTATES -> bevorzugte init-Statuse, in denen das Paket installiert werden sollte.
- RSTATES -> bevorzugte init-Statuse, in denen das Paket entfernt werden sollte.
- BASEDIR -> Angabe eine absoluten Pfades zu einem Verzeichnisses, in das die Paketobjekte installiert werden.
Darüberhinaus gibt es auch noch andere Parameter wie CLASSES, auf die an dieser Stelle nicht näher eingegangen wird.
2.3 Erzeugen der Informationsdatei prototypeDie Informationsdatei
prototype ist ebenfalls eine ASCII-Datei. Sie dient dem formatierten/spezifischen Listen aller Objekte eines Paketes und weiterer Informationen, die für das Kommando
pkgmk benötigt werden. Dabei beschreibt jede Zeile ein einzelnes Objekt des Paketes nach einem festgelegten Format. Grundsätzlich lässt sich die
prototype-Datei auch von Hand erstellen, was aber unter Umständen je nach Paketinhalt und -größe sehr zeitaufwändig werden kann. Das ist nötig, wenn der Paketinhalt vorher nicht organisiert und in einer Hierarchie zusammengefasst wurde. Für unseren Fall bedienen wir uns dem Kommando
pkgproto, da wir die notwendigen Datei-Organisierung bereits vorgenommen haben:
sypho% cd $HOME
sypho% pwd
/home/schaarst
sypho% mkdir InfoFiles
sypho% cd /opt/gnu
sypho% pwd
/opt/gnu
sypho% pkgproto bin lib man > /home/schaarst/InfoFiles/prototype
Die Anweisung "
pkgproto bin lib man > /home/schaarst/InfoFiles/prototype" erstellt eine Datei mit der Bezeichnung "prototype" im Verzeichnis /home/schaarst/InfoFiles. Die 3 Pfad-Parameter im Format "
Path1[=Path2]" dienen der Angabe des Pfades, wo sich Paketobjekte befinden. Wird die
Option "=Path2" an Path1 angehängt, wird die Pfadangabe von Path1 mit der von Path2 in der prototype-Datei substituiert.
Folgenden Inhalt hat die prototype-Datei nach Ausführung der Anweisung:
d none bin 0755 bin bin
s none bin/cc=gcc
f none bin/protoize 0755 bin bin
f none bin/unprotoize 0755 bin bin
f none bin/gcov 0755 bin bin
f none bin/cpp 0755 bin bin
f none bin/gcc 0755 bin bin
d none lib 0755 bin bin
d none lib/gcc-lib 0755 bin bin
d none lib/gcc-lib/sparc-sun-solaris2.5.1 0755 bin bin
d none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3 0755 bin bin
d none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include 0755 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/math.h 0644 bin bin
d none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/sys 0755 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/sys/stream.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/curses.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/assert.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/syslimits.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/stdarg.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/stddef.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/varargs.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-alpha.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-h8300.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-i860.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-i960.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-mips.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-m88k.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-mn10200.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-mn10300.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-pa.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-pyr.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-sparc.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-clipper.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-spur.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-m32r.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-sh.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-v850.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/proto.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-arc.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/iso646.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-ppc.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/va-c4x.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/stdbool.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/limits.h 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/README 0644 bin bin
d none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/v7 0755 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/include/fixed 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/cc1 0755 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/collect2 0755 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/crt1.o 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/crti.o 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/crtn.o 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/gcrt1.o 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/gmon.o 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/crtbegin.o 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/crtend.o 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/specs 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/SYSCALLS.c.X 0644 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/cpp0 0755 bin bin
f none lib/gcc-lib/sparc-sun-solaris2.5.1/2.95.3/libgcc.a 0644 bin bin
f none lib/libiberty.a 0644 bin bin
d none man 0755 bin bin
d none man/man1 0755 bin bin
f none man/man1/gcc.1 0444 bin bin
f none man/man1/cccp.1 0444 bin bin
Nehmen wir uns mal den Eintrag "
f none bin/gcc 0755 bin bin" aus der Datei prototype und erklären deren Bedeutung:
- "f" -> bezeichnet den Objekt-Typ (hier f=file, d=directory, s=symbolic link)
- "none" -> bezeichnet die Klasse zu der das Objekt gehört. Ohne Angabe des Parameters "CLASSES" in der Informationsdatei pkginfo wird "none" angenommen und bei Aufruf des Kommandos pkgmk in der pkginfo-Datei ergänzt.
- "bin/gcc" -> gibt den Pfad (entw. relativ oder absolut) an, wohin das Objekt/die Datei durch das Kommando pkgadd installiert wird.
- "0755" -> beschreibt die Objekt-Privilegiun als oktalen Wert (-rxwr-xr-x). Alternativ kann auch das Fragezeichen "?" gesetzt werden, womit die Privilegien denen des bereits vorhandenen Objektes (beim Überschreiben) auf dem Zielsystem entsprechen.
- "bin" -> Benutzername des Eigentümers der Datei
- "bin" -> Gruppenname des Eigentümers der Datei
Bevor wir das Paket mit dem Kommando pkgmk aufrufen können, müssen wir dem in der prototype-Datei noch eintragen, wo die pkginfo-Datei zu finden ist. Dazu kann wieder der bevorzugte Editor benutzt werden, der bei mir nicht unbedingt vi ist
aber überall vorhanden ist.
sypho% cd $HOME/InfoFiles
sypho% pwd
/home/schaarst/InfoFiles
sypho% ls
pkginfo prototype
sypho% vi prototype
i pkginfo
Durch Einfügen von "i pkginfo" (include) wird dem Kommando
pkgmk vermittelt, dass sich die Datei pkginfo im selben Verzeichnis befindet wie die prototype-Datei. Sollte die pkginfo-Datei in einem anderen Verzeichnis liegen, kann im Format "pkginfo=<Pfad>" auch ein alternativer Pfad (relativ oder absolut) angegeben werden. Darüberhinaus können auch weitere solcher Einträge genutzt werden, wie z.B.
- i copyright=/path/to/my/copyright.file
- !include InfoFile/prototype2
- !default 0755 schaarst users
- !search /home/schaarst/moreInstallAndInfoFiles
2.4 Erzeugen des Paketes mit dem Kommando pkgmkJetzt kommt der kritische Schritt: Das automatisierte Erzeugen des Paketes mit dem Kommando pkgmk. Folgende Aufgaben erledigt das pkgmk-Kommando für uns:
- Aufbereiten aller in der prototype-Datei definierten Objekte zu einem Verzeichnis-Format.
- Erstellen der Datei pkgmap, um die Datei prototype zu ersetzen.
- Zusammenstellen einen installierbaren Paketes als Eingabedaten für das Kommando pkgadd.
Versuchen wir es mal:
sypho% cd $HOME/InfoFiles
sypho% pwd
/home/schaarst/InfoFiles
sypho% pkgmk
## pkgmap wird erzeugt aus Package-Prototypdatei.
FEHLER in /home/schaarst/InfoFiles/prototype:
Kein Objekt für <bin/protoize> in root-Verzeichnis gefunden
Kein Objekt für ...
...
pkgmk: ERROR: Erzeugen von pkgmap aus Prototypdatei nicht möglich
## Packaging war nicht erfolgreich.
sypho%
Das war wohl nichts. Da habe ich mich wieder mal total unfähig gestellt. Zuerst wollte ich die Ausgabe "
Kein Objekt für <...> in root-Verzeichnis gefunden" nicht verstehen.
Immer wieder wird es gesagt, notwendigerweise muss man es sich auch ab und zu selbst eingestehen: "Du Vollidiot. Lesen was da steht."
/!\ Nicht schon wieder: "Beitrag hat die max. Länge erreicht (20000 Zeichen)."...