Como listar os blocos de dados de um arquivo no Linux?

13

Pelo que entendi, cada arquivo em um sistema operacional semelhante ao Unix tem um número de inode (que pode ser visualizado com "ls -i"), e cada inode é uma lista de blocos de disco que contêm os dados reais de um arquivo.

Existe um comando Linux que usa um nome de arquivo como argumento e imprime a lista de blocos de disco apontados pelo inode desse arquivo?

PS O sistema de arquivos em questão é ext3.

Mike
fonte

Respostas:

17

Você pode usar a ferramenta "debugfs" para visualizar as informações do arquivo na linha de comando ou no arquivo interativo. use:

# debugfs /dev/<spartition>
# stat /path/to/file

ou

# debugfs -R "stat /path/to/file" /dev/<partition>

por exemplo:

# debugfs -R "stat /etc/passwd"  /dev/sda5
Inode: 435914   Type: regular    Mode:  0644   Flags: 0x0
Generation: 979004472    Version: 0x00000000
User:     0   Group:     0   Size: 1577
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
atime: 0x4a2d6f79 -- Mon Jun  8 23:07:21 2009
mtime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
Size of extra inode fields: 4
BLOCKS:
(0):1767438
TOTAL: 1
katriel
fonte
Observe que o argumento para 'stat' nem sempre é / path / to / file. O uso de / path / to / file funciona para arquivos nos sistemas de arquivos raiz (montados em /), mas não para caminhos montados em outro sistema de arquivos. Nesses casos, pode-se receber a mensagem de erro File not found by ext2_lookup. Portanto, é melhor usar a notação inode para o argumento stat. Use ls -ipara obter o número de inode de um arquivo e, em seguida, chame debugfs com esse número em '<>' em vez de / path / to / file. Por exemplo:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR 14/02
@ElazarR Você pode explicar esse comentário? Por que path/to/filenão deve funcionar em todos os casos? O que é confuso para mim é que, como debugfs ..... /dev/fs_blockdevhá, em minha compreensão, apenas um sistema de arquivos em consideração, e todos os arquivos dentro deste sistema podem ser acessados ​​por seu caminho ou por seu inode, o que você deseja expressar?
humanityANDpeace
@humanityANDpeace, no caso de um arquivo estar em uma partição (sistema de arquivos) que está fora do sistema de arquivos raiz, ou seja, montada em algum ponto de montagem na partição raiz, a operação ext2_lookup parece falhar ao encontrar o caminho especificado no dispositivo especificado (partição). Isso resulta no erro que mencionei. Por exemplo, se suas pastas / home forem montadas a partir de / dev / sda5 sobre o sistema de arquivos raiz (que está em outra partição, por exemplo, / dev / sda3), isso debugfs -R "stat /home/myuser/foo.txt" /dev/sda5resultará em um erro. Mas invocar debugfs -R "stat /path/on/rootfs" /dev/sda3obras.
ElazarR
Eu acho que você precisa sudo, caso contrário, alguma mensagem inútil será exibida.
Kedar Mhaswade
E a pergunta inversa: como podemos descobrir qual arquivo usa um determinado bloco?
Luis A. Florit
4

Veja a sintaxe para "debugfs" e, especificamente, o comando "stat". Isso mostrará uma lista dos blocos de dados usados ​​por um arquivo. Você pode passar parâmetros para "debugfs" com o argumento "-f" para chamá-lo a partir de um script.

Evan Anderson
fonte
4

Uma maneira simples de obter a lista de blocos (sem precisar ler da partição como nas debugfsrespostas) é usar o FIBMAPioctl. Não conheço nenhum comando para fazê-lo, mas é muito simples escrever um; uma rápida pesquisa no Google me deu um exemplo de uso do FIBMAP , que faz exatamente o que você deseja. Uma vantagem é que ele funcionará em qualquer sistema de arquivos que suporte a bmapoperação, não apenas no ext3.

Uma alternativa mais nova (e mais eficiente) é o FIEMAPioctl, que também pode retornar informações detalhadas sobre extensões (útil para ext4).

CesarB
fonte
3
hdparm --fibmap /path/to/filename

Não vou trabalhar no zfs, mas no ext4, btrfs, (v) fat, etc

man 8 hdparm :

--fibmapQuando usado, esse deve ser o único sinalizador fornecido. Ele requer um caminho de arquivo como parâmetro e imprimirá uma lista das extensões de dispositivo (intervalos de setor) ocupadas por esse arquivo no disco. Os números do setor são dados como números absolutos do LBA, referenciados no setor 0 do dispositivo físico ( não na partição ou no sistema de arquivos). Essas informações podem ser usadas para vários propósitos, como examinar o grau de fragmentação de arquivos maiores ou determinar setores apropriados a serem corrompidos deliberadamente durante os procedimentos de teste de injeção de falhas.

ChewbaccaKL
fonte
1

Pelo menos em algumas máquinas Linux ... "ls -s" pode fornecer o que você está procurando.

Edit: meu mal, vejo que você está procurando uma lista dos próprios blocos, não uma contagem deles.

user10357
fonte
-s mostra o tamanho do arquivo em blocos - eu quero uma lista real dos números dos blocos.
Mike
-2

e2fsck -b 32768 / dev / hda1 eu sinto que você pode tentar isso ou se você estiver procurando mais docx no mesmo, você pode verificar o seguinte

http://www.linux-tutorial.info/modules.php?name=MContent&pageid=97

Rajat
fonte
Esse comando executa uma verificação do sistema de arquivos, tomando 32768 como um superbloco de backup. Não foi isso que ele pediu.
James Broadhead