// Datei: ./konzepte/software-in-paketen-organisieren/multiarch-einsetzen.adoc

// Baustelle: Fertig
// Axel: Fertig

[[multiarch-einsetzen]]
=== Multiarch einsetzen ===

// Stichworte für den Index
(((Architektur, Multiarch)))
(((dpkg, /var/lib/dpkg/arch)))
(((dpkg, /var/lib/dpkg/arch-new)))
`dpkg` führt eine Liste mit allen Architekturen, für die es Pakete
installiert bzw. installieren darf. Diese Liste befindet sich in der
Datei `/var/lib/dpkg/arch` und existiert allerdings nur, sofern Sie
zuvor auch Fremdarchitekturen ergänzt haben. Das nachfolgende Beispiel
stammt von einem System mit `amd64` als Basisarchitektur und `i386` als
Fremdarchitektur.

.Inhalt der Liste der Architekturen
----
$ cat /var/lib/dpkg/arch
amd64
i386
$
----

// Stichworte für den Index
(((dpkg, --print-architecture)))
(((dpkg, --print-foreign-architectures)))
Die erste Architektur in dieser Datei ist die Basisarchitektur. Diese
geben Sie mit der `dpkg`-Option `--print-architecture` aus. Früher bzw.
bei älteren `dpkg`-Versionen heißt die Option
`--print-installation-architecture`. Die Fremdarchitekturen zeigen Sie
mit `dpkg --print-foreign-architectures` an.

// Stichworte für den Index
(((dpkg, --add-architecture)))
(((dpkg, --remove-architecture)))
Über die beiden `dpkg`-Optionen `--add-architecture` und
`--remove-architecture` erweitern bzw. reduzieren Sie die Liste
entsprechend. Beim Aufruf geben Sie dazu jeweils noch die gewünschte
Architektur als Parameter an, bspw. `dpkg --add-architecture i386`,
wenn Sie zusätzlich die Architektur für 32-Bit-PCs nutzen wollen, weil
es die von Ihnen gewünschte Software nur für 32-Bit-Systeme gibt.

Während des Vorgangs schreibt `dpkg` diese Änderung zuerst in eine
temporäre Datei namens `/var/lib/dpkg/arch-new`. Wurden  alle anderen
Änderungen erfolgreich vorgenommen, benennt `dpkg` diese Datei in
`/var/lib/dpkg/arch` um.

[NOTE]
.Installation von Paketen für fremde Architekturen
====
Bitte berücksichtigen Sie bei Ihrer Softwareplanung, dass nicht jedes
Paket für alle Plattformen verfügbar ist. Wenn es verfügbar ist und Sie
es erfolgreich auf Ihrem System installieren konnten, heißt das nicht
automatisch, dass es auch auf Ihrer Architektur funktioniert, sondern
nur, dass die Paketverwaltung alle benannten Paketabhängigkeiten erfüllen
konnte.
====

[NOTE]
.Löschen einer Fremdarchitektur
====
Das Entfernen einer Fremdarchitektur gelingt Ihnen nur dann, wenn keine
Pakete (mehr) für diese Architektur auf Ihrem System installiert sind.
Wie Sie Pakete architekturbezogen deinstallieren, lesen Sie in
<<pakete-deinstallieren>> nach.
====

// Wie Sie Pakete finden, die zu dieser Kategorie zählen, lesen Sie im
// Detail unter <<multiarch-pakete-finden>> nach.

==== Multiarch-Beispiel: Installieren eines 32-Bit-Pakets auf einem 64-Bit-System ====

// Stichworte für den Index
(((dpkg, --add-architecture)))
(((dpkg, --print-architecture)))
(((dpkg, --print-foreign-architectures)))
(((Debianpaket, pforth)))
Ein _vollständiges Beispiel_ für den Einsatz von _multiarch_ ist die
Nutzung des Forth-Interpreters `pforth` auf einem 64-bittigen Debian
(Architektur _amd64_). `pforth` ist über das gleichnamige Paket bislang
nur nativ für 32-Bit-Betriebssysteme verfügbar. Gleiches betrifft das
recht weit verbreitete, aber nicht-quelloffene Kommunikationsprogramm
Skype <<Skype>>. Eine passende Schritt-für-Schritt-Anleitung finden Sie
im Debian Wiki <<Debian-Wiki-Skype>>.

Im Folgenden zeigen wir Ihnen anhand des vorgenannten Pakets `pforth`,
wie eine solche Installation abläuft und insbesondere, welche
Einzelschritte wir dabei für beachtenswert halten. Zunächst überprüfen
Sie mittels `dpkg` und dessen Option `--print-architecture` die derzeit
benutzte Architektur Ihres Systems – im hier betrachteten Fall ist es
'amd64'. Danach ergänzen Sie die Liste der Architekturen via `dpkg
--add-architecture i386` um _i386_ als weitere Plattform, für die Ihr
System Pakete akzeptiert. Ob der Vorgang erfolgreich war, zeigt Ihnen
der Parameter `--print-foreign-architectures` von `dpkg` an. Damit
erhalten Sie eine Übersicht zu allen ``Fremdarchitekturen'', die ihr
Debiansystem derzeit akzeptiert.

.Hinzufügen einer weiteren genutzten Paketarchitektur mittels `dpkg`
----
# dpkg --print-architecture
amd64
# dpkg --add-architecture i386
# dpkg --print-foreign-architectures
i386
#
----
// Stichworte für den Index
(((apt-get, update)))
Nun aktualisieren Sie die lokale Liste der verfügbaren Pakete
mittels `apt-get update`, wobei APT nun auch die Informationen
zu den Paketen der neu hinzugefügten Architektur herunterlädt.

.Aktualisieren der Paketlisten
----
# apt-get update
Ign http://ftp.ch.debian.org jessie InRelease
Hit http://ftp.ch.debian.org jessie Release.gpg
Hit http://ftp.ch.debian.org jessie Release
Hit http://ftp.ch.debian.org jessie/main amd64 Packages
Get:1 http://ftp.ch.debian.org jessie/main i386 Packages [6769 kB]
Hit http://ftp.ch.debian.org jessie/main Translation-en
Fetched 6769 kB in 6s (1005 kB/s)
Reading package lists... Done
----

// Stichworte für den Index
(((apt-cache, policy)))
Als nächsten Schritt prüfen Sie mit dem Aufruf `apt-cache policy`, für
welche akzeptierte Architektur das von Ihnen gewünschte Paket
bereitsteht. Die Details zum Aufruf von `apt-cache` finden Sie unter
``Aus welchem Repo kommen die Pakete'' in
<<aus-welchem-repo-kommen-die-pakete>>.

.Prüfung auf Verfügbarkeit für eine Architektur mittels `apt-cache`
----
# apt-cache policy pforth
pforth:i386:
  Installed: (none)
  Candidate: 21-12
  Version table:
     21-12 0
        990 http://ftp.ch.debian.org/debian/ jessie/main i386 Packages
#
----

// Stichworte für den Index
(((apt-get, install)))
Sie ersehen aus der obigen Ausgabe, dass das Paket bislang noch nicht
auf Ihrem System installiert ist. Es steht für die Architektur _i386_
und die Veröffentlichung Debian 8 _Jessie_ bereit. Nun können Sie das
Paket 'pforth' installieren. Das zieht u.a. das essentielle Paket
'libc6' für die Architektur 'i386' nach sich, um die Abhängigkeiten zum
Paket 'pforth' zu erfüllen.

.Installation des 'i386'-Pakets 'pforth' auf 'amd64'-Debian
----
# apt-get install pforth
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  gcc-4.9-base:i386 libc6:i386 libgcc1:i386
Suggested packages:
  glibc-doc:i386
Recommended packages:
  libc6-i686:i386
The following NEW packages will be installed:
  gcc-4.9-base:i386 libc6:i386 libgcc1:i386 pforth:i386
0 upgraded, 4 newly installed, 0 to remove and 27 not upgraded.
Need to get 4,252 kB of archives.
After this operation, 9,727 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://ftp.ch.debian.org/debian/ jessie/main gcc-4.9-base i386 4.9.1-15 [158 kB]
Get:2 http://ftp.ch.debian.org/debian/ jessie/main libc6 i386 2.19-11 [3,977 kB]
Get:3 http://ftp.ch.debian.org/debian/ jessie/main libgcc1 i386 1:4.9.1-15 [48.2 kB]
Get:4 http://ftp.ch.debian.org/debian/ jessie/main pforth i386 21-12 [69.1 kB]
Fetched 4,252 kB in 0s (20.5 MB/s)
Preconfiguring packages ...
Selecting previously unselected package gcc-4.9-base:i386.
(Reading database ... 474485 files and directories currently installed.)
Preparing to unpack .../gcc-4.9-base_4.9.1-15_i386.deb ...
Unpacking gcc-4.9-base:i386 (4.9.1-15) ...
Selecting previously unselected package libc6:i386.
Preparing to unpack .../libc6_2.19-11_i386.deb ...
Unpacking libc6:i386 (2.19-11) ...
Replacing files in old package libc6-i386 (2.19-11) ...
Selecting previously unselected package libgcc1:i386.
Preparing to unpack .../libgcc1_1%3a4.9.1-15_i386.deb ...
Unpacking libgcc1:i386 (1:4.9.1-15) ...
Selecting previously unselected package pforth.
Preparing to unpack .../archives/pforth_21-12_i386.deb ...
Unpacking pforth (21-12) ...
Processing triggers for man-db (2.7.0-1) ...
Setting up gcc-4.9-base:i386 (4.9.1-15) ...
Setting up libc6:i386 (2.19-11) ...
Setting up libgcc1:i386 (1:4.9.1-15) ...
Setting up pforth (21-12) ...
Processing triggers for libc-bin (2.19-11) ...
#
----

In o.g. Fall wurde das Paket `libc6` als Abhängigkeit auch für die
Architektur _i386_ installiert. Sie erkennen das daran, dass neben dem
Namen des Pakets auch die Architektur angegeben wird. Als Trennzeichen
in der Ausgabe fungiert hier ein Doppelpunkt.

Abschließend überprüfen Sie mittels `dpkg`, für welche Architekturen
die Pakete `pforth` und `libc6` auf Ihrem System installiert sind.

.Installationsstatus für das Paket 'libc6'
----
# dpkg -l pforth libc6
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  libc6:amd64    2.19-11      amd64        GNU C Library: Shared libraries
ii  libc6:i386     2.19-11      i386         GNU C Library: Shared libraries
ii  pforth         21-12        i386         portable Forth interpreter
#
----

Im letzten Schritt probieren Sie aus, ob das frisch installierte
32-Bit-Programm auch unter Ihrem 64-Bit-Betriebssystem funktioniert.
Dazu rufen Sie das Programm auf.

.Ausführung von `pforth`
----
$ pforth
PForth V21
pForth loading dictionary from file /usr/lib/pforth/pforth.dic
     File format version is 8
     Name space size = 120000
     Code space size = 300000
     Entry Point     = 0
     Little  Endian Dictionary
Begin AUTO.INIT ------
...
$
----

// Datei (Ende): ./konzepte/software-in-paketen-organisieren/multiarch-einsetzen.adoc
