So fragmentieren Sie eine Datei absichtlich

7

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 namens MyFragmenter gefunden, wie in diesem Thread beschrieben . Allerdings kann ich für ext2 / 3/4 nichts finden ... Ich bin Gast, ich kann meinen eigenen Dateifragmentierer entwickeln, aber aus Zeitgründen möchte ich eine schnellere Lösung finden. Ich habe ein Tool wie HJ-Split gefunden, das eine Datei in kleinere Bits aufteilt, aber ich bezweifle, dass dies die Fragmentierung von Dateien simuliert.

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

Flanfl
quelle

Antworten:

6

Wenn Sie die Fragmentierung sicherstellen , aber nicht verhindern möchten (Sie haben also nur teilweise Kontrolle darüber, was passiert) und sich nicht um die Besonderheiten der Fragmentierung kümmern, finden Sie hier eine schnelle und schmutzige Vorgehensweise.

So erstellen Sie eine nBlockdatei in mindestens zwei Fragmenten:

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

Sie können mehr Teile fragmentieren, indem Sie mehr Dateien verschachteln.

Dies setzt voraus, dass das Dateisystem für diese Art von Folter verfügbar ist, dh nicht in einer Umgebung mit mehreren Benutzern oder geschäftskritischen Bedingungen. Es wird auch davon ausgegangen, dass das Dateisystem keine reservierten Blöcke enthält oder dass die reservierten Blöcke für Ihre UID reserviert sind oder dass Sie root sind.

Es gibt keine direkte Möglichkeit, die Fragmentierung sicherzustellen, da Unix-Systeme eine Dateisystemabstraktion verwenden, sodass Sie niemals mit dem unformatierten Dateisystem sprechen.

Wenn Sie sicherstellen, dass die Fragmentierung auf Dateisystemebene erfolgt, erfahren Sie nichts darüber, was auf niedrigeren Ebenen geschieht. LVM, Software- und Hardware-RAID, Sektor-Remapping auf Hardware-Ebene und andere Abstraktionsschichten können Ihre Erwartungen (und Messungen) in Mitleidenschaft ziehen.

Alexios
quelle
Danke für die Antwort! Es scheint also, dass ich es auf einem laufenden System nicht tun kann. Da ich jedoch ein Disk-Image verwenden werde, kann ich nach der Erfassung auf die Rohdaten zugreifen. Somit würde ich LVM und so umgehen. Jetzt werde ich sehen, ob ich auf einem Disk-Image etwas Ähnliches wie Ihren Vorschlag tun kann.
Flanfl
Was versuchst du aus Neugier auf hohem Niveau zu tun?
Alexios
Ich versuche, Dateischnitzer wie Skalpell- Link zu bewerten, und die Fragmentierung von Dateien ist ein Hauptproblem für diese Tools.
Flanfl
Nun, dafür benötigen Sie nicht unbedingt ein echtes Dateisystem: Sie können ein Disk-Image mit eingestreutem Rauschen und Signalblöcken aus verschiedenen Quellen erstellen. Dies gibt Ihnen die richtige und vollständige Kontrolle über die experimentelle Methodik.
Alexios
Sie haben Recht, das Disk-Image wird jedoch zur Bewertung anderer Tools verwendet. Und es wäre schön, ein Disk-Image für alle Tools zu verwenden (anstatt ein bestimmtes zu erstellen). Ich kann ein laufendes Betriebssystem verwenden, um Benutzeraktivitäten und dergleichen zu generieren. Außerdem besteht eine Anforderung des Projekts darin, ein realistisches Disk-Image zu verwenden. Eine Fragmentierung der Datei im laufenden System wäre also besser, aber wenn ich nicht kann (oder die Ergebnisse zu unzuverlässig sind), muss ich eine Problemumgehung finden, z. B. die Arbeit am Raw-Disk-Image. Eine andere Lösung wäre, auf Windows
umzusteigen
1

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 filefragim 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_*

hhaamu
quelle