Como fragmentar deliberadamente um arquivo

Como fragmentar deliberadamente um arquivo

Estou procurando uma forma de fragmentar um arquivo existente para avaliar o desempenho de algumas ferramentas. Encontrei uma solução para o sistema de arquivos NTFS chamadaMeu Fragmentadorconforme descrito nestefio. No entanto, não consigo encontrar nada para ext2/3/4... Acho que 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 alguma ferramenta comoHJ-Splitque divide um arquivo em pedaços menores, mas duvido que isso simule a fragmentação do arquivo.

Existe alguma solução disponível para o meu problema?

Responder1

Se você quisergarantirfragmentação, mas nãoevitar(para que você tenha controle apenas parcial sobre o que acontece) e não se importe com as especificidades da fragmentação, aqui está uma maneira rápida e suja de fazer as coisas.

Para criar um arquivo de nblocos em pelo menos dois fragmentos:

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

Você pode fragmentar mais pedaços entrelaçando mais arquivos.

Isto pressupõe que o sistema de arquivos esteja 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 que os blocos reservados estão reservados para o seu UID ou para você ser root.

Não hádiretomaneira de garantir a fragmentação, porque os sistemas Unix empregam abstração do sistema de arquivos, então você nunca conversa com o sistema de arquivos bruto.

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

Responder2

Ainda não encontrei um sistema de arquivos de uso geral no Linux que sacrificasse a taxa de transferência de gravação em vez de arquivos contíguos. Ou seja, todo sistema de arquivos se fragmenta se as partes forem escritas em uma ordem não sequencial, especialmente com arquivos esparsos.

A maneira mais fácil: execute um arquivo por meio de um cliente de torrent – ​​de preferência algo que não pré-aloque o arquivo. BitTornado ou rtorrent se enquadram nesse perfil. (O primeiro possui modos de alocação configuráveis)

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

Aqui está um script 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 filefragcomando contido no pacote e2fsprogs.

Aqui está 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

Aqui está o que consegui 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, afinal não parece funcionar muito bem, exceto para arquivos maiores (fragmentos de arquivo de 1,5 GB, com certeza).

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

Responder3

Acontece que me deparei com uma situação que precisa gerar um arquivo fragmentado no Linux ext4. Eu fiz isso ligandofalocar, que pode ser usado para fazer furos em um arquivo, isso reciclará o furo para espaço utilizável em disco, causando fragmentos. Veraquipara que um script gere um arquivo fragmentado (e uma história anexada). Desta forma é fácil criar milhares de fragmentos (ou extensões).

informação relacionada