Pbuilder - personal package builder
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 pbuilder findet sich unter der URI file:///usr/share/doc/pbuilder/pbuilder-doc.de.html das Pbuilder-Benutzerhandbuch. |
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=..
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.
C10shell
Startet eine Shell nachdem ein Build gescheitert ist
C11screen
Startet Gnu Screen nachdem ein Build gescheitert ist
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
Hinweis: Damit das bauen von Paketen nicht mir der lokalen Konfiguration kollidiert, kann man das Bauen mitten env -i anstossen und hat eine saubere Umgebung: env -i pdebuild o.ä.
|
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.
Aktuell hat z.B. bei Ubuntu scheinbar das Binary tripwire ein segmentation fault und muss neu aus den Quellen gebaut werden, damit es tut. Hier sieht man nun, dass durch ein ~local1 das neu gebaute Paket gegenüber dem Paket aus dem Archiv, was den Bug hat bevorzugt wird und so ein "Überschreiben" unterbunden wird, auch ohne das Paket auf hold zu setzen oder die APT preferences anzupassen o.ä.
$ apt-cache policy tripwire tripwire: Installiert: 2.4.3.7-3local1 Installationskandidat: 2.4.3.7-3local1 Versionstabelle: *** 2.4.3.7-3local1 100 100 /var/lib/dpkg/status 2.4.3.7-3 500 500 http://de.archive.ubuntu.com/ubuntu groovy/universe amd64 Packages
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
Pakete aus testing/sid als Backport bauen
Um Pakete aus testing/sid als Backport zu bauen, bietet sich apt-src an. Hier eine Beispiel Konfiguration, um mittels pbuilder die Pakete zu bauen:
# Nur im Verz. ~/.apt-src/sources arbeiten APT::Src::Location "/home/USERNAME/.apt-src/sources"; APT::Src::NoDeleteSource 1; APT::Src::Quiet 0; # Für Root-Rechte sudo benutzen, Regeln s. u. APT::Src::RootCommand sudo; # Lokale Bauabhängigkeiten installieren falls nötig # Wird z. T. auch mit pbuilder als Bauumgebung benötigt APT::Src::BuildDeps 1; # Pakete mit pdebuild bauen APT::Src::BuildCommand "pdebuild -- --buildresult /var/local/debian/ --debbuildopts "; #APT::Src::BuildCommand "dpkg-buildpackage --no-sign "; APT::Src::KeepBuilt 1; APT::Src::Compile 1; APT::Src::Patch 1; # Pakete nicht installieren # Z. Z. nicht; werden von pbuilder bzw. den hooks ins Repository kopiert #APT::Src::InstallDebs 1; # Sudo-Regeln: # Damit der Paketindex aktualisiert und apt-src update ausgeführt werden darf # %staff ALL=(root) SETENV: NOPASSWD: /usr/bin/apt-get update # Damit Bauabhänigkeiten installiert werden dürfen # %staff ALL=(root) SETENV: NOPASSWD: /usr/bin/apt-get -y build-dep * # Damit mittels pbuilder(8) Pakete gebaut werden dürfen # %staff ALL=(root) SETENV: NOPASSWD: /usr/sbin/pbuilder # Liste von Paketen die sich anbieten als Backport gebaut zu werden: # bitcoin # pokerth # virtualbox # torbrowser-launcher
Hat man nun die Quellen für testing/sid in der sources.list kann man mit apt-src update
und apt-src install PAKETNAME
Backports bauen. Neue Versionen baut man mit apt-src upgrade
. Alle so von apt-src verwalteten Pakete kann man mit apt-src list
einsehen. Mit apt-src remove
entfernt man ein Paket.
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: aptitude ist importen und gehört zum Minimum von Anwendungen die erwartet werden. Es sollte keinen Falls deinstalliert werden. Außer man möchte unbedingt selbst herausfinden ob und wie lange man ohne auskommt und sehen was passiert. |
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