Como alguém inspeciona as informações da estrutura de diretórios de um arquivo unix / linux?

2

Nos sistemas de arquivos Unix, os diretórios são apenas arquivos especiais com estruturas de diretórios especiais que contêm o nome do arquivo filho, o tamanho do nome do arquivo e o número de referência do inode.

Os metadados do arquivo real além disso são normalmente armazenados no próprio inode.

Minha pergunta é. Como se lê a estrutura de diretórios especial real em sua forma bruta em vez de sua forma interpretada.

Sim, eu sei que você pode usar ls para ver os arquivos lá. Não é isso que estou procurando.

    
por Biff 12.01.2015 / 01:51

5 respostas

3

A resposta simples é que o que você quer fazer é ler o arquivo do diretório, com um comando como cat . , cat /etc ou cat mydir . Claro, já que esses dados são "brutos", você gostaria de usar um programa que seja mais adequado exibir dados não ASCII de uma maneira amigável para o homem; por exemplo, hexdump ou od .

Infelizmente, conforme discutido em Quando os diretórios pararam de ser legíveis como arquivos? , a maioria das versões do Unix que foram lançadas nas últimas duas décadas, mais ou menos, não permitem isso. Então a resposta para sua pergunta pode ser “Encontre uma versão do Unix que ainda permita ler diretórios”. AIX, a maioria das versões do BSD, e todas, exceto as versões mais recentes do Solaris, podem se qualificar. Encontrar um Linux que permita isso pode exigir o uso de uma máquina do tempo.

    
por 13.01.2015 / 01:13
5

A estrutura é totalmente dependente do sistema de arquivos específico sendo usado, e a única maneira de lê-lo é lendo diretamente do disco (ou seja, / dev / sda1), e interpretando o sistema de arquivos você mesmo.

    
por 12.01.2015 / 02:27
3

Uma interface de programação expõe a entrada do diretório como um tipo especial de fluxo, manipulado pelas funções opendir , readdir , closedir e outras funções relacionadas. A entrada do arquivo que você obtém é descrita na página man (contém o arquivo inode e alguns outros dados):

link

Qualquer valor mais baixo do que isso dependerá da implementação real do sistema de arquivos. É completamente do projeto do sistema de arquivos o que usar para armazenar sua árvore de diretórios. Alguns usam árvores B, alguns usam árvores B +, alguns usam tabelas planas e assim por diante. Pode até haver cópias redundantes de dados de inode, checksums, criptografia, atributos estendidos e assim por diante.

Note que mesmo para sistemas de arquivos que não são baseados em inodes (FAT por exemplo), o driver do kernel faz um resumo para que o usuário não precise se preocupar com essa diferença.

    
por 12.01.2015 / 10:13
2

Eu sei que é uma pergunta antiga, mas eu estava procurando informações sobre a estrutura do diretório e achei isso.

Para obter os dados brutos em um arquivo de diretório, você pode usar debugfs . Por exemplo:

sudo debugfs /dev/sda1

Você pode ls , cd e assim por diante, ou cat um diretório. Isso não é muito legível, então você pode usar:

dump / dumproot

Isso cria um arquivo chamado dumproot no local em que você chamou debugfs . Para obter o conteúdo bruto, você pode usar xxd . Por exemplo:

xxd dumproot | head -n2

00000000: 0200 0000 0c00 0102 2e00 0000 0200 0000  ................
00000010: 0c00 0202 2e2e 0000 0b00 0000 1400 0a02  ................

Isso mostra as entradas . e .. do meu diretório / , ambas têm o inode número 2, que é 02000000 no início. Com números de inode maiores, você os vê no início de uma entrada em little endian. . é hexadecimal 2e, de modo que é visível lá também. Não tenho certeza do que "0c00 0102" representa ou como um fim de uma entrada é especificado. Isso é o que eu estava procurando quando encontrei este tópico.

    
por 08.06.2018 / 11:58
0

Quase todas as informações fornecidas pelo sistema de arquivos para um inode podem ser listadas pelo comando stat . Isso pode ser visto como a informação bruta do inode de arquivos e diretórios.

stat FILE

Muitas informações sobre os inodes no Linux podem ser encontradas aqui

Se você quiser examinar a criação geral de um sistema de arquivos, tente o seguinte:

  • crie um arquivo vazio de cerca de 100kB
  • arquivo de formato com o sistema de arquivos desejado
  • faça backup desse arquivo bruto
  • monte como dispositivo de loop
  • crie alguns dirs e arquivos
  • analise as alterações com hexadiff ou hexeditor do seu coice

Como root:

mkdir mountpoint
dd if=/dev/zero of=file_s.img bs=50k count=2
mkfs.ext2 file_s.img
cp file_s.img file_s_orig.img
mount -o loop file_s.img  mountpoint
bless file_s.img
    
por 12.01.2015 / 02:20