Makechrootpkg
makechrootpkg ist eine Spezialversion von makepkg, dem Build-Skript um ArchLinux Binärpakete zu erstellen (siehe auch Arch_Build_System. Der Unterschied ist, daß 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
Dieser Vorgang muß 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 Verzeichniss root, welches als Basis für Arbeiten in diesem chroot verwendet wird. Dieses Verzeichniss bleibt beim Bau unangetastet, ist also für weitere Paketbauten wiederverwendbar.
Als erstes sollte darin die /etc/pacman.d/mirrorlist angepaßt werden, damit andere Mirrors als ftp.archlinux.org verwendet werden. Auch evtl. Einträge für Nameserver, Locale, usw. (dies ist aber nicht zwangsweise nötig)
Paketbau-Beispiel
Ein Beispiel anhand des Paketes abook aus extra. Das PKGBUILD über ABS besorgen. Ein Verzeichniss namens abook z.B. im $HOME anlegen (im normalen System), das PKGBUILD da rein. Im Gegensatz zu makepkg muß 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 muß also gesetzt sein.
cd $HOME/abook [root@foobar abook]# ls PKGBUILD makechrootpkg [root@foorbar 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 Verzeichniss. 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, Tips
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 zuverwenden) 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 -Sy git