pBuilder
Archivierte Anleitung
Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.
Artikel für fortgeschrittene Anwender
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Hinweis:
Dieser Artikel ist eine Übersetzung des englischen PbuilderHowto 🇬🇧 und steht unter der DocumentationTeam/License 🇬🇧 Creative Commons Namensnennung-Weitergabe unter gleichen Bedingungen 2.5 🇩🇪
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
- Installation
- Ein bestehendes Paket aus den Paketquellen neu aus dem Quelltext bauen
- chroot aktualisieren
- chroot auf eine andere Ubuntuversion aktualisieren
- Berechnung der build-depency beschleunigen
- Integration mit ccache
- Universe-Unterstützung
- i386-Pakete auf einer AMD64 Maschine bauen
- mehrere pbuilder
- mit lokalen Paketen bauen
- ein 32-bit Paket auf einer 64-bit Maschine oder für ältere Ubuntuversionen bauen
- Weblinks
Mit pbuilder lässt sich eine chroot-Umgebung zum Paketbau erstellen. Für Maintainer von Ubuntu oder Debianpaketen wird dieses Vorgehen empfohlen. Man kann auch ohne pbuilder Pakete bauen, aber man muss alle build dependencies des Paketes auf dem laufenden System installieren. Falls man LVM verwendet, kann man die Erstellung der chroot-Umgebung beschleunigen (→ SbuildLVMHowto 🇬🇧) Im folgenden wird angenommen, dass Ubuntu 10.04 Lucid Lynx installiert ist. Falls man eine andere Version besitzt ersetzt man lucid gegen den Codenamen der verwendeten Distribution.
Installation¶
Zunächst werden die nötigen Pakete installiert [1] wobei devscripts nicht unbedingt nötig ist, jedoch für den ernsthaften Paketbau empfohlen wird.
pbuilder
debootstrap
devscripts
Befehl zum Installieren der Pakete:
sudo apt-get install pbuilder debootstrap devscripts
Oder mit apturl installieren, Link: apt://pbuilder,debootstrap,devscripts
Alsdann öffnet man eine Konsole [2] und erstellt mit folgendem Befehl einen Archiv mit der chroot-Umgebung zum Paketbau. Hierfür werden Root-Rechte benötigt.[3]
sudo pbuilder create
Um die Umgebung den offiziellen Paketbaurechnern anzunähern kann man folgende Parametern verwenden:
sudo pbuilder create --debootstrapopts --variant=buildd
Die Variante buildd installiert die build-essential Pakete in der chroot-Umgebung.
Wenn alles geklappt hat, sollte jetzt ein tar-Archiv mit dem Namen base.tgz im System unter /var/cache/pbuilder liegen.
Ein bestehendes Paket aus den Paketquellen neu aus dem Quelltext bauen¶
Zunächst müssen die Quelltext-Paketquellen (deb-src) eingebunden [4] werden.
Anschließend öffnet man ein Terminal [2] und gibt folgenden Befehl ein bei man wieder nach seinem Root-Passwort gefragt wird:
sudo apt-get update
Im folgenden werden die Quelltexte von bc, einem einfachen Taschenrechner heruntergeladen:
apt-get source bc
Anschließend wird das Paket im vorbereiteten chroot-Reinraum gebaut:
sudo pbuilder build *.dsc
Nach erfolgtem Paketbau finden sich die Binär und Quellpakete unter /var/cache/pbuilder/result/
chroot aktualisieren¶
Es wird empfohlen den chroot täglich vor jedem Bau zu aktualisieren:
sudo pbuilder update
chroot auf eine andere Ubuntuversion aktualisieren¶
Für ein neues Paket für die Entwicklungsversion von Ubuntu muss auch die chroot-Umgebung neu erstellt werden. Hierbei geht man wie bei Installation vor und gibt dann folgenden Befehl ein, wobei DIST-NAME der Codename der Entwicklerversion (momentan precise
) ist.
sudo pbuilder update --distribution DIST-NAME --override-config
Dies aktualisiert die chroot-Umgebung auf die angegebene Version und übergeht die Konfigurationsdateien.
Berechnung der build-depency beschleunigen¶
Ab 7.04 Feisty Fawn kann man einen neuen Abhängigkeitenauflöser basierend auf gdebi, was bedeutend schneller geht. Hierfür muss die Datei ~/.pbuilderrc in einem Texteditor geöffnet werden [5] und folgende Zeile ergänzt werden:
PBUILDERSATISFYDEPENDSCMD="/usr/lib/pbuilder/pbuilder-satisfydepends-gdebi"
Probleme mit pbuilder-satisfydepends-gdebi und lokalen Paketquellen¶
Falls man eine lokale übergelegte Paketquelle verwendet (eine fortgeschrittene Anwendung von pbuilder, die normalerweise für Backports verwendet wird), muss eine modifizierte Version von pbuilder-satisfydepends-gdebi
verwendet werden. Man öffnet ein Terminal [2] und kopiert den Abhängigkeitsauflöser und macht ihn ausführbar:
cp /usr/lib/pbuilder/pbuilder-satisfydepends-gdebi ~/.pbuilder-satisfydepends-gdebi chmod +x ~/.pbuilder-satisfydepends-gdebi
Dann öffnet man einen Texteditor [5] und ändert Zeile 80 von ~/.pbuilder-satisfydepends-gdebi um Warnungen von lokalen Paketquellen, die nicht im Ubuntu-Schlüsselbund sind zu ignorieren.
Die Zeile
$CHROOTEXEC /usr/bin/apt-get install -y $INSTALL
ändern in:
$CHROOTEXEC /usr/bin/apt-get install -y --force-yes $INSTALL
Dann ändert man noch ~/.pbuilderrc dahingehend, dass die modifizierten Abhängigkeitsauflösungsskripte verwendet werden sollen:
PBUILDERSATISFYDEPENDSCMD="~/.pbuilder-satisfydepends-gdebi"
Integration mit ccache¶
Zur Verwendung mit ccache muss mit einem Texteditor [5] folgendes zu ~/.pbuilderrc hinzugefügt werden:
# ccache sudo mkdir -p /var/cache/pbuilder/ccache sudo chmod a+w /var/cache/pbuilder/ccache export CCACHE_DIR="/var/cache/pbuilder/ccache" export PATH="/usr/lib/ccache:${PATH}" EXTRAPACKAGES=ccache BINDMOUNTS="${CCACHE_DIR}"
Jetzt wird pbuilder automatisch die Compilerausgaben zwischenspeichern.
Universe-Unterstützung¶
Falls man ein Paket aus Universe oder ein neues bauen möchte, welches daraus ein Paket benötigt muss folgendes mit einem Texteditor [5] zu ~/.pbuilderrc hinzugefügt werden:
COMPONENTS="main restricted universe multiverse"
Danach muss die chroot-Umgebung aktulaisiert werden:
sudo pbuilder update --override-config
i386-Pakete auf einer AMD64 Maschine bauen¶
Man kann eine i386-chroot-Umgebung mit folgenden Befehl erstellen:
sudo pbuilder create --debootstrapopts --arch --debootstrapopts i386
mehrere pbuilder¶
Falls man sowohl Backports als auch Pakete für die Entwicklungsversion erstellt möchte man parallel mehrere pbuilder-Umgebungen haben. Es ist auch möglich Pakete für Debian 🇬🇧 zu bauen.
debootstrap aktualisieren¶
Es wird empfohlen eine aktualisierte Version von debootstrap aus den Backports Paketquellen zu installieren. Die aktualisierte Version unterstützt neuere Distributionen wie den aktuellen Entwicklungszweig von Ubuntu.
base.tgz Ort ändern¶
Die einzige Anforderung um pbuilder für mehrere Distributionen zu verwenden ist ein alternativer Ort um das Archiv für die pbuilder-Umgebung zu lagern. In der Kommandozeile kann dies durch die basetgz
-Option angegeben werden. Bequemer ist es jedoch folgendes mit einem Texteditor in die ~/.pbuilderrc einzugeben um dies zu automatisieren:
# Codenamen für Debian Veröffentlichungen UNSTABLE_CODENAME="sid" TESTING_CODENAME="squeeze" STABLE_CODENAME="lenny" STABLE_BACKPORTS_SUITE="$STABLE_CODENAME-backports" # Liste von Debianversionen DEBIAN_SUITES=($UNSTABLE_CODENAME $TESTING_CODENAME $STABLE_CODENAME "unstable" "testing" "stable") # Liste von Ubuntuversionen UBUNTU_SUITES=("precise" "oneiric" " "lucid" ) # verwendete Mirrorserver DEBIAN_MIRROR="ftp.us.debian.org" UBUNTU_MIRROR="mirrors.kernel.org" # Wenn keine Version gesetzt ist, aus dem changelog auslesen. if [ -z "${DIST}" ] && [ -r "debian/changelog" ]; then DIST=$(dpkg-parsechangelog | awk '/^Distribution: / {print $2}') # unstable bei bestimmten Werten verwenden if $(echo "experimental UNRELEASED" | grep -q $DIST); then DIST="$UNSTABLE_CODENAME" fi fi # optional: eine Standarddistribution wählen falls keine Angabe verwendet wird # Man kann einen eigenen Standard definieren: ${DIST:="unstable"} : ${DIST:="$(lsb_release --short --codename)"} # optional: den Debianveröffentlichungsstatus in $DIST Namen zuordnen case "$DIST" in unstable) DIST="$UNSTABLE_CODENAME" ;; testing) DIST="$TESTING_CODENAME" ;; stable) DIST="$STABLE_CODENAME" ;; esac # optional: die Architektur der setzen, falls keine angegeben ist # Man kann seinen eigenen Standard setzen: ${ARCH:="i386"}). : ${ARCH:="$(dpkg --print-architecture)"} NAME="$DIST" if [ -n "${ARCH}" ]; then NAME="$NAME-$ARCH" DEBOOTSTRAPOPTS=("--arch" "$ARCH" "${DEBOOTSTRAPOPTS[@]}") fi BASETGZ="/var/cache/pbuilder/$NAME-base.tgz" # optional: BASEPATH anstelle von BASETGZ setzen, falls cowbuilder verwendet wird # BASEPATH="/var/cache/pbuilder/$NAME/base.cow/" DISTRIBUTION="$DIST" BUILDRESULT="/var/cache/pbuilder/$NAME/result/" APTCACHE="/var/cache/pbuilder/$NAME/aptcache/" BUILDPLACE="/var/cache/pbuilder/build/" if $(echo ${DEBIAN_SUITES[@]} | grep -q $DIST); then # Debian Konfiguration MIRRORSITE="http://$DEBIAN_MIRROR/debian/" COMPONENTS="main contrib non-free" # Dies aktiviert backports für die Debian stable Veröffentlichung if $(echo "$STABLE_CODENAME stable" | grep -q $DIST); then EXTRAPACKAGES="$EXTRAPACKAGES debian-backports-keyring" OTHERMIRROR="$OTHERMIRROR | deb http://www.backports.org/debian $STABLE_BACKPORTS_SUITE $COMPONENTS" fi elif $(echo ${UBUNTU_SUITES[@]} | grep -q $DIST); then # Ubuntu Konfiguration MIRRORSITE="http://$UBUNTU_MIRROR/ubuntu/" COMPONENTS="main restricted universe multiverse" else echo "Unknown distribution: $DIST" exit 1 fi
Hinweis:
Es gibt optionale Angaben in diesem Schnipsel, die mit "optional:" vor dem Kommentar gekennzeichnet sind. Entweder sollten diese auskommentiert werden oder an die eigenen Bedürfnisse angepasst werden.
Jetzt wird der Ort des tarballs automatisch geändert, wenn ein Benutzer DIST ändert und dann pbuilder mit dem Parameter --override-config
ausführt. Die Variablen BUILDRESULT oder APTCACHE zu verwenden ist optional, aber möglicherweise hilfreich.
Falls ARCH auf eine andere Architektur gesetzt ist wenn pbuilder ausgeführt wird, wird pbuilder eine entsprechende Umgebung erstellen.
Beispiele¶
Eine Umgebung für Ubuntu Precise
sudo DIST=precise pbuilder create
Eine Umgebung für Debian sid
sudo DIST=sid pbuilder create
Eine Umgebung für Ubuntu Lucid mit i386-Architektur
sudo DIST=lucid ARCH=i386 pbuilder create
Die Basisumgebung für Lucid aktualisieren
sudo DIST=lucid pbuilder update
Ein Paket mit Ubuntu Lucid als Basisumgebung bauen
DIST=lucid pdebuild
Ein Paket mit Ubuntu Lucid als Basisumgebung und i386-Architektur bauen
DIST=lucid ARCH=i386 pdebuild
mit lokalen Paketen bauen¶
Manchmal hängt ein zu bauendes Paket von einer neueren Version eines anderen Paketes ab, dass sich nicht im Ubuntu- oder Debianarchiv befindet oder sich dort noch überhaupt nicht befindet. Für diesen Fall erstellt man Pakete und lädt sie in Lokale Paketquellen hoch.
Installation¶
Zunächst werden die nötigen Pakete installiert.[1]
dput
mini-dinstall (universe)
Befehl zum Installieren der Pakete:
sudo apt-get install dput mini-dinstall
Oder mit apturl installieren, Link: apt://dput,mini-dinstall
Nun erstellt man mit einem Texteditor eine Datei namens .mini-dinstall.conf im Homeverzeichnis mit folgendem Inhalt:
[DEFAULT] architectures = all, i386, amd64, powerpc archivedir = /var/cache/archive/ use_dnotify = 0 verify_sigs = 0 extra_keyrings = ~/.gnupg/pubring.gpg mail_on_success = 0 archive_style = flat poll_time = 10 mail_log_level = NONE [sid] [lenny] [lucid]
Diese Konfigurationsdatei ist eine Abwandlung aus der Dokumenation von mini-dinstall (/usr/share/doc/mini-dinstall).Unter Architektur wählt man diejenige des verwendeten Rechners. Die Auflistung von [sid]
, [maverick]
, usw. erlaubt Pakete mit dput für die jeweilige Debian- und Ubuntuversion hochzuladen.
Dann öffnet man ~/.dput.cf mit einem Texteditor und ändert den Absatz nach [local]
folgendermaßen:
[local] method = local incoming = /var/cache/archive/mini-dinstall/incoming allow_non-us_software = 1 run_dinstall = 0 post_upload_command = mini-dinstall --batch
Jetzt erstellt man ein Verzeichnis namens incoming und gibt sich selbst die nötigen Schreibrechte:
sudo mkdir -p /var/cache/archive/mini-dinstall/incoming sudo chown -R $USER /var/cache/archive/
in ein lokales Dateisystem hochladen¶
Sobald ein Paket fertig gebaut ist, kann es in das lokale Dateisystem hochgeladen werden:
dput local *.changes
Mit der obigen Konfiguration sollte es folgendermaßen aussehen /var/cache/archive/<distro-version>, wobei <distro-version> entweder sid, lucid, usw. abhängig von der Distribution für die gebaut wurde. In dem Verzeichnis sollten die Pakete und Quelldateien zusammen mit den hochgeladenen Paketen liegen.
mit lokalen Paketquellen aktualisieren¶
Jetzt ändert man die Konfigurationsdatei .pbuilderrc in den folgenden Schnipsel:
# Codenamen für Debian Veröffentlichungen UNSTABLE_CODENAME="sid" TESTING_CODENAME="squeeze" STABLE_CODENAME="lenny" STABLE_BACKPORTS_SUITE="$STABLE_CODENAME-backports" # Liste von Debianversionen DEBIAN_SUITES=($UNSTABLE_CODENAME $TESTING_CODENAME $STABLE_CODENAME "unstable" "testing" "stable") # Liste von Ubuntuversionen UBUNTU_SUITES=("precise" "oneiric" "natty" "lucid" "hardy") # verwendete Mirrorserver DEBIAN_MIRROR="ftp.us.debian.org" UBUNTU_MIRROR="mirrors.kernel.org" # Wenn keine Version gesetzt ist, aus dem changelog auslesen. if [ -z "${DIST}" ] && [ -r "debian/changelog" ]; then DIST=$(dpkg-parsechangelog | awk '/^Distribution: / {print $2}') # unstable bei bestimmten Werten verwenden if $(echo "experimental UNRELEASED" | grep -q $DIST); then DIST="$UNSTABLE_CODENAME" fi # Verwende stable für stable-backports if $(echo "$STABLE_BACKPORTS_SUITE" | grep -q $DIST); then DIST="$STABLE" fi fi # optional: eine Standarddistribution wählen falls keine Angabe verwendet wird # Man kann einen eigenen Standard definieren: ${DIST:="unstable"} : ${DIST:="$(lsb_release --short --codename)"} # optional: den Debianveröffentlichungsstatus in $DIST Namen zuordnen case "$DIST" in unstable) DIST="$UNSTABLE_CODENAME" ;; testing) DIST="$TESTING_CODENAME" ;; stable) DIST="$STABLE_CODENAME" ;; esac # optional: die Architektur der setzen, falls keine angegeben ist # Man kann seinen eigenen Standard setzen: ${ARCH:="i386"}). : ${ARCH:="$(dpkg --print-architecture)"} NAME="$DIST" if [ -n "${ARCH}" ]; then NAME="$NAME-$ARCH" DEBOOTSTRAPOPTS=("--arch" "$ARCH" "${DEBOOTSTRAPOPTS[@]}") fi BASETGZ="/var/cache/pbuilder/$NAME-base.tgz" # optional: BASEPATH anstelle von BASETGZ setzen, falls cowbuilder verwendet wird # BASEPATH="/var/cache/pbuilder/$NAME/base.cow/" DISTRIBUTION="$DIST" BUILDRESULT="/var/cache/pbuilder/$NAME/result/" APTCACHE="/var/cache/pbuilder/$NAME/aptcache/" BUILDPLACE="/var/cache/pbuilder/build/" BINDMOUNTS="/var/cache/archive" if $(echo ${DEBIAN_SUITES[@]} | grep -q $DIST); then # Debian Konfiguration MIRRORSITE="http://$DEBIAN_MIRROR/debian/" COMPONENTS="main contrib non-free" # Dies aktiviert backports für die Debian stable Veröffentlichung if $(echo "$STABLE_CODENAME stable" | grep -q $DIST); then EXTRAPACKAGES="$EXTRAPACKAGES debian-backports-keyring" OTHERMIRROR="$OTHERMIRROR | deb http://www.backports.org/debian $STABLE_BACKPORTS_SUITE $COMPONENTS" fi elif $(echo ${UBUNTU_SUITES[@]} | grep -q $DIST); then # Ubuntu Konfiguration MIRRORSITE="http://$UBUNTU_MIRROR/ubuntu/" COMPONENTS="main restricted universe multiverse" OTHERMIRROR="deb file:///var/cache/archive $DIST/" else echo "Unknown distribution: $DIST" exit 1 fi
Jetzt muss man pbuilder aktualisieren. Hierfür muss pbuilder mit dem override-config
-Parameter gestartet werden:
sudo DIST=hardy pbuilder update \ --override-config \ --configfile ~/.pbuilderrc
Nach der Aktualisierung jeder Basisumgebung sollten die lokalen Paketquellen verwendet werden. Nun kann man die pbuilder Befehle wie oben benutzen.
ein 32-bit Paket auf einer 64-bit Maschine oder für ältere Ubuntuversionen bauen¶
Um für anderen Distributionen oder Architekturen zu bauen kann man pbuilder-dist verwenden.
Syntax¶
pbuilder-dist distribution [architecture] [mainonly] operation ...
Beispiele¶
Zunächst muss create aufgerufen werden wie beim normalen pbuilder
pbuilder-dist lucid i386 create
Für Lucid Lynx i386 bauen:
pbuilder-dist lucid i386 build *.dsc
Die erstellten Pakete werden unter ~/pbuilder/DIST-ARCH_result und nicht in /var/cache/pbuilder/result abgelegt.
Unterschiede zu pbuilder¶
pbuilder-dist unterstützt noch nicht alle Befehle. Beispielsweise funktioniert folgendes nicht richtig:
sudo pbuilder-dist lucid i386 update --override-config --othermirror "deb http://ppa.launchpad.net/cae-team/ppa/ubuntu karmic main"
Wenn man also eine Paketquelle hinzufügen möchte, muss man OTHERMIRROR in ~/.pbuilderrc wie folgt hinzufügen:
OTHERMIRROR="deb http://ppa.launchpad.net/cae-team/ppa/ubuntu karmic main"
Weblinks¶