ubuntuusers.de

pbuilder-dist

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


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.

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:

  1. es ruft dpkg-buildpackage zur Paketerstellung auf

  2. dann wird der Paketbau mit lintian kontrolliert

  3. Zum 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 

Diese Revision wurde am 11. November 2023 15:08 von karzer erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Paketbau, Paketverwaltung