Pbuilder - personal package builder

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Softwareentwicklung und paketierung ‹ Pbuilder - personal package builder


Hier soll gezeigt werden wie mit Debianpackage.png 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 Debianpackage.png pbuilder zu installieren. Dennoch werden einige weitere Pakete gebraucht, die Sachen erledigen bevor in der chroot-Umgebung das Kompilieren mit anschließendem Paketbau stattfindet.

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.png Hinweis: Nach der Installation von Debianpackage.png 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.png 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.png 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 Debianpackage.png 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.png Hinweis: Debianpackage.png 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