Eu sei que a primeira coisa que o sistema operacional acessa no disco rígido é o superbloco.
Mas então o que?
Responder1
O sistema operacional depende do kernel que, por sua vez, usa drivers para leitura/gravação de vários sistemas de arquivos. O manuseio de arquivos é abstraído através dos drivers e chamadas de sistema através de interfaces para que quando você disser open("file.txt")
não precise saber como o arquivo está armazenado no disco etc. de lidar com as coisas. Aqui está um trecho genérico no sistema ext.
Exemplo por Ext.
- Blocos: O disco é dividido emBlocosde espaço contíguo.
- Bloquear grupos: Os blocos são divididos em grupos.
- Inode: Um conjunto estruturado de informações sobre uma entrada, como um arquivo, diretório etc.
- Diretório: Uma lista de nomes de inodes <–>
CadaGrupo de blocospossui uma tabela de estruturas de inodes que pertencem ao grupo.
Layout principal:
Padding 1024 bytes
Super-Block 1 block *
Block Group Descriptor Table many blocks *
Reserved many blocks
Data Block Bitmap 1 block *
inode Bitmap 1 block *
inode Table many blocks *
Data Blocks many more blocks *
Super-blococontém informações como:
- Número total de inodes
- Número total de blocos
- Número de blocos em um grupo
- Número de inodes em um grupo
Além de serem armazenadas no grupo de blocos 0, cópias redundantes são armazenadas em outro lugar como backups (em caso de corrupção).
Tabela de descritores de grupos de blocosé diretamente após oSuperbloco. Contém, entre outras coisas:
- Número deBloquear gruposna partição
- Descritor para cadaGrupo de blocos
Onde cada Descritor contém informações sobre onde estão as estruturas de dados para aqueleGrupo de blocosestá localizado.
Grupo de blocosdetém, entre outras coisas:
- Endereço do bloco onde a tabela inode começa
- Número de diretórios no grupo
Bitmapscontém informações sobre o uso. 0
para não utilizado e 1
para usado.
Inode(Nó de índice)
Uma estrutura de inode faznãosegurar:
- nome
- dados do arquivo
Um inode contém informações como:
- Tipo, permissões, usuário, datas,… ponteiros para DADOS
Os DADOS de um arquivo são salvos em blocos. Um inode contém informações sobre quais blocos o arquivo ocupa. Isso é feito por ponteiros no inode. Há mais de umtipode ponteiros. Se chamarmos um ponteiro para dados PTR como:
[PTR] Endereço a bloquear com DATA
- 12 - Ponteiros diretos:
- [PTR] Endereço a bloquear com DATA
- 1 - Ponteiro indireto único:
- [S_PTR] Endereço a bloquear com lista de PTR
- 1 - Ponteiro duplamente indireto:
- [D_PTR] Endereço a bloquear com lista de S_PTR
- 1 - Ponteiro triplamente indireto:
- [T_PTR] Endereço a bloquear com lista de D_PTR
Números de ponteiros em umbloqueardepende detamanho do bloco.
Um diretório é um inode. Seus dados contêm informações sobre arquivos. Cada entrada vincula um nome e um inode. Cada diretório também possui .
, por si só, ..
um link efetivo para o diretório pai. Estes não podem ser excluídos.
O diretório raiz sempre possui o inode 2 no ramal. Fazer stat /
ou cd /; stat .
ver. São ..
links para.
Quando um arquivo é criado, ele é adicionado aromaticamente ao diretório apropriado.
Os números dos inodes são índices. Eles são índices ordenados na tabela de inodes para uma estrutura de inodes. Como as estruturas de inode têm tamanho fixo, pode-se calcular onde uma estrutura de inode está localizada.
Como o superbloco tem uminodes_per_grouppode-se encontrar o grupo de blocos por:
block_group = (inode - 1) / inodes_per_group;
E depois disso encontre o índice:
inode_index = (inode - 1) % inodes_per_group;
Leia a estrutura e os links para os dados. Leia os dados.
depuração
Pode-se usar debugfs
para extrair várias informações sobre o sistema de arquivos.
Certifique-se de não usar o -w
sinalizador se você se preocupa com os dados.
Opcionalmente, crie uma pequena amostra para brincar.
truncate -s 2M test
mkfs.ext4 -F test
mkdir x
sudo mount test x
sudo chown me x
cd x
echo "Hello Disk" >hello.txt
mkdir a b c
echo "Hello Bee" >b/hib.txt
sudo unount x
debugfs test
Digite ?
para obter uma lista de comandos.
debugfs: stats
(minificado)
Inode count: 256
Block count: 2048
Reserved block count: 102
Free blocks: 953
Free inodes: 240
First block: 1
Block size: 1024
Fragment size: 1024
Group descriptor size: 64
Blocks per group: 8192
Inodes per group: 256
Inode blocks per group: 32
First inode: 11
Inode size: 128
Directories: 5
Group 0: block bitmap at 18, inode bitmap at 34, inode table at 50
953 free blocks, 240 free inodes, 5 used directories, 240 unused inodes
[Checksum 0x055a]
...
debugfs: imap hello.txt
Inode 12 is part of block group 0
located at block 51, offset 0x0180
Outros exemplos: https://www.cs.montana.edu/courses/309/topics/4-disks/debugfs_example.html