Aula #14 - Os sistemas de arquivos ext2/ext3/ext4

 A família de sistemas de arquivos ext tem sido nativa para o Linux desde os seus primeiros dias, e tem sido a mais utilizada. Até recentemente, o ext4 foi a escolha padrão mais comum das distribuições Linux, devido à sua excelente combinação de desempenho, integridade e estabilidade.
O sistema de arquivos ext2 foi original e nativo do Linux e está disponível em todos os sistemas Linux, mas é raramente usado hoje.
O sistema de arquivos ext3 foi a primeira extensão com journaling do ext2. Tinha o mesmo layout usado pelo ext2, exceto pela presença do journal.

 
O sistema de arquivos ext4 apareceu pela primeira vez na versão do kernel 2.6.19, e sua designação experimental foi removida na versão 2.6.28. Ele incluiu melhorias significativas, como o uso de extents para arquivos grandes, ao invés de listas de file blocks.

Um extent é simplesmente um grupo de blocos adjacentes. Usá-los pode melhorar o desempenho para arquivos grandes e reduzir a fragmentação de disco. O ext4 é o sistema de arquivos padrão em distribuições Linux corporativas, embora RHEL 7 adotou recentemente o XFS como padrão.



EXT4


Há uma grande correspondência de recursos entre o VFS e os sistemas de arquivos ext2/3/4 como eles foram projetados para trabalhar em conjunto. O Tamanho do bloco (block size) é selecionado quando o sistema de arquivos é criado, ou seja na formatação; pode ser de 512, 1024, 2048, ou 4096 bytes. Por padrão, 4096 é usado a menos que a partição seja muito pequena. A menos que existam muitos arquivos pequenos, blocos grandes são mais eficiente em termos de minimizar acesso ao disco.

O sistema de gerenciamento de memória do kernel do Linux exige que os blocos de disco devem caber inteiramente em uma página de memória; portanto, você não pode ter blocos de 8 KB na plataforma x86 onde as páginas de memória tem 4 KB de tamanho.
O número de inodes no sistema de arquivos também pode ser ajustado, para economizar espaço em disco.

Um recurso chamado inode reservation (reserva de inodes) consiste em reservar vários inodes quando um diretório é criado, esperando que eles sejam utilizados no futuro. Isso melhora o desempenho, porque quando novos arquivos são criados o diretório já tem inodes alocados. Se o caminho de um link simbólico é inferior a 60 caracteres, um link simbólico rápido é criado. A diferença é que o link simbólico tradicional é armazenado em um bloco de dados enquanto o link simbólico rápido é armazenado diretamente no inode. Links simbólicos rápidos são, como o nome diz, rápidos, mas também utilizam menos espaço em disco.

Todos os campos são gravados no disco na ordem little-endian, com exceção do jornal.

Os blocos de disco são divididos em grupos de blocos, cada um contendo inode e blocos de dados armazenados um após o outro para diminuir o tempo de acesso.

O layout de um grupo de blocos padrão é simples. Para o bloco do grupo 0, os primeiros 1024 bytes não são utilizadas (para permitir setores de boot, etc). O superbloco vai começar no primeiro bloco, exceto para o grupo bloco 0. Em seguida descritores de grupo e uma série de blocos GDT (Global Descriptor Table). E depois bitmap bloco de dados, o mapa de bits inode, tabela de inode, e os blocos de dados.

Os blocos de dados são pré-alocados para arquivos antes que eles sejam realmente utilizados. Assim, quando o tamanho de um arquivo aumenta, espaço contínuo já está disponível e a fragmentação do disco é reduzida.

O superbloco do sistema de arquivos contém campos que são usados ​​para determinar se o sistema de arquivos precisa ser verificado antes de ser montado. O estado pode ser:
  •     clean: sistema de arquivos limpo, que foi desmontado corretamente
  •     dirty: geralmente significa montado
  •     unknown: não foi desmontado corretamente, como quando há uma falha no sistema


Nos dois últimos casos o fsck será executado para verificar o sistema de arquivos e corrigir problemas antes de montar.

Outros campos no superbloco contêm informações sobre quando o sistema de arquivos foi verificado pela última vez, tanto em data quanto em número de montagens, e a verificação automática é acionada quando os limites forem ultrapassados.



O primeiro bloco do sistema de arquivos é o chamado bloco de boot, e é reservado para o setor de inicialização de partição.


 Após o bloco de boot, existe uma série de grupos de blocos, todos com o mesmo tamanho. O esquema de cada bloco é listado a seguir:
Super    Group        Data Block    Inode        Inode Table    Data Blocks
Block    Descriptors     Bitmap         Bitmap        (n blocks)     (n blocks)
   

Os dois primeiros blocos de cada grupo são os mesmos, são eles o Superblock e o Group Descriptors. Normalmente apenas estes no primeiro block group são usados pelo kernel; as cópias redundantes são usadas apenas quando o sistema de arquivos é verificado.  Se tudo está bem, o kernel apenas os copia sobre o primeiro. Caso haja um problema com a cópia principal, a busca avança de bloco em bloco até que um saudável seja encontrado e a estrutura do sistema de arquivos é reconstruída. Esta redundância torna muito difícil de danificar seriamente um sistema de arquivos ext2/3/4, desde que o sistema de arquivos seja verificado periodicamente.

Nas primeira encarnações da família de sistema de arquivos ext, cada block group tinha os group descriptors para cada block group, e também uma cópia do super block. Como resultado de uma otimização nem todos os block groups tem uma cópia do superblock e dos group descriptors. 
Para ver o que você tem, você pode executar:


$ sudo dumpe2fs /dev/sda4 | grep -i super

dumpe2fs 1.42.9 (4-Feb-2014)
  Primária superbloco em 0, Descritores de grupo em 1-4
  Cópia de segurança superbloco em 32768, Descritores de grupo em 32769-32772
  Cópia de segurança superbloco em 98304, Descritores de grupo em 98305-98308
  Cópia de segurança superbloco em 163840, Descritores de grupo em 163841-163844
  Cópia de segurança superbloco em 229376, Descritores de grupo em 229377-229380
  Cópia de segurança superbloco em 294912, Descritores de grupo em 294913-294916
  Cópia de segurança superbloco em 819200, Descritores de grupo em 819201-819204
  Cópia de segurança superbloco em 884736, Descritores de grupo em 884737-884740
  Cópia de segurança superbloco em 1605632, Descritores de grupo em 1605633-1605636
  Cópia de segurança superbloco em 2654208, Descritores de grupo em 2654209-2654212
  Cópia de segurança superbloco em 4096000, Descritores de grupo em 4096001-4096004
  Cópia de segurança superbloco em 7962624, Descritores de grupo em 7962625-7962628
  Cópia de segurança superbloco em 11239424, Descritores de grupo em 11239425-11239428


(apontando para um dispositivo de armazenamento) para ver detalhes precisos. Isso acontece quando o sistema de arquivos é criado com a opção sparse_super que é habilitada por padrão.

O número de block groups é limitado pelo fato de que o block bitmap, que identifica blocos livres e ocupados dentro de um bloco, deve ser armazenado em apenas um bloco. Logo, se um bloco tem 4096 bytes de tamanho, um block group não pode ter mais do que 32 K blocos, ou 128 MB. Se pegarmos o maior tamanho possível para o block group, uma partição de 10 GB teria que ter no mínimo 80 block groups.

O alocador de blocos tenta manter os blocos associados a cada arquivo dentro do mesmo block group para reduzir os tempos de consulta a disco.

Como acabamos de mostrar, é possível usar o dumpe2fs para extrair informações sobre o sistema de arquivos; fazer isso em uma partição:

$ sudo dumpe2fs /dev/sda1




SUPERBLOCO


O superblock contém informações globais sobre o sistema de arquivos, incluindo:

Número de mounts e número máximo de mounts para executar o fsck. (A contagem de mount é incrementada cada vez que o disco é montado com sucesso e seu valor é o número de vezes que isso tem sido feito desde a última vez que o fsck foi executdo.) Pode-se forçar uma verificação do sistema de arquivos após um número de dias (180 dias por padrão), e a configuração é feita com a ferramenta tune2fs.

Block size (tamanho do bloco) (não pode ser maior do que uma página de memória, definida pelo mkfs.)     Blocks per group (Blocos por grupo).
    Número de blocos livres.
    Número de inodes livres.
    ID do sistema operacional.


O superbloco é armazenado de forma redundante em vários grupos de blocos.






TUNE2FS

O tune2fs pode ser usado para alterar os parâmetros do sistema de arquivos. Para alterar o número máximo de montagens entre as verificações do sistemas de arquivos (max-mount-count):
$ sudo tune2fs -c 25 /dev/sda1


Para alterar o intervalo de tempo entre as verificações (intervalo de entre-cheques):

$ sudo tune2fs -i 10 /dev/sda1

Para listar o conteúdo do superbloco incluindo os valores atuais dos parâmetros que podem ser alterados:

esli-nux ~ $ sudo tune2fs -l /dev/sda4
tune2fs 1.42.9 (4-Feb-2014)
Filesystem volume name:  
Last mounted on:          /
Filesystem UUID:          e5a37647-9817-4b1b-ae43-8628ab3105ac
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              3244032
Block count:              12955904
Reserved block count:     647795
Free blocks:              8076997
Free inodes:              2895107
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      1020
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Mon Jun 15 17:19:43 2015
Last mount time:          Tue Oct 13 11:08:24 2015
Last write time:          Tue Oct 13 11:08:23 2015
Mount count:              38
Maximum mount count:      -1
Last checked:             Mon Jun 15 17:19:43 2015
Check interval:           0 (
)
Lifetime writes:          968 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:              256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       673412
Default directory hash:   half_md4
Directory Hash Seed:      c7bc31ce-062b-4b04-8fe1-f3df6be8c5bf
Journal backup:           inode blocks


bitmaps

Os bitmaps (ou mapa de bits) para data block e inodes são blocos contendo um 0 para cada bloco ou inode livre, e contendo 1 para cada bloco ou inode utilizado. Em geral existe apenas um desses bitmaps para cada grupo de blocos.

A tabela de inodes contém o número mínimo de blocos que são necessários para cobrir o número de inodes no bloco de grupos. Cada inode precisa de 128 bytes; logo um bloco de 4 KB pode conter 32 inodes. A estrutura de dados ext2_inode está descrita no arquivo de código fonte /usr/src/linux-headers-/nclude/linux/ext2_fs.h.

Observe que algum espaço é reservado no sistema de arquivos para armazenar informação relativa ao sistema operacional. Outros sistemas operacionais podem montar sistemas de arquivo ext2/3/4, da mesma forma que o Linux pode montar vários sistemas de arquivos não nativos.

O número de inodes não é salvo no disco, porque pode ser rapidamente calculado com base no grupo de blocos e alguns offsets.

Os sistemas de arquivo ext2 e ext3 não suportavam o uso de extents para organizar arquivos grandes.  Eles usam uma array com ponteiros para blocos de dados i_block[], com tamanho padrão EXT2_N_BLOCKS=15. . Lidar com estes detalhe é complexo:
 

Os primeiros 12 elementos da array simplesmente apontam para os 12 primeiros blocos de dados do arquivo.

O 13º elemento aponta para um bloco que representa outro array de ponteiros, este sendo de segundo nível. O 14o representa outro array, neste caso de terceiro nível, enquanto o 15o representa a array de quarto nível.

Este algoritmo é rápido para arquivos pequenos. Por exemplo, com um tamanho de bloco 4 KB, um arquivo de 48 KB pode ser acessado diretamente, um arquivo de 2 MB requer um processo de segunda ordem, um de 1 GB de terceira ordem, e um 4 GB precisa da quarta ordem.


O sistema de arquivos ext4

  • É compatível com as versões anteriores ext3 e ext2.
  • Aumentou o tamanho máximo do sistema de arquivos para 1 EB (era 16 TB), e o tamanho máximo de um arquivo para 16 TB (era 2 TB). Esses números são uma consequência do endereçamento de 48 bits que é usado atualmente. Endereçamento de 64 bits pode ser usado no futuro, mas não é necessário no momento.
  • Removeu o limite de 32K diretórios que é uma limitação do ext3
  •  Divide arquivos grandes entre os maiores extents disponíveis ao invés de usar mapeamento indireto (indirect block mapping). Esta estratégia pode aumentar o desempenho para arquivos grandes e reduzir a fragmentação de disco.
  •  Usa multiblock allocation que é uma estratégia que permite alocar todo o espaço solicitado em uma operação ao invés de alocar um bloco de cada vez. Outro estratégia utilizada é delayed allocation que atrasa a alocação para aumentar desempenho em alguns casos.
  •  Pode pré-alocar espaço em disco para um arquivo. Geralmente o espaço alocado é garantido e contínuo.
  •  Usa allocate-on-flush, que é uma técnica que retarda a alocação de bloco até que dados sejam gravados em disco. 
  • Usa fsck (ferramenta de verificação de disco) rápido, o que aumenta em 10 vezes ou mais a velocidade da verificação do sistema de arquivos.
  •  Utiliza checksums para o journal (meta dados do sistema de arquivos) o que aumenta a confiabilidade. Isso ainda tem o potencial de uma pequena melhora no desempenho por permitir eliminar uma operação de espera que era necessária durante o journalling (processo de escrita dos meta dados).
  •  Lida com tempo de forma mais precisa usando nanosegundos.
  •  Suporta snapshots (semelhante a tirar uma foto do sistema de arquivos. Permite salvar o estado em um momento arbitrário para uso no futuro).

Mais vistos no mês:

As melhores distribuições Linux para 2017

TuxMath - Tux, do Comando da Matemática. Ensino e diversão a crianças.

Teste de Performance de Rede com Iperf

DHCP - Guia Completo

OPNsense - Firewall Open Source

Ophcrack: Descubra todas as senhas do Windows

SSD no linux

Oracle Linux 7.0 Server com Xfce - Instalação e configurações iniciais