Makechrootpkg: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
KKeine Bearbeitungszusammenfassung
(als veraltet markiert)
 
(7 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{veraltet}}
[[Kategorie:Paketverwaltung]]
[[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, daß der Paketbau in einem chroot ausgeführt wird, also nicht im "normalen" System des Users. Das hat einige Vorteile:
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.
Zeile 6: Zeile 7:


== Vorarbeiten, das chroot erstellen ==
== Vorarbeiten, das chroot erstellen ==
Dieser Vorgang muß mit root-Rechten ausgeführt werden. Als Beispiel wird das chroot in /tmp/i686 erstellt.
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 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.
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 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)
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 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.
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@foorbar abook]# ls
 
   [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 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.
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, Tips ==
== 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.<br>
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.''<br>
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 zuverwenden) sind die Verzeichnisse $CHROOT_SHELL/rw und $CHROOT_SHELL/union zu löschen, diese werden bei Bedarf wieder angelegt.
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 -Sy git
   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