Como o sistema operacional acessa os arquivos armazenados no disco rígido?

Como o sistema operacional acessa os arquivos armazenados no disco rígido?

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.

  1. Blocos: O disco é dividido emBlocosde espaço contíguo.
  2. Bloquear grupos: Os blocos são divididos em grupos.
  3. Inode: Um conjunto estruturado de informações sobre uma entrada, como um arquivo, diretório etc.
  4. 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. 0para não utilizado e 1para 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.


Diretório

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 debugfspara extrair várias informações sobre o sistema de arquivos.

Certifique-se de não usar o -wsinalizador 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

informação relacionada