Eu realmente tenho lido sobre isso recentemente, e embora tenha sido especificamente sobre ext2, eu acredito que ext3 e ext4 são semelhantes, se não o mesmo.
Vamos chamar seu disco rígido físico sda
. No nível mais alto, seu disco é primeiro dividido em partições separadas. Cada partição recebe seu próprio sistema de arquivos que decide como gerenciar arquivos nessa partição. Por exemplo, você pode ter o Windows em sda1
usando o sistema de arquivos NTFS, o Ubuntu em sda2
usando o sistema de arquivos ext4 e o Swap em sda3
que não usa um sistema de arquivos. Perto do começo de sda
, antes das partições começarem, são duas coisas. Primeiro, o setor de inicialização, que sua BIOS carrega na inicialização e provavelmente contém o grub. Segundo, a tabela de partições, que lista os detalhes sobre onde todas as partições começam e terminam no disco. Você pode descobrir detalhes sobre suas partições usando sudo fdisk -l
.
Dentro da partição ext4 em sda2
, a partição é dividida em grupos de blocos. Dentro de um grupo de blocos é primeiro o superbloco, que fornece informações importantes sobre o sistema de arquivos e o espaço livre. Depois de mais algumas áreas usadas pelo sistema de arquivos, estão os inodes. Cada inode inclui uma lista dos locais de até 12 blocos de dados. Cada inode também pode ter uma referência para até três outros inodes. A área final no grupo de blocos é para dados reais e é dividida em blocos (tipicamente 4 KB cada).
Todo diretório, arquivo e link possui um inode exclusivo. Os dados nos arquivos estão contidos em muitos blocos de disco diferentes que podem estar em qualquer lugar no disco. O inode do arquivo lista onde encontrar todos os blocos de dados potencialmente dispersos. Da mesma forma, o conteúdo de cada diretório é armazenado como dados da mesma maneira.
Quando você abre um arquivo, por exemplo /home/user/contacts.txt
, o computador encontra o inode do diretório raiz, que sempre sabe onde encontrar. O inode lista os locais de todos os blocos de dados que descrevem o conteúdo do diretório. Em seguida, o computador pesquisa os blocos de dados em busca de uma entrada chamada "home". A entrada para o diretório home
informa onde encontrar o inode para home
no disco. Em seguida, ele procura nesse inode, procura os blocos especificados para user
e repete o processo para localizar o arquivo contacts.txt
, cujo inode lista os blocos que contêm o conteúdo do arquivo.
Se você quiser mover contacts.txt
para /home
, primeiro terá que fazer tudo o que foi descrito acima para encontrar o inode do arquivo. Em seguida, o computador precisa navegar até o inode para /home
(que será rápido porque o Linux mantém um cache dos inodes de diretórios acessados recentemente chamado cache dentry) e adiciona contacts.txt
aos blocos de dados do diretório. Em seguida, ele tem que navegar até o inode de user
e pesquisar seus blocos de dados para contacts.txt
e excluir sua entrada.
Portanto, se os dois locais estiverem na mesma partição, os blocos de dados do arquivo nunca serão realmente movidos. A referência do inode para o arquivo simplesmente será movida dos blocos de dados do diretório de origem para os blocos de dados do diretório de destino. Se um local estiver em uma partição diferente, que conta como um sistema de arquivos totalmente separado, a entrada do arquivo do inode será excluída, seus blocos de dados serão copiados e uma nova entrada do inode será criada nos blocos de dados do diretório relevante.
Há também mais uma coisa que acontece em segundo plano em ext3
e ext4
. Chama-se journaling e ajuda a garantir a integridade do sistema de arquivos, apesar de falhas. Sempre que ocorre uma operação de arquivo, o sistema de arquivos escreve uma entrada no diário descrevendo o que vai fazer. A entrada é excluída apenas quando todas as operações descritas forem concluídas. Dessa forma, quando um computador é inicializado após uma falha no meio das operações de arquivo, ele imediatamente vê as entradas pendentes no diário e pode tentar corrigir os problemas.
Fonte: Modern Operating Systems 3e por Andrew S. Tanenbaum