Pbuilder - personal package builder
Aus DebianforumWiki
| |
Review: Dieser Artikel ist für das Review freigegeben.
|
Hier soll gezeigt werden wie mit
pbuilder eine Umgebung geschaffen werden kann. In der man Debian Pakete erstellt, ohne sich groß um die Verwaltung von Bauabhängigkeiten kümmern zu müssen.
Es soll keine Anleitung zum Debianiesieren von Quellcode sein. Dies wird voraus gesetzt.
Wer richtig in die Debian-Entwicklung einsteigen will, lese die Handbücher auf http://www.debian.org/doc.
Ergänzend sind u.a. auch die folgenden Handbuchseiten Lesenswert diese Beschreiben den Aufbau von Debian-Paketen in deutscher Sprache.
- deb - Debian-Binärpaketformat
- deb-control, deb-src-control - Dateiformat der Hauptsteuerdatei von Debian-Paketen
- debhelper - die Debhelper-Werkzeugsammlung
Naja und so weiter...
Installation
Kern ist das Paket
pbuilder zu installieren. Dennoch werden einige weitere Pakete gebraucht, die Sachen erledigen bevor in der chroot-Umgebung das Kompilieren mit anschließendem Paketbau stattfindet.
-
fakeroot-ng:
-
debhelper:
-
devscripts: ?
-
dpatch,
quilt:
-
auto-make und
auto-conf:
-
intltool:
-
cdbs:
- ...
Diese Liste muss nicht Vollständig sein. Wenn hier Sachen fehlen, wird das durch eine Fehlermeldung gezeigt und hängt meist mit ./debian/rules zusammen. Es hilft dann einen Blick in diese Datei und die Buildabhängigkeiten, um herauszufinden was fehlt.
| |
Hinweis: Nach der Installation von |
Einrichten
Die Konfigurationsdatei
Die Konfigurationsdatei von pbuilder ist /etc/pbuilderrc (ein Link auf /etc/pbuilder/pbuilderrc).
| |
Hinweis: Ich habe einfach mal meine Konfiguration aufgesplittet und versucht zu erklären. |
Das zu nutzende Debian Repository aus dem die chroot-Umgebung und später Bauabhängigkeiten installiert werden legt man folgendermaßen fest. Das gilt aber nur für das Erstellen eines Archivs (s. unten), danach gilt die APT-Konfiguration der chroot-Umgebung.
DISTRIBUTION=squeeze COMPONENTS="main non-free contrib" DEBSECSERVER=http://security.debian.org/debian-security MIRRORSITE="http://ftp.de.debian.org/debian/" OTHERMIRROR="deb $DEBSECSERVER $DISTRIBUTION/updates $COMPONENTS"
Hat man sich ein lokales Repository eingerichtet, kann man dies auch einbinden. ZB. um dort Bauabhängigkeiten bereitzustellen.
BINDMOUNTS="/var/local/repository" # lokales Verzeichnis einbinden (mounten) OTHERMIRROR="$OTHERMIRROR | deb file:///var/local/repository ./" # Fertige Pakete im lokalen Repository ablegen BUILDRESULT=/var/local/repository
In der Variable EXTRAPACKAGES können weitere Pakete definiert werden, die beim erstellen einer chroot-Umgebung Standardmäßig mit installiert werden sollen.
EXTRAPACKAGES=" debhelper ccache hardening-wrapper lintian "
Das HOOKDIR setzen: Default ist /usr/lib/pbuilder/hooks
HOOKDIR=/etc/pbuilder/hooks
debsign ausführen, um Pakete zu signieren.
AUTO_DEBSIGN=${AUTO_DEBSIGN:-yes}
Hooks
Hooks sind Skripte die, an bestimmten Punkten, während des Bauprozesses Dinge erledigen. Wobei der Name des Hook-Script bestimmt, an welcher Stelle im Build-Prozess das Hook ausgeführt wird.
Dabei gilt folgende Konversation:
X<digit><digit><whatever-else-you-want-as-name>
Das "X" bestimmt die Hook-Klasse, die folgenden 2 Ziffern die Reihenfolge in der die Hooks einer Klasse ausgeführt werden. Der Rest dient als Beschreibung.
| Hook-Klasse | Beschreibung |
|---|---|
| A | Is for --build target. It is executed before build starts; after unpacking the build system, and unpacking the source, and satisfying the build-dependency. |
| B | Is executed after build system finishes building, successfully, before copying back the build result. |
| C | Is executed after build failure, before cleanup. |
| D | Is executed before unpacking the source inside the chroot, after setting up the chroot environment.
Create $TMP, and $TMPDIR if necessary. This is called before build-dependency is satisfied. Also useful for calling apt-get update |
| E | Is executed after pbuilder --update and pbuilder --create finishes apt-get work with the chroot, before umounting kernel file systems (/proc) and creating the tarball from the chroot. |
| F | Is executed just before user logs in, or program starts executing, after chroot is created in --login or --execute target. |
| G | Is executed just after debootstrap finishes, and configuration is loaded, and pbuilder starts mounting /proc and invoking apt-get install in --create target. |
Beispiele finden sich unter /usr/share/doc/pbuilder/examples und können einfach in das, durch die Variable HOOKDIR definierte Verzeichnis kopiert werden.
B90linitian
Nutzt lintian um Pakete auf Fehler und Einhaltung der Richtlinien zu überprüfen.
D01apt-update
TODO: http://www.netfort.gr.jp/~dancer/software/pbuilder-doc/pbuilder-doc.html#apt-getupdateonbuild-depend
Basisarchiv
Das System auf dem die chroot-Umgebung basiert, liegt einem tgz-Archiv zugrunde. Erstellte Archive befindet sich dann unterhalb von /var/cache/pbuilder/.
erstellen
Eine minimale chroot-Umgebung erstellt man mittels
pbuilder --create
ändern
Dauerhafte Änderungen kann man bei Bedarf mittels folgendem Befehl durchführen.
pbuilder --login --save-after-login
aktualisieren
pbuilder --update
löschen
Eine nicht mehr benötigte pbuilder chroot-Umgebung wird entfernt, indem das entsprechende .tgz-Archiv gelöscht wird:
rm /var/cache/pbuilder/*.tgz
sudo
Pakete baut man mit dem pdebuild-Befehl. Dieser nutzt sudo -E um intern das Kommando pbuilder build als root aufzurufen. Also muss der eigene Benutzer-Account dazu mittels sudo dazu autorisiert werden.
Dafür mit visudo folgendes definieren:
username ALL=(root) SETENV: NOPASSWD: /usr/sbin/pbuilder
Soll vor dem Bau das Passwort abgefragt werden, muss NOPASSWD: weggelassen werden.
Pakete bauen
Den Bauvorgang stößt man im Projekt-Verzeichnis mit pdebuild wie folgt an:
pdebuild
Wobei die chroot-Umgebung immer wieder in den Ursprungszustand zurück gesetzt wird. Die fertigen Pakete findet man in dem durch die Variable BUILDRESULT definierten Verzeichnis. Standardmäßig ist das /var/cache/pbuilder/results oder auch das Eltern-Verzeichnis.
-
AUTO_DEBSIGN=no pdebuild– lässt einmalig das Signieren weg. -
pdebuild --buildresult /pfad/zum/verzeichnis– überschreibt die Variable BUILDRESULT aus der Konfigurationsdatei.
Eine universellere Möglichkeit ist es, ins chroot zu wechseln und das Paket dort "manuell" zu bauen:
sudo pbuilder --login --bindmounts /tmp # in die chroot Umgebung wechseln
# und das /tmp-Verz. des Host mitnehmen
cd /tmp # ins /tmp-Verz. wechseln
apt-get source $PAKET # Quell-Paket laden und
apt-get build-dep $PAKET # Bauabhänigkeiten installieren
cd $PAKET-* # ins Projekt-Verz. wechseln
#
# Nun die gewünschte Features aktivieren, Patches einspielen usw.
#
dch --local "~name" # Changelog-Eintrag erzeugen und
# alle lokalen Änderungen dokumentieren
debuild # Paket bauen
logout # chroot-Umgebung verlassen
Das Paket findet man dann im /tmp-Verzeichnis.
Optionen an dpkg-buildpackage übergeben
Als Beispiel soll hier die Option -sa an dpkg-buildpackage übergeben werden:
pdebuild -- --debbuildopts "-sa"
Wissen muss man, dass Optionen nach -- an pbuilder übergeben werden und PBuilder den Wert von --debbuildopts wiederum (als Optionen) an dpkg-buildpackage übergibt.
Die Option -sa wird von dpkg-buildpackage unverändert an dpkg-genchanges weitergegeben und erzwingt die Hinzunahme der Originalquellen.
git-buildpackage zusammen mit Pbuilder benutzen
Damit
git-buildpackage Pakete mit pbuilder statt cowbuilder baut, muss in der Konfiguration $HOME/.gbp.conf folgendes konfiguriert werden:
builder = pdebuild
Sonstiges
Über updates an Source-Paketen informiert werden
Nutze dafür das Debian Package Tracking System (PTS). Am einfachsten über das Web-Interface, dort kann auf den einzelnen Paketseiten unter "subscribe to this package", der Newsletter abonniert, storniert und unter der Auswahl "opts" die Art der Mitteilungen ausgewählt werden.
Troubleshooting
dpkg-buildpackage: error: fakeroot debian/rules clean gave error exit status 2
dpkg-source: error: can't build with source format '3.0 (quilt)': no orig.tar file found
chroot: failed to run command `aptitude': No such file or directory
Hat man aptitude deinstalliert (weil man nur apt-get nutzt), erhält man diese Fehlermeldung. pbuilder nutzt als Standard aptitude um Bauabhänigkeiten (build-dependencies) zu installieren.
Lösung
Über die Variable PBUILDERSATISFYDEPENDSCMD in pbuilderrc das module, was zuständig ist um Bauabhänigkeiten zu installieren, wieder auf classic setzen.
PBUILDERSATISFYDEPENDSCMD=/usr/lib/pbuilder/pbuilder-satisfydepends-classic
| |
Hinweis: |
sudo: sorry, you are not allowed to preserve the environment
Wer pdebuild aus einem unprivilegierter Nutzerkonto heraus verwendet und deswegen eine sudo-Regel für pbuilder anlegt, könnte diesen Fehler begehen. Eigentlich eine Fehlermeldung von sudo.
pdebuild nutzt "sudo -E" um das Kommando "pbuilder build" aufzurufen. Die Option "-E" (preserve environment) deaktiviert die "env_reset" Einstellung und ist nur dann Verfügbar, wenn die Regel "SETENV" enthält oder aber die "setenv" Option in sudoers aktiviert ist.
Lösung
Mit visudo in sudoers, für den pbuilder Eintrag "SETENV" setzen.
user ALL = (root) SETENV: /usr/sbin/pbuilder