Makechrootpkg

Aus wiki.archlinux.de

Dieser Artikel wurde als veraltet markiert, und sollte kontrolliert, und gegebenfalls korrigiert bzw. aktualisiert werden.


makechrootpkg ist eine Spezialversion von makepkg, dem Build-Skript um ArchLinux Binärpakete zu erstellen (siehe auch Arch Build System). Der Unterschied ist, dass der Paketbau in einem chroot ausgeführt wird, also nicht im "normalen" System des Users. Das hat einige Vorteile:

  • Abhängigkeiten werden nicht in das eigene System installiert
  • Das Paket wird in einer sauberen Umgebung gebaut, fehlende Pakete o.ä. fallen viel schneller auf.
  • Auf x86_64 Systemen kann auch ein chroot für i686 eingerichtet werden.

Vorarbeiten, das chroot erstellen

makechrootpkg selbst ist im Paket devtools enthalten. Also ggf. installieren:

 pacman -S devtools

Dieser Vorgang muss mit root-Rechten ausgeführt werden. Als Beispiel wird das chroot in /tmp/i686 erstellt.

 mkdir /tmp/i686
 export CHROOT_SHELL=/tmp/i686
 mkarchroot $CHROOT_SHELL/root base base-devel sudo

Dies erstellt in /tmp/i686 ein Verzeichnis root, welches als Basis für Arbeiten in diesem chroot verwendet wird. Dieses Verzeichnis bleibt beim Bau unangetastet, ist also für weitere Paketbauten wiederverwendbar.

Als erstes sollte darin die /etc/pacman.d/mirrorlist angepasst werden, damit andere Mirrors als ftp.archlinux.org verwendet werden. Auch evtl. Einträge für Nameserver, Locale, usw. (dies ist aber nicht zwingend notwendig)

Paketbau-Beispiel

Ein Beispiel anhand des Paketes abook aus extra. Das PKGBUILD über ABS besorgen. Ein Verzeichnis namens abook z.B. im $HOME anlegen (im normalen System), das PKGBUILD da rein. Im Gegensatz zu makepkg muss der Aufruf von makechrootpkg auch als root bzw. mit Root-Rechten erfolgen, der eigentliche Paketbau im chroot wird aber dort als User nobody erledigt. makechrootpkg fragt die Umgebungsvariable $CHROOT_SHELL ab, um das gewünschte chroot zu ermitteln. Diese muss also gesetzt sein.

 cd $HOME/abook
 [root@foobar abook]# ls
 PKGBUILD
 
 makechrootpkg
 
 [root@foobar abook]# ls
 PKGBUILD  abook-0.5.6-2-i686.pkg.tar.gz  abook-0.5.6.tar.gz

Das fertig gebaute Paket (und den Source-Tarball) finden wir nun in unserem aktuellen Verzeichnis. Das Auspacken des Sourcecodes und das Kompilieren wurde aber in unserem chroot gemacht. Auch evtl. notwendige weitere Pakete (Abhängigkeiten) wurden in das chroot installiert, nicht in unser normales System.

Dafür wurden in unserem chroot mehrere neue Verzeichnisse erstellt (z.B. rw und union). In rw erfolgt (als User nobody) der eigentliche Aufruf von makepkg. Das Chroot-System an sich (in root) wird dabei nicht angetastet, sondern durch Hardlinks nach union verlinkt. So bleibt das chroot auch sauber für weitere Paketbauten.

Optionen, Tipps

Um dem eigentlichen makepkg (im chroot) Optionen mitgeben zu können kann so gearbeitet werden:

 makechrootpkg -- -L

Hier wird per Option -L ein Logfile vom Paketbau erstellt, zu finden dann in $CHROOT_SHELL/rw/build/$paketname.log

 makechrootpkg  -- -i

Hiermit wird das gerade gebaute Paket auch installiert. Wichtig für Paketgruppen bei denen man Pakete baut die von anderen selbstgebauten abhängen. Und die installiert sein müssen. Der Vorteil hierbei aber wieder: Diese Pakete werden im chroot installiert (genau: in rw), landen also nicht in unserem realen System.

Generell gilt: Optionen für makepkg nach den zwei Bindestrichen (--) mitgeben. Diese gelten für die Arbeit im chroot!

 makechrootpkg -c

Laut Hilfe: The -c flag, if specified, will remove all files created by previous builds using makechrootpkg. This will ensure a clean chroot is used.

Ich bin mir über diese Option nicht ganz klar bzw. sehe keinen Unterschied...

Um das chroot komplett zu bereinigen (aber ansonsten weiter zu verwenden) sind die Verzeichnisse $CHROOT_SHELL/rw und $CHROOT_SHELL/union zu löschen, diese werden bei Bedarf wieder angelegt.

Um im eigentlichen chroot weitere Software zu installieren:

 pacman -r $CHROOT_SHELL/root -S git

oder (über den normalen chroot Befehl):

 chroot $CHROOT_SHELL/root
 pacman -S git