Como extrair dados brutos do ext3 inode do disco?

2

Em um sistema de arquivos ext3 (ou ext2 / 4, escolha seu sabor), como extrair dados brutos de bytes que correspondem a um inode em particular diretamente do disco rígido? É possível, digamos, um número de inode para determinar sua localização no disco (talvez como um deslocamento do início da partição ou algum outro deslocamento do LBA) e, em seguida, usar algum utilitário como "dd" ou uma chamada de sistema (algo como lseek, exceto operando no sistema de arquivos?) para ler esses dados sem ter que referenciá-los como um arquivo? Eu estou supondo que isso pode ser feito, talvez com algum tipo de utilitário no nível do driver ....

    
por Michael Martinez 11.11.2014 / 00:38

1 resposta

5

O comando imap no debugfs pode dizer onde está um inode. Exemplo:

$ debugfs -R 'imap <128901>' /dev/whatever
debugfs 1.42.5 (29-Jul-2012)
Inode 128901 is part of block group 16
        located at block 524344, offset 0x0400

Para obter um despejo bruto do inode 128901, você procuraria byte 524344*block_size + 0x0400 e ler inode_size bytes. Você pode obter os tamanhos com o comando stats em debugfs ou o utilitário separado dumpe2fs .

stats ou dumpe2fs também fornecerá uma listagem completa de todas as áreas de armazenamento de inodes para que você possa criar sua própria função que execute o equivalente a imap sem realmente chamar debugfs (ou executá-lo interativamente). Apenas lembre-se quando você faz o seu cálculo, não há nenhum zero inode. inode 1 começa no byte 0 do primeiro bloco de inodes.

Se você quiser fazer isso em um programa C sem programas externos, você deve olhar a biblioteca libext2 , que é usada por todos os utilitários padrão ext2. Eu não usei isso sozinho, mas eu suspeito que com a documentação do libext2 mais o código-fonte do debugfs para usar como inspiração, você pode escrever sua própria função imap -like facilmente.

... e aqui é onde me ocorreu que talvez você não tenha literalmente significado que queria os dados brutos do inode. Talvez você queira o conteúdo do arquivo que o inode descreve. Nesse caso, é ainda mais fácil. debugfs tem um comando interno para isso:

debugfs -R 'cat <128901>' /dev/whatever

imprime o conteúdo do arquivo cujo número de inode é 128901.

    
por 11.11.2014 / 01:30

Tags