Cómo fragmentar deliberadamente un archivo

Cómo fragmentar deliberadamente un archivo

Estoy buscando una manera de fragmentar un archivo existente para evaluar el rendimiento de algunas herramientas. Encontré una solución para el sistema de archivos NTFS llamadaMi fragmentadorcomo se describe en estehilo. Sin embargo, no puedo encontrar nada para ext2/3/4... Supongo que puedo desarrollar mi propio fragmentador de archivos, pero debido a limitaciones de tiempo me gustaría encontrar una solución más rápida. Encontré alguna herramienta comoHJ-Splitque divide un archivo en bits más pequeños, pero dudo que esto simule la fragmentación de archivos.

¿Hay alguna solución disponible para mi problema?

Respuesta1

Si quieresasegurarfragmentación pero noprevenir(por lo que solo tienes control parcial sobre lo que sucede), y no te importan los detalles de la fragmentación, aquí tienes una forma rápida y sucia de hacer las cosas.

Para crear un archivo de nbloques en al menos dos fragmentos:

  1. Abra el archivo con escrituras sincrónicas, escriba m <n bloques.
  2. Abra otro archivo. Agréguelo hasta que haya como máximo n - m bloques libres en el disco. ¡No lo hagas escaso por error!
  3. Escriba los n - m bloques restantes en el primer archivo.
  4. Cerrar y unlinkel segundo archivo.

Puedes fragmentar en más piezas entrelazando más archivos.

Esto supone que el sistema de archivos está disponible para este tipo de tortura, es decir, no en un entorno multiusuario o de misión crítica. También supone que el sistema de archivos no tiene bloques reservados, o que los bloques reservados están reservados para su UID o usted es root.

No haydirectomanera de garantizar la fragmentación, porque los sistemas Unix emplean abstracción del sistema de archivos, por lo que nunca se habla con el sistema de archivos sin formato.

Además, garantizar la fragmentación a nivel del sistema de archivos no le dice nada sobre lo que sucede en los niveles inferiores. LVM, RAID de software y hardware, reasignación de sectores a nivel de hardware y otras capas de abstracción pueden causar estragos en sus expectativas (y mediciones).

Respuesta2

Todavía tengo que encontrar un sistema de archivos de propósito general en Linux que sacrifique el rendimiento de escritura por tener archivos contiguos. Es decir, cada sistema de archivos se fragmenta si las piezas se escriben en un orden no secuencial, especialmente con archivos dispersos.

La manera más fácil: ejecutar un archivo a través de un cliente torrent, preferiblemente algo que no asigne previamente el archivo. BitTornado o rtorrent encajan en este proyecto. (El primero tiene modos de asignación configurables)

La manera más difícil: divida el archivo fuente en partes de algunos KB de tamaño y mezclelas. Abra el archivo de destino. Para cada pieza, busca su posición correcta y escríbela.

Aquí hay un script en Perl que lo hace:

#!/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;

Puede comprobar la fragmentación con el filefragcomando contenido en el paquete e2fsprogs.

A continuación se muestra un ejemplo de lo que hace un torrent:

# 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

Esto es lo que obtuve con mi script (en ext3):

$ 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

EDITAR:No importa, después de todo no parece funcionar tan bien, excepto para archivos de gran tamaño (un archivo de 1,5 GB, con seguridad).

El sistema VM probablemente esté almacenando en caché y posponga/reordene escrituras demasiado pequeñas. Esta es la razón por la que los clientes de torrents logran fragmentarse (ya que normalmente no se descargan a >10 MB/s) pero mi script no. Creo que se puede modificar reduciendo los umbrales de VM. Ver/proc/sys/vm/dirty_*

Respuesta3

Me encuentro con una situación que necesita generar un archivo fragmentado en Linux ext4. lo hice llamandofallar, que se puede utilizar para perforar agujeros en un archivo, esto reciclará el agujero en espacio utilizable en el disco, lo que provocará fragmentos. Veraquípara que un script genere un archivo fragmentado (y una historia adjunta). De esta forma es fácil crear miles de fragmentos (o extensiones).

información relacionada