AA_roadtrain-cp_123rf-14298755_colindamckie.jpg

© colindamckie, 123RF

Übergröße

Große Dateien transferieren

18.10.2012 Einige Dateisysteme orientieren sich meist an Dateien kleiner und mittlerer Größe und bekommen bei größeren Brocken schnell Schluckauf. Kleine Umwege versprechen hier Abhilfe.

Die Situation kommt Vielen vermutlich bekannt vor: Sie möchten eine große Datei auf einem USB-Stick speichern, das Unterfangen schlägt aber fehl, obwohl genügend Platz vorhanden wäre. In diesem Fall sind Sie sehr wahrscheinlich an die Grenzen des Dateisystems auf dem verwendeten Datenträger gestoßen. Als Ursache kommt eine gefüllte File Allocation Table (FAT) – das Verzeichnis über den Inhalt des Datenträgers – und das Erreichen der maximalen Anzahl der Blöcke pro Datei in Frage.

Aus Kompatibilitätsgründen liefern viele Hersteller ihre Medien mit den Dateisystemen VFAT oder FAT32 aus. Dass diese die Größe einer Datei begrenzen, fällt oft lange Zeit nicht auf. Beide speichern Dateien bis zu einer maximalen Größe von rund 4 GByte. Allerdings gibt es verschiedene Lösungsansätze, wie Sie solche großen Dateien dennoch von Rechner zu Rechner transportieren.

Variante Eins ist der Datentransfer über eine Netzwerkverbindung, Variante Zwei das Komprimieren der Daten, Variante Drei das Formatieren des Datenträgers mit einem anderen Dateisystem und Variante Vier das Zerlegen der Datei in mehrere Stücke und das nachfolgende Zusammenfügen auf dem Zielsystem.

Netzbetrieb

Ob der Transfer über das Netz infrage kommt, hängt vom Durchsatz der Leitung und einer stabilen Bandbreite während der Verbindung ab. Für den Upload über einen Zugang mit asymmetrischer Bandbreite (Beispiel: ADSL) stellen Internet Service Provider häufig weniger Kapazität bereit als für den Download. In Zeiten des stets verfügbaren Netzes gerät diese Tatsache leicht in Vergessenheit.

Vermag das Zielsystem Daten via FTP zu empfangen, erweist sich dieses Protokoll als erste Wahl. Neben dem klassischen Werkzeug ftp für die Kommandozeile (Listing 1) vereinfacht der Client Gftp mit seiner grafischen Oberfläche das Hin- und Herschieben der Daten mitunter erheblich (Abbildung 1).

Listing 1

$ ftp Nutzer@Server
Password:
230 Login successful. Have fun.
ftp> put Datei
ftp> bye
221 Goodbye.
Abbildung 1

Abbildung 1: Der Client Gftp erleichtert mit seiner grafischen Oberfläche den Dateitransfer zu einem FTP-Server.

Bei FTP handelt es sich aber um ein unsicheres Protokoll, das sämtliche Daten unverschlüsselt verschickt. Als sicherere Alternativen stehen seit längerem Secure FTP (SFTP) und FTPS (FTP über SSH) bereit. Daneben bietet sich zum sicheren Übertragen der Einsatz von Secure Copy (SCP) an. Das Programm gehört in der Regel zum Umfang einer SSH-Installation auf einem Client-PC. Auf dem Zielsystem setzt dieser Weg einen SSH-Server voraus.

Beide Komponenten stehen unter Debian und Ubuntu in den Paketen openssh-client und openssh-server bereit. Der Client gehört bei vielen Distributionen bereits zur Standardumfang, eine Installation ist deswegen meist nicht erforderlich. Den Server installieren Sie nachträglich, unter Ubuntu/Debian mittels apt-get install openssh-server auf dem Zielsystem.

Um Daten vom Host zum Server zu übertragen, genügt das Kommando aus der ersten Zeile von Listing 2. SCP baut eine verschlüsselte Verbindung zum Zielrechner auf und überträgt die Datei ins angegebene Verzeichnis. Dieses benennen Sie explizit, in dem Sie es im Aufruf an den Rechnernamen anfügen. Als Trennzeichen fungiert im SCP-Aufruf der (obligatorische) Doppelpunkt. Geben Sie nur den Doppelpunkt an, wählt die Software automatisch das Home-Verzeichnis auf dem entfernten System als Ziel aus.

Listing 2

$ scp Datei Nutzer@Ziel:
$ scp Datei Nutzer@Ziel:/tmp/
$ scp -C datei3.iso Nutzer@Ziel:debian.iso
$ scp -C Nutzer@Quelle:debian.iso datei4.iso

Während die ersten beiden Aufrufe in Listing 2 den Dateinamen auf dem Zielsystem beibehalten, ändert das dritte Kommando ihn in debian.iso. Zusätzlich erfolgt der Transfer durch den Schalter -C in Gzip-komprimierter Form. Bei Textdateien und Tar-Archiven verringert sich dadurch unter Umständen die Dauer der Übertragung ganz erheblich.

SCP holt auf Wunsch auch Daten vom Server. Im Aufruf geben Sie dazu im ersten Parameter den Namen des Rechners an, auf dem die Dateien bereitstehen, und im zweiten Parameter den Pfad und Dateinamen im lokalen System. In der letzten Zeile von Listing 2 liest das Programm die Datei debian.iso vom angegebenen Rechner aus dem Home-Verzeichnis des Benutzers, überträgt diese Gzip-komprimiert auf das lokale System und speichert das File im aktuellen Verzeichnis unter dem Namen datei4.iso ab.

Haben Sie sich noch nicht mit den Werkzeugen auf der Kommandozeile vertraut gemacht, bietet der Midnight Commander sich hier als Alternative an. Hinter den beiden Menüpunkten Links | FTP-Verbindung und Links | Shell-Verbindung verbergen sich Aufrufe, über die Sie eine FTP- beziehungsweise SCP-Verbindung herstelle (Abbildung 2).

Abbildung 2

Abbildung 2: Wer den Kontakt mit der Kommandozeile scheut, dem bietet der Midnight Commander, in einer grafischen Oberfläche verpackt, eine ähnliche Funktion wie SCP und FTP.

Beachten Sie, dass der Midnight Commander Daten im Verzeichnis /tmp puffert. Prüfen Sie daher vor dem Übertragen großer Dateien, ob dort genügend Platz bereitsteht.

Abgleich mit Rsync

Eine weitere Möglichkeit, Daten zu transferieren, besteht im Synchronisieren zweier Verzeichnisse via Rsync oder dessen grafischen Frontend Grsync (Abbildung 3).

Abbildung 3

Abbildung 3: Die grafische Oberfläche Grsync erleichtert den Umgang mit den zuweilen recht kryptisch wirkenden Rsync-Kommandos.

Listing 3 zeigt, wie Sie den Inhalt des Verzeichnisses /original von einem Rechner mit dem lokalen Verzeichnis kopie abgleichen. Rsync überträgt dabei nur die Änderungen zwischen dem Original und der Kopie – identische Daten(blöcke) erkennt das Tool und spart sie aus. Die Option -z sorgt dafür, dass die Daten beim Abgleich via Gzip komprimiert übers Netz laufen.

Listing 3

$ rsync -z Nutzer@Quelle:/original/ kopie

Daten komprimieren

Die Kompression der Daten während des Übertragens kostet einerseits Zeit, andererseits unterstützt das Duo SSH/SCP nur das Komprimieren mittels Gzip. Das Verfahren ist zwar weit verbreitet, aber nicht immer die beste Wahl. Möchten Sie ein anderes Verfahren verwenden, bleibt Ihnen nur das Komprimieren der Dateien vor dem Transfer und das Auspacken auf dem Zielsystem, beispielsweise mittels Xz oder 7z.

Welches Verfahren sich am besten eignet, hängt in erster Linie von den zu verarbeitenden Daten ab. Eine vollständige Übersicht zu den einzelnen Verfahren und deren Grad der Kompression und Geschwindigkeit beim Verarbeiten der Daten gibt ein Artikel von Martin Steigerwald [1].

Es gilt jedoch, die Wahl des Formats noch in einer ganz anderen Hinsicht zu beachten: Möchten Sie die komprimierte Datei auf dem Zielsystem wieder auspacken, stellen Sie am besten vorab sicher, dass dort auch ein geeignetes Programm bereit steht.

Neues Format

Eine weitere Möglichkeit besteht in der Manipulation des externen Datenträgers und dessen Dateisystem. Das Erzeugen eines Dateisystems gelingt mit den Mkfs-Werkzeugen. Mkfs steht für "make file system", für (fast) jedes Dateisystem steht ein eigenes Kommando bereit. So erzeugt mkfs.ext4 /dev/sdb1 ein Ext4-Dateisystem auf dem angegebenen Device /dev/sdb1.

Die maximale Dateigröße in einem Dateisystem variiert erheblich und liegt beispielsweise zwischen 16 TByte bei Ext2, 1 EByte bei Ext4 und 16 EByte bei ZFS [2].

Je nach Größe des Datenträgers nimmt das Anlegen eines Dateisystems etwas Zeit in Anspruch. Beachten Sie dabei, dass bei diesem Vorgang sämtliche Informationen zu den bereits abgelegten Daten auf dem Speichermedium verloren gehen.

Dateien splitten

Sind die oben genannten Vorschläge nicht praktikabel oder nicht möglich, zerlegen Sie die Datei in kleinere Stücke und setzen sie diese auf dem Zielsystem wieder zusammen. Unter Linux existieren dafür die beiden Werkzeuge split und cat. Split zerlegt die Dateien, Cat fügt die Einzelteile wieder zusammen.

Ohne Angabe weiterer Parameter zerlegt Split die angegebene Datei in Einzelteile mit einer Länge von 1000 Zeilen. Diese Voreinstellung eignet sich primär für Textdateien, aber nicht für ein ISO-Image oder eine virtuelle Maschine. Mit dem Parameter --bytes=Wert (oder -b Wert) teilt Split dagegen aufs Byte genau.

Möchten Sie das ISO-Image des Netinstallers von Debian (191 MByte) in maximal 50 MByte große Häppchen zerteilen, genügt dazu der folgende Aufruf:

$ split --bytes=50M debian-6.0.4-i386-netinst.iso

Split zerlegt das Image dann in die vier Teile xaa bis xad. Dabei fallen xaa, xab und xac exakt 50 MByte groß aus, xad enthält die restlichen Daten mit rund 41 MByte. In der Grundeinstellung benennt das Tool die Ausgabedateien mit dem Präfix x und den beiden nachfolgenden, aufsteigend durchgezählten Buchstaben (Suffix) durch.

Über zusätzliche Parameter im Split-Aufruf passen Sie das Benennen der Ausgabedateien ihren Vorstellungen an. Den Hauptbestandteil für den Dateinamen übermitteln Sie Split, indem Sie obigen Aufruf um ein Präfix ergänzen:

$ split --bytes=50M debian-6.0.4-i386-netinst.iso teil-

Die erzeugten Dateien heißen nun beispielsweise teil-aa bis teil-ad. Über die beiden Parameter -d und -abeeinflussen Sie zudem die Suffixe. Die Option -d erzeugt numerische Endungen, -a Anzahl bestimmt deren Breite (in der Vorgabe 2), die Leerstellen füllt Split mit Nullen auf. Der Aufruf in der ersten Zeile von Listing 4 erzeugt die vier Dateien teil-000 bis teil-003.

Listing 4

$ split --bytes=50M -d -a 3 debian-6.0.4-i386-netinst.iso teil-
$ ls -hal teil*
-rw-r--r-- 1 frank frank 50M 30. Apr 10:33 teil-000
-rw-r--r-- 1 frank frank 50M 30. Apr 10:33 teil-001
-rw-r--r-- 1 frank frank 50M 30. Apr 10:33 teil-002
-rw-r--r-- 1 frank frank 41M 30. Apr 10:33 teil-003

Für das Zusammenfügen der Einzelteile auf dem Zielsystem genügt ein einfaches Kommando in der Bash (Listing 5, Zeile 1): Mit Cat setzen Sie die Teile, die durch das Namensschema in der richtigen Reihenfolge vorliegen, über den Operator >> zu einer Datei zusammen, die im Beispiel neu.iso heißt.

Listing 5

$ cat teil-* >> neu.iso
$ diff debian.iso neu.iso
$ cmp debian.iso neu.iso

Sicherheitshalber überprüfen Sie danach, dass es beim Zerlegen und Zusammenfügen keine Fehler gab und beide ISO-Dateien (Original und Kopie) identisch ausfallen. Ein Byte-für-Byte-Vergleich dauert zu lange und ist zudem fehleranfällig. Hier helfen die nützlichen Werkzeuge Cmp und Diff, mit denen Sie beide Dateien auf mögliche Unterschiede prüfen (Listing 5, zweite und dritte Zeile). Erfolgt keine Ausgabe, sind beide ISO-Dateien identisch.

Einen weiteren, eleganteren und oft genutzten Weg stellt das Erzeugen eines Hash-Wertes dar. Dabei handelt es sich um eine Art Fingerabdruck für eine Datenmenge oder Zeichenkette. In Listing 6 erzeugt das Kommando openssl diesen Wert auf der Basis des MD5-Algorithmus. Bei identischen Prüfsummen stimmen Original und Kopie überein.

Listing 6

$ openssl dgst -md5 debian.iso
MD5(debian.iso)= ff79f60c4d1fee2d47baadcbf081e5b6
$ openssl dgst -md5 neu.iso
MD5(neu.iso)   = ff79f60c4d1fee2d47baadcbf081e5b6

Fazit

Beim Kopieren großer Dateien führen verschiedene Ideen und Vorgehensweisen gleichermaßen zum Erreichen des Ziels, es gibt dabei keinen richtigen und keinen falschen Weg. Wichtig ist nur, dass Sie für das Problem eine passende Lösung finden und sich danach wieder etwas sicherer durch den Linux-Alltag bewegen. 

Glossar

EByte

1 Exabyte = 1018 Byte. 1 EByte entspricht also 1 Million TByte oder 1 Milliarde GByte.

Infos

[1] Packer im Vergleich: Martin Steigerwald, "Zip und Zop", LU 10/2010, S. 68, http://www.linux-community.de/20298

[2] ZFS: http://de.wikipedia.org/wiki/ZFS_(Dateisystem)

[] Der Autor bedankt sich bei Thomas Osterried und Wolfram Eifler für deren kritische Anmerkungen, Kommentare und Ergänzungen im Vorfeld dieses Artikels.

[] Frank Hofmann (http://www.efho.de) hat Informatik an der Technischen Universität Chemnitz studiert. Derzeit arbeitet er in Berlin im Büro 2.0, einem Open-Source Experten-Netzwerk, als Dienstleister mit Spezialisierung auf Druck und Satz. Er ist Mitgründer des Schulungsunternehmens Wizards of FOSS. Seit 2008 koordiniert er das Regionaltreffen der Linux-Usergroups aus der Region Berlin-Brandenburg.

Tip a friend    Druckansicht beenden Bookmark and Share
Kommentare