Makechrootpkg: Unterschied zwischen den Versionen
GerBra (Diskussion | Beiträge) |
als veraltet markiert |
||
(9 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
makechrootpkg ist eine Spezialversion von makepkg, dem Build-Skript um ArchLinux Binärpakete zu erstellen (siehe auch [[ | {{veraltet}} | ||
[[Kategorie:Paketverwaltung]] | |||
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 | * Abhängigkeiten werden nicht in das eigene System installiert | ||
* Das Paket wird in einer sauberen Umgebung gebaut, fehlende Pakete o.ä. fallen viel schneller auf. | * 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. | * Auf x86_64 Systemen kann auch ein chroot für i686 eingerichtet werden. | ||
== Vorarbeiten, das chroot erstellen == | == Vorarbeiten, das chroot erstellen == | ||
Dieser Vorgang | 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 | mkdir /tmp/i686 | ||
export CHROOT_SHELL=/tmp/i686 | export CHROOT_SHELL=/tmp/i686 | ||
mkarchroot $CHROOT_SHELL/root base base-devel sudo | mkarchroot $CHROOT_SHELL/root base base-devel sudo | ||
Dies erstellt in /tmp/i686 ein | 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 | 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 == | == Paketbau-Beispiel == | ||
Ein Beispiel anhand des Paketes abook aus extra. Das PKGBUILD über ABS besorgen. Ein | 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 | cd $HOME/abook | ||
[root@foobar abook]# ls | [root@foobar abook]# ls | ||
PKGBUILD | PKGBUILD | ||
makechrootpkg | makechrootpkg | ||
[root@ | |||
[root@foobar abook]# ls | |||
PKGBUILD abook-0.5.6-2-i686.pkg.tar.gz abook-0.5.6.tar.gz | 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 | 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 | 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. | durch Hardlinks nach union verlinkt. So bleibt das chroot auch sauber für weitere Paketbauten. | ||
== Optionen, | == Optionen, Tipps == | ||
Um dem eigentlichen makepkg (im chroot) Optionen mitgeben zu können kann so gearbeitet werden: | Um dem eigentlichen makepkg (im chroot) Optionen mitgeben zu können kann so gearbeitet werden: | ||
makechrootpkg -- -L | makechrootpkg -- -L | ||
Hier wird per Option -L ein Logfile vom Paketbau erstellt, zu finden dann in $CHROOT_SHELL/rw/build/$paketname.log | Hier wird per Option -L ein Logfile vom Paketbau erstellt, zu finden dann in $CHROOT_SHELL/rw/build/$paketname.log | ||
makechrootpkg -- -i | 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. | 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! | '''Generell gilt:''' Optionen für makepkg nach den zwei Bindestrichen (--) mitgeben. Diese gelten für die Arbeit im chroot! | ||
makechrootpkg -c | 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.'' | 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... | Ich bin mir über diese Option nicht ganz klar bzw. sehe keinen Unterschied... | ||
Um das chroot komplett zu bereinigen (aber ansonsten weiter | 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: | Um im eigentlichen chroot weitere Software zu installieren: | ||
Zeile 45: | Zeile 52: | ||
oder (über den normalen chroot Befehl): | oder (über den normalen chroot Befehl): | ||
chroot $CHROOT_SHELL/root | chroot $CHROOT_SHELL/root | ||
pacman - | pacman -S git |
Aktuelle Version vom 26. Oktober 2019, 21:23 Uhr
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