ubuntuusers.de

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 🇩🇪

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

Paketliste zum Kopieren:

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 (Abschnitt „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)

Paketliste zum Kopieren:

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"

Diese Revision wurde am 2. April 2020 17:31 von Heinrich_Schwietering erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Paketverwaltung, Paketbau