Diplomarbeit herunterladen
Transcrição
Diplomarbeit herunterladen
Konzeption und Realisierung einer Paketverwaltung als Peer-to-Peer-Architektur Prototypische Umsetzung am Beispiel von BitTorrent Fachhochschule Brandenburg Fachbereich Informatik und Medien vorgelegt von Matthias Friese zum Erlangen des akademischen Grades Diplom-Informatiker (FH) 21. August 2008 1.Gutachter: Prof. Dr. Jörg Berdux 2.Gutachter: Prof. Dr.-Ing. Thomas Preuss Erklärung der Selbstständigkeit Hiermit versichere ich, die vorliegende Arbeit selbstständig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt sowie die Zitate deutlich kenntlich gemacht zu haben. Potsdam, den 21.08.2008 Matthias Friese Danksagung Ich möchte mich bei Prof. Dr. Jörg Berdux für das Übernehmen meiner Betreuung und mehrfachen Anmerkungen in den Vorabversionen bedanken. Ebenso möchte ich mich bei bei meinem 2. Betreuer bedanken, für die Anmerkungen in der letzten Vorabversion. Für das äußerst sorgfälltige Korrekturlesen bedanke ich mich bei meiner Mutter. Inhaltsverzeichnis 1 Einleitung 1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Ziel der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Gliederung der Arbeit . . . . . . . . . . . . . . . . . . . . . . . 2 Paketverwaltung 2.1 Einführung in Pakete . . . . . . . . . . . . . . . . . . 2.2 Debian Pakete . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Typen von Debian-Paketen . . . . . . . . . . 2.2.2 Kategorien von Debian-Paketen . . . . . . . . 2.2.3 Aufbau des Paketnamens . . . . . . . . . . . . 2.2.4 Versionsnummern bei Debian-Paketen . . . . . 2.2.5 Kontrollinformationen in einem Debian-Paket 2.3 Paketverwaltung . . . . . . . . . . . . . . . . . . . . 2.3.1 Paketdatenbank . . . . . . . . . . . . . . . . . 2.3.2 Verschiedene Paketverwaltungen . . . . . . . . 2.3.3 Debian Package Manager (dpkg) . . . . . . . 2.3.4 Advanced Packaging Tool (APT) . . . . . . . 2.3.5 Konfiguration Debian-Paketen . . . . . . . . . 2.3.6 Verwaltung geänderter Pakete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Peer-to-Peer 3.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1 Peer-to-Peer im Vergleich zu Web-Services . . . . . . 3.1.2 Unterschiedliche Arten von Peer-to-Peer-Netzwerken 3.1.3 Verteilte Hashtabellen am Beispiel von CAN . . . . . 3.1.4 Rechtliche Probleme in Peer-to-Peer-Netzwerken . . . 3.2 BitTorrent . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Fairness und Drosselung . . . . . . . . . . . . . . . . 3.2.2 Technische Funktionsweise . . . . . . . . . . . . . . . 3.2.3 Erweiterungen des BitTorrent-Protokolls . . . . . . . 3.2.4 BitExt - BitTorrent Bibliothek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 2 . . . . . . . . . . . . . . 3 3 4 5 5 6 6 7 12 13 13 14 18 19 23 . . . . . . . . . . 27 28 30 32 34 39 41 42 43 49 52 iv 4 Praxis 4.1 Zielsetzung . . . . . . . . . . . . . . . . 4.2 Konzeption . . . . . . . . . . . . . . . . 4.2.1 Konzept der Tracker-Anwendung 4.2.2 Konzept der Peer-Anwendung . . 4.3 Tests . . . . . . . . . . . . . . . . . . . . 4.3.1 Testaufbau . . . . . . . . . . . . 4.3.2 JUnit Tests . . . . . . . . . . . . 4.3.3 Tests an virtuellen Rechnern . . . Inhaltsverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 53 54 55 61 63 63 63 64 5 Zusammenfassung und Ausblick 65 5.1 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . 65 5.2 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 6 Literaturverzeichnis CD-Inhalt 67 v KAPITEL 1 Einleitung 1.1 Motivation Viele Linux-Distributionen sind von kompilierten Binärpaketen abhängig. Diese Binärpakete zu verteilen ist ein hoher Aufwand für die Betreiber der Distribution und für die Verwalter von Mirrorservern. Da einige diese Pakete sehr häufig heruntergeladen werden, entsteht dadurch ein hohes Aufkommen an Daten. Dieses Datenaufkommen lässt sich für den einzelnen Server durch die Verwendung von Peer-to-Peer-Mechanismen senken. Der Vorteil für den Nutzer soll in einer verkürzten Dauer des Herunterladens liegen. Linux Distributionen, die größere Änderungen mit einer neuen Version der Distribution bereitstellen, weisen ein Problem in den ersten Tagen nach Veröffentlichung der Version auf. Die Bandbreite, welche die Server bereitstellen reicht nicht aus, um ein zuverlässiges und schnelles Herunterladen der Dateien zu ermöglichen. Ein Beispiel dafür war das Herunterladen der Dateien der aktuellen Ubuntu Version 8.04 Mitte April. Das Herunterladen von ca. 1 GB an Dateien dauert über 6 Stunden, weil die Server so überlastet waren. Diese Überlastung lässt sich mit Peer-to-Peer-Mechanismen reduzieren. 1.2 Ziel der Arbeit Ziel dieser Arbeit ist es, Möglichkeiten der Verwendung von Peer-to-PeerMechanismen aufzuzeigen sowie autretende Probleme darzustellen. Dazu wird eine Software entwickelt, die Funktionen der Paketverwaltung in Linux-Distributionen implementiert und dazu Peer-to-Peer-Mechanismen für die Verteilung der Daten nutzt. 2 1 Einleitung Diese Arbeit soll die Grundlagen für die Entwicklung dieser Software vorstellen und die Konzeption erklären. Zur Bearbeitung dieser Arbeit sind drei Monaten vorgesehen. 1.3 Gliederung der Arbeit Die Arbeit ist in drei große Komplexe unterteilt. Der erste Abschnitt der Arbeit befasst sich mit den Grundlagen der Paketverwaltung. In diesem Abschnitt wird geklärt, was ein Paket ist und welche Funktionen einen Paketverwaltung erfüllt. Im speziellen wird auf die Paketverwaltung der Distribution Debian eingegangen. Im zweiten Teil der Arbeit wird der Themenkomplex der Peer-to-Peer-Technologien beleuchtet. Es wird erklärt, welche unterschiedlichen Arten von Peer-to-PeerNetzwerken es gibt sowie auf den rechtlichen Aspekt von Peer-to-Peer-Systemen eingegangen. Als Vertreter der Peer-to-Peer-Systeme wird das Protokoll von BitTorrent erklärt und die Möglichkeiten, die dieses Protokoll bietet, aufgezeigt. Der letzte Abschnitt der Arbeit stellt die praktische Umsetzung vor. In diesem Bereich werden die Konzeption und die verwendeten Werkzeuge erklärt. Die Konzeption wird für die zwei Teilbereiche des Peers und der Trackeranwendung getrennt betrachtet. KAPITEL 2 Paketverwaltung In diesem Kapitel werden die Grundlagen der Paketverwaltung erläutert. Da die Implementierung für debian-basierte Distributionen des Betriebssystems Linux durchgeführt wurde, wird auf die Debian-Paketverwaltung intensiver eingegangen. Zu Beginn des Kapitels wird erläutert, was ein Paket ist, welche Informationen ein Paket enthält und wie diese Pakete klassifiziert werden. Im weiteren Verlauf wird auf die verschiedenen Debian-Pakete eingegangen sowie auf deren Verwaltung. 2.1 Einführung in Pakete Ein Paket ist eine Software in gepackter Form und den dazu gehörigen Konfigurationsdateien, die für die Installation notwendig sind. Zu den Angaben, die ein Paket enthält, gehören mindestens: • eindeutiger Name • Versionsnummer • Maintainer1 • Installationszustand 1 „Maintainer: der zuständige Entwickler eines Softwarepakets. Er ”wartet” seine Pakete, korrigiert Fehler usw.“[Gl05] 4 2 Paketverwaltung Der Maintainer ist dann wichtig, wenn es zu einem Problem mit einem Paket kommt. Der Installationszustand dient der Verwaltung der installierten Software, um ein Update durchführen zu können. Welche Angaben zu einem Paket unter Debian dafür vorgesehen sind, wird in 2.3.3 betrachtet. Pakete werden in der Verwaltung mittels eines eindeutigen Namens und der Versionsnummer identifiziert. Versionsnummern Eine Versionsnummer setzt sich aus mehreren Komponenten zusammen. <Hauptversionsnummer>.<Nebenversionsnummer>.<Revisionsnummer><Buildnummer>. Die Hauptversionsnummer gibt signifikante Änderungen an der Software an, während die Nebenversionsnummer funktionale Erweiterungen beschreibt. Die Revisionsnummer steht für Fehlerbehebungen, die durchgeführt wurden. Die Nebenversionsnummer und Revisionsnummer werden bei einer neuen Hauptversionsnummer zurückgesetzt. Die Buildnummer wird fortlaufend vergeben und gibt den Fortschritt der Entwicklung in einzelnen Schritten an.1 Die Versionsnummer ist für den Updateprozess wichtig. Dadurch kann festgestellt werden, ob ein neueres Paket als das installierte im Packetarchiv des Betriebssystems eingetragen ist. Dieser Vergleich wird mittels lexikografischer Vergleichsmethoden durchgeführt. Wie dieser Vergleich bei Debian implementiert ist, wird im Punkt 2.3.4 aufgezeigt. 2.2 Debian-Pakete Die nachfolgenden Punkte dieses Kapitels wurde auf der Grundlage des Buches [Kr06] erstellt. Debian nutzt für das Verwalten von Paketen ein Werkzeug namens dpkg, den Debian Package Manager. Ein Debian-Paket besitzt ein eigenes Dateiformat, welches die Endung .deb hat. Dieses Dateiformat ist ein binäres Format, welches ein Standard Unix ar-Archiv ist. Dieses Archiv bündelt mehrere Dateien zu einer Datei. 1 vgl. [Ve] Wikipedia Versionsnummer vom 07.08.2008 um 10:08Uhr 2.2 Debian Pakete 5 Eine .deb-Datei enthält folgende Dateien: Die Datei „debian-binary“ enthält die Versionsnummer und kennzeichnet es als Debian-Paket. Die Datei „control.tar.gz“ ist eine komprimierte Datei mit den Kontrollinformationen. Die Datei „data.tar.gz“ ist ebenfalls komprimiert und enthält die Programmdateien, die im Wurzelverzeichnis gespeichert werden. 2.2.1 Typen von Debian-Paketen Die Debian-Pakete lassen sich in zwei unterschiedliche Typen einteilen. Der erste Typ ist ein Binärpaket. Es enthält die ausführbaren Dateien, Dokumentationen, Konfigurationsdateien sowie Copyright-Informationen. Pakete können auch nur die Copyright-Informationen enthalten, sie werden dann Metapakete oder virtuelle Pakete genannt und dienen ausschließlich der Auflösung von Abhängigkeiten. Sie stellen eine Gruppe von Paketen dar, wovon eines installiert sein muss, um die Abhängigkeit zu erfüllen. Der zweite Typ ist ein Quellpaket. Das Quellpaket besteht aus drei Dateien. Die .dsc-Datei beschreibt das Paket und gibt die Dateinamen der anderen beiden Dateien an. Die zweite Datei enthält den originalen Quellcode der zu installierenden Software. In der dritten Datei sind die Änderungen des originalen Quellcodes enthalten, die benötigt werden, um ein Debian-Paket zu erstellen. In diesen Änderungen sind z. B. Pfadanpassungen enthalten. 2.2.2 Kategorien von Debian-Paketen Debian unterteilt die Pakete in unterschiedliche Kategorien. Die Kategorien dienen einer Einordnung der einzelnen Pakete zu Funktionsgruppen. 6 2 Paketverwaltung Kategorie Beschreibung admin administrative Werkzeuge base das Debian-Grundsystem comm Programme für Faxmodems und andere Kommunikationsgeräte devel Software-Entwicklung doc Dokumentation editors Editoren und Textverarbeitung electronics Programme für Schaltkreise und Elektronik embedded Programme für eingebettete Systeme games Spiel & Spaß gnome der GNOME-Desktop graphics Anzeigen und Bearbeiten von Bildern Tabelle 2.1: Übersicht der Kategorien nach Debianrichtlinie [Kr06] S.141 (Auszug) 2.2.3 Aufbau des Paketnamens Der Name eines Debian-Paketes besteht aus drei Teilen. Der erste Teil ist der Name, der zweite Teil die Versionsnummer und der dritte Teil die Architektur, für die das Paket vorgesehen ist. Bei der Architektur gibt es die Möglichkeit „all“ einzusetzen, was bedeutet, dass das Paket für alle Architekturen geeignet ist. Für die Paketverwaltung ist der Name der Datei uninteressant, da in den Kontrolldaten diese Informationen enthalten sind.(siehe 2.2.5) Ein korrekt gesetzer Paketname erleichtert dem Nutzer die Identifikation eines Paketes. 2.2.4 Versionsnummern bei Debian-Paketen Die Versionsnummern ist der zweite Teil des Paketnamens und wird nach einem festgelegten Schema vergeben. Dieses Schema findet sich in den DebianRichtlinien wieder. Die Debian-Richtlinien stellen ein zentrales Regelwerk bereit, welches z. B. Regeln für die Entwicklung von Software für Debian-Systeme definiert. Eine Versionsnummer hat folgenden Aufbau: [epoch :] sof tware_version [−debian_revision] 2.2 Debian Pakete 7 Die Angaben in den eckigen Klammern sind optional. Das Epochenfeld dient der Korrektur der Versionsnummer. An einem Beispiel wird klarer, was gemeint ist. Ein Entwickler hat bereits 2 Versionen seiner Software freigegeben. Die zweite Version besitzt die Versionsnummer 2. Bei der dritten Version soll ein “sauberes” Versionssystem zum Einsatz kommen und er nennt diese Version 1.0. Die Debian-Paketverwaltung würde diese Versionsnummer als früher einstufen als die Versionsnummer 2. In diesem Fall wird das Epochenfeld erhöht, um der Paketverwaltung zu signalisieren, dass dies eine neuere Version ist. In einigen Fällen ist das Epochenfeld nicht notwendig. Bei postfix-Paketen wurde z. B. bis 2002 das Datum in der Versionsnummer verwendet. In diesen Fällen wurde eine 0.0 dem Datum vorangestellt. Eine Versionsnummer hatte folgenden Aufbau „0.0.20011217.SNAPSHOT-1“. 2002 wurde die Versionsnummer 1.0 eingeführt. Es war keine Anpassung mittels Epochenfeld notwendig, weil der lexikografische Vergleich ergibt, das 1.0 > 0.0.20011217-SNAPSHOT-1 ist. Mittels der Paketverwaltung von Debian kann der Versionsnummernvergleich1 nach den oben genannten Regeln durchgeführt werden, im Exitcode wird codiert, ob die Anfrage zutreffend ist. 2.2.5 Kontrollinformationen in einem Debian-Paket Das Debian-Paketformat kennt unterschiedliche Kontrolldateien, notwendig ist aber nur die control -Datei. Schlüsselwort Beschreibung control enthält Abhängigkeiten und Informationen conffiles Änderungen des Nutzers werden beibehalten preinst wird vor Installation ausgeführt postinst wird nach Installation ausgeführt prerm wird vor Entfernung oder vor Upgrade ausgeführt postrm nach Entfernung oder fehlerhafter Installation md5sums Prüfsummen aller Dateien, die installiert wurden shlibs Bilbliotheken und SONAME2 config Abfrage der Konfigurationsparameter vom Nutzer templates enthält Texte für debconf3 Tabelle 2.2: Kontrollinformationen für dpkg [Kr06] S.147f 1 dpkg –compare-versions 1.0-0+1.0rc1+2 lt 1.0-1 && echo yes 8 2 Paketverwaltung control-Datei Die control -Datei liegt in jedem Paket und stellt die Informationen für die Paketdatenbank bereit. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Package : a p a c h e 2 .2 −common V e r s i o n : 2.2.3 −4+ e t c h 4 S e c t i o n : web Priority : optional Architecture : i386 Depends : apache2−u t i l s , net−t o o l s , l i b m a g i c 1 , mime−s u p p o r t , l s b −b a s e , p r o c p s C o n f l i c t s : apache2−common , l i b a p a c h e 2 −mod−php5 (<= 5 . 1 . 6 − 3 ) , l i b a p a c h e 2 −mod−php4 (<= 4 : 4 . 4 . 4 − 2 ) , l i b a p a c h e 2 −mod−mime−x a t t r (<= 0.3 −2) , l i b a p a c h e 2 −mod−mono (<= 1 . 1 . 1 7 − 3 ) , l i b a p a c h e 2 −mod−proxy−html (<= 2 . 4 . 3 − 2 ) , l i b a p a c h e 2 −mod−s c g i (<= 1.11 −1) , l i b a p a c h e 2 − mod−s p e e d y c g i (<= 2.22 −3) , l i b a p a c h e 2 −m o d x s l t (<= 2005072700 −1) , l i b a p a c h e 2 − r e d i r t o s e r v e r n a m e (<= 0.1 −1) , l i b a p a c h e 2 −webauth (<= 3 . 5 . 3 − 1 ) , l i b a p a c h e 2 −webkdc (<= 3.5.3 −1) R e p l a c e s : apache2−common I n s t a l l e d −S i z e : 3276 M a i n t a i n e r : Debian Apache M a i n t a i n e r s <d e b i a n −a p a c h e @ l i s t s . d e b i a n . org> Source : apache2 D e s c r i p t i o n : Next g e n e r a t i o n , s c a l a b l e , e x t e n d a b l e web s e r v e r Apache v2 i s t h e n e x t g e n e r a t i o n o f t h e o m n i p r e s e n t Apache web s e r v e r . T h i s v e r s i o n − a t o t a l r e w r i t e − i n t r o d u c e s many new improvements , s u c h a s t h r e a d i n g , a new API , IPv6 s u p p o r t , r e q u e s t / r e s p o n s e f i l t e r i n g , and more . . I t i s a l s o c o n s i d e r a b l y f a s t e r , and can be e a s i l y e x t e n d e d t o p r o v i d e s e r v i c e s o t h e r than h t t p . . T h i s p a c k a g e c o n t a i n s a l l t h e s t a n d a r d a p a c h e 2 modules , i n c l u d i n g SSL s u p p o r t . However , i t d o e s ∗ n o t ∗ i n c l u d e t h e s e r v e r i t s e l f ; f o r t h i s you need t o i n s t a l l one o f t h e apache2−mpm−∗ p a c k a g e s ; s u c h a s w o r k e r o r p r e f o r k . Listing 2.1: Relationen des Pakets apache2.2-common aus der control-Datei Zu den wichtigsten Zeilen gehört die „section“ in Zeile drei, um den Bereich in der Paketstruktur filtern zu können.1 Die Paketstruktur ist für das Herunterladen der Pakete wichtig, um den Pfad auf dem Server generieren zu können. Weiterhin sind das package in Zeile eins und die depends in Zeile sechs wichtig. Zur Vermeidung von Konflikten muss vor der Installation überprüft werden, ob eines der Pakete aus dem Bereich conflicts installiert ist. Wenn ein Paket installiert ist, wird die Installation abgebrochen. Dieser Konflikt ist durch den Nutzer zu lösen. Der Bereich des Ersetzens ist wichtig, um dieses Paket zu entfernen und das neue Paket installieren zu können. Das Paket wird zusätzlich in die Zeile der Konflikte aufgenommen. Dpkg wertet diese Informationen für jedes Paket aus und nimmt sie in die Paketdatenbank auf. 1 vgl. [Ro] Debian Anwenderhandbuch 2.2 Debian Pakete Schlüsselwort Beschreibung Depends Ein Paket, welches in diesem Feld aufgeführt ist, muss installiert und konfiguriert sein, bevor das zu installierende Paket konfiguriert werden kann. Dies ist eine strikte Abhängigkeit. Recommends Dieses Paket wird empfohlen, ist aber nicht notwendig, schränkt jedoch die Funktionalität ein. Das Beispiel des Mediaplayers xmms verdeutlicht den Zusammenhang. Xmms funktioniert auch ohne eine SoundsystemSchnittstelle, besitzt aber eine eingeschränkte Funktionalität, sodass kein Ton bei der Wiedergabe von Filmen ausgegeben wird. Suggests Pakete, die in suggests gelistet werden, erweitern die Funktionalität eines Programms. Am Beispiel von xserver-common ist dies die Schrift. Der xserver benötigt keine Font-Dateien, jedoch lassen sie die Ausgabe qualitativ hochwertiger erscheinen als dies mit Pixelschrift in niedriger Auflösung möglich ist. Enhances Ist das Gegenstück zu suggests. Ziel ist es, einen Vorschlag zu unterbereiten, ohne die control-Datei des Pakets zu ändern, für das es vorgeschlagen wird. Ein Beispiel wäre libapche-mod-dav enhances apache. Dies ist ein fiktives Beispiel. Enhances ist zwar in der Spezifikation vorgesehen, wird aber nicht von allen Frontends der Paketverwaltung unterstützt, apt unterstützt dies nicht. Provides Ein Paket bietet eine Funktionalität für ein anderes an. Das Paket at benötigt die Funktion Mail-Transport-Agent, welche sowohl von dem Paket postfix als auch von den Paketensendmail und exim4 angeboten wird. Zur Installation von at ist es erforderlich, dass eines dieser Pakete installiert ist. Conflicts Pakete, die in conflicts stehen, können nicht parallel installiert werden, da es z. B. Dateikollisionen verursacht. Replaces Ein Paket wurde als Ersatz für ein anderes ins Repository aufgenommen. Ein Beispiel dafür ist in der Datei über dieser Erklärung zu finden, apache2.2-common ersetzt dabei apache2-common. 9 Tabelle 2.3: Relationen zwischen Paketen(vgl. [Kr06, S.230f]) Die Relationen zwischen den Paketen werden durch die Angabe der Versionsnummer vervollständigt. Die dort üblichen Angaben sind „=“, „<“, „>“ und Kombinationen dieser. Eine Schwierigkeit ist es, die Abhängigkeiten für die Paketdatenbank zu ermitteln. Zur Lösung dieses Problems gibt es im Abschnitt 3.5 der Debian-Richtlinien folgende Festlegung: „ jedes Paket muss die Abhängigkeitsinformationen zu anderen Paketen angeben, die für dieses erforderlich sind, damit es korrekt 10 2 Paketverwaltung arbeitet“1 Das heißt, der Paketbetreuer muss die nötigen Pakete heraussuchen und in die control-Datei eintragen. Es gibt nun zwei Wege, wie Debian versucht dieses Problem für den Paketbetreuer zu lösen. Einerseits existieren für einige Sprachen spezialisierte Anweisungen, wie z. B. die Perl-Richtlinien2 . Andererseits gibt es spezielle Paketbetreuerwerkzeuge, die dafür sorgen, dass die Debian-Richtlinien eingehalten werden. Eines dieser Werkzeuge ist das shlibs-System. Dieses Werkzeug ermittelt automatisch Paketzusammenstellungen, welche die Bibliotheksabhängigkeiten einer Software erfüllen. In Kombination mit dem Werkzeug ldd wird die Zahl der Debian-Pakete auf ein Minimum reduziert. So erhält der Paketbetreuer einen Anhaltspunkt, welche Pakete mindestens notwendig sind, um dieses Paket installieren zu können. Shlibs überprüft jedoch nur die dynamischen Bibliotheken, die genutzt werden. Eine komplette Überprüfung des gesamten Quellcodes auf mögliche Aufrufe von Funktionen aus anderen Paketen ist zurzeit nicht möglich. Zusammenfassend kann man feststellen, dass eine Software von einer Vielzahl von Paketen abhängt ohne die sie nicht funktioniert. Pakete, die diese Funktionalität noch erweitern, können nur vorgeschlagen oder empfohlen werden. Die Frage nach der effektiven Verwaltung der Abhängigkeiten lässt sich am besten an einem Beispiel beantworten. Als Beispiel dient das Paket isdnutils, welches einen ISDN-Router bereitstellt. Isdnutils besitzt mehrere Eingabemethoden. Eine Eingabemöglichkeit ist die Konsole, eine andere ist die grafische Oberfläche. Werden die beiden Eingabemöglichkeit in einem Paket vereinigt, muss das Paket xserver als Voraussetzung aufgenommen werden. Dies ist unpraktisch für Systeme, die keine grafische Oberfläche benötigen. Dies führt zu einer Splittung des Pakets in zwei Pakete. Die Splittung wird in isdnutils und in isdnutils-xtools vorgenommen. So wird in isdnutils die Abhängigkeit zu einem X-Server vermieden während isdnutils-xtools diese Abhängigkeit besitzt. Prioritäten Die Priorität ist eine Gewichtung einer Aufgabe nach zeitlicher oder bedeutungsgemäßer Dringlichkeit. Dazu werden bei Debian die Pakete mit unterschiedlichen Prioritäten versehen. Diese legen fest, welche Pakete installiert werden müssen und welche Pakete optional installiert sein können. Es kann hilfreich sein 1 2 http://www.debian.org/doc/debian-policy/ch-binary.html#s3.5 Debianrichtlinien zu Abhängigkeiten http://de.debian.org/doc/packaging-manuals/perl-policy 2.2 Debian Pakete 11 ein Paket einer niedrigeren Priorität zu installieren, um die Oberfläche bedienerfreundlicher zu gestalten. Die Debian-Richtlinien sehen 5 Prioritäten vor: Priorität Beschreibung required muss installiert werden, damit das System läuft important Minimum an notwendigen Packeten standard die Debian minimal Installation optional können wahlweise installiert werden, z.B. das X-Window-System; dürfen untereinander keine Konflikte aufweisen extra für spezielle Anforderung; dürfen mit anderen Packeten dieser Priorität kollidieren Tabelle 2.4: Prioritäten von Paketen [Kr06] S.142f Die Prioritäten haben folgenden Hintergrund, ein Paket darf keine Abhängigkeit zu einem Paket aufweisen, welches in einer unter dem Paket liegenden Priorität eingeordnet wurde. Eine weitere Bedeutung haben Prioritäten bei der Erstellung eines neuen Releases. Die Pakete der höheren Kategorien werden zuerst „eingefroren“, damit die Pakete der niedrigeren Priorität noch Zeit haben, sich gegen die Version in der höheren Priorität zu stabilisieren. Statusinfomationen eines Pakets Zur Verwaltung führt dpkg eine eigene Datenbank, in der die Statusinformationen zum jeweiligen Paket abgelegt werden. Ein Paket besitzt einen Paketstatus sowie einen Paketauswahlstatus. Der Paketstatus beinhaltet den Fortschritt der Installation eines Paketes 12 2 Paketverwaltung Paketstatusinformationen Paketstatus Beschreibung installed Paket ist entpackt und konfiguriert half-installed Installation wurde gestartet, aber nicht korrekt beendet not-installed Paket ist nicht installiert unpacked entpackt aber nicht konfiguriert halfconfigured Paket wurde entpackt und die Konfiguration gestartet, aber nicht beendet config-files nur Konfigurationsdateien vorhanden Tabelle 2.5: Übersicht der Paketstatusinformationen laut Man Page von dpkg[Ma08] Der Paketauswahlstatus definiert die gewünschte Aktion, die mit einem Paket durchgeführt werden soll. Paketauswahlstatusinformationen Paketauswahlstatus Beschreibung install Paket soll installiert werden deinstall Paket soll deinstalliert werden, Konfigurationsdateien bleiben erhalten purge deinstall mit löschen der Konfigurationsdateien Tabelle 2.6: Übersicht der Paketauswahlinformationen laut Man Page von dpkg[Ma08] 2.3 Paketverwaltung Zu den Aufgaben einer Paketverwaltung gehört es, eine Liste aller installierten Pakete zu führen, ein Paket zu installieren bzw. zu entfernen sowie das Updaten von Paketen.1 Eine weitere Funktion der Paketverwaltung ist, dass die Konfiguration der zu installierenden Pakete übernommen wird. Diese Konfigurationsskripte heißen meistens pre- bzw. postinst. Eine weitere Aufgaben ist es, bei einem Update eines Paketes, welches eine geänderte Konfiguration enthält, die Änderungen zu erhalten und die ungeänderten Teile der Konfiguration mit der neuen Konfigurationsdatei zusammenzuführen. Eine Paketverwaltung sollte auch in der Lage sein, ein installiertes Paket wieder vollständig zu entfernen 1 vgl. [Pa08] Wikipedia Artikel zu Paketverwaltung vom 15.06.2008 um 16:40 Uhr 2.3 Paketverwaltung 13 ohne die Dateien zu löschen, welche die Daten enthalten. 2.3.1 Paketdatenbank Die Paketdatenbank dient der Verwaltung der Informationen aus den Kontrolldateien der einzelnen Pakete und führt die Liste der installierten Pakete. Die Paketdatenbank wird zurzeit noch in Dateien gehalten, die sich in dem Verzeichnis /var/lib/dpkg befinden. Die gesamte Datenbank ist über mehrere Dateien verteilt. Folgende Informationen sind in der Paketdatenbank zu finden: Datei Beschreibung status Die Information, ob ein Paket installiert ist oder war info Unterhalb des Ordners info wird für jedes Paket eine Liste der installierten Dateien und Konfigurationsdateien geführt, in der auch die Konfigurationsskripte, MD5-Summen der installierten Dateien und debconf-Daten abgelegt werden available Stellt eine Liste alle verfügbaren Pakete bereit Tabelle 2.7: Paketdateien 2.3.2 Verschiedene Paketverwaltungen Bevor auf die Paketverwaltung von Debian eingegangen wird, soll eine kleine Übersicht über andere Paketverwaltungen gegeben werden. Einige Paketverwaltungen sind der RPM Package Manager (früher Red Head Package Manager), Debian Package Manager und die ebuilds von Gentoo. Der Nutzer hat nicht die Wahl, welches Paketverwaltungswerkzeug er einsetzen möchte, er muss das nutzen, was ihm seine Distribution zur Verfügung stellt. Da die Programme in Linux-Distributionen nicht als monolithischer Block installiert werden, müssen Paketverwaltungswerkzeuge überprüfen, welche Abhängigkeiten zwischen den einzelnen Paketen bestehen und diese auflösen. Da die Paketverwaltungen das Installieren von abhängigen Paketen nicht automatisch vornehmen, werden dafür Frontends benötigt, die diese Programme steuern und ihnen die Pakete an der gewünschten Stelle bereitstellen. Erst diese Frontends können Pakete von einer Quelle nachladen. Diese Quellen sind in der Regel DVD, ftp- und Web-Server. Jede Paketverwaltung besitzt ihr eigenes Binärformat, diese Formate sind nicht zueinander kompatibel, können aber mit speziellen Werkzeugen konvertiert werden [Ki08]. 14 2 Paketverwaltung 2.3.3 Debian Package Manager (dpkg) Die Aufgaben der Debian-Paketverwaltung bestehen darin, die Pakete zu installieren bzw. wieder zu entfernen, die Konfiguration der Pakete vorzunehmen und in der Verwaltung der installierten Pakete. Dpkg ist nicht in der Lage Pakete für ein Update vorzuschlagen. Es gibt unterschiedliche Frontends für dpkg. Einige sind dselect, apt-get und console-apt. Dpkg selbst ist nicht in der Lage, Abhängigkeiten zwischen Paketen aufzulösen. Diese Funktionalität bieten aber die eben genannten Frontends. Seit der Debian Versionsnummer drei gibt es sehr komfortable Frontends wie Aptitude und Synaptic.1 Installation von Paketen Ein wichtiger Punkt bei der Installation von Paketen wird durch die DebianRichtlinien definiert. Laut dieser Regel darf bei der Installation eines Paketes nie eine Datei, die von einem anderen Paket installiert wurde, überschrieben werden. Dies soll dazu führen, dass das System immer in einem konsistenten Zustand gehalten wird. Sollte ein Paket gegen eine Richtlinie verstoßen, so wird dieser Verstoß als schwerer Fehler markiert und das Paket kann nicht in das Stable-Release aufgenommen werden. Sollte ein Paket, obwohl es einen solchen Fehler aufweist, ins Stable-Release aufgenommen worden sein, wird dieser Fehler schnellstmöglich in einer neuen Version behoben.(vgl. [Kr06, S.223f]) Um zu definieren welche Datei in welchen Verzeichnissen gespeichert werden sollen und das Überschreiben von Dateien zu verhindern wurde ein Standard definiert. Dieser Standard ist der „Filesystem Hierarchy Standard“2 kurz „FHS“. Um der Forderung aus den Debian-Richtlinien nachzukommen, dass zwei unterschiedliche Pakete nicht den gleichen Dateiname innerhalb des Pakets besitzen dürfen, schlägt der FHS vor, Programmunterverzeichnisse unter /usr/share und /usr/lib anzulegen. Dies wird z. B. bei der Installation des Programmes gimp durch das programmspezifische Unterverzeichnis /usr/share/gimp realisiert. 1 2 vgl. [Dp08] Wikipedia Artikel zu dpkg am 15.06.2008 um 15:02 Uhr [FH04] 2.3 Paketverwaltung 15 Abbildung 2.1: Installation eines Paketes Dpkg installiert ein Paket in neun Schritten(siehe Abbildung 2.1) Es beginnt die Entpackungsphase, die sich wiederum in mehrere Schritte unterteilt. Zuerst überprüft es, ob die angegebene Datei eine Debian-Paket-Datei ist, in dem es die debian-binary Datei prüft. Wenn die Datei existiert und die Checksumme des Paketes mit der Checksumme in der Datei übereinstimmt, werden die Konfigurationsskripte in ein temporäres Verzeichnis entpackt.1 Wenn das preinst-Skript vorhanden ist, wird es als nächstes ausgeführt. Dann werden die Konfigurationsdateien an ihre Stellen in dem Verzeichnis /etc kopiert und mit der Endung .dpkg-new versehen. Nun wird die Datei data.tar.gz in das Wurzelverzeichnis / entpackt. Da sich die Dateien an ihrem definierten Ort befinden und den Kontrolldateien noch der Paketname vorran gestellt ist, wird der Status des Pakets in der dpkg-Datenbank auf entpackt gesetzt. 1 temporäres Verzeichnis: /var/lib/dpkg/tmp.ci 16 2 Paketverwaltung Nach dem Entpacken des Pakets startet dpkg die Konfigurationsphase. Die Konfigurationsphase lässt sich wieder in einzelne Schritte aufteilen. Wenn eine Konfigurationsdatei bereits vorhanden ist, fragt dpkg den Nutzer, ob diese Datei erhalten werden oder gegen eine Datei des Paketes ausgetauscht werden soll. Als nächster Schritt wird ein vorhandenes postinst-Skript abgearbeitet. Das Konfigurationsskript fragt die Einstellungen vom Nutzer ab und führt die Änderungen am System durch, kann Nutzer anlegen oder Dienste starten. Zum Schluss setzt dpkg den Status des Pakets auf installiert.(vgl. [Kr06, S.154]) Entfernen von Paketen Auch für das Entfernen von Paketen existieren Regeln, die zu beachten sind. Laut der „Debian-Richtlinien“[De08] wird dem Paketverwaltungswerkzeug ein Verhalten auferlegt, wie es sich zu verhalten hat, wenn Pakete gelöscht werden sollen oder ein Update eines Paketes vorgenommen werden soll. In Abschnitt 10.7.3 der Debian-Richtlinien[De08] steht dazu folgendes: „Configuration file handling must conform to the following behavior: • local changes must be preserved during a package upgrade, and • configuration files must be preserved when the package is removed, and only deleted when the package is purged.“ Dpkg ist für die Einhaltung dieser Richtlinien verantwortlich. Es wird aber dem Administrator des Systems überlassen, ob er eine lokale Konfigurationsdatei ersetzten oder löschen möchte.(vgl. [De08]) 2.3 Paketverwaltung 17 Abbildung 2.2: Entfernen eines Paketes Das Entfernen von Paketen findet bei dpkg in vier Schritten statt.(siehe Abbildung 2.2) 1. Ein vorhandenes prerm-Skript wird ausgeführt. 2. Alle Dateien aus dem System werden entfernt. 3. Die Kontrolldateien aus dem Verzeichnis /var/lib/dpkg/info werden gelöscht, bis auf postrm und .files.1 .files wird auf die noch vorhandenen Konfigurationsdateien reduziert. 4. Der Status des Pakets wird in remove bzw. purge geändert Dpkg besitzt noch zwei andere Programme, dass eine zum Manipulieren von deb-Dateien nennt sich dpkg-deb und das andere dient dem Zugriff auf die dpkg-Datenbank und heißt dpkg-query. Da diese Funktionen aber auch von dpkg angeboten werden, sind diese selten von Belang. Dpkg kapselt diese Funktionen 1 .files verwaltetet die installierten Dateien eines Pakets 18 2 Paketverwaltung und ruft dann die entsprechenden Programme auf. Zusammenfassend bleibt zu sagen, dass dpkg vier Aufgabenkomplexe abdeckt([Kr06, S.149]). • .deb-Dateien betrachten und bearbeiten • Pakete installieren • die Paketverwaltungsdatenbank abfragen • Pakete entfernen 2.3.4 Advanced Packaging Tool (APT) Das Advanced Packaging Tool ist ein Frontend von dpkg, welches nicht nur die Funktionen von dpkg nutzt, sondern diese sogar erweitert. Dpkg kann z. B. keine abhängigen Pakete selbst installieren, sondern wirft einen Fehler aus. Darüber hinaus sucht dpkg nicht das konkrete Paket zu einem Paketnamen. Das ist eine Funktion von APT. Eine weitere Erweiterung ist, dass dpkg die Pakete in der richtigen Reihenfolge benötigt werden, während bei APT die Reihenfolge bedeutungslos ist. Es installiert die Pakete in der Reihenfolge, wie es von den Abhängigkeiten notwendig ist. APT erstellt dazu einen gerichteten Graphen Abbildung 2.3: Teil eines Abhängigkeitsbaums des Pakets abcde1 Die unterschiedlichen Symbole stellen die unterschiedlichen Relationen dar. Ein Rechteck steht für ein „normales“ Paket, ein Dreieck ist ein virtuelles Paket. Rauten sind normale Pakete, deren Funktion aber auch durch andere Pakete bereitgestellt werden, z. B. wget wird auch durch die Kombination von wget-ssl und libssl bereitgestellt. Sechseckige Rahmen stehen für nicht verfügbare Pakete. Helle Rahmen weisen auf Pakete hin, die apt-cache nicht weiter auflösen soll. Grüne Linien deuten auf Konflikte hin und schwarze Linien sind aufgelöste Abhängigkeiten.(vgl. [Kr06, S.179]) 2.3 Paketverwaltung 19 APT stellt Mechanismen bereit, um anhand der Versionsnummer feststellen zu können, ob ein Paket einem Upgrade unterzogen werden muss. Dazu wird der String der installierten Versionsnummer mit dem String des Paketes in der Paketdatenbank lexikografisch verglichen. 2.3.5 Konfiguration Debian-Paketen Um Pakete unter Debian konfigurieren zu können, existiert ein Werkzeug namens debconf. Debconf dient als Schnittstelle zwischen den Konfigurationsskripten und dem Benutzer des Systems. Die Aufgabe besteht darin, Informationen, die während der Erstellung des Paketes nicht bekannt sind, vom Nutzer zu erfragen, zwischenzuspeichern und diese während der Laufzeit an die Konfigurationsskripte weiterzugeben. Ziel ist die Konfigurationsprozesse von den Benutzerdialogen zu trennen. Damit debconf korrekt funktioniert werden im Paket zwei Dateien benötigt. Diese zwei Dateien sind die Templates-Datei und die Konfigurationsskriptdatei (siehe Liste 2.2). In dem Konfigurationsskript wird definiert, wann und unter welchen Bedingungen debconf gestartet wird und welche Fragen an den Nutzer gestellt werden. Da debconf das Paket nicht konfiguriert, benötigt man für diese Aufgabe das postinst-Skript. Dazu ruft das postinst-Skript das Konfigurationsskript auf, um die Antworten auf die Fragen die debconf stellt, zu kennen. Erst dann kann postinst die Datenbank abfragen, in der Antworten abgelegt sind, und die Werte des Benutzers in die Konfigurationsdateien übernehmen. Das Konfigurationsskript kann aber auch zu anderen Zeitpunkten gestartet werden als im postinst-Skript definiert. Apt kann bei installiertem apt-utils mittels Hooks1 debconf vor dem eigentlichen Entpacken und Konfigurieren starten. Dies ist für Administratoren sehr praktisch, da sie am Anfang alle Fragen beantworten können und der Vorgang ohne weitere Eingaben läuft. Auch bei den Fragen von debconf gibt es unterschiedliche Prioritäten. Die Priorität für jede einzelne Frage ist in dem Konfigurationsskript hinterlegt. 1 Möglichkeit zu bestimmten Phasen eigene Befehle ausführen zulassen, z. B. „Pre-Invoke“ das vor dem Ausführen von dpkg erst das /usr schreibbar macht 20 2 Paketverwaltung Debconf kennt die folgenden vier Prioritäten Priorität Beschreibung critical Müssen allen Benutzern gestellt werden und von diesen auch beantwortet werden; betreffen wichtige Einstellungen, die nur der Administrator kennt. high Sollten von Systemadministratoren beantwortet werden z.B. der main_mailer_type von postfix, wenn die Distribution ungleich Ubuntu ist medium Standardfragen mit Vorgabewerten müssen also nur beantwortet werden, wenn die Vorgabe nicht stimmt, z. B. der main_mailer_type von postfix, wenn Ubuntu verwendet wird low Es gibt Standardwerte, die fast immer stimmen, z. B. “für welche weiteren Rechner möchten Sie E-Mails in postfix akzeptieren?” Tabelle 2.8: Prioritäten von Paketen Die Standardeinstellung eines Debiansystems liegt bei der Priorität high. Dem Nutzer werden nur Fragen der Prioritäten high und critical angezeigt. Welche Fragen dem Nutzer gestellt werden, kann durch die temporäre Einstellung der Priorität in der Umgebungsvariablen $DEBIAN_PRIORITY geändert werden. Template: postfix/destinations Type: string Description: Other destinations to accept mail for? (blank for none) Give a comma-separated list of domains that this machine should consider itself the final destination for. If this is a mail domain gateway, you probably want to include the top-level domain. Description-ca.UTF-8: Altres destinacions per a les quals s’accepta correu? (deixeu-ho en blanc per a cap) Introduïu una llista, separada per comes, de dominis pels quals aquesta màquina serà considerada el destinatari final. Si aquesta és una passarel·la del domini de correu, probablement vulgueu incloure també el domini de nivell superior. Description-cs.UTF-8: Další místa, pro která přijímat poštu? (nebo ponechte prázdné) Zadejte čárkami oddělený seznam domén, pro které má Postfix předpokládat, že pošta z nich skončí na tomto počítači. Pokud je počítač bránou pro poštovní doménu, měli byste zahrnout vrcholovou doménu. Description-de.UTF-8: Für welche weiteren Rechner möchten Sie E-Mails akzeptieren (leere Eingabe: keine)? Spezifizieren Sie bitte eine durch Kommata getrennte Liste der Rechner, für die dieser Rechner das Zielsystem darstellt. Ist dieser Rechner für eine gesamte E-Mail-Domain zuständig, sollten Sie möglicherweise die Top-Level Domain (TLD) hinzufügen. Description-es.UTF-8: ¿Otros destinos para los cuales aceptar correo? (en blanco para ninguno) Ingrese una lista, separada por comas, de dominios de los que esta máquina deberá considerarse destino final. Si esta es una pasarela de correo del dominio, probablemente querrá incluir el dominio padre. Description-fr.UTF-8: Autres destinations pour lesquelles le courrier sera accepté (champ vide autorisé) : Veuillez indiquer une liste des domaines, séparés par des virgules, que cette machine reconnaîtra comme lui appartenant. Si la machine est un serveur de courrier, il est conseillé d’inclure le domaine de plus haut niveau. Description-gl.UTF-8: ¿Outros destinos para os que aceptar correo? (en branco para ningún) Forneza unha lista de dominios separados por comas para os que esta máquina se debería considerar o destino último. Se esta é unha pasarela de dominio de correo, seguramente queira incluír o dominio de nivel superior. Description-it.UTF-8: Altre destinazioni per cui accettare posta? Lasciare in bianco se non ce ne sono. Indicare una lista (separata da virgole) di domini per cui questo computer si deve considerare come la destinazione finale. Se questo computer è un gateway di posta per un intero dominio, è consigliabile includere anche il top-level domain. Description-nl.UTF-8: Andere bestemmingen waarvoor post aanvaard wordt? (laat leeg indien geen) Gelieve een komma-gescheiden lijst van domeinen op te geven waarvoor deze machine zichzelf als de eindbestemming moet beschouwen. Indien dit een post-domein gateway is kunt u best het top-niveau domein toevoegen. Description-pt.UTF-8: Outros destinos para os quais aceitar mail? (vazio para nenhum) Forneça uma lista de domínios separados por vírgulas que esta máquina deve considerar-se ela própria como destino final. Se é um gateway de um domínio de mail, você provelmente quer incluir o domínio de topo. Description-pt_BR.UTF-8: Outros destinos para os quais aceitar mensagens ? (em branco para nenhum) Forneça uma lista de domínios separados por vírgulas os quais esta máquina deve considerar como sendo ela mesma o destino final. Caso este seja um gateway de mensagens do domínio, você provavelmente desejará incluir o domínio de nível mais alto (top-level). Tabelle 2.9: Template-Datei des Packets postfix(stark gekürzt)2 2.3 Paketverwaltung 21 Am Anfang der Datei steht der Name des Templates, gefolgt von dem Typ des Rückgabewertes und den Fragen in unterschiedlichen Sprachen. Debconf wählt die Sprache für die Ausgabe anhand der locales-Einstellung. Die Fragen werden anhand der Namen aus dem Steuerungsskripts aufgerufen. In dem folgenden Beispiel ist der Aufruf des schon gezeigten Beispiels postfix/destinations zu sehen. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 #! / u s r / b i n / p e r l −w # −∗−CPerl −∗− # Script to configure Postfix . # B a s e d on c o d e b y C o l i n W a l t e r s < w a l t e r s @ c i s . o h i o −s t a t e . edu > , # and John G o e r z e n < j g o e r z e n @ p r o g e n y l i n u x . com >. use Debconf : : C l i e n t : : ConfModule qw ( : a l l ) ; use F c n t l ; my $ v e r s i o n = v e r s i o n ( 2 . 0 ) ; capb ( " backup " ) ; t i t l e ( " Postfix Configuration " ) ; # begin script # R e g e x p s f o r c h e c k i n g domain names , b l a t a n t l y s t o l e n f r o m e x i m c o n f i g my $ r f c 1 0 3 5 _ l a b e l _ r e= ’ [0 −9A−Za−z ]([ −0 −9A−Za−z ] ∗ [ 0 − 9A−Za−z ] ) ? ’ ; my $ r f c 1 0 3 5 _ d o m a i n _ r e= " $ r f c 1 0 3 5 _ l a b e l _ r e ( \ \ . $ r f c 1 0 3 5 _ l a b e l _ r e ) ∗ " ; my $ n e t w o r k _ r e= ’ [ 0 − 9 ] { 1 , 3 } \ . [ 0 − 9 ] { 1 , 3 } \ . [ 0 − 9 ] { 1 , 3 } \ . [ 0 − 9 ] { 1 , 3 } / [ 0 − 9 ] { 1 , 2 } ’ ; $topstate = " start " ; my $ d i s t r i b u t i o n = l c ( ‘ l s b _ r e l e a s e − i s 2>/dev / n u l l ‘ ) ; $ d i s t r i b u t i o n = ’ d e b i a n ’ i f $ d i s t r i b u t i o n eq ’ ’ ; while ( $ t o p s t a t e ne " done " ) { TOPSTATE: { i f ( $ t o p s t a t e eq " s t a r t " ) { ... if 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 configuration my $ t o p s t a t e ; my $back ; my $ n o n i n t e r a c t i v e ; ( $ t o p s t a t e eq " d e s t i n a t i o n s " ) { my $ m a i l e r t y p e = g e t ( " p o s t f i x / main_mailer_type " ) ; my $hostname = ‘ hostname −−fqdn ‘ | | " l o c a l h o s t " ; chomp $hostname ; my $domain = ‘ hostname −−domain ‘ | | " l o c a l d o m a i n " ; chomp $domain ; my $mailname = g e t ( " p o s t f i x / mailname " ) | | " l o c a l h o s t " ; my $ d e s t i n a t i o n s ; my $ p r i o r i t y=" medium " ; i f ( f g e t ( " p o s t f i x / d e s t i n a t i o n s " , " s e t " ) eq " t r u e " ) { i f (( −x " / u s r / s b i n / p o s t c o n f " ) && (− f " / e t c / p o s t f i x / main . c f " ) ) { i f ( open (POSTCONF, " p o s t c o n f −h m y d e s t i n a t i o n | " ) ) { $ d e s t i n a t i o n s=<POSTCONF>; c l o s e (POSTCONF) ; chomp $ d e s t i n a t i o n s ; set ( " postfix / destinations " , $destinations ) ; } } } else { i f ( $ m a i l e r t y p e eq " I n t e r n e t S i t e " ) { i f ( $mailname eq $hostname ) { $ d e s t i n a t i o n s = j o i n " , " , ( $mailname , " l o c a l h o s t . " . $domain , " , l o c a l h o s t " ) ; } else { $ d e s t i n a t i o n s = j o i n " , " , ( $mailname , $hostname , " l o c a l h o s t . " . $domain . " , localhost " ) ; } } else { # don ’ t a c c e p t m a i l f o r $ m a i l n a m e b y d e f a u l t i f we h a v e a r e l a y h o s t o r l o c a l o n l y mail , # u n l e s s t h e mailname b e a r s no r e s e m b l a n c e t o $ m y o r i g i n . $ d e s t i n a t i o n s = j o i n " , " , ( $hostname , " l o c a l h o s t . " . $domain . " , l o c a l h o s t " ) ; u n l e s s ( $hostname =~ m/ ( ^ | [ \ . ] ) $mailname$ / ) { $ d e s t i n a t i o n s = $mailname . " , " . $ d e s t i n a t i o n s ; } } set ( " postfix / destinations " , $destinations ) ; f s e t ( " postfix / destinations " , " set " , " true " ) ; } .... } ..... } } # end TOPSTATE # end w h i l e ( $ t o p s t a t e ne q ( d o n e ) ) 22 2 Paketverwaltung Listing 2.2: Konfigurationsskript des Pakets postfix(stark gekürzt) Obiges Skript funktioniert wie folgt. Es werden die Variablen, die schon in Schritten davor abgefragt wurden, wieder eingelesen. Dann wird überprüft, ob diese Konfiguration schon in der debconf-Datenbank vorhanden ist. Falls nicht, werden die Variablen entsprechend gesetzt. Zum Schluss wird die Eingabe in der Datenbank abgelegt und vermerkt, dass sie konfiguriert ist. debconf-Datenbank Die debconf-Datenbank wird normalerweise in einer Datei im lokalen Dateisystem gehalten. Es besteht zurzeit die Möglichkeit, zwischen drei Arten der Speicherung der Datenbankinhalte, zu wählen. Die erste Möglichkeit ist das Speichern in einer großen Datei (File, der Standard). Weiterhin ist es möglich, die Konfiguration in einer Verzeichnishierarchie (DirTree) zu speichern oder pro Paket eine Datei anzulegen (PackageDir). Debconf unterstützt auch unter Verwendung des read-only Attributes die Nutzung von LDAP. Eine weitere Möglichkeit besteht darin, die Konfigurationsdaten von einem entfernten Rechner auszulesen. Dazu wird der PIPE-Treiber3 von debconf verwendet und über eine ssh-Verbindung auf diese Daten zugegriffen. Es ist natürlich auch möglich, die Datenbank vorher per ssh auf den Rechner zu kopieren. Debconf kann auch mehrere Datenbanken miteinander verbinden. Dazu besitzt es 2 Umgebungsvariablen, um die Daten von anderen Rechnern ermitteln zu können. $DEBCONF_DB_OVERRIDE verwendet die Daten von der angegebenen Quelle vor den Daten in der eigenen Datenbank und $DEBCONF_DB_FALLBACK verwendet die Daten der Quelle nur dann, wenn sie nicht in der lokalen Datenbank vorhanden sind. Das sind einige Treiber, die bei debconf zum Einsatz kommen können: 3 Treiber sind bei debconf Zugriffsmethoden auf die Datenbank 2.3 Paketverwaltung 23 Treiber Beschreibung File Verwendung einer Datei als Datenbank, z.B. File{/tmp/my-deb-confdb} Pipe Verwendung von Standardeingabe bzw. -ausgabe, kann auf andere Dateien verweisen, z.B. auf den Quellrechner cat /var/cache/debconf/config.dat | ssh root@target „DEBCONF_FRONTEND=noninteractive DEBCONF_DB_FALLBACK=Pipe apt-get upgrade“ Stack Kann mehrere Quellen verwenden unter Einhaltung der angegebenen Reihenfolge, z.B. debconf.conf enthält Name: megadb Driver: stack Stack: passworddb, configdb, companydb LDAP Werte kommen aus einem LDAP-Server, z.B. LDAP{server:servername,basedn:dc=debconf} Tabelle 2.10: debconf-Treiber Debconf ist kein Konfigurationsarchiv und auch kein Registry-System, wie es von Windows her bekannt ist. Debconf dient dazu, Einstellungen vom Benutzer zu erfragen, wenn die Konfiguration in /etc nicht vollständig vom Paketbetreuer voreingestellt werden konnten. Da debconf den Zustand während der Konfiguration des Paketes sichert, kann es bei nachträglichen Änderungen zu Inkosistenzen zwischer der Datenbank und dem Zustand des Systems kommen. Das ist z. B. der Fall, wenn bei einer Konfiguration eines Paketes mittels debconf ein Cron-Job4 auf einmal am Tag eingerichtet wurde und der Administrator dies manuell auf einmal in der Woche ändert. Um die Datenkosistenz zwischen Datenbank und System wiederherzustellen muss eine erneute Konfiguration durchgeführt werden. 2.3.6 Verwaltung geänderter Pakete Bisher wurde nur auf die Verwendung von Binärpaketen eingegangen. Wie aber schon in Abschnitt 2.2 erwähnt, gibt es auch die Quellpakete. Diese werden dann interessant, wenn ein Paket mit anderen Optionen kompiliert werden soll, als das Binärpaket kompiliert wurde. Die Quellpakete werden nochmals in zwei Gruppen eingeteilt. Die erste Gruppe sind die Pakete, die ungeändert in das System integriert werden können, Debian nennt diese native Pakete. Die andere Gruppe benötigt Änderungen, um in einem Debian System lauffähig zu sein. Ein Quellpaket besteht aus 2 oder 3 Dateien, zwei Dateien sind es bei nativen 4 ein Skript, welches zeitgesteuert aktiviert, wird 24 2 Paketverwaltung Quellen und drei bei den „normalen“ Quellen. Diese Dateien werden jetzt etwas genauer beleuchtet: • Debian Source Control(DSC) besitzt die Metadaten für die Paketverwaltung und welche Dateien im Quellpaket enthalten sind. Diese Informationen werden meistens mit der digitalen Signatur des Paketbetreuers unterschrieben. • Native Quellpakete enthalten den Quellcode des Programmes als tarArchiv, wie z. B. apt_0.6.25.tar.gz. “Normale” Quellpakete tragen in der Regel den Zusatz .orig und enthalten die original Software, wie postfix_2.1.5.orig.tar.gz. • “Normale” Quellen enthalten zusätzlich die Datei diff.gz. Mit dieser Datei wird aus dem Originalverzeichnisbaum ein Debian-Paketbaum, welcher dann installiert werden kann. Um mit Quellpaketen arbeiten zu können, muss die Konfigurationsdatei /etc/apt/sources.list angepasst werden. Für Binärpakete sieht ein möglicher Standardeintrag so aus: deb ftp://ftp.de.debian.org/debian etch main Um jedoch ein Quellpakete nutzen zu können, benötigt APT die Indizes der Sourcen. deb-src ftp://ftp.de.debian.org/debian etch main Hinter diesem Eintrag verbirgt sich die URL: ftp://ftp.de.debian.org/debian/dists/etch/main/source/Sources.gz Hier wird keine Architektur benötigt wie bei den Binärpaketen, da der Quellcode erst auf dem Zielrechner kompiliert wird. Die Sources-Dateien sind sehr ähnlich den Packages-Dateien der Binärpakete und enthalten die Metadaten für die Paketverwaltung und die enthaltenen Dateien samt MD5-Checksumme. 1 2 3 4 5 6 Package : p o s t f i x B i n a r y : p o s t f i x −dev , p o s t f i x , p o s t f i x −p c r e , p o s t f i x −p g s q l , p o s t f i x −mysql , p o s t f i x −l d a p Version : 2.3.8 −2 Priority : extra Section : mail M a i n t a i n e r : LaMont J o n e s <lamont@debian . org> p o s t f i x −doc , p o s t f i x −cdb , 2.3 Paketverwaltung 7 8 9 10 11 12 13 14 15 25 B u i l d −Depends : d e b h e l p e r (>= 4 . 1 . 1 6 ) , po−d e b c o n f (>= 0 . 5 . 0 ) , g r o f f −b a s e , patch , dpatch , l s b −r e l e a s e , l i b d b 4 .3 − dev , libgdbm−dev , l i b l d a p 2 −dev (>= 2 . 1 ) , l i b p c r e 3 −dev , l i b m y s q l c l i e n t 1 5 −dev | l i b m y s q l c l i e n t 1 4 −dev , l i b s s l −dev (>= 0 . 9 . 7 − 1 ) , l i b s a s l 2 −dev , l i b p q −dev , l i b c d b −dev A r c h i t e c t u r e : any S t a n d a r d s −V e r s i o n : 3 . 7 . 2 . 0 Format : 1 . 0 D i r e c t o r y : p o o l / main /p/ p o s t f i x Files : 7 d f 8 8 a d 2 8 2 7 9 f b 6 e 0 5 9 6 f 5 2 2 8 0 0 d c a 4 5 897 p o s t f i x _ 2 . 3 . 8 − 2 . d s c a 6 c 5 6 0 6 5 7 7 8 8 f c 7 a 5 4 4 4 f a 9 e a 3 2 f 5 5 1 3 2787761 p o s t f i x _ 2 . 3 . 8 . o r i g . t a r . gz d913fd22db241516888c747b13411adc 161117 p o s t f i x _ 2 . 3 . 8 − 2 . d i f f . gz Listing 2.3: Source-Dateieintrag des Packets postfix Bei der Verwendung von APT spielt es keine Rolle, ob Binärpakete oder Quellpakete zum Einsatz kommen. APT kann mit beiden Pakettypen umgehen. Um postfix nicht aus dem Binärpaket zu installieren, sondern die Installation aus den Quellen vornehmen zu lassen, wird der Parameter source angehängt. APT-get ruft dabei automatisch dpkg-source auf, welches das Paket in einen angepassten Quellbaum umwandelt, damit es installiert werden kann. Wenn alle Abhängigkeiten erfüllt sind, kann man die Änderungen am Paket vornehmen. Wenn etwas am Inhalt des Pakets geändert werden soll, ruft man die üblichen Befehle ./configure und ./make im Paketverzeichniss auf. Beim ./configure können dann Anpassungen an den Optionen vorgenommen werden. Weitere Erklärungen zum Kompilieren führen an dieser Stelle zu weit. Weitere Informationen siehe GCC-Anleitung http://bama.ua.edu/cgi-bin/man-cgi?gcc. Für die Installation aus den Quellen sollte eine neuere Versionsnummer für das Paket gewählt werden, als die des Originalpaketes, um nicht die Originalversion zu ersetzen. Dies kann z. B. durch das Anhängen einer Zeichenkette wie „+0.lokal.1“ geschehen. Sollte es zu einem Fehler in dem neu erstellten Paket kommen, ist es eindeutig, dass es nicht die Version aus dem Debianrepository ist, sondern eine geänderte Version. Das Binärpaket zu erstellen und in das APT-Archiv einzutragen sind die letzten Schritte, um ein eigenes Paket in die Paketverwaltung aufzunehmen. Um die Aufgabe durchzuführen, wird das Werkzeug apt-ftparchive benötigt. Dieses erstellt die Pakete und Source-Dateien. Zum Abschluss das erstellte Binärpaket auf einen ftp- oder Web-Server laden.5 Wenn die erstellte Version vor dem Ersetzen durch eine neue Version im Debianrepository geschützt werden soll, kann diese Version fixiert werden. 5 eine genaue Beschreibung, wie dies funktioniert, ist in [Kr06] im Kapitel 9.3 zu finden KAPITEL 3 Peer-to-Peer Das folgende Kapitel ist in zwei Teile unterteilt. Der erste Teil beschäftigt sich mit der Peer-to-Peer-Technologie an sich. Dazu gehören der Vergleich zwischen Peer-to-Peer-Architekturen und Web-Service-Architekturen sowie die unterschiedlichen Arten von Peer-to-Peer-Netzwerken. Ein weiterer Punkt in Peer-to-Peer-Netzwerken ist die dezentrale Datenhaltung und die rechtliche Situation. Im zweiten Teil des Kapitels wird BitTorrent vorgestellt und erklärt, welche Konzepte BitTorrent umsetzt. Dazu gehören die Datenstruktur mit der entsprechenden Kodierung und die Erweiterungen des BitTorrent-Protokolls. Peer-to-Peer Ansätze können für ganz unterschiedliche Möglichkeiten genutzt werden. Eine offensichtliche Nutzung, die auch jedem sofort einfällt, ist der Austausch von Dateien. Das ist nicht die einzige Nutzungsmöglichkeit, für die sich Peer-to-Peer Netzwerke nutzen lassen. Eine weitere Möglichkeit ist das Instant Messaging, dabei wird zwischen den Rechnern eine direkte Kommunikation aufgebaut. Ein weiterer großer Vertreter des Peer-to-Peer Gedanken ist Skype. Weiterhin ist es auch möglich, mittels Peer-to-Peer Technologien eine Groupware zu realisieren. Ein Vertreter dieser Peer-to-Peer Groupware Systeme ist Groove, welches von der Firma Groove Networks entwickelt wurde. Diese Firma wurde 2005 von Microsoft gekauft.1 1 vgl. http://de.wikipedia.org/wiki/Microsoft_Groove 28 3 Peer-to-Peer Peer-to-Peer-Systeme sind mittlerweile viele im Einsatz, wie es die Zahlen aus folgendem Artikel von Heise-Netze belegen.1 Demnach ist Peer-to-Peer mittlerweile für 69% des Internetverkehrs in Deutschland verantwortlich. Abbildung 3.1: Traffic durch Peer-to-Peer in Deutschland Die nachfolgenden Punkte wurden auf der Grundlage des Buches Peer-to-Peer Netzwerke[MS07] erstellt. 3.1 Grundlagen Der Grundgedanke hinter der Peer-to-Peer-Architektur liegt in der Dezentralisierung der Informationen. Ein Nachteil bei Client-Server-Architekturen ist, dass je mehr Nutzer eine Informationsquelle nutzen, sich die Auslastung des Systems erhöht und die Antwortzeiten sich für den einzelnen Nutzer verlängern. Bei Peer-to-Peer-Architekturen hingegen verändert sich die Antwortzeits mit steigender Anzahl der Nutzer nicht. Als Peer wird dabei ein „gleichgestellter“ Rechner bezeichnet. Um ein Peer-to-Peer-Netzwerk aufzubauen, wird kein eigenes physikalisches Netzwerk benötigt, es wird statt dessen ein Overlay-Netzwerk aufgebaut. Ein Overlay-Netzwerk ist ein logisches Netzwerk, welches auf die bestehende Infrastruktur aufsetzt. Es besitzt in der Regel einen eigenen Adressraum, welcher unabhängig von dem darunter liegenden Netzwerk ist. Es können auch eigene Routingverfahren zum Einsatz kommen. Ein Beispiel für ein Overlay-Netzwerk ist das I2P, welches sich das anonyme Nutzen eines Netzes zur Aufgabe gemacht hat.2 I2P unterscheidet sich vom Konzept her klar von anderen anonymen Verteilungsdiensten, wie Freenet oder IIP. Die Aufgabe von IIP ist das Bereitstellen eines anonymen IRC-Servers. Freenet dagegen ist ein auf mehrere Rechner verteilter Datenspeicher, um der Zensur des Internets entgegen zu wirken. I2P hingegen stellt eine anonyme und sichere Verbindung für andere Dienste bereit, wie den des anonymen Blogs oder 1 2 vgl. [Bl08] Heise-Netze Artikel weitere Informationen siehe http://de.wikipedia.org/wiki/I2P und http:// planetpeer.de/wiki/index.php/Das_deutsche_I2P-Handbuch 3.1 Grundlagen 29 die anonyme E-Mail. I2P verwendet dafür eine verschlüsselte nachrichtenbasierte Kommunikation zwischen den Endpunkten. Um die Anonymität zu gewährleisten, nutzt I2P Pseudonyme für die Übertragung von Nachrichten, die mittels Kryptografie und Mixing-Mechanismen gewährleisten sollen, dass kein Beteiligter weiß, hinter welchem Pseudonym sich welche IP-Adresse zu einem bestimmten Zeitpunkt befand und somit eine Identifikation nicht möglich sein soll. Die Übertragung der Daten findet über eine Kaskade von Routern statt, wobei mehrere eingehende und ausgehende Tunnel aufgebaut werden. Diese Tunnel sind für jede Richtung unterschiedlich. Ein Overlay-Netzwerk stellt zwei Grundfunktionen bereit, einmal die LookupFunktion und zum anderen die Suchen-Funktion. Die Lookup-Funktion dient dazu, Knoten in einem Netzwerk zu identifizieren, die für eine bestimmte ObjektID zuständig sind. Die Zuständigkeit zu einer ObjektID ist mindestens einem Knoten zugeordnet. In diesem Fall heißt dieses Overlay-Netzwerk auch strukturiertes Overlay-Netzwerk. Es existieren auch unstrukturierte OverlayNetzwerke; diese nutzen die andere Grundfunktion, das Suchen. Dabei wird in dem Netzwerk nach gewissen Merkmalen gesucht, wie einem Dateinamen oder auch einem Nutzernamen. Das entgegengesetzte Konzept zu Peer-to-Peer-Architekturen ist die ClientServer-Architektur. Bei der Client-Server-Architektur wird ein Dienst von einem Server bereitgestellt. Bei Peer-to-Peer-Architekturen ist der einzelne Peer sowohl Client als auch Server.1 Weitere Unterschiede aber auch Gemeinsamkeiten der beiden Architekturen werden im Unterpunkt 3.1.1 dargestellt. 1 vgl. [P208] Wikipedia Artikel zu Peer-to-Peer am 26.06.2008 um 17:10 Uhr 30 3 Peer-to-Peer Bei der Client-Server-Architektur existiert eine zentrale Instanz. An diese Instanz werden die Anfragen gerichtet und diese beantwortet die Anfragen. Dies ist in der Abbildung 3.2 auf Hardwareebene dargestellt. Abbildung 3.2: Client-Server-Architektur [WW02] Bei der Peer-to-Peer-Architektur hingegen ist eine solche zentrale Instanz nicht notwendig.(Siehe Abbildung 3.3) Abbildung 3.3: Peer-to-Peer-Architektur [WW02] 3.1.1 Peer-to-Peer im Vergleich zu Web-Services Während bei Peer-to-Peer-Architekturen alles auf die Dezentralisierung abgestellt ist, wird bei Web-Services, die nach der Client-Server-Architektur arbeiten, eine zentrale Instanz in den Mittelpunkt gerückt. Diese zentrale Instanz hat den Vorteil, dass der Aufwand für die Administration des Systems gering gehalten wird. Der größte Nachteil dieser Architektur ist, dass bei steigender Nachfrage 3.1 Grundlagen 31 die Verfügbarkeit sinken kann. Wenn dies ausgeglichen werden soll, muss viel Aufwand an Hardware in Load-Balancing-Maßnahmen investiert werden. Diese Maßnahme verringert jedoch den Vorteil der leichten Administration. Der Vorteil bei Peer-to-Peer-Architekturen liegt eindeutig in der Entlastung der zentralen Instanzen, wenn es diese überhaupt gibt. Allerdings ist hier die Administration etwas schwieriger. Ein klarer Vorteil liegt bei der Client-Server-Architektur im Punkt der Verfügbarkeit. Hier kann eine sehr hohe Verfügbarkeit zugesichert werden, was bei Peer-to-Peer-Netzwerken nicht immer der Fall ist. Hier können auch hohe Werte erreicht werden, indem Peers eingebaut werden, die wie ein Web-Server permanent im Netz vorhanden sind. Ein weiterer Unterschied liegt in der Bekanntmachung der Web-Services bzw. der Peers. Ein Web-Service wird zentral bei einer UDDI Business Registry bekannt gemacht. Dagegen werden Peers über dezentrale Mechanismen bekannt gemacht, wie den „Rendezvous Peers“ bei JXTA. Die UDDI kann sehr schnell eine Liste der möglichen Services liefern. Peer-to-Peer-Mechanismen liefern die tatsächlich verfügbaren Dienste.1 Nach den Unterschieden sollen jetzt die Gemeinsamkeiten aufgezeigt werden. Es sind in beiden Architekturen Ansätze vorhanden, die aus der jeweils anderen Architektur entnommen sind. Beispiele für die Dezentralisierung im Web sind Services, wie das Domain-Name-Services-System oder auch verschiedene Caching-Mechanismen. Ansätze für Zentralisierung lassen sich auch in Peerto-Peer-Systemen finden. Ein Beispiel dafür ist die Hierarchie der Server in der JXTA-Suche. Eine weitere Gemeinsamkeit der beiden ist die Verwendung von Service Oriented Architecture. Web-Services in der Gesamtheit betrachtet, stellen auch eine Dezentralisierung dar, weil die Services von unterschiedlichen Quellen eingebunden werden können. Wie können nun Web-Services und Peer-to-Peer-Systeme voneinander profitieren. Web-Services haben den Vorteil gegenüber Peer-to-Peer-Systemen, dass sie Interoperabilität und Kommunikation über Standard-Ports beherrschen. Dies ist bei Peer-to-Peer-Applikationen noch nicht der Fall. Das JXTA-Projekt versucht, nun diese zwei Aspekte in die Peer-to-Peer-Welt zu portieren. Das Entwicklerteam von JXTA entwirft einen JXTA-Service, der eine Verbindung zu Web-Services herstellen kann. Dieser Web-Service mit angeschlossenem Peer-to-Peer-Netzwerk könnte für Firmen eine Vermarktungsgrundlage für ungenutzte Rechnerkapazitäten sein. Eine mögliche Verbindung dieser Firmen könnte ein Web-Service sein, der die beiden Firmen-Netzwerke miteinander verbindet. Über diesen Web-Service kommunizieren die Peer-to-Peer-Netzwerke miteinander.(siehe Abbildung 3.4) Diese Technologie wird als Grid-Computing bezeichnet. 1 vgl. [WW02, S.99ff] 32 3 Peer-to-Peer Abbildung 3.4: Verbindung von Peer-to-Peer-Netzwerken mittels Web Services(vgl. [WW02, S.114]) 3.1.2 Unterschiedliche Arten von Peer-to-Peer-Netzwerken Zentralisierte Peer-to-Peer-Netzwerke Eine Variante ist das zentralisierte Peer-to-Peer-System, welches über einen zentralen Server verfügt. Der Server ist für die Verwaltung der verfügbaren Dateien zuständig und weiß auch, wer diese Dateien besitzt. Ein Beispiel für ein solches Netzwerk ist Napster. 1 Ein Nachteil dieser Systeme ist, dass es zusammenbricht, sobald der Server vom Netz ist, sei es durch eine gerichtliche Anordnung oder eine Überlastung. 1 Napster in der Form wie es heute noch existiert ist kein Peer-to-Peer Netzwerk mehr, sondern eine Client-Server Anwendung, die kostenpflichtig Musik anbietet. 3.1 Grundlagen 33 Abbildung 3.5: Peer-to-Peer-Netzwerk mit zentralem Server[MS07, S.56] Dezentrale Peer-to-Peer-Netzwerke Eine andere Variante des Peer-to-Peer-Netzwerks ist das Netzwerk in dem es keine zentralen Instanzen gibt. Es wird auch manchmal als das „reine“ Peer-toPeer bezeichnet. Diese Art hat einige Schwachstellen. So muss z. B. bei der ersten Kontaktaufnahme mit dem Netzwerk der Peer, der beitreten will einen Peer kontaktieren, der schon Teil dieses Netzwerks ist. Woher soll der Peer aber andere Peers kennen? Dies wird bei diesen Netzen, z. B. bei Gnutella, über eine Startliste von Peers geregelt. Diese Variante der ersten Kontaktaufnahme nennt sich auch Bootstrapping. Die Startliste mit Peers wird abgearbeitet, bis ein aktiver Peer gefunden wird. Von diesem Peer aus werden die Nachbar-Peers abgefragt bis zu einer vorher definierten Tiefe k. Aus den Antworten der Peers baut sich eine eigene Liste von Peers auf.1 Diese Tiefe wird als TTL (Time to Life) bezeichnet, nicht zu verwechseln mit der TTL des Internet Protokols (IP). Die TTL wird bei Erreichen eines Peers um 1 reduziert. Das kann auch zu Problemen führen, da eine Datei nur in dem Umfeld der 1 Eine übliche Tiefe k ist 5. 34 3 Peer-to-Peer angegebenen Tiefe gesucht wird. Dadurch werden nicht immer alle im Netz vorhandenen Dateien gefunden.1 Abbildung 3.6: Peer-to-Peer-Netzwerk ohne zentralen Server[MS07, S.61] Hybride Peer-to-Peer-Netzwerke Die dritte Variante sind die hybriden Peer-to-Peer-Netzwerke. Diese Netze bestimmen dynamisch zentrale Instanzen für die Verwaltung. Diese werden bei JXTA als Rendezvous-Peers bezeichnet.2 3.1.3 Verteilte Hashtabellen am Beispiel von CAN Verteilte Hashtabellen werden in dezentralen Peer-to-Peer-Netzwerken benötigt, um eine dezentrale Datenhaltung zu ermöglichen und auf die zentrale Verwaltungsinstanz verzichten zu können. Die Idee hinter verteilten Hashtabellen ist 1 2 vgl. [MS07, S.57ff] vgl. Wikipedia Artikel zu Peer-to-Peer [P208] am 26.06.2008 um 17:10 Uhr 3.1 Grundlagen 35 die Verteilung der Daten unter den Peers gerecht zu gestalten. Es gibt unterschiedliche Implementierungen von verteilten Hashtabellen, eine davon ist CAN. CAN ist die Abkürzung für „Scalable Content Addressable Network“. CAN ist eine verteilte Datenstruktur, die es ermöglicht, die Daten auf verschiedene Peers zu verteilen. CAN war im Jahr 2000 das erste Peer-to-Peer-Netzwerk, dass eine effiziente Datenstruktur mit einem Overlay-Netzwerk verband. Die Verbindung der Peers wird über eine Gitterstruktur erreicht. Auf dieser Struktur können Operationen durchgeführt werden, die es ermöglichen, die Struktur aufzubauen und aufrecht zuerhalten. Eine Zuordnung der Daten zu einem Peer erfolgt über eine quadratische Fläche. Diese Fläche muss nicht auf die Dimension zwei beschränkt werden, wird hier aber wegen der leichteren Veranschaulichung gewählt. Diese Fläche wird beim Hinzufügen von neuen Peers in Rechtecke und Quadrate geteilt. Diese sind dann einzelnen Peers zugeordnet. Der Idealzustand ist, wenn die Daten gleichmäßig über die Gesamtfläche des Quadrates verteilt sind und die Flächen der Einzelquadrate gleich groß sind. Die Verteilung der Daten auf dem Gitter erfolgt mittels Hashfunktionen, die jedem Datum einen Punkt auf dem Quadrat zuweist. In Peer-to-Peer-Systemen werden kryptografisch sichere Hashfunktionen verwendet, um eine eindeutige Zuordnung zwischen dem Datum und einem Peer zu gewährleisten. Für eine kryptografisch sichere Hashfunktion gilt, dass es praktisch unmöglich sein soll für einen Ausgabewert h(x) = y den Eingabewert x zu ermitteln.1 Des Weiteren sollten Hashfunktionen, die in der Kryptografie eingesetzt werden, möglichst keine Kollision aufweisen. Von einer Kollision ist die Rede, wenn für zwei unterschiedliche Eingabewerte bei Anwendung der Hashfunktion der gleichen Ausgabewert generiert wird. In Peer-to-Peer-Netzwerken werden Hashfunktionen wie MD-5, SHA-1 oder SHA-2 eingesetzt. Wie die Verteilung auf die Hashtabelle funktioniert, zeigt das Beispiel aus dem Buch Peer-to-Peer Netzwerke[MS07]. Als Schlüssel für die Hashfunktion wird der Dateiname gewählt. Dieser lautet music.mp3. Dies entspricht in hexadezimal Darstellung: 6d 75 73 69 63 2e 6d 70 33, wenn man die ASCII-Zeichentabelle zugrunde legt. Als Hashfunktion wird eine einfache modulo-Operation verwendet, mod(5). Daraus ergibt sich der Hash h(music.mp3) = 4. Diese Hashfunktionen werden zum Suchen und Speichern der Daten in der Hashtabelle verwendet. Die Datei music.mp3 wird also in der vierten Speicherzelle der Hashtabelle abgelegt. In Peer-to-Peer-Netzwerken wird modulo nicht als Hashfunktion verwendet und die Anzahl der verwendbaren Schlüssel ist mit fünf nicht verwendbar. Eine mögliche Länge des Hashwerts sind 128-Bit. Die eben vorgestellte Technologie lässt sich nicht für Peer-to-Peer-Netzwerke 1 vgl. Wikipedia Artikel zu Hashfunktionen [Wi08b] vom 05.07.2008 um 23:23 Uhr 36 3 Peer-to-Peer nutzen, da die Peers nicht durchnummeriert sind und die Anzahl der Peers permantent variiert. Um dies nun zu lösen, nutzt CAN ein Quadrat. Die Position eines Datums im Quadrat wird bestimmt, indem zwei verschiedene Hashfunktionen angewendet werden, die den x- und y-Wert erzeugen. Das Quadrat wird aufgeteilt, wie schon oben beschrieben. Kommt ein neuer Peer hinzu, wird ein Rechteck geteilt. Hinzufügen eines neuen Peers Am Anfang besteht das Quadrat aus nur einem Peer. Wenn ein neuer Peer hinzukommt, wählt er einen zufälligen Punkt im Quadrat. Dann kontaktiert er den zuständigen Peer. Diese Kontaktaufnahme wird über eine Suchanfrage realisiert. Dann wird das Rechteck halbiert, wenn es ein Rechteck ist entlang der x-Achse, bei einem Quadrat entlang der y-Achse. Nach dieser Teilung wird die Netzwerkstruktur entsprechend der neuen Nachbarschaft angepasst. Abbildung 3.7: Einfügen eines Peers ins Netz [MS07, S.68] Die Netzwerkstruktur des CAN ist durch die Lage der Rechtecke und Quadrate bestimmt. Ein Peer besitzt Verbindungen zu allen benachbarten Peers. Bei Einfügen des Peers zwei werden die Informationen über die benachbarten Peers von Peer eins an Peer zwei übertragen und der zweite Peer wird in das Netz aufgenommen. Dazu muss der Graph angepasst werden. Die Verteilung ist ungleichmäßig, sodass sich die Fläche in unterschiedlich große Rechtecken aufteilt.(vgl. Abbildung 3.8) 3.1 Grundlagen 37 Abbildung 3.8: Graph von Peers [MS07, S.70] Entfernen eines Peers Um ein Peer aus dem Netzwerk entfernen zu können, muss es einem Peer erlaubt sein, für mehr als ein Rechteck zuständig zu sein. Das CAN-System geht nicht davon aus, dass sich ein Peer vor Verlassen des Netzwerks abmeldet. Daraus ergibt sich, dass jeder Peer regelmäßig überprüft, ob alle Nachbar-Peers verfügbar sind. Stellt ein Peer fest, dass ein anderer Peer nicht antwortet, übernimmt der Peer dieses Rechteck. Das beständige Hinzufügen und Entfernen von Peers führt zu einer Fragmentierung des gesamten Systems. Defragmentierung Um diese Fragmentierung auszugleichen zu können, wird eine Defragmentierung im CAN durchgeführt. Um den Defragmentierungsprozess zu veranschaulichen, wird der Graph als Binärbaum dargestellt. Die Wurzel des Baums ist das große Quadrat, wie in Abbildung 3.7 auf der linken Seite. Eine Ebene tiefer ist die rechte und linke Hälfte, wie auf der Abbildung rechts. Dies verzweigt sich bis zu den Peers auf Blattebene. Die Defragmentierung kann von jedem Peer gestartet werden, der mehr als ein Rechteck verwaltet. Der Peer wird das kleinere der verwalteten Rechtecke an den Nachbar-Peer abgeben. 38 3 Peer-to-Peer Abbildung 3.9: Defragmentierung eines Graphen Fall 1 [MS07, S.74] Zwei Fälle sind bei Defragmentierung zu unterscheiden. Der Peer eins verwaltet zwei Rechtecke A und B, wovon B das kleinere ist. Der Peer eins untersucht nun den Bruderbaum von Blatt B, ist dies auch ein Blatt so übergibt der Peer eins dieses Blatt an den Nachbar-Peer. Dieser vereinigt beide Blätter und erhält ein größeres Blatt. Das Netz ist weniger fragmentiert. Im zweiten Fall ist der Baum etwas anders aufgebaut, der Bruderbaum besitzt kein Blatt. Abbildung 3.10: Defragmentierung eines Graphen Fall zwei[MS07, S.75] Peer eins verwaltet zwei Rechtecke und startet die Defragmentierung. Dazu 3.1 Grundlagen 39 wird eine Tiefensuche im Nachbarbaum durchgeführt, wo zwei Blätter mit den Peers zwei und drei gefunden werden. Die zwei Blätter aus dem Nachbarbaum werden vereinigt und einem der Peers zugewiesen. Der freie Peer erhält die Verantwortung für das kleinere Rechteck von Peer eins. 3.1.4 Rechtliche Probleme in Peer-to-Peer-Netzwerken Peer-to-Peer-Nutzer, -Betreiber und -Designer stehen gleich vor einem ganzen Komplex von juristischen Fragen. Einige davon sind: • Erlaubnis des freien und unkontrollierten Meinungsaustausches, • der Besitz und die Weitergabe von verboten Dokumenten, • Einsatz kryptografischer Protokolle, • mögliche Überwachung einzelner Nutzer, • illegale Nutzung fremder Dienste, • Urheberrechtsverletzungen Auf den ersten Punkt sollten die Designer besonders achten. Da es in einigen Ländern eine Zensur des Internets gibt, sollte besonders auf die sichere und anonyme Kommunikation in diesen Netzen geachtet werden. Ein Beispiel für das anonyme und sichere Austauschen von Dokumenten ist das Peer-to-PeerNetzwerk Freenet. Es ist aber auch in einem demokratischen Staat nicht erlaubt, jedes Dokument zu besitzen. So ist es nach §130 des Strafgesetzbuchs verboten, volksverhetzende Schriften zu besitzen oder weiter zu verbreiten. Dies kann für den Betreiber eines Peer-to-Peer-Netzes zu einem juristischen Problem werden. In einigen, auch demokratischen Staaten wie Frankreich, wird versucht die Kryptografie aus diesem Grund einzuschränken. In Deutschland hingegen ist die Verwendung von kryptografischen Verfahren erlaubt. Eine weitere Frage ist, ob ein Internet-Service-Provider überprüfen darf oder muss, welche Inhalte durch sein Netz fließen. Betrachtet man dazu das Fernmeldegesetz, ist es verboten, eine Überwachung und Einsichtnahme in fremde Nachrichten vorzunehmen. Dies ist nur mit einer richterlichen Anordnung für Staatsorgane möglich. Diese Regelung gilt aber nur auf nationaler Ebene, der Verkehr ins bzw. aus dem Ausland ist davon nicht betroffen. Das führt dazu, dass es nicht sicher ist, ob der Staat doch Einsicht in den Internetverkehr nehmen kann, da der Internetverkehr nicht nur auf nationaler Ebene funktioniert. 40 3 Peer-to-Peer Ist eine Kontrolle der Kommunikation in einem Peer-to-Peer-Netzwerk juristisch möglich? Wenn es sich um eine Nachricht im Sinne des Fernmeldegesetzes handelt, nein und es darf auch kein Automat diese Aufgabe übernehmen. Ist es aber keine Nachricht im Sinne des Fernmeldegesetzes, so besteht die Pflicht, dass Weiterverbreiten von verbotenen Dokumenten zu verhindern. Die Konsequenz daraus ist, dass der Internet-Service-Provider nur die Möglichkeit hat, die Verbindungen in seinem Netz zu protokollieren, um einen Verursacher von illegalen Handlungen benennen zu können, um so selbst der Strafverfolgung zu entgehen. Es dürfen, nach § 113a des Telekommunikationsgesetzes (TKG) nur die Verbindungsdaten und nicht der Inhalt einer Verbindung gespeichert werden. Urheberrecht Das Thema des Urheberschutzes ist bei Peer-to-Peer-Netzen immer von großer Bedeutung. Der Urheberschutz wurde eingeführt, um die intellektuellen und kulturellen Leistungen eines Komponisten, Autoren oder Entwicklers zu schützen. Seit dem Jahr 2003 werden Nutzer von Peer-to-Peer-Netzwerken, welche das Urheberrecht verletzen, von der „Recording Industry Accociation of America“ (RIAA) und der „International Federation of the Phonographic Industry“ (IFPI) verklagt. Die Ermittlung der Nutzer geschieht anhand der IP-Adresse. Wenn diese dynamisch vergeben werden, wird der Nutzer mittels einer Anfrage beim Internet-Service-Provider ermittelt. Dieser speichert die Vergabe der IP-Adresse an den jeweiligen Kunden bis zu 6 Monate. Die Weitergabe dieser Daten ist nur mit einem richterlichen Beschluss möglich, da sonst gegen das Fernmeldegeheimnis verstoßen wird. In einigen Ländern ist der Betrieb von Index-Diensten für Peer-to-Peer-Netzwerke verboten, wie z. B. in Slowenien. In anderen Ländern, wie der Niederlande ist es hingegen gestattet, einen solchen Dienst anzubieten. Ein Index-Dienst stellt eine Möglchkeit bereit nach Dateimerkmalen, wie einem Dateinamen, in einem Peer-to-Peer-Netzwerk zu suchen. In den USA ist es sogar verboten ein Peer-to-Peer-Netzwerk zu entwickeln, das den Zweck der Verteilung von urheberrechtlich geschützten Inhalten hat. Konsequenzen für Entwickler Dies hat Konsequenzen für die Entwickler von Peer-to-Peer-Netzwerken. Es muss darauf geachtet werden, dass für den Transport von Nachrichten keine lokalen Kopien erzeugt werden, weder im RAM noch auf der Festplatte. Wenn eine Kopie erzeugt wird, kann dies als Verletzung der Urheberrechtsbestimmungen gesehen werden und der Transporteur einer Nachricht macht sich wegen 3.2 BitTorrent 41 Urheberrechtsverletzung strafbar. Diese Maßnahme ist nicht nur für Entwickler von Peer-to-Peer-Netzen von Bedeutung, sondern ist auch wichtig für das Entwickeln von Software für Internet-Service-Provider. Bei Peer-to-Peer-Netzwerken ist dies aber in der Regel einfach zu realisieren, weil die Endnutzer eine direkte Verbindung untereinander aufbauen. Jeder Entwickler sollte auf die Werbung mit Copyright-Verletzung verzichten, da dies als Hauptaufgabe des Peer-to-Peer-Netzwerkes ausgelegt werden kann. Ein Peer-to-Peer-Netzwerk muss eine andere Aufgabe, als die Verbreitung urheberrechtlich geschützter Informationen haben. Der Rechtsanwalt Lohmann stellt zwei Möglichkeiten der Überwachung des Nutzungsverhaltens im Peer-to-Peer-Netzwerk vor. Die eine Möglichkeit besteht in der „totalen Kontrolle“ des Netzes. Die andere, die er bevorzugt, ist das Fehlen jeder Kontrollmöglichkeit. Er beschreibt, dass es keinen Zwischenweg gibt, weil es später immer in die „totale Kontrolle“ führen wird. Es wird weiter beschrieben, dass es günstiger ist, einen eigenständigen Client zu entwickeln, als eine Dienstleistung anzubieten. Weiterhin sollte auf die „End User Licence Aggreement“ (EULA) verzichtet werden, weil dies als Vereinbarung zwischen Hersteller und Endnutzer gesehen wird. Diese Vereinbarung wird als Möglichkeit der Kontrolle des Nutzers interpretiert. Der günstigste Weg um diese Forderungen zu erfüllen, ist ein quelloffenes System. Um daraus ein Geschäftsmodell entwickeln zu können, wird eine Zusatzsoftware vermarktet, die eine komfortable Oberfläche und Zusatzfunktionen bietet.(vgl. [MS07, S.252ff]) 3.2 BitTorrent BitTorrents Erfolg beruht auf der Effektivität des Netzwerkes den Upload der Nutzer zu verwenden, um anderen Nutzern das Herunterladen der Datei zu ermöglichen. Dazu muss der einzelne Nutzer noch nicht einmal die komplette Datei heruntergeladen haben, um sie anderen Nutzern zur Verfügung stellen zu können. BitTorrent verfügt über keine Suchmethoden, um eine Datei im Netz zu suchen, wie das bei anderen Peer-to-Peer-Netzwerken möglich ist. Die Organisation des Downloads in einem Netz übernimmt der Tracker-Host, dieser vermittelt die Verbindungen zwischen den einzelnen Peers. Der Tracker-Host stellt keine Dateien zur Verfügung, es kann trotzdem zu Problemen mit dem Urheberrecht kommen, einen Tracker zu betreiben. 1 1 Ein möglicher Fall ist, ein Rechteinhaber kontaktiert den Tracker-Host Betreiber und verlangt die Entfernung einer Datei vom Tracker-Host. Dies ist nur schwer möglich, da BitTorrent keine Dateinamen verwaltet und damit die Datei nicht identifiziert werden kann. Interessante Ausführungen zu dem Thema: http://events.ccc.de/congress/ 2007/Fahrplan/events/2355.en.html 42 3 Peer-to-Peer BitTorrent verwendet Bäume zur Verteilung der Daten, wobei der Baum für einen Peer und nicht für eine Datei erstellt wird. In diesem Baum wird angegebenen, welche Teile von Dateien der Peer als Nächstes herunterladen will oder welche er verteilt. BitTorrent verfolgt unterschiedliche Ziele, welche dieses Netzwerk erfüllen soll. Diese Ziele sind folgende: • Möglichst effizienter Download einer Datei unter Verwendung der Peers, die diese Datei bereitstellen. • Faires Verhältnis zwischen Upload und Download.1 • Fairness zwischen den Peers. • Verwendung verschiedener Quellen. Die Referenzimplementierung des BitTorrent-Protokolls wird in der Programmiersprache Python umgesetzt. 3.2.1 Fairness und Drosselung Ein wichtiges Ziel von BitTorrent ist die Fairness unter den einzelnen Peers. Es gibt die Unterscheidung in „gutes“ und „schlechtes“ Verhalten der Peers. Für diese zwei Gruppen werden unterschiedliche Namen verwendet. Die „gute“ Gruppe wird Seeder (Säher) genannt und stellt Daten zum Herunterladen bereit. Die andere Gruppe wird Leecher (Sauger) genannt und beeinträchtigt das System, wenn keine Daten zum Hochladen bereitgestellt werden. BitTorrent hat ein System entwickelt, welches „gutes“ Verhalten belohnt und „schlechtes“ bestrafft. Ein Seeder kann bevorzugt werden, wenn er selber Dateien herunterlädt. Die Bestrafung wird durch Drosselung erreicht, d. h., ein Verbindungsaufbau wird abgelehnt. Jeder Peer besitzt eine Liste mit anderen Peers, die gedrosselt werden sollen. Steht ein Peer auf dieser Liste, so wird die Anfrage von diesem Peer nicht beantwortet. Aufgenommen in diese Liste werden die Peers, die den schlechtesten Download geliefert haben. Die Beurteilung, ob ein Download schlecht war, wird mittels der Bandbreite des Peers durchgeführt. Diese Bandbreite ermittelt der BitTorrentClient durch Zählen der Bits, die in einem Testintervall von 20 Sekunden beim 1 durch asymmetrische Verbindungen in der Praxis schwieriger Umzusetzen 3.2 BitTorrent 43 Empfänger-Peer angekommen sind. Es besteht die Möglichkeit, Peers wieder von dieser Liste zu entfernen. Was passiert, wenn ein Peer von allen anderen Peers gedrosselt wurde und er darauf die anderen Peers auch drosselt? Für diese Situation gibt es einen Mechanismus, der sich optimistisches Entdrosseln nennt. Dabei wird ein Peer aus der Liste zufällig entdrosselt, dadurch soll dieser Deadlock für den einen Peer aufgelöst werden. 3.2.2 Technische Funktionsweise In diesem Abschnitt werden die Kernpunkte der Realisierung des BitTorrentProtokolls vorgestellt. Eine zu verteilende Datei wird in kleinere Teile fester Länge geteilt. Für jedes dieser Teile wird ein Hashwert generiert und in die .torrent-Datei eingetragen. Zu Beginn wird beschrieben wie eine Datei von einem Peer heruntergeladen wird. Ein Peer, der eine Datei herunterladen will, nimmt Kontakt zu einem TrackerHost auf. Dieser Tracker-Host ist in der .torrent-Datei eingetragen. Der TrackerHost verwaltet die Paare, die jeweils aus der IP-Adresse und dem Port bestehen, und gibt an wo ein Peer erreichbar ist. Diese Liste der IP-Adressen und Ports wird an den anfragenden Peer geliefert. Alle teilnehmenden Peers erhalten diese Informationen über andere Peers vom Tracker-Host. Anhand dieser Informationen fragen sie die anderen Peers in einem festgelegten Intervall an und tauschen ihre Teilelisten aus. In den Rückgabewerten befinden sich die Hashwerte der Dateiteile sowie weitere Kontrollinformationen. Der Peer fragt bei einem anderen Peer nach einem Teil der Datei und lädt es von diesem Peer herunter. Sobald eines dieser Teile vom Peer heruntergeladen wurde, wird es von diesem Peer zum Herunterladen bereitgestellt.(siehe Abbildung 3.11) 44 3 Peer-to-Peer Abbildung 3.11: Herunterladen des zweiten Teils einer Datei Es ist jeder Peer in der Lage, eine Statistik über die verfügbaren Teile zu führen und zu erkennen, ob es möglich ist, eine Datei herunterzuladen. Das Herunterladen erfolgt nach einer festgelegten Strategie. Teileauswahl Das Hauptproblem der Verteilung ist das sogenannte „Coupon-CollectorsProblem“. Es wird angenommen, dass eine Datei in m Teile aufgeteilt wurde und jeder Peer erhält genau ein Teil. Dann müssen laut [MS07] auf Seite 234 mindestens Ω(m ln m) Peers teilnehmen, um mit konstanter Wahrscheinlichkeit alle Teile verteilen zu können. Werden die Teile zufällig verteilt, erhalten einige Peers (konvergiert gegen 1e ) kein Teil während O(log m) mehr als ein Teil besitzen. Um dieses Coupon-Collectors-Problem zu verringern, nutzt BitTorrent verschiedene Maßnahmen. 3.2 BitTorrent 45 Strategie Beschreibung Seltenste zuerst Es versucht jeder Peer die Teile zuerst zu laden, die am wenigsten im Netz vorhanden sind. Die Häufigkeit der einzelnen Teile wird durch die Abfragen der Teilliste mit den anderen Peers errechnet. Diese Strategie verringert die Wahrscheinlichkeit, dass ein Teil nicht verfügbar ist, produziert aber ein neues Problem. Die Bandbreite der Teile, die am seltensten im Netzwerk vorhanden sind, wird weiter reduziert und das Herunterladen dieser Teile dauert länger. Zufälliges zuerst (Ausnahme für neue Peers) Dieser Modus wird verwendet damit die geringe Bandbreite der Teile, die selten im Netzwerk vertreten sind, nicht weiter reduziert wird. Deswegen beginnen Clients das Herunterladen in diesem Modus. Wenn die Peers einige Teile heruntergeladen haben, wechseln sie in den Modus der seltensten Teile zuerst. Endspielmodus Wenn ein Peer fast alle Teile heruntergeladen hat, wird der Endspielmodus aktiviert, um das Herunterladen schnell zu beenden. Dazu fragt der Peer bei allen anderen Peers nach fehlenden Teilen, um das Herunterladen von langsamen Peers zu verhindern. Die erhöhte Belastung im Netz ist gering, da dieser Modus nur für eine kurze Zeit aktiviert wird. Tabelle 3.1: Downloadstrategien Datenstruktur Ein Download wird durch eine Datei mit Metainformationen beschrieben.1 Diese Datei erhält die Dateiendung .torrent.2 Die Werte in der Datei werden mittels bencoding formatiert abgespeichert. Bencoding Bencoding ist eine Möglichkeit, Daten zu spezifizieren und zu organisieren.3 Bencoding kennt vier unterschiedliche Datentypen, das sind Zeichenketten, Integer, Listen und Zuordnungstabellen. Zeichenketten werden wie folgt dargestellt: <Länge der Zeichenkette>:<Zeichenkette>. Bei Zeichenketten existieren keine konstanten Anfangs- und keine konstanten 1 2 3 vgl. [Bi08b] BitTorrent Spezifikation am 11.07.2008 um 17:21 Uhr vgl. [Bi08a] BitTorrent Protokoll Seite am 10.07.2008 um 16:53 Uhr vgl. BitTorrent Spezifikation [Bi08b] am 11.07.2008 um 17:21 Uhr 46 3 Peer-to-Peer Endzeichen. Beispiel: „4:spam“ Bei Integer ist das anders, eine Zahl beginnt mit dem Zeichen „i“, gefolgt von der Zahl und dem Abschlusszeichen „e“. Beispiel: „i3e“ für die Zahl drei Für Listen existiert auch ein konstantes Anfangszeichen, das „l“. Der Aufbau einer Liste sieht dann so aus. l<bencoding-kodierte Werte>e Beispiel: „l4:spam4:eggse“ für eine Liste mit den zwei Einträgen „spam“ und „eggs“ Eine Zuordnungstabelle beginnt mit dem Buchstaben „d“ und endet wieder mit einem „e“ Beispiel: „d3cow3:moo4:spam4:eggse“ für die Zuordnungen cow=>moo und spam=>eggs .torrent-Datei Im Protokoll von BitTorrent ist spezifiziert, welche Angaben in .torrent-Dateien enthalten sein müssen. Schlüsselwort Beschreibung announce Enthält die URL des Trackers. announce-list Ist eine optionale Erweiterung des BitTorrent Protokolls und wird genutzt um eine Liste von Ausweichtrackern zu implementieren. creation date Ist optional und enthält das Erstellungsdatum im Standard Unix Format (Anzahl der Sekunden seit dem 1-Jan-1970 00:00:00 UTC). comment Ist optional und kann mit einem freien Text des Erstellers belegt werden. created by Ist optional und enthält Name und Versionsnummer des Programms, welches für die Erstellung der .torrent-Datei genutzt wurde. info Enthält die Beschreibung der Datei als Zuordnungstabelle. Tabelle 3.2: Angaben einer .torrent-Datei 3.2 BitTorrent 47 Die Zuordnungstabelle im Schlüssel info enthält folgende Einträge: Schlüsselwort Beschreibung piece length Länge der Blöcke, in der Regel zweier Potenzen, bei älteren Versionen 220 = 1M , bei Versionen nach der Protokollversion 3.2 218 = 256KB pieces Die Länge eines Strings ist ein Mehrfaches von zwanzig-Byte, wobei jeder Teilstring zwanzig-Byte lang ist und den SHA-1 Hashwert des Teils und den Index des Teils enthält. private (optional) Ist eine Zahl, wenn diese auf eins gesetzt wird, muss der Peer seinen Ort angeben und wird nur zugelassen, wenn er in einer Liste des Trackers steht. Wenn die Zahl auf null gesetzt wird, kann jeder Peer diese Datei herunterladen. Tabelle 3.3: Unterwerte des Schlüssels info[Bi08b] Schlüsselwort Beschreibung name Name der Datei lenght Die Größe des Downloads in Byte md5sum MD5-Prüfsumme der Datei Tabelle 3.4: .torrent-Datei, die eine Datei enthalten[Bi08b] Schlüsselwort Beschreibung name Name des Verzeichnisses, wo alle Dateien abgespeichert werden sollen files Eine Liste von Zuordnungstabellen, jede Zuordnungstabelle enthält wieder folgende Werte length Die Größe des Downloads in Byte path Einen Pfad der die Unterverzeichnisse enthält, wenn mehr als eine Datei in der .torrent Datei enthalten ist, sonst der Name der Datei md5sum MD5-Prüfsumme der Datei Tabelle 3.5: .torrent-Datei, die mehr als eine Datei enthalten[Bi08b] Eine .torrent-Datei, die für das Paket apache2 mit bencoding generiert wurde, sieht wie folgt aus: 1 d8 : announce34 : h t t p : / / 1 9 2 . 1 6 8 . 1 . 1 0 0 : 8 0 8 1 / announce7 : comment40 : / home/ m i r r o r / d e b i a n / p o o l / main / a / a p a c h e 2 / 1 0 : c r e a t e d by14 : Apt−b i t t o r r e n t 4 : i n f o d 6 : l e n g t h i 4 1 4 4 2 e 4 : name29 : apache2_2 .2.3 −4+ e t c h 4 _ a l l . deb12 : p i e c e l e n g t h i 2 6 2 1 4 4 e 6 : p i e c e s 2 0 : f \ ’Y \ ’AL\^ o \~An\ ’O \~ a c ) \ " Eee Listing 3.1: .torrent-Datei des Paket apache2 48 3 Peer-to-Peer Tracker-Anfragen Die Anfragen an den Tracker müssen folgende Schlüsselwörter nutzen und in der Anfrage mitsenden.1 Schlüsselwort Beschreibung info_hash Liefert den SHA1 Wert des info Eintrags der .torrent Datei peer_id 20 stellige ID, die jeder herunterladende Client beim Start des Herunterladens generiert ip Optional, IP-Adresse oder DNS-Name des Clients; kann aus HTTPRequest ausgelesen werden port Portnummer, über die der Peer erreichbar ist uploaded Gesamtmenge der hochgeladenen Bytes in base 10 ASCII download Gesamtmenge der heruntergeladenen Bytes in base 10 ASCII, exklusive der mehrfach geladenen Blöcke wegen Übertragungsfehlern left Gesamtmenge der heruntergeladenen Bytes in Base 10 ASCII, inclusive der mehrfach geladen Blöcke wegen Übertragungsfehlern event Optional, welche Aktion ausgeführt werden soll. Mögliche Aktionen sind beginnen, fertig und anhalten. interval Anzahl der Sekunden, die der Peer bis zur nächsten Anfrage wartet. peer Liste bekannter Peers, jeder dieser Einträge enthält Peer ID, IP und Port. Tabelle 3.6: Schlüsselwörter bei Tracker-Anfragen[Bi08b] Wenn ein Fehler bei der Bearbeitung der Anfrage im Tracker auftritt, sendet der Tracker einen Fehlercode zurück, der im Client in eine für Menschen lesbare Form umgewandelt wird. Das BitTorrent-Protokoll arbeit mit TCP; in die Liste der Erweiterungen ist UDP als Transportmöglichkeit aufgenommen. Das Herunterladen findet nur dann statt, wenn der Client, der herunterladen will, ein entsprechendes Interesse bekundet und der Client, der die Daten bereitstellt, den herunterladenden Client nicht gedrosselt hat. Der Verbindungsaufbau geschieht mittels eines Handshakes, der folgenden Aufbau hat. Das erste Zeichen ist die Zahl neunzehn dezimal, gefolgt von der Zeichenkette „BitTorrent protocol“. Die neunzehn ist die Länge der Zeichenkette. Alle Ganzzahlen, die später gesendet werden, sind als vier Byte Bigendian codiert. Nach diesem Header kommen acht reservierte Bytes, die z. Z. alle mit null belegt sind. Als Nächstes kommt der 20 Byte lange SHA-1 Hash des Infoschlüssels 1 vgl. BitTorrent Spezifikation [Bi08b] am 11.07.2008 um 17:21 Uhr 3.2 BitTorrent 49 der .torrent-Datei. Wenn der info-Hash auf beiden Clients nicht übereinstimmt, wird die Verbindung beendet. Als nächstes kommt die 20 Byte lange PeerID, welche in der Trackeranfrage und in der Antwort des Trackers enthalten sein muss. Wenn die ID des empfangenden Clients nicht mit der ID des iniziierenden Clients übereinstimmt, wird die Verbindung ebenfalls getrennt. Nach dem Handshake werden die Daten und Nachrichten ausgetauscht. Nachrichten der Länge 0 sind Nachrichten, die das Vorhandensein eines Clients signalisieren, diese werden nicht weiterverarbeitet. Die anderen Nachrichten beginnen mit einem der folgenden Codes Code Beschreibung 0 Der anfragende Client ist gedrosselt, Länge der Nutzdaten ist 0. 1 Der anfragende Client wurde entdrosselt, Länge der Nutzdaten ist 0. 2 Der Client ist an einem Teil interessiert, Länge der Nutzdaten ist 0. 3 Der Client ist an einem Teil nicht interessiert, Länge der Nutzdaten ist 0. 4 Der Client besitzt das angefragte Teil und hat den Intigritätstest für dieses Teil erfolgreich durchgeführt. 5 Diese Nachricht übermittelt dem Client, welche Teile einer Datei bei einem anderen Client vorhanden sind. Wenn ein Client noch keine Teile besitzt, wird der Index des Teils und der Wert null übertragen. Ist ein Teil vorhanden, wird der Index und eine eins übertragen. 6 Ist eine Anfragenachricht nach einem Teil, es wird der Index des Teils mitgesendet. 7 Ist eine Nachricht die den Inhalt eines Teils überträgt. Dazu wird der Index und der Offset eines Teils mitgesendet. 8 Nachricht zum Abbrechen einer Übertragung, wird im Endspielmodus benötigt um den anderen Clients zu signalisieren, dass dieses Teil nicht mehr benötigt wird. Tabelle 3.7: Codierung der Nachrichten[Bi08b] 3.2.3 Erweiterungen des BitTorrent-Protokolls In den folgenden Punkten werden Möglichkeiten erklärt, die möglich sind aber nicht von allen Peers bzw. nicht von jeder Software genutzt werden können. Es existieren einige offizielle und inoffizielle Erweiterungen dieses Protokolls. Eine offizielle Erweiterung ist in diesem Kontext eine Erweiterung, die von der Protokollierungsstelle ausgegeben wurde. Eine der offiziellen Erweiterungen ist die Verschlüsselung der Verbindung zwischen den einzelnen Peers. InternetService-Provider können die Filterung des Internetverkehrs, der durch BitTorrent verursacht wird, nicht anhand einer Portnummer durchführen. Es kommt 50 3 Peer-to-Peer trotzdem zur Drosselung des Peer-to-Peer-Verkehrs. Die Verschlüsselung kann dazu genutzt werden, um die Drosselung einiger Internet-Service-Provider zu umgehen. Eine inoffizielle Erweiterung des Protokolls ist das „Azureus Messaging Protocol“; dieses Protokoll erweitert das Standardnachrichtenprotokoll von BitTorrent um weitere Funktionen, wie das Minimieren der Tracker-Kontakte, weil die Peers untereinander Nachrichten austauschen. Auch ein Chat ist in dieser Erweiterung vorgesehen. BitTorrent ohne Tracker-Host In aktuellen BitTorrent-Versionen wird der Betrieb ohne Tracker-Host zur Verfügung gestellt. Das Netz wird dadurch dezentral, weil es keinen zentralen Tracker-Host mehr gibt. Der Verzicht auf einen Tracker-Host kann Probleme, wie den Ausfall des Tracker-Hosts, ausschließen. Um auf den Tracker-Host verzichten zu können, wird ein Algorithmus vorausgesetzt, der die Aufgabe des Tracker-Hosts übernehmen kann. Dazu verwendet BitTorrent einen Algorithmus Namens „Kademlia“. Es ist dadurch möglich die Funktion des Tracker-Hosts auf die Clients zu verteilen. Die Kompatibilität zwischen den Clients ist jedoch problematisch, weil nicht alle das Protokoll für die verteilten Hashtabellen unterstützen.1 Kademlia implementiert verteilte Hashtabellen. Kademlia nutzt die Protokolle IP und UDP für die Kommunikation mit den anderen Knoten. Jeder Knoten erhält eine eindeutige Identifikation. Wenn ein neuer Knoten dem Netz beitritt, durchläuft er einen Prozess, der ähnlich dem Startprozess von Gnutella ist. Er muss zuerst Kontakt zu einem Knoten im Netz aufnehmen. Dieser Knoten übermittelt dem neuen Knoten die IP-Adressen der anderen Knoten im Netz. Wenn eine Information ins Netz eingetragen werden soll, wird zuerst der Hashwert der Information berechnet. Dabei ist zu beachten, dass die Länge des Hashwertes der Information und der Hashwert des Knotens immer dieselbe Länge haben muss. Der Knoten sucht nun Knoten, die die kleinste Distanz zum Hashwert der Information besitzen. An diese Knoten sendet er seine Kontaktdaten. Wird nun diese Information im Netz gesucht, wird die Berechnung der kleinsten Distanz erneut durchgeführt und so erhält der Knoten die Information des Knotens dem bekannt ist, wo die Information abgespeichert ist. Die Berechnung der Distanz zwischen zwei Knoten geschieht durch die XOR-Funktion und beträgt immer log2 (ID1 XORID2 )2 1 2 vgl. Wikipedia Artikel zu BitTorrent[Wi08a] am 14.07.2008 um 15:10 Uhr vgl. [Wi08c] Wikipedia Artikel zu Kademlia am 14.07.2008 um 14:50 Uhr 3.2 BitTorrent 51 Redundante Codierung Aufgrund der dezentralen Datenhaltung besteht bei BitTorrent und anderen Peer-to-Peer-Netzwerken immer die Gefahr, dass Teile einer Datei durch das Abmelden von Peers verloren gehen. Wenn nur wenige Teile fehlen, kann dies durch redundante Codierung ausgeglichen werden. Im Beispiel besteht die Datei aus 4 Teilen, x1 = 0101, x2 = 0011, x3 = 1000 und x4 = 0000. Daraus kann mittels XOR z. B. ein Fehlercode z = x1 +x2 +x3 +x4 = 1110 errechnet werden. Meldet sich nun der Client mit dem Teil x2 ab, kann dieses Teil mittels x2 = z + x1 + x3 + x4 neu errechnet werden. Diese Technik wird in Netzwerken als Vorwährtsfehlerkorrektur verwendet. In Netzwerken dient diese Technik der Korrektur einzelner Bits, die verloren gegangen sind, bei Peer-to-Peer-Netzen gehen gleich ganze Blöcke verloren. Ein Codierverfahren, welches dies kompensieren kann, ist die Kodierung von Reed und Solomon. Bei der Reed-Solomon-Codierung muss im Voraus festgelegt werden wie viele dieser Blöcke verloren gehen dürfen, um die Verluste kompensieren zu können. Eine Datei wird in n Blöcke zerlegt. Die Anzahl der wiederherstellbaren Blöcke sei k. Es müssen jetzt statt n Blöcke, n + k Blöcke codiert werden, wobei n Blöcke für die Wiederherstellung der Datei ausreichen. Die Blöcke werden als Vektoren über einem Körper betrachtet, sodass sie addiert werden können und mit Variablen multipliziert werden können. Die Blöcke werden codiert in dem man die Matrixmultiplikation mit einer Matrix der Größe (n + k) × n durchführt. M .X = Y Dabei muss jede n × n Teilmatrix, die durch Streichen von k Zeilen von M entsteht, invertierbar sein. Sei M 0 eine Teilmatrix, welche die korrespondierenden Zeilen des n-stelligen Teilcodes (yi1 , ..., yin ) mit i1 < i2 < ... < in enthält. Dann gilt M 0.X = Y 0 Ist M 0 invertiert, kann durch X = (M 0 )−1 Y 0 52 3 Peer-to-Peer der Originalvektor wiederhergestellt werden. Hierzu wird ein n-stelliger Teilcode sowie die Indizes des Codes benötigt. Eine geeignete Vektorgröße ist F [256], da diese mit der Wortlänge aktueller Prozessoren übereinstimmt. 3.2.4 BitExt - BitTorrent Bibliothek Die BitExt BitTorrent Bibliothek kapselt die Funktionalität von BitTorrent. Die Bibliothek steht unter der GNU GPL Lizenz zur Verfügung und ist auf der Seite http://sourceforge.net/projects/bitext/ zu finden. Die aktuelle Version wurde am 25. Oktober 2007 online gestellt. Diese Bibliothek bringt einen eigenen Tracker mit, welches den Aufwand bei der Entwicklung reduziert, da während der Entwicklung kein eigenständiger Tracker laufen muss. Zu den Funktionen, die diese Bibliothek bietet, gehören das Erzeugen von .torrent Dateien, inklusive aller notwendigen Codieraufgaben. Es ist möglich die erstellten .torrent-Dateien auf einem Tracker zu veröffentlichen und die Dateien, die in der .torrent-Datei enthalten sind, herunterzuladen oder anderen Personen zur Verfügung zu stellen. Dafür stellt BitExt einen Downloadmanager bereit, der in einem Thread gestartet werden muss, um mehr als eine Datei herunterzuladen und danach zu verteilen. Es handelt sich hier um eine in Java entwickelte Bibliothek, die sich zur Zeit noch im Beta-Stadium befindet. Nach dem Eintrag bei SourceForge wird diese Bibliothek von nur einem Entwickler geschrieben. Bewertung BitExt ist eine Bibliothek mit der es einfach ist, die Funktionalität von Bittorrent zu nutzen. Sie läuft noch nicht an allen Stellen zur vollen Zufriedenheit, da es z.B. beim Herunterladen von Dateien keine Benachrichtigung gibt, wann der Download abgeschlossen ist und der Prozess des Verteilens beginnt. Es ist zur Zeit noch nicht klar, ob diese Bibliothek weiter entwickelt wird und diese Mängel noch abgestellt werden. KAPITEL 4 Praxis In dem nachfolgenden Kapitel wird die praktische Umsetzung der Diplomarbeit dargestellt. Das Kapitel unterteilt sich in drei Unterpunkte. Der erste Unterpunkt beschäftigt sich mit der Zielsetzung der praktischen Arbeit. Im darauf folgenden Punkt wird die Konzeption der beiden Tracker- und Peer-Komponenten vorgestellt. Zum Abschluss des Kapitels wird auf die Tests eingegangen und den dafür notwendigen Testaufbau. 4.1 Zielsetzung Ziel ist es, eine Anwendung zu entwickeln, die eine Paketverwaltung unter debian-basierten Linux-Distributionen ermöglicht. Die Paketverwaltung soll folgende Funktionen umfassen. Es soll möglich sein, die Abhängigkeiten der Pakete aufzulösen. Um dies zu ermöglichen muss es möglich sein, die Paketlisten der Paketdatenbank einzulesen und auszuwerten. Des Weiteren muss es möglich sein, Pakete zu installieren und ein Update des Systems vornehmen zu können. Um ein System-Update vornehmen zu können, muss die Anwendung die Versionsnummern der installierten Pakete mit den Versionsnummern der Pakete in der Paketdatenbank vergleichen. Diese Paketverwaltung soll ihre Pakete nicht auf dem konventionellen Weg per FTP- oder Webserver beziehen, sondern über ein Peer-to-Peer-Netzwerk. Dazu muss sowohl eine Peer-Anwendung als auch eine Tracker-Anwendung entwickelt werden. Die Komponenten auf dem Tracker-Host umfassen folgende Funktionen. Der Tracker-Host soll für Pakete die .torrent-Datei erzeugen und diese auf dem Tracker registieren. Weiterhin muss die Tracker-Anwendung erkennen können, ob ein Paket im Debian-Mirror aktualisiert wurde und dafür eine neue .torrent- 54 4 Praxis Datei erstellen. Eine weitere Funktion ist das Verteilen der Pakete, die in den .torrent-Dateien enthalten sind. Durch die Verwendung von Peer-to-Peer-Mechanismen lässt sich die Last für den Server senken und in Zeiten, wenn viele Nutzer Daten von den Servern anfordern, die Verbindungsgeschwindigkeit erhöhen. Bei einer normalen Nutzungssituation ist die Verwendung von HTTP oder FTP nicht langsamer als die Nutzung von BitTorrent. Dies gilt unter der Voraussetzung, dass die Bandbreite des Server für die Anzahl der Nutzer im Standardfall ausreicht. Einen Geschwindigkeitsvorteil erhält der Nutzer erst im Fall eines Updates auf eine neuere Distribution, wenn die Bandbreite des Servers nicht mehr ausreicht. 4.2 Konzeption Die Software wird in verschieden Komponenten aufgeteilt. Abbildung 4.1: Komponenten Die Komponente PackageManagment enthält die Funktionen, welche für das Auflösen von Abhängikeiten bis zur Installation der Pakete notwendig sind. Die Paketverwaltung nutzt das externe Programm dpkg, um die Pakete zu installieren und zu konfigurieren. Diese Komponente ist über ein Interface mit der BitTorrent-Komponente verbunden. Das Interface dient einer loseren Kopplung zwischen den Komponenten, um die BitTorrent-Komponente leichter austauschen zu können. Die BitTorrent-Komponente selbst dient der Aufbereitung der Daten und der Nutzung der BitTorrent-API. Der Aufbau auf der Seite des Tracker-Hosts sieht ähnlich aus, weil dort das gleiche Konzept der Lockerung der Kopplung angewendet wurde. 4.2 Konzeption 55 4.2.1 Konzept der Tracker-Anwendung Die Anwendung, die auf dem zentralen Tracker-Host läuft, ist ein Debian-Mirror. Dies ist erforderlich, um die Pakete lokal vorliegen zu haben und um die .torrentDateien erstellen zu können. Weitere Anwendungen die auf dem Tracker-Host laufen sind der Tracker selbst und eine Anwendung, die es ermöglicht die Dateien, die in den .torrent-Dateien registriert sind, zu verteilen. Debian-Mirror Der Debian-Mirror ist ein Shell-Skript, welches die aktualisierten Pakete von einem Server des Debian-Projekts herunterlädt und in den vorgeschriebenen Ordnern abspeichert. Dabei werden die Pakete, die neuer sind als im lokalen Mirror durch das Programm debmirror bestimmt und heruntergeladen. Die Verzeichnisse werden zusätzlich von einem Apache Webserver bereitgestellt. Dieser dient ausschließlich für Tests. 1 2 3 4 5 6 7 8 9 10 11 12 13 #! / b i n / b a s h MIRRORUSER=m i r r o r MIRRORUID=‘ cat / e t c / passwd | g r e p $ {MIRRORUSER} : | c u t −d : −f 3 ‘ i f [ ! $UID −eq $MIRRORUID ] ; then echo " Warnung : D i e s e s S c r i p t w i r d n i c h t vom u s e r $MIRRORUSER a u s g e f u e r h r t " echo " Warnung : B i t t e p e r \ " s u $MIRRORUSER −c m i r r o r \ " s t a r t e n " exit 1 fi l o g g e r −t m i r r o r [ $$ ] Updating Debian M i r r o r d e b m i r r o r /home/ m i r r o r / d e b i a n −−p r o g r e s s −−n o s o u r c e −−h o s t=f t p . de . d e b i a n . o r g −−r o o t =/ d e b i a n −−d i s t=e t c h −−s e c t i o n=main , c o n t r i b , non−f r e e −−method=f t p −−a r c h=i 3 8 6 −−p a s s i v e −−g e t c o n t e n t s −−i g n o r e −r e l e a s e −gpg l o g g e r −t m i r r o r [ $$ ] F i n i s h e d Updating Debian M i r r o r Listing 4.1: Mirror-Skript zum Aktualisieren des lokalen Mirrors Im ersten Schritt, in Zeile fünf, wird überprüft ob das Skript von dem definierten Nutzer ausgeführt wird. Diese Überprüfung ist erforderlich damit das Skript die Dateien ersetzen kann. In der Zeile zwölf wird der eigentliche Aktualisierungsprozess gestartet. Die Parameter definieren, welche Distribution geladen werden soll, mit welchen Zweigen und welche Rechnerarchitektur der Mirror bereitstellen soll. Für den Debian-Mirror ist mindetens 5 GB auf der Festplatte zu reservieren.(vgl. [De]) 56 4 Praxis Tracker-Anwendung Die Tracker-Anwendung stellt unterschiedliche Funktionen für den Tracker bereit. Zu diesen Funktionen gehören die Erstellung der .torrent-Dateien und das Verteilen der Pakete. Die gesamte Anwendung läuft mit der BitTorrent Bibliothek BitExt und ist trackerbasiert. Die Entscheidung, einen zentralen Tracker zu nutzen, wurde getroffen weil die Bibliothek keine Unterstützung für einen trackerlosen BitTorrent-Betrieb besitzt. In der Bibliothek sind keine Algorithmen für verteilte Hashtabellen vorhanden. Der Ressourcenbedarf der Anwendung ist hoch, wenn alle Pakete von dem Tracker-Host auch verteilt werden sollen. Dies liegt daran, dass die Bibliothek für das Bereitstellen von Dateien pro .torrent-Datei einen Thread benötigt. Das Debian-Repository in der Variante, wie es zurzeit auf dem Debian-Mirror läuft, also nur die Zweige „main, contrib und non-free“ für die Rechnerarchitektur i386, stellt ca. 10000 Pakete bereit. Das heißt, mit der jetzigen Bibliothek müssen ca. 10000 Threads geöffnet werden, um die Dateien zu verteilen. Es müssen alle Dateien geöffnet sein, weil es keine Nachricht gibt, dass eine Datei heruntergeladen werden soll und diese dann geöffnet wird. Die Anzahl der Threads führt zu einem weiteren Problem, da die Anzahl der gleichzeitig offenen Dateien bei Unix-Systemen beschränkt ist. Diese Grenze liegt bei Debian bei 1024 Dateien und muss demzufolge auf einen Wert größer 10000 angehoben werden. Interface zwischen Paketverwaltung und BitTorrent Sämtliche Funktionen der Bibliothek werden über ein Interface aufgerufen, damit im Falle eines Wechsels der Bibliothek nicht alle Funktionen der Bibliothek in allen Klassen geändert werden müssen. Die Interfaceklasse dient der Kapselung dieser Funktionen. 4.2 Konzeption 57 Abbildung 4.2: Interface zwischen Anwendung und Bibliotheksaufrufen Die Klasse PublishTorrent nutzt dabei das Interface zum eigentlichen Bekanntmachen der .torrent-Datei bei dem angegebenen Tracker. Das Interface definiert vier Methoden, die der Server benötigt, um mit einem BitTorrent-Netzwerk Kontakt aufnehmen zu können. Die vier Methoden sind das Herunterladen einer Datei, das Verteilen einer Datei sowie die zwei Methoden zum Registrieren einer Datei bei einem Tracker. Das Herunterladen ist notwendig, um eine Datei, die in in einer .torrent-Datei registriert ist, verteilen zu können. Das Registieren und Verteilen von Dateien wird in den nächsten Punkten erläutert. .torrent-Dateien für neue Pakete erstellen Die .torrent-Dateien müssen bei einem Update oder dem Hinzufügen neuer Pakete neu erstellt werden. Um nicht alle Pakete neu erstellen zu müssen, wird anhand des Datums der letzten Modifikation überprüft, ob sie sich geändert haben. Wenn eine Änderung vorliegt, werden die .torrent-Dateien neu generiert und auf den Webserver geladen. Die Datei neu auf den Webserver zu kopieren, ist zurzeit nur lokal auf dem Webserver möglich. Der Anwendung fehlt noch eine Möglichkeit die Datei auf einen anderen Server zu kopieren. Eine Möglichkeit dies zu realisiern ist WebDAV. Das bedeutet, dass der Tracker und der Webserver 58 4 Praxis auf einem Rechner betrieben werden müssen. Die Erstellung der .torrent-Dateien übernimmt die Bibliothek von BitTorrent. Es werden dafür von der Anwendung folgende Parameter gesetzt: • Liste der Dateien, die mit der .torrent-Datei verteilt werden sollen • Tracker-URL • Erzeuger • Kommentar • Speicherort • Dateiname der .torrent-Datei In der Liste der Dateien wird in der Regel nur eine Datei übergeben. Die Liste ist eine ArrayList, welche den Pfad zur Datei enthält. Die Tracker-URL dient den Clientanwendungen als Möglichkeit der Kontaktaufnahme zum Tracker. Als Erzeuger wird Apt-BitTorrent übergeben. Der Erzeuger müsste nicht übergeben werden, da die Spezifikation dieses Feld optional definiert. Der Speicherort wird nach der Definition der BitTorrent-Spezifikation mit dem Dateinamen bei einer Datei oder dem Pfad bei mehr als einer Datei belegt. Abbildung 4.3: Klassendiagramm der Klasse GenerateTorrent mit den Attributen, die gesetzt werden 4.2 Konzeption 59 Veröffentlichen .torrent-Dateien Die .torrent-Dateien müssen auf einen Webserver übertragen werden, um sie nutzen zu können. Des Weiteren müssen die .torrent-Dateien beim Tracker registiert werden. Dafür wird die Klasse PublishTorrent benötigt. Abbildung 4.4: Veröffentlichen von .torrent-Dateien Pakete mit dem Tracker bereitstellen Um die Pakete mit dem Tracker verteilen zu können, werden diese aus dem Mirror Ordner eingelesen. Der Speicherort wird in der .torrent-Datei in dem Kommentarfeld hinterlegt. Das Verteilen wird über die Funktion des Herunterladens realisiert. Wenn eine Datei vorhanden ist, wird der entsprechende Thread in den Modus des Verteilens gesetzt. 60 4 Praxis Abbildung 4.5: Verteilen von Dateien 4.2 Konzeption 61 4.2.2 Konzept der Peer-Anwendung Paketverwaltung Die Paketverwaltung soll in der Lage sein, Abhängigkeiten zwischen Paketen aufzulösen. Um diese Aufgabe erfüllen zu können, muss die Paketverwaltung Listen führen, welche Programme verfügbar sind und welche installiert sind. Diese Informationen werden durch das Parsen von Paketdateien bereitgestellt. Abbildung 4.6: Paket installieren Die Klasse AptBittorrent dient der Steuerung der Aktionen und wird als Thread konzipiert, um während des Herunterladens einer Dateien diesen Thread pausieren zu können und nach Abschluss wieder zu wecken. Darüber hinaus soll die Paketverwaltung Updates von Programmen erkennen und durchführen. Um ein Update zu erkennen, muss die Versionsnummer eines Paketes, das installiert ist, mit der Versionsnummer des Paketes in der Liste der verfügbaren Pakete verglichen werden. Herunterladen der .torrent-Dateien Die .torrent-Dateien der Pakete werden auf einem Webserver bereitgestellt und von diesem heruntergeladen. Dazu muss die Clientanwendung eine HTTPVerbindung zu diesem Server aufbauen und den Stream auf der Festplatte ablegen. Der zu verwendende Webserver wird aus einer Konfigurationsdatei ausgelesen, 62 4 Praxis um eine schnelle Änderung des genutzten Webservers zu ermöglichen. Downloadmanager der Bibliothek Der Downloadmanager, welcher von der BitTorrent-Bibliothek bereitgestellt wird, hat einen Nachteil. Er blockiert ohne Mitteilung den Haupt-Thread und gibt diesen nach dem Download nicht wieder frei. Aus diesem Grund wird ein eigener Thread für das Herunterladen der Dateien benötigt. Dieser Thread blockiert ebenfalls den Steuerthread, sendet aber nach dem Herunterladen einer Datei ein Signal an diesen. Danach blockiert er den Thread des Herunterladens für das Verteilen der Dateien. Pakete installieren Die Installation der Pakete wird durch das Aufrufen eines externen Programms realisiert. Dazu wird das dpkg-Frontend apt-get eingesetzt. Dieses hat den Vorteil, dass die Pakete nicht in der richtigen Reihenfolge angegebenen werden müssen. Apt-get entpackt die Pakete und konfiguriert diese auch. Nutzung externer Programme Es werden externe Programme im Verlauf des Programmes genutzt. Dazu wird mittels 1 2 3 [...] P r o c e s s p r = Runtime . getRuntime ( ) . e x e c ( command ) ; [...] Listing 4.2: Nutzen externer Programme ein anderes Programm aufgerufen. Diese Vorgehensweise wird z. B. bei dem Vergleich der Versionsnummern genutzt, um entscheiden zu können, ob eine neuere Version eines Paketes vorhanden ist. Dazu wird der Rückgabewert, der in Process pr enthalten ist, ausgewertet. 4.3 Tests 63 4.3 Tests Es wurden unterschiedliche Tests durchgeführt. Diese Tests wurden sowohl als JUnit-Tests als auch in virtuellen Maschinen durchgeführt. 4.3.1 Testaufbau Für die Entwicklung und die Tests existieren mehrere virtuelle Rechner, auf denen unterschiedliche debian-basierte Betriebssysteme installiert sind. Es existiert auf einer vitruellen Maschine ein Tracker, auf der gleichzeitig ein DebianMirror betrieben wird. Dies ist notwendig, um die Pakete für die Generierung der .torrent-Dateien lokal vorliegen zu haben. Des Weiteren muss ein debian-basierter Client vorhanden sein, um die Pakete, die per BitTorrent heruntergeladen wurden, testweise installieren zu können. Die beiden zuvor genannten virtuellen Rechner laufen mit einem Debian 4.0 Etch Betriebssystem. Da diese Distribution nicht für alle Tests geeignet war1 , wurde ein weiterer Rechner mit einer Ubuntu Distribution für die Update-Tests verwendet. Abbildung 4.7: Testaufbau 4.3.2 JUnit Tests Die Hauptfunktionen, die am Server mittels JUnit getestet wurden, sind sowohl das Verteilen von Dateien als auch das Erstellen von .torrent-Dateien. Es wurde 1 die Anzahl der Updates in der Zeit des Tests war zu gering 64 4 Praxis dabei überprüft, ob unerwartete Exceptions bei der Abarbeitung des Programms auftreten und ob das Programm die gewünschten Aktionen ausführt. Ähnliche JUnit Tests wurden auch auf der Client-Seite der Anwendung entwickelt. Zu den getesteten Funktionen zählen dort das korrekte Auflösen von Abhängigkeiten, die Ermittlung der neuen Pakete, die einem Update unterzogen werden sollten, sowie das Installieren von Paketen. 4.3.3 Tests an virtuellen Rechnern Es wurde auch das Verhalten des kompletten Programms an mehreren Rechnern und mehrere debianbasierten Distributionen überprüft. Dazu wurde eine virtuelle Maschine mit einem Debian verwendet und ein Rechner, auf dem ein Ubuntu der Version „8.04 LTS“ installiert ist. Diese Tests umfassten auf der Client-Seite die Funktionen des Aktualisierens der Paketlisten, des Aktualisierens des Systems auf den aktuellen Stand der Paketlisten sowie die Installation eines Pakets mit den ermittelten Abhängigkeiten. An der Serveranwendung wurden auch Tests vorgenommen, wie das Erstellen der .torrent-Datei für neue und für alle Pakete sowie das Verteilen aller Pakete und einzelner Paketgruppen. KAPITEL 5 Zusammenfassung und Ausblick 5.1 Zusammenfassung Diese Arbeit zeigt sowohl Vorteile der Nutzung von Peer-to-Peer-Technologien in der Verteilung von Softwarepaketen als auch derzeitig existierende Hindernisse auf. Das verwendete Protokoll wird nicht von allen Clients und Trackern in vollem Umfang unterstützt. Aus diesem Grund kann in der Anwendung die zentrale Instanz nicht entfernt werden. Darüberhinaus ist der Ressourcenbedarf der Anwendung in der jetzigen Version sehr hoch. Zu den Funktionen, welche die Anwendung bereitstellt, gehören das Auflösen der Abhängigkeiten zwischen den Paketen, das Herunterladen und Installieren von Paketen, sowie die Möglichkeit ein Update an einem bestehenden System vorzunehmen. Darüberhinaus die Funktionen, die dazu notwendig sind, um die eben genannten Aufgaben erfüllt werden können. 5.2 Ausblick In der zukünftigen Entwicklung der Anwendung ist noch Potenzial für Erweiterungen vorhanden. Eine dieser Erweiterungen ist das Einbinden eines WebDAV-Clients, um die .torrent-Dateien auf einen anderen Server übertragen zu können. Des Weiteren ist es möglich, die BitTorrent-API gegen eine API auszutauschen, die ein besseres Downloadmanagement zur Verfügung stellt. Eine weitere Verbesserung ist die Unterstützung von mehr als einem Distributionszweig. 66 5 Zusammenfassung und Ausblick Trotz dieser Erweiterungsmöglichkeiten setzt die Anwendung schon jetzt einen großen Teil der Möglichkeiten einer Paketverwaltung um. KAPITEL 6 Literaturverzeichnis [Bi08a] Bittorrent Protokol. http://www.bittorrent.org/beps/bep_0003.html. Version: 2008 (Zitiert auf Seite 45) [Bi08b] Bittorrent Spezifikation. http://wiki.theory.org/BitTorrentSpecification. Version: 2008 (Zitiert auf Seiten 45, 47, 48, 49 und iii) [Bl08] Bleich, Holger: Studie: Tauschbörsen erzeugen 69 Prozent des deutschen IP-Traffics. In: Heise Online/c’t (2008), Juni. http://www.heise.de/netze/Studie-Tauschboersen-erzeugen-69-Prozent-des-d news/meldung/99814 (Zitiert auf Seite 28) [De] Debian Mirror. http://www.lug-kr.de/wiki/DebianMirror (Zitiert auf Seite 55) [De08] Debian Richtlinien. http://www.de.debian.org/doc/debian-policy/ch-files. html#s10.7.3. Version: Juni 2008 (Zitiert auf Seite 16) [Dp08] Debian Package Manager. 68 6 Literaturverzeichnis http://de.wikipedia.org/wiki/Dpkg. Version: 06 2008. – Wikipedia Artikel zu dpkg am 15.06.2008 um 15:02 Uhr (Zitiert auf Seite 14) [FH04] Filesystem Hierarchy Standard. http://www.pathname.com/fhs. Version: Januar 2004 (Zitiert auf Seite 14) [Gl05] Debian Glossar. http://www.debian.org/doc/manuals/maint-guide/ch-trans. de.html#s-gloss. Version: Januar 2005. – Sektion S des Debian Glossars (Zitiert auf Seite 3) [Ki08] Kietzke, Matthias: Paketverwaltung – von APT und RPM. In: freies Magazin (2008), März, 27–28. http://freiesmagazin.de/ftp/2008/freiesMagazin-2008-03. pdf (Zitiert auf Seite 13) [Kr06] Krafft, Martin F.: Das Debian-System - Konzepte und Methoden. Open Source Press, 2006. – ISBN 3–937513–17–1 (Zitiert auf Seiten 4, 6, 7, 9, 11, 14, 16, 18 und 25) [Ma08] Hilfe von dpkg. http://linuxreviews.org/man/dpkg/. Version: 2008. – Man-Page von dpkg (Zitiert auf Seite 12) [MS07] Mahlmann, Peter ; Schindelhauer, Christian: Peer-to-Peer-Netzwerke. Springer, 2007 (eXamen.press). – ISBN 978–3–540–33991–5 (Zitiert auf Seiten 28, 33, 34, 35, 36, 37, 38, 41 und 44) [P208] http://de.wikipedia.org/wiki/Peer-to-Peer (Zitiert auf Seiten 29 und 34) 6 Literaturverzeichnis 69 [Pa08] Paketverwaltung. http://de.wikipedia.org/wiki/Paketverwaltung. Version: Juni 2008. – Wikipedia Artikel zu Packetverwaltung vom 15.06.2008 um 16:40 Uhr (Zitiert auf Seite 12) [Ro] Ronneburg, Frank: Debian Anwender Handbuch. http://debiananwenderhandbuch.de/debianpaketeerstellen. html#debianpaketeerstellencontrol (Zitiert auf Seite 8) [Ve] Versionsnummer. http://de.wikipedia.org/wiki/Versionsnummer (Zitiert auf Seite 4) [Wi08a] BitTorrent (Protokoll). http://de.wikipedia.org/wiki/BitTorrent_Betrieb. Version: 2008 (Zitiert auf Seite 50) [Wi08b] Hashfunktionen. http://wga.dmz.uni-wh.de/orga/html/default/hash. Version: 2008 (Zitiert auf Seite 35) [Wi08c] Kademlia. http://de.wikipedia.org/wiki/Kademlia. Version: 2008 (Zitiert auf Seite 50) [WW02] Wojciechowski, Remigiusz ; Weinhardt, Christof: Peer-to-Peer. Springer, 2002. – ISBN 3–540–43708–8 (Zitiert auf Seiten 30, 31, 32 und i) Abbildungsverzeichnis 2.1 2.2 2.3 Installation eines Paketes . . . . . . . . . . . . . . . . . . . . . . 15 Entfernen eines Paketes . . . . . . . . . . . . . . . . . . . . . . 17 Teil eines Abhängigkeitsbaums des Pakets abcde . . . . . . . . . 18 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 Traffic durch Peer-to-Peer in Deutschland . . . . . . . Client-Server-Architektur [WW02] . . . . . . . . . . . Peer-to-Peer-Architektur [WW02] . . . . . . . . . . . Verbindung von Peer-to-Peer-Netzwerken mittels Web Peer-to-Peer-Netzwerk mit zentralem Server . . . . . Peer-to-Peer-Netzwerk ohne zentralen Server . . . . . Einfügen eines Peers ins Netz . . . . . . . . . . . . . Graph . . . . . . . . . . . . . . . . . . . . . . . . . . Defragmentierung des Graphen Fall 1 . . . . . . . . . Defragmentierung des Graphen Fall 2 . . . . . . . . . Herunterladen des zweiten Teils einer Datei . . . . . . . . . . . . . . . . . . . . . . . . -Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 30 30 32 33 34 36 37 38 38 44 4.1 4.2 4.3 Komponenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interface zwischen Anwendung und Bibliotheksaufrufen . . . . . Klassendiagramm der Klasse GenerateTorrent mit den Attributen, die gesetzt werden . . . . . . . . . . . . . . . . . . . . . . . Veröffentlichen von .torrent-Dateien . . . . . . . . . . . . . . . . Verteilen von Dateien . . . . . . . . . . . . . . . . . . . . . . . . Paket installieren . . . . . . . . . . . . . . . . . . . . . . . . . . Testaufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 57 4.4 4.5 4.6 4.7 58 59 60 61 63 Tabellenverzeichnis 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 Übersicht der Kategorien nach Debian-Richtlinie . . . . . . . . . Kontrollinformationen für dpkg . . . . . . . . . . . . . . . . . . Relationen zwischen Paketen . . . . . . . . . . . . . . . . . . . . Prioritäten von Paketen . . . . . . . . . . . . . . . . . . . . . . Übersicht der Paketstatusinformationen laut Man Page von dpkg Übersicht der Paketauswahlinformationen laut Man Page von dpkg Paketdateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prioritäten von Paketen . . . . . . . . . . . . . . . . . . . . . . Template-Datei des Packets postfix(stark gekürzt) . . . . . . . debconf-Treiber . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 7 9 11 12 12 13 20 20 23 3.1 3.2 3.3 3.4 3.5 3.6 3.7 Downloadstrategien . . . . . . . . . . . . . . . . . . . . Angaben einer .torrent-Datei . . . . . . . . . . . . . . . Unterwerte des Schlüssels info[Bi08b] . . . . . . . . . . .torrent-Datei, die eine Datei enthalten[Bi08b] . . . . . .torrent-Datei, die mehr als eine Datei enthalten[Bi08b] Schlüsselwörter bei Tracker-Anfragen[Bi08b] . . . . . . Codierung der Nachrichten[Bi08b] . . . . . . . . . . . . 45 46 47 47 47 48 49 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CD-Inhalt Die CD besitzt folgende Ordnerstruktur: Diplomarbeit Enthält die PDF der Diplomarbeit und die Web-Quellen www-source: Web-Quellen JavaDoc JavaDoc der Anwendung Peer: JavaDoc der Peer-Anwendung Tracker: JavaDoc der Tracker-Anwendung Quellcode Quellcode der Anwendung Peer: Enthält den Quellcode der Peer-Anwendung Tracker: Enthält den Quellcode der Tracker-Anwendung Index A Advanced Packaging Tool, 18 APT, 18 apt-get, 14 B Bencoding, 45 Binärpaket, 5 BitTorrent, 41 Tracker-Anfrage, 48 Datenstruktur, 45 .torrent-Datei, 46 Drosselung, 42 Effektivität, 41 Erweiterungen, 49 Fairness, 42 Funktionsweise, 43 Optimistische Entdrosselung, 43 Trackerlos, 50 C CAN, 35 Client-Server-Architektur, 28 console-apt, 14 control-Datei, 8 Conflicts, 9 Depends, 9 Enhances, 9 Provides, 9 Recommends, 9 Replaces, 9 Suggests, 9 Coupon-Collectors-Problem, 44 D debconf, 22 Debian Package Manager, 14 Debian-Paket, 4 Debian-Richtlinien, 16 Dezentralisierung, 28 dselect, 14 F FHS, 14 Filesystem Hierarchy Standard, 14 H Hashfunktion, 35 Kryptografisch sicher, 35 J JXTA, 31 K Kademlia, 50 Kontrolldateien, 7 L Leecher, 42 O Overlay-Netzwerk, 28 P Paket, 3 Priorität von, 10 Auswahlstatus, 12 Entfernen, 16 Installation, 14 Konfiguration, 19 Relation, 9 Statusinfomationen, 12 viii Paketdatenbank, 13 Paketverwaltung geändertes Paket, 23 Peer-to-Peer, 28 Arten, 32 Dezentral, 33 Hybrid, 34 Zentral, 32 Groupware, 27 Rechtliches, 39 Vergleich mit Web-Services, 30 Q Quellpaket, 5 R Redundante Codierung, 51 Reed-Solomon-Codierung, 51 S Seeder, 42 T Teileauswahl, 44 Tracker-Host, 41 U UDDI, 31 Urheberrecht, 40 V Verfügbarkeit, 31 Versionsnummer, 4 Verteilte Hashtabellen, 34 Defragmentierung, 37 Entfernen eines Peers, 37 Hinzufügen eines Peers, 36 Vorwährtsfehlerkorrektur, 51 Index