Como posso descobrir onde um arquivo está fisicamente localizado no disco (números de bloco)?

9

Essa é uma pergunta obscura, eu sei. Eu estou tentando fazer alguns testes de desempenho de alguns discos em uma caixa Linux. Estou obtendo alguns resultados inconsistentes, executando o mesmo teste no mesmo disco. Eu sei que os discos têm desempenho diferente dependendo de qual parte do disco está sendo acessada. Em particular, as leituras e gravações no exterior do disco têm um rendimento muito maior do que as leituras e gravações na parte interna do disco, devido à densidade de dados quase constante e à velocidade de rotação constante.

Gostaria de ver se minhas inconsistências podem ser atribuídas a essa variação induzida pela geometria na taxa de transferência. É possível, usando ferramentas existentes, descobrir onde no disco foi colocado um arquivo?

Se não, suponho que posso escrever algo para procurar, ler e gravar diretamente no próprio arquivo de dispositivo, ignorando (e destruindo) o sistema de arquivos, mas espero evitar isso. Atualmente estou usando o ext4 em um kernel 3.0 (Arch Linux, se for importante), mas estou interessado em técnicas para outros sistemas de arquivos também.

    
por Rick Koshi 09.09.2011 / 08:24

4 respostas

7

Você pode usar debugfs para isso:

debugfs -R "stat ~/myfile" /dev/hda1

Altere a unidade de disco rígido / partição adequadamente e certifique-se de que a unidade esteja desmontada. Você receberá uma lista com todos os blocos usados:

BLOCKS:
(0):1643532
TOTAL: 1
    
por 09.09.2011 / 08:37
9

Você pode usar o FIBMAP ioctl , como exemplificado aqui ou usando hdparm :

/ $ sudo /sbin/hdparm --fibmap /etc/X11/xorg.conf

/etc/X11/xorg.conf:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0    1579088    1579095          8
    
por 09.09.2011 / 08:30
5

Este tópico pode fornecer algumas dicas sobre o algoritmo de colocação de arquivos ext4.

debugfs tem uma função bmap , que parece fornecer os dados desejados. Você deve ser capaz de dar blocos consecutivos de um arquivo e obter os números de blocos físicos.

    
por 09.09.2011 / 09:24
2

A pergunta é bem antiga, mas há outra resposta que pode ser útil para quem encontrar isso no Google: filefrag (no Debian ela está dentro do pacote e2fsprogs ).

# filefrag -eX /usr/bin/aptitude
Filesystem type is: ef53
File size of /usr/bin/aptitude is 4261400 (1041 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..     1fa:    15bd805..   15bd9ff:    1fb:            
   1:      1fb..     3f2:    15c6608..   15c67ff:    1f8:    15bda00:
   2:      3f3..     410:    15c8680..   15c869d:     1e:    15c6800: last,eof
/usr/bin/aptitude: 3 extents found

Ele tem a vantagem de funcionar também para outros sistemas de arquivos (usei para UDF), que não parecem ser suportados por outras ferramentas descritas aqui.

O offset apresentado na saída deve ser múltiplo do tamanho do bloco escrito na segunda linha (4096 aqui). Esteja ciente de que os desvios lógicos podem não ser contíguos, pois um arquivo pode ter falhas (quando suportado pelo sistema de arquivos).

    
por 27.09.2016 / 11:49