. sistemas-de-arquivos
Uma introdução a arquivos e sistemas de arquivos.
- arquivos: vetor de bytes, identificado por um inode (ou apenas um ponteiro em alguns casos).
- diretório: lista de tuplas referenciando arquivos ou links (hard ou soft), divididos hierarquicamente formando uma árvore (com root “/”) e separadores (Posix “/” ou Win “").
- pathname: /root/dir/file.txt
API do FS
Open file table: uma tabela com as referencias aos arquivos ja abertos, gerenciados pelo processo requerente (agent)
open() abre arquivos e retorna um
file descriptor:- inode
- nome
- ACL
- type
- ponteiro para a região de dados do arquivos
- readable
- writable
- off
- ref
write()
read()
mkfs() -> cria um entrypoint, o superbloco, os blocos de dados, os blocos de inode e os de bitmap do filesystem em questão na partição dada, criando um novo fs e permitindo que o novo file system seja montando no file system atual.
mount() -> integra a estrutura acima na arvore de diretorios do fs atual. -fsync() -> força a escrita de todos os arquivos dirty (modificados na memória).
Compartilhamento de entries da OFT
compartilhamento de entries pode ser feito por fork() de processo ou dup() ao se criar outro file descriptor sobre o mesmo arquivo.
Links
Hard link -> criado via link() e destruido por unlink(), criando outra referencia no diretório para o mesmo inode, ou seja, terão 2 inodes iguais mas com nome diferente. Soft link -> Links simbólicos, é um arquivo próprio cuja conteúdo se baseia no caminho absoluto de outro arquivo.
Exemplo de arquitetura de um FS
Nesta seção, falarei um pouco sobre uma possibilidade de escolhas de arquitetura de um file system. A organização geral se dá por:
os blocos possuem tamanho fixo (e.g 4KB) e são organizados assim:
- tabela de Inodes (Inode table)
- metadados (data region)
- allocation bitmaps (rastrear estado - alocado ou não - de um inode ou bloco de dados)
- superbloco -> contém dados sobre o file system em si (e.g offset de começo da data region, da inode table ou bitmap). É o primeiro bloco lido pelo mount().
inodes
Abreviação de index node (nó de índice), eles são a parte principal do fs. São eles que representam o arquivo unicamente e o identifica. Num inode, temos :
- Tipo do arquivo (ex: regular, diretório).
- Tamanho do arquivo em bytes.
- Número de blocos alocados para o arquivo.
- Informações de proteção (dono, grupo, permissões de acesso).
- Tempos de criação, modificação e último acesso.
- Contador de hard links ou soft links.
- Ponteiros para os blocos de dados que contêm o conteúdo do arquivo.
indices multi-nivel
Para que um arquivo cresça para além do que o inode suporta diretamente, pode-se criar certas abstrações:
- ponteiro direto: aponta diretamente para o arquivo no bloco de dados.
- ponteiro indireto: aponta para um bloco que, por sua vez, contém um array de ponteiros para os blocos de dados.
- Ponteiro Indireto Duplo/Triplo/N-esimal: isso pode ser escalado para quantos blocos de tabelas de ponteiros necessario, tendo perdas no desempenho considerável mas acomodando arquivos de grande tamanho.
diretórios
O diretório é um tipo especial de arquivo residente na data region, cujo conteúdo se baseia la listagem de túplas (nome_da_entrada, i-number). Cada diretório tem 2 entradas especiais: ‘.’ (referencia a si mesmo) ‘..’ (referencia ao seu diretório pai).
Gerenciamento de espaço livre
Para alocar espaço para novos arquivos e diretórios, o sistema de arquivos precisa gerenciar o espaço livre. O vsfs utiliza bitmaps para essa tarefa. Ao criar um arquivo, o sistema de arquivos consulta o inode bitmap para encontrar um inode livre, marca-o como usado (1) e o aloca. Um processo semelhante ocorre com o data bitmap ao alocar blocos de dados

