Como fragmentar deliberadamente um arquivo

7

Estou procurando uma maneira de fragmentar um arquivo existente para avaliar o desempenho de algumas ferramentas. Eu encontrei uma solução para o sistema de arquivos NTFS chamado MyFragmenter , conforme descrito neste thread . No entanto eu não consigo encontrar nada para ext2 / 3/4 ... Eu convidado posso desenvolver meu próprio fragmentador de arquivos, mas devido à restrição de tempo, gostaria de encontrar uma solução mais rápida. Eu encontrei algumas ferramentas como HJ-Split que dividem um arquivo em bits menores, mas duvido que isso simule a fragmentação de arquivos.

A solução deles está disponível para o meu problema?

    
por Flanfl 18.03.2012 / 18:00

2 respostas

6

Se você quiser garantir fragmentação, mas não evitar (então você só tem controle parcial sobre o que acontece), e você não se importa com as especificidades do fragmentação, aqui está um rápido & maneira suja de fazer as coisas.

Para criar um arquivo de n bloqueia em pelo menos dois fragmentos:

  1. Abra o arquivo com gravações síncronas, escreva m < n blocos.
  2. Abra outro arquivo. Adicione a ele até que haja no máximo n -m blocos livres no disco. Não faça isso escasso por engano!
  3. Escreva os blocos n-m restantes no primeiro arquivo.
  4. Fechar e unlink o segundo arquivo.

Você pode fragmentar mais peças entrelaçando mais arquivos.

Isso pressupõe que o sistema de arquivos está disponível para esse tipo de tortura, ou seja, não em um ambiente multiusuário ou de missão crítica. Ele também assume que o sistema de arquivos não possui blocos reservados, ou os blocos reservados são reservados para o seu UID, ou você é root.

Não existe uma maneira direta para garantir a fragmentação, porque os sistemas Unix empregam a abstração do sistema de arquivos, portanto, você nunca fala com o sistema de arquivos raw.

Além disso, garantir a fragmentação no nível do sistema de arquivos não informa nada sobre o que acontece nos níveis inferiores. LVM, software e hardware RAID, remapeamento de setor em nível de hardware e outras camadas de abstração podem atrapalhar suas expectativas (e medidas).

    
por 18.03.2012 / 18:49
1

Ainda não encontrei um sistema de arquivos de propósito geral no Linux que sacrificaria o throughput de gravação por ter arquivos contíguos. Ou seja, todos os fragmentos do sistema de arquivos se as partes são escritas em uma ordem não seqüencial, especialmente com arquivos esparsos.

A maneira mais fácil: executar um arquivo através de um cliente de torrent - de preferência algo que não pré-aloca o arquivo. BitTornado ou rtorrent se encaixam nessa conta. (O primeiro tem modos de alocação configuráveis)

Da maneira mais difícil: Divida o arquivo de origem em pedaços de alguns KB, embaralhe-os. Abra o arquivo de destino. Para cada peça, procure a posição correta e escreva-a.

Aqui está um script em Perl que faz isso:

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

Você pode verificar a fragmentação com o comando filefrag , contido no pacote e2fsprogs.

Veja um exemplo do que um torrent faz:

# 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

Veja o que recebi com meu script (no 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: Não importa, parece que não funciona tão bem depois de tudo, exceto os arquivos largish (com certeza um fragmento de arquivo de 1,5 GB).

O sistema VM provavelmente está em cache e adia / reordena gravações muito pequenas. É por isso que os clientes de torrent conseguem se fragmentar (já que eles geralmente não baixam em > 10MB / s), mas meu script não. Eu acho que pode ser alterado, diminuindo os limites de vm. Veja /proc/sys/vm/dirty_*

    
por 18.03.2012 / 20:31

Tags