{"id":545,"date":"2021-02-01T11:56:11","date_gmt":"2021-02-01T10:56:11","guid":{"rendered":"https:\/\/informatik.htwk-leipzig.de\/seminar\/?p=545"},"modified":"2021-11-28T17:27:45","modified_gmt":"2021-11-28T16:27:45","slug":"paketverwaltung-am-beispiel-von-debian","status":"publish","type":"post","link":"https:\/\/informatik.htwk-leipzig.de\/seminar\/lehrveranstaltungen\/betriebliche-informationssysteme\/2021\/paketverwaltung-am-beispiel-von-debian\/","title":{"rendered":"Paketverwaltung am Beispiel von Debian"},"content":{"rendered":"<h2>Was sind Software-Pakete?<\/h2>\n<p>Software-Pakete entstehen wenn Softwarebestandteile zusammengefasst werden und bestehen in einem einfachen Fall beispielsweise aus einer Archivdatei, welche ein Programm, Abh\u00e4ngigkeiten und Anweisungen wie das Programm installiert werden sollte, enth\u00e4lt. Pakete k\u00f6nnen aber auch aus Programmbibliotheken oder Dokumentation bestehen.<\/p>\n<h2>Was ist Paketverwaltung?<\/h2>\n<p>Werden Softwarepakete automatisiert durch einen Package-Manager verwaltet, spricht man von Paketverwaltung, und diese erm\u00f6glicht im Optimalfall eine reibungslose und vollautomatische<\/p>\n<ul>\n<li>Installation<\/li>\n<li>Vorkonfiguration<\/li>\n<li>Aktualisierung<\/li>\n<li>Deinstallation<\/li>\n<\/ul>\n<p>von Software.<\/p>\n<h2>Vergleich zu manueller Vorgehensweise<\/h2>\n<p>Werden Pakete nicht systematisch verwaltet, treten verschiedene Probleme auf. Softwarespezifische Installer sind im Allgemeinen nicht in der Lage Abh\u00e4ngigkeiten aufzul\u00f6sen und so wird bei fehlenden Abh\u00e4ngigkeiten wie z.B. der Java Runtime Environment die Installation mit der Aufforderung an den Benutzer diese manuell zu installieren, abgebrochen. Um dieses Problem weitestgehend zu umgehen werden die meisten Abh\u00e4ngigkeiten f\u00fcr jede Software separat installiert, unabh\u00e4ngig davon wie oft diese schon von anderen Installern kopiert wurde.<\/p>\n<p>Diese Probleme resultieren in einem erh\u00f6hten Speicherverbrauch, zahllosen Update-Agenten, Chaos in der Startmen\u00fc-Struktur und bei Ordnern und Dateien, welches bei h\u00e4ufiger Installation und Deinstallation immer weiter zunimmt, da die softwarespezifischen Deinstaller im Zweifelsfall bestimmte Teile nicht l\u00f6schen, um die Funktionsf\u00e4higkeit des Systems nicht zu gef\u00e4hrden. Auch bei der Beschaffung von Software k\u00f6nnen Probleme entstehen. So wird dem Nutzer und dessen F\u00e4higkeit vertraut, die Qualit\u00e4t und Sicherheit der Software und seiner Quelle einzusch\u00e4tzen.<\/p>\n<p>Bei einer zentralen Paketverwaltung k\u00f6nnen Pakete im Voraus getestet werden, so dass Pakete in der Test-Phase, Beta-Phase und stabile Pakete unterschieden werden k\u00f6nnen. Ebenso werden die Pakete mit Signaturen versehen, womit viele Man-In-The-Middle-Angriffe unm\u00f6glich werden und sichergestellt werden kann dass das jeweilige Paket von der vertrauten Quelle stammt. Dadurch wird hohe Software-Sicherheit, Software-Qualit\u00e4t und Benutzerfreundlichkeit erreicht. Die vertraute Quelle ist meistens ein vom Paketmanager oder von der Distribution bereitgestelltes und voreingestelltes Repository aber viele Paketverwaltungen erlauben auch das Einbinden externer Repositories sowie das Erstellen eigener Repositories.<\/p>\n<h2>Wahl des Paketmanagers<\/h2>\n<p>Es gibt eine Vielzahl von Paketmanagern mit unterschiedlichen Ans\u00e4tzen und Einsatzbereichen, was durch die folgende Aufz\u00e4hlung einiger Paketverwaltungen verdeutlicht werden soll:<\/p>\n<ul>\n<li><strong>dpkg<\/strong> ist der von der Linuxdistribution Debian verwendete Paketmanager. Auch weitere von Debian abstammende Distributionen wie Ubuntu, Linux Mint oder Raspbian verwenden diesen. Er stellt eine Sammlung von betriebsystemseitig unterst\u00fctzter Software zur Verf\u00fcgung.<\/li>\n<li><strong>RPM<\/strong> wird von den Linuxdistributionen RHEL, CentOS und Fedora verwendet. Auch Suse Linux verwendet RPM, ohne aber kompatibel zu den zuvor genannten Distributionen zu sein.<\/li>\n<li><strong>Snap<\/strong> ist eine distributionsunabh\u00e4ngige Paketverwaltung f\u00fcr Linux, welche in sich geschlossene Applikationen in einer teilweise abgeschotteten Umgebung ausf\u00fchrt. Das Repository ist closed source und wird von Canonical bereitgestellt.<\/li>\n<li><strong>Nix<\/strong> ist ein rein funktionaler, distributionsunabh\u00e4ngiger Paketmanager welcher \u00fcber hierarchische Hashwertbildung der Abh\u00e4ngigkeiten Abh\u00e4ngigkeitskonflikte vollst\u00e4ndig vermeidet und eine hohe Reproduzierbarkeit bei gleichzeitig geteilten Abh\u00e4ngigkeiten erm\u00f6glicht.<\/li>\n<li><strong>Google Play Store<\/strong> ist der vom Smartphone-Betriebssystem Android verwendete Appstore<\/li>\n<li><strong>npm<\/strong> ist ein Paketmanager nur f\u00fcr JavaScript Programme und Programmbibliotheken.<\/li>\n<li><strong>Steam<\/strong> verwaltet Pakete f\u00fcr Computerspiele und ist f\u00fcr die Betriebssysteme Windows, MacOS und Linux verf\u00fcgbar.<\/li>\n<\/ul>\n<p>Unter Linux ist die Wahl des Paketmanagers verkn\u00fcpft mit der Wahl der Linuxdistribution. Die zus\u00e4tzliche Verwendung von distributionsunabh\u00e4ngigen Paketverwaltungen ist kein Problem, muss aber eventuell durch einen erh\u00f6hten Speicherverbrauch erkauft werden, da diese eine eigene Sammlung von Abh\u00e4ngigkeiten pflegen.<\/p>\n<p>F\u00fcr das sp\u00e4ter folgende Beispiel zum Bauen und Hosten eines Paketes wird hier Debian verwendet, da dieses im betrieblichen Umfeld h\u00e4ufig eingesetzt wird und eine sehr gute Dokumentation vorliegt.<\/p>\n<h2>Vorteile eines eigenen Repositories<\/h2>\n<p>Ein betriebsinternes Software Repository bietet folgende Vorteile:<\/p>\n<ul>\n<li><strong>Caching von Paketen aus externen Repositories: <\/strong> Durch Mirroring von externen Paketquellen kann Internet-Bandbreite und Zeit bei Installation und Update von Paketen gespart werden.<\/li>\n<li><strong>Unternehmensweite Bereitstellung von eigenen Software-Paketen: <\/strong>Die Paketierung eigener Software beispielsweise f\u00fcr die Serverinfrastruktur im Unternehmen kann durch die vollautomatische Installation und Updates im Nachhinein viel Zeit sparen<\/li>\n<li><strong>Staging der eigenen Software f\u00fcr Entwicklung, Pilotphase, Live-Betrieb: <\/strong> Eine Paketverwaltung erm\u00f6glicht kontrollierte Test und Entwicklungs-Umgebungen<\/li>\n<\/ul>\n<h2>Bauen eines Paketes am Beispiel Debian<\/h2>\n<p>F\u00fcr das Erstellen eines Debian-Software-Pakets muss die Software selbst sowie Anweisungen f\u00fcr Anpassungen an das Makefile und weitere Metadaten in speziellen Dateien gespeichert werden. Vorlagen dieser Dateien k\u00f6nnen mit Werkzeugen wie <code>dh_make<\/code> erstellt werden.<\/p>\n<p>Als Beispiel wird hier ein in C geschriebenes Hello-World Programm mit Hilfe einer Debian VM paketiert. Das Programm liegt als tar Datei vor und wird zun\u00e4chst konventionsgem\u00e4\u00df umbenannt und entpackt. Dann wird ein Verzeichnis mit dem Namen <code>debian<\/code> erstellt, in welches die zuvor erw\u00e4hnten Text-Dateien erstellt werden. <code>hithere.1<\/code> stellt den man-Eintrag bereit.<\/p>\n<p><code>beispielpaket<br \/>\n\u251c\u2500\u2500 hithere-1.0<br \/>\n\u2502   \u251c\u2500\u2500 debian<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 changelog<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 control<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 copyright<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 rules<br \/>\n\u2502   \u251c\u2500\u2500 hithere.1<br \/>\n\u2502   \u251c\u2500\u2500 hithere.c<br \/>\n\u2502   \u2514\u2500\u2500 Makefile<br \/>\n\u2514\u2500\u2500 hithere_1.0.tar.gz<\/code><\/p>\n<p>Im Folgenden werden die vier notwendigen Dateien f\u00fcr das Bauen des Paketes beschrieben.<\/p>\n<h4>copyright<\/h4>\n<p>In <code>copyright<\/code> k\u00f6nnen Software-Lizenzen des Paketes auf Datei und Ordner-Ebene vergeben werden.<\/p>\n<h4>changelog<\/h4>\n<p><code>hithere (1.0-1) UNRELEASED; urgency=low<\/code><\/p>\n<p>* Initial release. (Closes: #XXXXXX)<\/p>\n<p>&#8212; Peter Hornik &lt;peter.hornik@stud.htwk-leipzig.de&gt; Fri, 20 Nov 2020 10:36:34 +0100<\/p>\n<p>Die changelog-Datei dient unter Anderem zur Dokumentation von Ver\u00e4nderungen am Paket. Sie gibt Nutzern Anhaltspunkte \u00fcber m\u00f6gliche Probleme die mit dem Paket bestehen. <code>hithere<\/code> ist dabei der Paket-Name, gefolgt von Version und Distribution, hier <code>UNRELEASED<\/code> was versehentliches Hochladen verhindert, f\u00fcr gew\u00f6hnlich w\u00fcrde man hier &#8222;unstable&#8220; eintragen. <code>Closes<\/code> bezieht sich auf einen Bug, der mit dem Release des Paketes gefixt wird.<\/p>\n<h4>rules<\/h4>\n<p><code>#!\/usr\/bin\/make -f<br \/>\n%:<br \/>\ndh $@<\/code><\/p>\n<p>override_dh_auto_install:<br \/>\n$(MAKE) DESTDIR=$$(pwd)\/debian\/hithere prefix=\/usr install<\/p>\n<p><code>rules<\/code> ist ein Makefile, welches als Vorlage automatisch erstellt werden kann und alle Targets an debian helper scripts weiterleitet. Hier kann die Installationsprozedur aus dem Makefile der zu paketierenden Software angepasst werden, was hier bez\u00fcglich des Installationsverzeichnisses gemacht wurde.<\/p>\n<h4>control<\/h4>\n<p>In <code>control<\/code> werden Informationen wie die angezeigte Paketbeschreibung, Abh\u00e4ngigkeiten und weitere gespeichert, die von Werkzeugen wie <code>apt-get<\/code> oder <code>aptitude<\/code> ben\u00f6tigt werden.<\/p>\n<h2>Hosting eines Debian-Repositorys<\/h2>\n<p>Ein Debian-Repo besteht aus zwei grundlegenden Bausteinen: Einem Server, \u00fcber den die Pakete verteilt werden und einer Software (<code>reprepro<\/code>), die eine Paketdatenbank und eine entsprechende Dateisystemstruktur statisch generiert. Ein solches Repository kann einer von zwei Kategorien zugeordnet werden. Entweder ist es ein Spiegelserver des offiziellen, distributionseigenen Repos. Das kann etwa gro\u00dfen Organisationen dabei helfen, Bandbreite f\u00fcr Systemupdates zu sparen und den Updateprozess an sich besser zu kontrollieren.<\/p>\n<p>Hier soll aber auf Repositories der zweiten Kategorie eingangen werden: Die <em>Private Package Archives<\/em>. Diese werden verwendet, um Software \u00fcber die distributionseigenen Werkzeuge zu installieren, die nicht in den offiziellen Softwarequellen angeboten wird.<\/p>\n<p>Ein solches Paket geht dabei \u00fcber drei Stationen: Zuerst vom Rechner des Entwicklers oder vom Build-Server aus auf den Repository-Server. Dort wird das Paket mithilfe von <code>reprepro<\/code> der Datenbank hinzugef\u00fcgt und dar\u00fcber hinaus \u00fcber <code>gpg<\/code> signiert. Das sorgt daf\u00fcr, dass das Paket auf dem Weg zum Rechner, auf dem die Software installiert werden soll, nicht manipuliert werden kann, da sich sonst die Signatur \u00e4ndern w\u00fcrde. Au\u00dferdem kann der Nutzer oder die Nutzerin festlegen ausschlie\u00dflich Pakete zu erlauben, die von einem Schl\u00fcssel signiert wurden, dem auch vertraut wird.<\/p>\n<p>Ist auf dem Repo-Server bereits ein Webserver korrekt installiert und konfiguriert, steht das Paket jetzt zum Download bereit. Um die Software nun \u00fcber die gewohnten Werkzeuge auf dem Zielrechner zu installieren und aktualisieren sind noch einige Konfigurationsschritte n\u00f6tig: Der Paketmanager muss informiert werden, dass dem Schl\u00fcssel des Repos vertraut werden kann, au\u00dferdem m\u00fcssen der Name und die URL des Repos hinterlegt werden. Jetzt kann das Paket ganz einfach installiert werden.<\/p>\n<h3>Beispiel<\/h3>\n<p>Eine einfache Beispieleinrichtung kann im <a href=\"https:\/\/gitlab.com\/htwk20-21\/package-management\/-\/tree\/master\/hosting\">Hosting<\/a>-Ordner unseres GitLab-Verzeichnisses zu diesem Projekt gefunden werden. Diese ist \u00fcber <code>docker-compose<\/code> mit zwei Containern realisiert. Zum Ausf\u00fchren des Servers m\u00fcssen die Container erst mit <code>docker-compose build<\/code> gebaut werden und dann mit <code>docker-compose up<\/code> gestartet werden.<\/p>\n<p>Der Server ist nun \u00fcber <a href=\"http:\/\/localhost:8080\">http:\/\/localhost:8080<\/a> zu erreichen. Die genaue Konfiguration kann hier auch eingesehen werden. Auf dem Client, der nun das entsprechende Paket installiert werden soll, m\u00fcssen nun erst die Dateien <em>key_pub.gpg<\/em> und <em>example-repo.list<\/em> heruntergeladen werden, die auch auf dem Server zu finden sind.<br \/>\nDie <em>.list<\/em>-Datei muss jetzt in den Ordner <code>\/etc\/apt\/sources.list.d\/<\/code> kopiert werden. Dadurch wei\u00df der Paketmanager, wo das Repo zu finden ist. Dann muss dem Schl\u00fcssel vertraut werden. Das erreicht man mit dem Befehl <code>apt-key add key_pub.gpg<\/code>. Nachdem der Paketcache erneuert wurde (<code>apt update<\/code>), kann das Paket jetzt mit <code>apt install hithere<\/code> installiert und danach mit <code>hithere<\/code> ausgef\u00fchrt werden.<\/p>\n<h2>Quellen<\/h2>\n<p><a href=\"https:\/\/wiki.debian.org\/Packaging\/Intro\">Debian Packaging Intro<\/a><br \/>\n<a href=\"https:\/\/www.debian.org\/doc\/manuals\/debian-reference\/ch02.en.html\">Debian Package Management<\/a><br \/>\n<a href=\"https:\/\/gitlab.com\/htwk20-21\/package-management\">GitLab-Projekt<\/a><\/p>\n<h2>Pr\u00e4sentation<\/h2>\n<p><a href=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2021\/02\/paketverwaltung.pdf\">Folien<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was sind Software-Pakete? Software-Pakete entstehen wenn Softwarebestandteile zusammengefasst werden und bestehen in einem einfachen Fall beispielsweise aus einer Archivdatei, welche<\/p>\n","protected":false},"author":35,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-545","post","type-post","status-publish","format-standard","hentry","category-betriebliche-informationssysteme"],"_links":{"self":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/545","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/comments?post=545"}],"version-history":[{"count":19,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/545\/revisions"}],"predecessor-version":[{"id":718,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/545\/revisions\/718"}],"wp:attachment":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/media?parent=545"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/categories?post=545"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/tags?post=545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}