pbuilder-dist
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 22.04 Jammy Jellyfish
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Artikel für fortgeschrittene Anwender
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Mit pbuilder lässt sich eine chroot-Umgebung zum Paketbau erstellen. Für Entwickler 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. Dadurch wird es möglich Pakete zu erstellen, welche nicht nur auf seinem eigenen Computer funktionieren, sonder auch auf anderen. Falls man LVM verwendet, kann man die Erstellung der chroot-Umgebung beschleunigen (→ SbuildLVMHowto 🇬🇧).
Der Befehl pbuilder-dist unterstützt gegenüber dem ursprünglichen Befehl pbuilder
komfortabler das Arbeiten mit mehreren unterschiedliche Architekturen und Versionen von Debian und Ubuntu.
Es wird angenommen, dass Ubuntu 22.04 Jammy Jellyfish installiert ist. Falls man für eine andere Version bauen möchte, ersetzt man jammy gegen den Codenamen der zu verwendenden Distribution.
Die Übersetzung des englischen PbuilderHowto 🇬🇧 befindet sich im Archiv.
Installation¶
Zunächst werden die nötigen Pakete installiert [1]:
pbuilder
ubuntu-dev-tools
debootstrap
devscripts
Befehl zum Installieren der Pakete:
sudo apt-get install pbuilder ubuntu-dev-tools debootstrap devscripts
Oder mit apturl installieren, Link: apt://pbuilder,ubuntu-dev-tools,debootstrap,devscripts
Dabei ist die Installation von devscripts nicht unbedingt notwendig, jedoch für den ernsthaften Paketbau empfohlen. Es enthält Werkzeuge wie debsign und dget.
Syntax¶
Die Syntax für den Befehl pbuilder-dist
lautet folgendermaßen:
pbuilder-dist DISTRIBUTION [ARCHITEKTUR] OPERATION [OPTION]
pbuilder-dist
unterstützt die gleichen Operationen wie pbuilder.
Erstellen der Umgebung¶
Zuallererst öffnet man ein Terminal [2] und erstellt mit folgendem Befehl einen Archiv mit der chroot-Umgebung zum Paketbau.
pbuilder-dist jammy create
Nach erfolgtem Paketbau finden sich die Binär und Quellpakete unter ~/pbuilder/jammy_result/.
Umgebung für andere Versionen erstellen¶
Man kann für alle unterstützten und in Entwicklung befindlichen Ubuntu und Debian Versionen jeweils eine chroot-Umgebung erstellen und diese parallel verwenden.
pbuilder-dist DISTRIBUTION create
DISTRIBUTION
muss man dann durch den entsprechenden Codenamen der gewünschten Version ersetzten.
32Bit-Pakete auf einem 64Bit-System bauen¶
Es ist zusätzlich möglich chroot-Umgebung für 32bit-Betriebsysteme zu erstellen. Dafür muss man einfach "i386" hinter dem Namen der zu erstellenden Version setzten:
pbuilder-dist DISTRIBUTION i386 create
ARM-Pakete auf einem 64Bit-System bauen¶
Mithilfe von QEMU ist es möglich auch Pakete für Prozessoren auf ARM-Basis zu erstellen. Dafür benötigt man noch folgendes Paket:
qemu-user-static (universe)
Befehl zum Installieren der Pakete:
sudo apt-get install qemu-user-static
Oder mit apturl installieren, Link: apt://qemu-user-static
Nach der Installation kann man Pakete für die Architekturen "armhf", "arm64" und "armel" (nur Debian) bauen. Die dafür benötigten chroot-Umgebungen erstellt man wie oben beschrieben.
Das anschließende Bauen der Pakete unterscheidet sich nicht vom Bau von Paketen für die eigene Architektur. Der einzige Nachteil ist, dass die Kompilierung des Programms wegen der Nutzung von QEMU mehr Zeit beansprucht.
Bestehende Pakete neu bauen¶
Das folgende Beispiel soll zeigen, wie man mithilfe von pbuilder-dist
schon existierende Debian-Pakete neu bauen kann, um diese beispielsweise selbstständig zu patchen.
Zunächst müssen die Quelltext-Paketquellen (deb-src) eingebunden [4] werden.
Anschließend öffnet man ein Terminal [2] und führt folgenden Befehl mit Root-Rechten [3] aus, um die Paketquellen zu aktualisieren:
sudo apt-get update
Im folgenden werden die Quelltexte von bc, einem einfachen Taschenrechner, heruntergeladen:
apt-get source bc
Abschließend wird mit dem nächsten Befehl das Paket in die vorbereitete chroot-Umgebung gebaut. Dazu wird die aus dem Quellarchiv entpackte .dsc-Datei, die eine Zusammenfassung des Paketinhalts mit optionaler Signatur enthält, an pbuilder-dist
übergeben.
pbuilder-dist
kann immer nur eine .dsc-Datei zur Bearbeitung übergeben werden.
pbuilder-dist jammy build dateiname.dsc
Pakete neu bauen¶
Bevor man mithilfe von pbuilder-dist
ein Debian-Paket für einen neues Programm bauen kann, muss man erst – falls diese noch nicht existieren – die dafür benötigten Debian-Dateien erstellen [5]. Sobald diese Dateien erfolgreich erstellt sind, öffnet man ein Terminal, wechselt in das Projektverzeichnis, in dem der Ordner mit dem Namen "debian" liegt, und erzeugt die benötigten Dateien mit debuild
:
debuild -S -sa
Dieses Hilfsprogramm arbeitet wie folgt:
es ruft
dpkg-buildpackage
zur Paketerstellung aufdann wird der Paketbau mit
lintian
kontrolliertZum Schluss erfolgt die Signierung mit
debsign
Experten-Info:
Dieser Schritt benötigt das Vorhandensein aller Bau-Abhängigkeiten auf dem System. Wenn dies nicht möglich ist, da sie nicht in den entsprechenden Versionen vorliegen, kann auf pdebuild ausgewichen werden. Dieser Befehl, um Pakete aus den Kontrolldateien unter debian/ neu zu bauen, greift normalerweise auf
pbuilder
zurück, kann sich aber durch entsprechende Konfiguration an pbuilder-dist
anpassen.
Dazu kann eine Datei ~/.pbuilderrc mit folgendem Inhalt angelegt werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # Liste der Codenamen. Momentan lediglich Bau für Ubuntu 22.04 erlaubt. UBUNTU_SUITES=("jammy") # Paketquellen-Mirror UBUNTU_MIRROR="ftp.ubuntu.com" # Anpassung der Pfade an `pbuilder-dist` BASETGZ="$HOME/pbuilder/$DIST-base.tgz" DISTRIBUTION="$DIST" BUILDRESULT="$HOME/pbuilder/${NAME}_result/" APTCACHE="$HOME/pbuilder/aptcache/" BUILDPLACE="$HOME/pbuilder/build/" # Überpfüfung, ob Codename valide ist. if $(echo ${UBUNTU_SUITES[@]} | grep -q $DIST); then # Ubuntu configuration MIRRORSITE="http://$UBUNTU_MIRROR/ubuntu/" COMPONENTS="main restricted universe multiverse" DEBOOTSTRAPOPTS=("${DEBOOTSTRAPOPTS[@]}" "--keyring=/usr/share/keyrings/ubuntu-archive-keyring.gpg") else echo "Unknown distribution: $DIST" exit 1 fi |
Dies bewirkt, das der Bau und die Ablage des Paketes von /var/cache/pbuilder/ in die entsprechenden Verzeichnisse unter ~/pbuilder/ verlegt wird.
Nun kann mittels pdebuild
unter Angabe des Codenamens das Paket gebaut und anschließend signiert werden:
DIST=jammy pdebuild --auto-debsign
Die Verwendung von lintian
ist als Hook möglich. Mehr dazu in diesem Abschnitt des Debian-Leitfadens für Paketbetreuer 🇬🇧.
Dabei werden mehrere Dateien im übergeordneten Ordner erzeugt, u.a. Projektname_Version-Revisionsnummer_Architektur.dsc und Projektname_Version-Revisionsnummer_Architektur.changes. War die Erstellung des Projekts nicht erfolgreich, müssen mit den Hinweisen von lintian
die Fehler in der Paketkonfiguration ermittelt und korrigiert werden.
Anschließend wechselt man in den übergeordneten Ordner und lässt das Paket mithilfe von pbuilder-dist
bauen:
cd .. && pbuilder-dist jammy build dateiname.dsc
Das fertige Paket befindet sich – nach dem erfolgreichen Bau – unter ~/pbuilder/jammy_result/.
chroot aktualisieren¶
Es wird empfohlen, den chroot vor jedem Bau zu aktualisieren:
pbuilder-dist jammy update
Pakete aus einem PPA einbinden¶
Das Einbinden eines PPAs[6] ist etwas komplizierter und wird hierbei am Beispiel des GNOME3 PPAs erläutert.
Möchte man ein PPA in eine chroot-Umgebung einbinden, dann braucht man als erstes den Signierschlüssel des PPAs. Diesen findet man auf der Launchpad-Seite des PPAs unter "Technical details about this PPA" → "Signing key:".
Um diesen Signierschlüssel nun in die chroot-Umgebung zu importieren meldet man sich zuerst bei dieser an:
pbuilder-dist jammy login --save-after-login
und fügt den Schlüssel mit folgender Befehlsfolge (GnuPG ist nicht vorhanden und muss nachinstalliert werden) hinzu:
apt install gpg dirmngr gpg-agent export HOME="/root" mkdir -m700 $HOME/.gnupg/ dirmngr --daemon gpg --no-default-keyring --keyring /etc/apt/keyrings/gnome3-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 9D542E3D52C801D9F8E31682F1773AF13B1510FD
Zuletzt verlässt man die chroot-Umgebung wieder.
exit
Nun kann das PPA mit folgendem Befehl hinzugefügt werden:
pbuilder-dist jammy update --override-config --othermirror "deb [signed-by=/etc/apt/keyrings/gnome3-archive-keyring.gpg] http://ppa.launchpad.net/gnome3-team/gnome3/ubuntu jammy main"
Nun kann man wie oben beschrieben seine Pakete erstellen und dabei auf die eingebundenen PPAs zugreifen.
Hinweis:
Haben sich die Pakete im PPA verändert, dann empfiehlt es sich die chroot-Umgebung mit vorherigen Befehl zu aktualisieren.
Beispiele¶
Im folgenden noch ein paar Beispiele, wie pbuilder-dist
verwendet werden kann:
Eine Umgebung für Debian Sid erstellen:
pbuilder-dist sid create
Eine Umgebung für Ubuntu Jammy mit 32Bit-Architektur:
pbuilder-dist jammy i386 create
Die chroot-Umgebung aktualisieren:
pbuilder-dist jammy update
Ein Paket mit Ubuntu Jammy als chroot-Umgebung auf Grundlage der .dsc-Datei bauen:
pbuild-dist jammy build dateiname.dsc
Das Paket für die 32Bit-Architektur bauen:
pbuild-dist jammy i386 build dateiname.dsc
Links¶
Launchpad/PPA – Pakete in Lauchpad hochladen
pbuilder-dist 🇬🇧 – Ubuntu Manpage