So fragmentieren Sie eine Datei absichtlich

So fragmentieren Sie eine Datei absichtlich

Ich suche nach einer Möglichkeit, eine vorhandene Datei zu fragmentieren, um die Leistung einiger Tools zu bewerten. Ich habe eine Lösung für das NTFS-Dateisystem gefunden:MeinFragmenterwie in diesem beschriebenFaden. Ich kann jedoch nichts für ext2/3/4 finden ... Ich schätze, ich kann meinen eigenen Dateifragmentierer entwickeln, aber aus Zeitgründen würde ich gerne eine schnellere Lösung finden. Ich habe ein Tool wieHJ-Splitdas eine Datei in kleinere Teile aufteilt, aber ich bezweifle, dass dies eine Dateifragmentierung simuliert.

Gibt es eine Lösung für mein Problem?

Antwort1

Wenn Sie wollensicherstellenFragmentierung, aber nichtverhindern(Sie haben also nur eine teilweise Kontrolle über das, was passiert) und Sie sich nicht um die Einzelheiten der Fragmentierung kümmern, gibt es hier eine schnelle und einfache Möglichkeit, die Dinge zu erledigen.

So erstellen Sie eine Datei mit nBlöcken in mindestens zwei Fragmenten:

  1. Öffnen Sie die Datei mit synchronen Schreibvorgängen, schreiben Sie m < n Blöcke.
  2. Öffnen Sie eine weitere Datei. Fügen Sie so viele Blöcke hinzu, bis höchstens n - m Blöcke auf der Festplatte frei sind. Achten Sie darauf, dass die Datei nicht versehentlich spärlich belegt ist!
  3. Schreiben Sie die verbleibenden n - m Blöcke in die erste Datei.
  4. Schließen und unlinkdie zweite Datei.

Sie können in mehrere Teile fragmentieren, indem Sie mehrere Dateien miteinander verflechten.

Dies setzt voraus, dass das Dateisystem für diese Art von Folter verfügbar ist, d. h. nicht in einer Mehrbenutzer- oder unternehmenskritischen Umgebung. Es wird auch angenommen, dass das Dateisystem keine reservierten Blöcke hat oder die reservierten Blöcke für Ihre UID reserviert sind oder dass Sie Root sind.

Da ist keinDirekteMöglichkeit, Fragmentierung sicherzustellen, da Unix-Systeme eine Dateisystemabstraktion verwenden und Sie daher nie mit dem Rohdateisystem kommunizieren.

Außerdem sagt Ihnen die Sicherstellung der Fragmentierung auf Dateisystemebene nichts darüber aus, was auf niedrigeren Ebenen geschieht. LVM, Software- und Hardware-RAID, Neuzuordnung von Sektoren auf Hardwareebene und andere Abstraktionsebenen können Ihre Erwartungen (und Messungen) durcheinanderbringen.

Antwort2

Ich habe noch kein Allzweck-Dateisystem unter Linux gesehen, das Schreibdurchsatz zugunsten zusammenhängender Dateien opfern würde. Das heißt, jedes Dateisystem fragmentiert, wenn die Teile in nicht sequenzieller Reihenfolge geschrieben werden, insbesondere bei spärlich besetzten Dateien.

Der einfache Weg: Führen Sie eine Datei über einen Torrent-Client aus – vorzugsweise über einen, der die Datei nicht vorab zuweist. BitTornado oder rTorrent erfüllen diese Anforderungen. (Ersteres hat konfigurierbare Zuweisungsmodi)

Der schwierige Weg: Teilen Sie die Quelldatei in mehrere KB große Teile auf und mischen Sie sie. Öffnen Sie die Zieldatei. Suchen Sie für jedes Teil 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;

filefragSie können mit dem im Paket e2fsprogs enthaltenen Befehl auf Fragmentierung prüfen .

Hier ist ein Beispiel dafür, was ein Torrent macht:

# 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

BEARBEITEN:Aber egal, es scheint doch nicht so gut zu funktionieren, außer bei größeren Dateien (auf jeden Fall bei Dateifragmenten mit 1,5 GB).

Das VM-System führt wahrscheinlich eine Zwischenspeicherung durch und verschiebt/ordnet zu kleine Schreibvorgänge neu an. Aus diesem Grund gelingt es Torrent-Clients, zu fragmentieren (da sie normalerweise nicht mit >10 MB/s herunterladen), mein Skript jedoch nicht. Ich denke, es kann optimiert werden, indem die VM-Schwellenwerte gesenkt werden. Siehe/proc/sys/vm/dirty_*

Antwort3

Ich bin zufällig auf eine Situation gestoßen, in der eine fragmentierte Datei in Linux ext4 generiert werden muss. Ich habe dies getan, indem ich aufgerufen habeverfallen, mit dem man Löcher in eine Datei stanzen kann. Dadurch wird das Loch in nutzbaren Speicherplatz umgewandelt, was zu Fragmenten führt. SieheHierfür ein Skript, um eine fragmentierte Datei (und eine angehängte Story) zu generieren. Auf diese Weise können problemlos Tausende von Fragmenten (oder Extents) erstellt werden.

verwandte Informationen