// Datei: ./praxis/metapakete-bauen/metapakete-bauen.adoc[]

// Baustellenstatus: Rohtext

[[metapakete-bauen]]

== Metapakete bauen ==

// Stichworte für den Index
(((Metapaket, benennen)))
(((Metapaket, erstellen)))
(((Paketvarianten, Metapaket)))
Metapakete sind spezielle Binärpakete, die keine Daten, sondern lediglich 
Abhängigkeiten auf andere Pakete beinhalten. Genauer erklären wir Ihnen diese 
Paketvariante unter ``Übergangspakete, Metapakete und Tasks'' in 
<<uebergangs-und-metapakete>>.

Sehr nützlich sind Metapakete genau dann, wenn Sie immer wieder eine bestimmte 
Kombination von Paketen benötigen, bspw. um eine Reihe gleichartiger Systeme zu
pflegen. Definieren Sie einen LAMP-Server bestehend aus Linux, dem Webserver 
Apache, dem Datenbankmanagementsystem MariaDB und der Programmiersprache PHP 
über das Metapaket namens 'meta-lamp', enthält dieses bspw. die Abhängigkeiten 
zu den vier Paketen 'apache2', 'mariadb-server', 'mariadb-client' und 'php'. 
Installieren Sie später das Metapaket 'meta-lamp', werden diese Abhängigkeiten 
von der Paketverwaltung aufgelöst und die genannten Pakete samt deren 
Abhängigkeiten installiert.

// Stichworte für den Index
(((Debianpaket, dphys-config)))
(((Debianpaket, dphys-swapfile)))
Für die Benennung von eigenen Metapaketen gibt es keine Festlegung -- 
Namenskonflikte mit Paketen aus eigenen Repositories sind daher nie 
vollständig auszuschliessen. Im offiziellen Bestand finden sich Pakete, die 
den Namen der Einrichtung tragen, an denen das Paket entstanden ist. Dazu 
gehören bspw. 'dphys-config' <<Debian-Paket-dphys-config>> und 'dphys-swapfile' 
<<Debian-Paket-dphys-swapfile>>, die beide das Departement für Physik der ETH 
Zürich beigesteuert hat. Vielleicht ist dieses Namensschema auch für Sie 
nützlich.

// Stichworte für den Index
(((Debianpaket, mc)))
(((Debianpaket, mc-data)))
In diesem Kapitel lernen Sie, wie Sie ein Metapaket für den Midnight Commander 
erstellen <<mc>>. Hier heißt dieses schlicht und einfach 'meta-mc'. 'mc' setzt 
sich aus zwei Paketen zusammen -- 'mc' <<Debian-Paket-mc>> für die Binärdateien 
und 'mc-data' <<Debian-Paket-mc-data>> für die architekturunabhängigen 
Datendateien. 

[[metapakete-bauen-vorbereitungen]]
=== Vorbereitungen ===

// Stichworte für den Index
(((Debianpaket, equivs)))

Zur Erstellung des Metapakets 'meta-mc' greifen wir auf das Debianpaket 
'equivs' <<Debian-Paket-equivs>> zurück, was diesen Vorgang für alle Seiten 
sehr stark vereinfacht. Das Paket 'equivs' bringt die beiden Werkzeuge 
`equivs-control` und `equivs-build` mit.

Ausgangspunkt ist das Erzeugen einer Beschreibung des zu erstellenden 
Metapakets. Dazu benutzen Sie `equivs-control`. Dieses erwartet einen 
Dateinamen, in der die Beschreibung landet -- nachfolgend genannt 
`ns-control`:

.Beschreibungsdatei für das Metapaket erzeugen
----
$ equivs-control ns-control
$
----

Die mittels `equivs-control` erzeugte Beschreibung ist nur eine Vorlage, die 
Sie nun noch entsprechend ändern, damit es auch auf das Metapakets 'meta-mc' 
passt. Das betrifft insbesondere die Felder `Section` (Paketkategorie), 
`Priority` (Priorität des Pakets), `Package` (Paketname des Metapakets), 
`Maintainer` (Name des Paketbetreuers), `Depends` (Paket hängt ab von) und 
`Description` (Paketbeschreibung). Passende Felder kommentieren Sie aus und 
hinterlegen den gewünschten Wert. In unserem Fall sieht das wie folgt aus:

.Angepasste Beschreibungsdatei `ns-control` für das Metapaket 'meta-mc'
----
### Commented entries have reasonable defaults.
### Uncomment to edit them.
# Source: <source package name; defaults to package name>
Section: misc
Priority: optional
# Homepage: <enter URL here; no default>
Standards-Version: 3.9.2

Package: meta-mc
# Version: <enter version here; defaults to 1.0>
Maintainer: Frank Hofmann <frank.hofmann@efho.de>
# Pre-Depends: <comma-separated list of packages>
Depends: mc, mc-data
# Recommends: <comma-separated list of packages>
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Replaces: <comma-separated list of packages>
# Architecture: all
# Multi-Arch: <one of: foreign|same|allowed>
# Copyright: <copyright file; defaults to GPL2>
# Changelog: <changelog file; defaults to a generic changelog>
# Readme: <README.Debian file; defaults to a generic one>
# Extra-Files: <comma-separated list of additional files for the doc directory>
# Files: <pair of space-separated paths; First is file to include, second is destination>
#  <more pairs, if there's more than one file to include. Notice the starting space>
Description: Installs the Midnight Commander
 Installs the Midnight Commander

----

[NOTE]
====
Beachten Sie bitte die Leerzeile am Ende der Beschreibungsdatei `ns-control`. 
Ohne diese kann das Paket später nicht sauber gebaut werden.
====

[[metapakete-bauen-bauen]]
=== Das Paket bauen ===

// Stichworte für den Index
(((equivs-build, --full)))
Nun kommt Schritt 2 -- das Bauen des `deb`-Pakets auf der Basis der zuvor
erstellten Beschreibungsdatei. Das gelingt Ihnen mit Hilfe des Werkzeugs 
`equivs-build`. Es erwartet zwei Parameter -- `-f` (Langform `--full`) und 
den Namen der Beschreibungsdatei. Der verwendete Schalter `-f` sorgt dafür, 
dass der Bauprozeß vollständig durchlaufen wird. Das Paket wird gebaut und 
auch signiert, sofern ein entsprechender GnuPG-Schlüssel hinterlegt ist.

.Bauen des Metapakets auf der Basis der Beschreibungsdatei
----
$ equivs-build --full ns-control
dpkg-buildpackage: Information: Quellpaket meta-mc
dpkg-buildpackage: Information: Quellversion 1.0
dpkg-buildpackage: Information: Quelldistribution unstable
dpkg-buildpackage: Information: Quelle geändert durch Frank Hofmann <frank.hofmann@efho.de>
dpkg-buildpackage: Information: Host-Architektur amd64
 dpkg-source --before-build equivs.x2AVPx
 fakeroot debian/rules clean
dh_testdir
dh_clean
dh_clean: Compatibility levels before 9 are deprecated (level 7 in use)
 dpkg-source -b equivs.x2AVPx
dpkg-source: Information: Quellformat »1.0« wird verwendet
dpkg-source: Warnung: Quellverzeichnis »equivs.x2AVPx« lautet nicht <Quellpaket>-<Ursprungsversion> »meta-mc-1.0«
dpkg-source: Information: meta-mc wird in meta-mc_1.0.tar.gz gebaut
dpkg-source: Information: meta-mc wird in meta-mc_1.0.dsc gebaut
 debian/rules build
make: Für das Ziel „build“ ist nichts zu tun.
 fakeroot debian/rules binary
dh_testdir
dh_testroot
dh_prep
dh_testdir
dh_testroot
dh_install
dh_install: Compatibility levels before 9 are deprecated (level 7 in use)
dh_installdocs
dh_installdocs: Compatibility levels before 9 are deprecated (level 7 in use)
dh_installchangelogs
dh_compress
dh_fixperms
dh_installdeb
dh_installdeb: Compatibility levels before 9 are deprecated (level 7 in use)
dh_gencontrol
dh_md5sums
dh_builddeb
dpkg-deb: Paket »meta-mc« wird in »../meta-mc_1.0_all.deb« gebaut.
 dpkg-genbuildinfo
 dpkg-genchanges  >../meta-mc_1.0_amd64.changes
...
$ 
----

Das Ergebnis umfaßt eine Reihe von Dateien und sieht dann wie folgt aus:

.Ergebnis nach dem Bauen des Pakets
----
$ ls meta-mc*
meta-mc_1.0_all.deb          meta-mc_1.0_amd64.changes  meta-mc_1.0.tar.gz
meta-mc_1.0_amd64.buildinfo  meta-mc_1.0.dsc            
$
----

`meta-mc_1.0_all.deb` :: das erzeugte Metapaket
`meta-mc_1.0_amd64.buildinfo` :: Dateien und Softwarepakete, die zum Zeitpunkt
der Erstellung des Pakets installiert sind
+
----
$ cat meta-mc_1.0_amd64.buildinfo
Format: 1.0
Source: meta-mc
Binary: meta-mc
Architecture: all source
Version: 1.0
Checksums-Md5:
 0e03c6890fc8a72762cf994a0cdcafb7 487 meta-mc_1.0.dsc
 5050e909c14b6ccf703cf00ebf831594 2050 meta-mc_1.0_all.deb
Checksums-Sha1:
 91ab2cf66937c606ff3abb8853f1555b78521a7d 487 meta-mc_1.0.dsc
 c5640969e2e515a0fca2f49fc5835846a1d9a8fa 2050 meta-mc_1.0_all.deb
Checksums-Sha256:
 ced0cf69f3eeeef5b4370b0c5654f0db3c5eb77809fc8057b79f91bd154d3c83 487 meta-mc_1.0.dsc
 c2ca1265083bf413856c29afdfd00e47b8850fa28a89c85510867b6a65644538 2050 meta-mc_1.0_all.deb
Build-Origin: Debian
Build-Architecture: amd64
Build-Date: Wed, 13 Nov 2019 14:55:05 +0100
Installed-Build-Depends:
 autoconf (= 2.69-10),
 automake (= 1:1.15-6),
 autopoint (= 0.19.8.1-2+deb9u1),
...
$
----

`meta-mc_1.0_amd64.changes` :: die Änderungshistorie zum erzeugten Paket. Diese 
Datei wird benötigt, um das erzeugte Paket später auf einem Paketmirror 
hochzuladen.
+
----
$ cat meta-mc_1.0_amd64.changes
Format: 1.8
Date: Wed, 13 Nov 2019 14:55:04 +0100
Source: meta-mc
Binary: meta-mc
Architecture: source all
Version: 1.0
Distribution: unstable
Urgency: low
Maintainer: Frank Hofmann <frank.hofmann@efho.de>
Changed-By: Frank Hofmann <frank.hofmann@efho.de>
Description:
 meta-mc    - Installs the Midnight Commander
Changes:
 meta-mc (1.0) unstable; urgency=low
 .
   * First version
Checksums-Sha1:
 91ab2cf66937c606ff3abb8853f1555b78521a7d 487 meta-mc_1.0.dsc
 68ae676fb11fcca32674557510327830499e17a2 1826 meta-mc_1.0.tar.gz
 c5640969e2e515a0fca2f49fc5835846a1d9a8fa 2050 meta-mc_1.0_all.deb
 42ece0cc919f8be786615c6fd5e0c992946455ca 5230 meta-mc_1.0_amd64.buildinfo
Checksums-Sha256:
 ced0cf69f3eeeef5b4370b0c5654f0db3c5eb77809fc8057b79f91bd154d3c83 487 meta-mc_1.0.dsc
 27e3c42c64e1243371ff68bf62f255e863e54c8f5922326b5ddc494d8c3cb6cd 1826 meta-mc_1.0.tar.gz
 c2ca1265083bf413856c29afdfd00e47b8850fa28a89c85510867b6a65644538 2050 meta-mc_1.0_all.deb
 f94aec05b0f2aea1f83e95debe3f842cf0a317f18cc8ff2a737025b33ad4e672 5230 meta-mc_1.0_amd64.buildinfo
Files:
 0e03c6890fc8a72762cf994a0cdcafb7 487 misc optional meta-mc_1.0.dsc
 396fa6392e9518bb302d88c4c038e095 1826 misc optional meta-mc_1.0.tar.gz
 5050e909c14b6ccf703cf00ebf831594 2050 misc optional meta-mc_1.0_all.deb
 261b4cb586d5d8d11a22badf6fb3c914 5230 misc optional meta-mc_1.0_amd64.buildinfo
$
----

`meta-mc_1.0.dsc` :: die Paketbeschreibung für die Paketverwaltung (Quellcode)
+
----
$ cat meta-mc_1.0.dsc
Format: 1.0
Source: meta-mc
Binary: meta-mc
Architecture: all
Version: 1.0
Maintainer: Frank Hofmann <frank.hofmann@efho.de>
Standards-Version: 3.9.2
Build-Depends: debhelper (>= 7)
Package-List:
 meta-mc deb misc optional arch=all
Checksums-Sha1:
 68ae676fb11fcca32674557510327830499e17a2 1826 meta-mc_1.0.tar.gz
Checksums-Sha256:
 27e3c42c64e1243371ff68bf62f255e863e54c8f5922326b5ddc494d8c3cb6cd 1826 meta-mc_1.0.tar.gz
Files:
 396fa6392e9518bb302d88c4c038e095 1826 meta-mc_1.0.tar.gz
$
----

`meta-mc_1.0.tar.gz` :: das Quellpaket zum erzeugten Metapaket

Jetzt wurde das Paket erfolgreich gebaut -- Gratulation!

[[metapakete-bauen-signieren]]
=== Die Komponenten des Pakets kryptographisch signieren ===

// Stichworte für den Index
(((debsign, -k)))
(((Debianpaket signieren)))
Das zuvor gebaute Paket können Sie uneingeschränkt benutzen (und auch direkt 
bei <<metapakete-bauen-benutzen>> weiterlesen). In den nun folgenden 
Abschnitten gehen wir noch einen Schritt weiter in Richtung Sicherheit und 
versehen sowohl die einzelnen Komponenten des Pakets als auch das gesamte 
Paket selbst mit einer kryptographischen Signatur. Das garantiert jedem Nutzer 
die Echtheit des Pakets -- sprich: der Inhalt und das Paket selbst stammt aus 
einer verlässlichen Quelle. 

Zunächst signieren Sie den Quellcode und die Änderungen (`.changes`-Datei) mit 
ihrem GnuPG-Schlüssel. In Anwendung kommen dafür die beiden Werkzeuge `debsign` 
aus dem Paket 'devscripts' <<Debian-Paket-devscripts>> und `gpg` aus dem Paket 
<<Debian-Paket-gpg>>.

.Signieren des Quellpakets
----
$ debsign -k D431AC07 meta-mc_1.0.dsc
 signfile dsc meta-mc_1.0.dsc D431AC07

Successfully signed dsc file
$
----

`debsign` freut sich über den Schalter `-k`, den Wert ihres GnuPG-Schlüssels
und den Namen der zu signierenden Datei. Ist es im obigen Aufruf das Quellpaket,
geben Sie im unteren Aufruf die `.changes`-Datei an.

.Signieren der Änderungen
----
$ debsign -k D431AC07 meta-mc_1.0_amd64.changes 
The .dsc file is already signed.
Would you like to use the current signature? [Yn]Y
Leaving current signature unchanged.
 fixup_buildinfo meta-mc_1.0.dsc meta-mc_1.0_amd64.buildinfo
 signfile buildinfo meta-mc_1.0_amd64.buildinfo D431AC07

 fixup_changes dsc meta-mc_1.0.dsc meta-mc_1.0_amd64.changes
 fixup_changes buildinfo meta-mc_1.0_amd64.buildinfo meta-mc_1.0_amd64.changes
 signfile changes meta-mc_1.0_amd64.changes D431AC07

Successfully signed buildinfo, changes files
$
----

// Stichworte für den Index
(((gpg, --verify)))
Zur Sicherheit prüfen Sie die Signatur mit Hilfe von `gpg` nach. In Anwendung
ist der Schalter `--verify` gefolgt von der signierten Datei. Nachfolgende 
Ausgabe zeigt, dass die Signatur korrekt ist, aber nicht garantiert werden kann,
dass der verwendete kryptographische Schlüssel authentisch ist. Einen Schlüssel
mit einem fremden Namen erzeugen kann ja jeder.

.Prüfen der Signatur des Quellpakets
----
$ gpg --verify meta-mc_1.0.dsc
gpg: Signatur vom Do 14 Nov 2019 15:12:00 CET
gpg:                mittels RSA-Schlüssel 35F8DF9C884E36AB974460AFCFA72978D431AC07
gpg: Korrekte Signatur von "Frank Hofmann (Hofmann EDV) <frank.hofmann@efho.de>" [unbekannt]
gpg: WARNUNG: Dieser Schlüssel trägt keine vertrauenswürdige Signatur!
gpg:          Es gibt keinen Hinweis, daß die Signatur wirklich dem vorgeblichen Besitzer gehört.
Haupt-Fingerabdruck  = 35F8 DF9C 884E 36AB 9744  60AF CFA7 2978 D431 AC07
$
----

[[metapakete-bauen-paket-signieren]]
=== Das Debianpaket kryptographisch signieren ===

Für diesen abschließenden Schritt stehen zwei verschiedene Werkzeuge bereit --
`dpkg-sig` (Debianpaket 'dpkg-sig' <<Debian-Paket-dpkg-sig>>) und `debsigs` 
(Debianpaket 'debsigs' <<Debian-Paket-debsigs>>). Leider sind deren Ergebnisse 
nicht zueinander kompatibel.

==== `dpkg-sig` verwenden ====

// Stichworte für den Index
(((Debianpaket, dpkg-sig)))
(((dpkg-sig, -k)))
(((dpkg-sig, --sign)))
(((dpkg-sig, --verify)))
(((gpg, --verify)))

Rufen Sie `dpkg-sig` auf, erzeugt es eine Debian-`control`-Datei mit einer 
Reihe nützlicher Einträge:

* der Version von `dpkg-sig`, die die Signatur erzeugt hat
* die GnuPG-Information über denjenigen, in dessen Namen die Signierung 
vorgenommen wurde
* dessen Rolle
* einen Abschnitt mit Checksummen, Dateigrößen und Dateinamen der Binär-,
Kontroll- und Datendateien im Debianpaket.

Der Name der erzeugten Datei hängt von der ausgewählten Rolle ab. Falls nicht
weiter spezifiziert, ist das derjenige, der das Paket gebaut hat. Dann heißt 
die neue Datei `_gpgbuilder`. Die Datei wir dem Debianpaket hinzugefügt, das 
Paket wird mit GnuPG signiert und die Signatur als Klartext ergänzt. 

.Das Debianpaket signieren
----
$ dpkg-sig -k D431AC07 --sign builder meta-mc_1.0_all.deb 
Processing meta-mc_1.0_all.deb...
gpg: "D431AC07" wird als voreingestellter geheimer Signaturschlüssel benutzt
Signed deb meta-mc_1.0_all.deb
$
----

Somit können Sie jetzt über mehrere Ebenen hinweg die Echtheit der Daten prüfen
-- entweder mittels `gpg --verify`, oder mittels `dpkg-sig --verify`.

.Prüfen der Signatur mittels `gpg`
----
$ gpg --verify meta-mc_1.0_all.deb 
gpg: Signatur vom Fr 15 Nov 2019 14:10:36 CET
gpg:                mittels RSA-Schlüssel 35F8DF9C884E36AB974460AFCFA72978D431AC07
gpg: Korrekte Signatur von "Frank Hofmann (Hofmann EDV) <frank.hofmann@efho.de>" [unbekannt]
gpg: WARNUNG: Dieser Schlüssel trägt keine vertrauenswürdige Signatur!
gpg:          Es gibt keinen Hinweis, daß die Signatur wirklich dem vorgeblichen Besitzer gehört.
Haupt-Fingerabdruck  = 35F8 DF9C 884E 36AB 9744  60AF CFA7 2978 D431 AC07
$
----

.Prüfen der Signatur mittels `dpkg-sig`
----
$ dpkg-sig --verify meta-mc_1.0_all.deb 
Processing meta-mc_1.0_all.deb...
GOODSIG _gpgbuilder 35F8DF9C884E36AB974460AFCFA72978D431AC07 1573823436
$
----

==== `debsigs` benutzen ====

// Stichworte für den Index
(((debsigs, --default-key)))
(((debsigs, --sign)))
(((debsigs, -k)))
Die Alternative zu `dpkg-sig` ist `debsigs`. Nachfolgender Aufruf signiert das 
Paket 'meta-mc' über den Schalter `-k` (Langform `--default-key`) mit dem 
Schlüssel `D431AC07`. Die Angabe von `--sign` ist die kryptographische Signatur 
der Organisation, die das Paket bereitstellt. Erlaubte Werte sind `origin` 
für den Originalautor, `maint` für den Paketmaintainer und `archive` für den 
Namen des Archivs, welches das Paket bereitstellt.

.Das Debianpaket signieren
----
$ debsigs --sign=origin -k D431AC07 meta-mc_1.0_all.deb 
gpg: "D431AC07" wird als voreingestellter geheimer Signaturschlüssel benutzt
$
----

// ToDo: Überprüfen der Signatur mit debsigs -t
// Stichworte für den Index
(((debsigs, -t)))

Nun ist auch der Sicherheitscheck über die Bühne und das Paket kann zum Einsatz 
kommen. Auf gehts!

[[metapakete-bauen-benutzen]]
=== Das neue Paket benutzen ===

Das fertige Paket steht nun zum Einsatz bereit. Entweder laden Sie dieses
auf einen Paketmirror hoch (siehe <<eigenes-apt-repository-anlegen>>) oder
Sie installieren das Paket gleich direkt auf ihrem System. Für letzteres haben 
Sie mehrere Möglichkeiten.

==== Mittels `dpkg` und APT ==== 

// Stichworte für den Index
(((apt-get, install -f)))
(((apt-get, install --fix-broken)))
(((dpkg, -i)))
Zuerst rufen Sie `dpkg -i paket.deb` auf, danach `apt-get install -f`. Ersteres 
veranlasst `dpkg`, ihr Paket zu installieren. 

.Installieren des Metapakets `meta-mc` mittels `dpkg`
----
# dpkg -i meta-mc_1.0_all.deb
Vormals nicht ausgewähltes Paket meta-mc wird gewählt.
(Lese Datenbank ... 239663 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von meta-mc_1.0_all.deb ...
Entpacken von meta-mc (1.0) ...
dpkg: Abhängigkeitsprobleme verhindern Konfiguration von meta-mc:
 meta-mc hängt ab von mc; aber:
  Paket mc ist nicht installiert.
 meta-mc hängt ab von mc-data; aber:
  Paket mc-data ist nicht installiert.

dpkg: Fehler beim Bearbeiten des Paketes meta-mc (--install):
 Abhängigkeitsprobleme - verbleibt unkonfiguriert
Fehler traten auf beim Bearbeiten von:
 meta-mc
#
----

`dpkg` lässt das Paket unkonfiguriert, da es die im Paket benannten 
Paketabhängigkeiten nicht selbst auflösen kann. Sie erkennen den Status an der
Buchstabenkombination `iU` für 'Paket installiert' und 'nicht konfiguriert':

.Installationsstatus von `meta-mc`
----
# dpkg -l | grep meta-mc
iU  meta-mc                               1.0                               all          Installs the Midnight Commander
# 
----

// Stichworte für den Index
(((apt-get, install -f)))
(((apt-get, install --fix-broken)))

Nun rufen Sie `apt-get install -f` auf. APT behebt nun die fehlenden 
Abhängigkeiten und konfiguriert das Paket `meta-mc` wie folgt: 

.Auflösen der Paketabhängigkeiten mit `apt-get`
----
# apt-get install -f
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.       
Statusinformationen werden eingelesen.... Fertig
Abhängigkeiten werden korrigiert ... Fertig
The following additional packages will be installed:
  mc mc-data
Vorgeschlagene Pakete:
  arj dbview djvulibre-bin gv libaspell-dev odt2txt python-boto python-tz
Die folgenden NEUEN Pakete werden installiert:
  mc mc-data
0 aktualisiert, 2 neu installiert, 0 zu entfernen und 2 nicht aktualisiert.
1 nicht vollständig installiert oder entfernt.
Es müssen noch 0 B von 1.780 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 7.175 kB Plattenplatz zusätzlich benutzt.
Möchten Sie fortfahren? [J/n] j
Vormals nicht ausgewähltes Paket mc-data wird gewählt.
(Lese Datenbank ... 239667 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von .../mc-data_3%3a4.8.18-1_all.deb ...
Entpacken von mc-data (3:4.8.18-1) ...
Vormals nicht ausgewähltes Paket mc wird gewählt.
Vorbereitung zum Entpacken von .../mc_3%3a4.8.18-1_amd64.deb ...
Entpacken von mc (3:4.8.18-1) ...
Trigger für mime-support (3.60) werden verarbeitet ...
Trigger für desktop-file-utils (0.23-1) werden verarbeitet ...
mc-data (3:4.8.18-1) wird eingerichtet ...
Trigger für man-db (2.7.6.1-2) werden verarbeitet ...
Trigger für hicolor-icon-theme (0.15-1) werden verarbeitet ...
mc (3:4.8.18-1) wird eingerichtet ...
meta-mc (1.0) wird eingerichtet ...
#
----

==== Mittels `gdebi` ==== 

// Stichworte für den Index
(((Debianpaket, gdebi)))
(((gdebi)))
Dem Werkzeug `gdebi` <<Debian-Paket-gdebi>> ist in <<gui-gdebi>> ein eigener
Bereich gewidmet. Es untersucht das zuvor erzeugte Metapaket vor dessen
Installation und löst die Paketabhängigkeiten sauber auf.

.Installation des Metapakets mittels `gdebi`
----
# gdebi meta-mc_1.0_all.deb
Reading package lists... Done
Building dependency tree        
Reading state information... Done
Reading state information... Done
Erfordert die Installation folgender Pakete: mc mc-data 

Installs the Midnight Commander
 Installs the Midnight Commander
Wollen Sie das Software-Paket installieren? [j/N]:j
Fetched 0 B in 0s (0 B/s)                                                      
Vormals nicht ausgewähltes Paket mc-data wird gewählt.
(Lese Datenbank ... 240891 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von .../mc-data_3%3a4.8.18-1_all.deb ...
Entpacken von mc-data (3:4.8.18-1) ...
Vormals nicht ausgewähltes Paket mc wird gewählt.
Vorbereitung zum Entpacken von .../mc_3%3a4.8.18-1_amd64.deb ...
Entpacken von mc (3:4.8.18-1) ...
Trigger für mime-support (3.60) werden verarbeitet ...
Trigger für desktop-file-utils (0.23-1) werden verarbeitet ...
mc-data (3:4.8.18-1) wird eingerichtet ...
Trigger für man-db (2.7.6.1-2) werden verarbeitet ...
Trigger für hicolor-icon-theme (0.15-1) werden verarbeitet ...
mc (3:4.8.18-1) wird eingerichtet ...
Vormals nicht ausgewähltes Paket meta-mc wird gewählt.
(Lese Datenbank ... 241248 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von meta-mc_1.0_all.deb ...
Entpacken von meta-mc (1.0) ...
meta-mc (1.0) wird eingerichtet ...
#
----

==== Mittels `apt` ==== 

// Stichworte für den Index
(((apt, install)))
(((apt, lokales Paket installieren)))
(((Debianpaket, apt)))
Das Werkzeug `apt` steht `gdebi` in nichts nach -- es löst ebenfalls die 
Paketabhängigkeiten sauber auf. `apt` kann ebenfalls mit lokalen Paketen
umgehen, sofern im Pfadnamen zum Paket ein Verzeichnistrenner enthalten 
ist. Liegt das Paket im lokalen Verzeichnis, fügen Sie vor dem Namen der 
Paketdatei die Zeichen `./` hinzu. Der Aufruf sieht dann wie nachfolgend 
gezeigt aus.

.`apt` bei der Installation des Metapakets 'meta-mc'
image::praxis/metapakete-bauen/apt.png[id="fig.metapakete-apt", width="50%"]

// Datei (Ende): ./praxis/metapakete-bauen/metapakete-bauen.adoc[]
