Ich habe noch kein universelles Dateisystem unter Linux kennengelernt, das den Schreibdurchsatz gegenüber zusammenhängenden Dateien opfern würde. Das heißt, jedes Dateisystem fragmentiert, wenn die Teile in einer nicht sequentiellen Reihenfolge geschrieben werden, insbesondere bei Dateien mit geringer Dichte.
Der einfache Weg: Führen Sie eine Datei über einen Torrent-Client aus - vorzugsweise etwas, das die Datei nicht vorab zuweist. BitTornado oder rtorrent passen zu dieser Rechnung. (Ersteres verfügt über konfigurierbare Zuordnungsmodi)
Der harte Weg: Teilen Sie die Quelldatei in Teile mit einer Größe von einigen KB auf und mischen Sie sie. Öffnen Sie die Zieldatei. Suchen Sie für jedes Stück die richtige Position und schreiben Sie es.
Hier ist ein Perl-Skript, das dies tut:
#!/usr/bin/perl
use List::Util qw/shuffle/;
use IO::Handle;
use constant BLOCK_SIZE => 4096;
my ($src, $dst) = @ARGV;
my $size = (stat($src))[7];
my @blocks = shuffle(0 .. ($size / BLOCK_SIZE));
my ($srcfh, $dstfh);
open $srcfh, "<", $src or die "cannot open $src: $!";
open $dstfh, ">", $dst or die "cannot open $dst: $!";
truncate $dstfh, $size; # undefined behaviour
my $buf;
for my $blockno (@blocks) {
seek $_, $blockno * BLOCK_SIZE, 0 for ($srcfh, $dstfh);
read $srcfh, $buf, BLOCK_SIZE;
print $dstfh $buf;
$dstfh->flush;
}
close $dstfh;
close $srcfh;
Sie können mit dem filefrag
im e2fsprogs-Paket enthaltenen Befehl nach Fragmentierung suchen.
Hier ist ein Beispiel dafür, was ein Torrent tut:
# ls -sh amd64memstick-5.1.2.fs.gz
239M amd64memstick-5.1.2.fs.gz
# filefrag amd64memstick-5.1.2.fs.gz
amd64memstick-5.1.2.fs.gz: 585 extents found
Folgendes habe ich mit meinem Skript (auf ext3) erhalten:
$ ls -sh source.tar
42M source.tar
$ perl fragment.pl source.tar fragmented.tar
$ md5sum fragmented.tar source.tar
f77fdd7ab526ede434f416f9787fa9b3 fragmented.tar
f77fdd7ab526ede434f416f9787fa9b3 source.tar
# filefrag fragmented.tar
fragmented.tar: 395 extents found
EDIT: Egal, es scheint doch nicht so gut zu funktionieren, außer bei größeren Dateien (mit Sicherheit 1,5 GB Dateifragmente).
Das VM-System speichert wahrscheinlich zwischen und verschiebt / ordnet zu kleine Schreibvorgänge. Aus diesem Grund können Torrent-Clients fragmentiert werden (da sie normalerweise nicht mit> 10 MB / s herunterladen), mein Skript jedoch nicht. Ich denke, es kann durch Verringern der VM-Schwellenwerte optimiert werden. Sehen/proc/sys/vm/dirty_*