Por favor, habilite JavaScript para poder visualizar esta página corretamente.

Resiliência em Sistemas de Arquivos Linux

Criado em 10/08/2019. Atualizado em 27/10/2023.

O Linux

Em 1991, o estudante de computação Linux Torvalds lança o kernel (núcleo de sistema operacional) Linux, baseado no código do Unix Minix. Sua motivação era criar um sistema gratuito para uso em CPUs x86, que pudesse ser usado e alterado sem maiores restrições. No ano seguinte, o kernel Linux foi licenciado sob os termos da GNU GPL. Em 1993, o ele foi adaptado e integrado as aplicações que compunham o GNU (projeto liderado por Richard Stallman), tornando-se um sistema operacional completo.

Sistemas de Arquivos

Os sistemas de arquivos (file systems, em inglês) são formas de organizar e gravar dados em dispositivos de armazenamento (HD, SSD, pen drive, etc.). Eles contém os registros e a indexação dos blocos alocados, possibilitando operações de leitura e escrita nas devidas áreas de disco onde os dados estão armazenados ou onde eles deverão ser gravados. É nessa camada lógica que estão contidos os metadados (informações sobre arquivos) e seus respectivos dados - arquivos, propriamente, ditos.

A primeira geração de computadores em produção, nos anos 50, armazenava informações de modo muito primitivo. Arquivos (datasets) eram alocados em blocos sequenciais, nomeados e separados entre si. Ocorria considerável redução na capacidade original de armazenagem, após algum tempo de uso. Ainda, havia o agravante das mídias de armazenamento serem muito rudimentares, gerando um cenário propício a corrupção e perda de dados. Essas tecnologias de armazenamento nem tinham um nome e eram, simplesmente, chamadas de FS (file system).

Com o surgimento do Unix, os sistemas de arquivos passam a ter uma estrutura (bootblocks, superblocks e inodes) parecida com que vemos hoje.

Sistema de arquivo Linux
Sistema de arquivo Linux

Unix File System

Em 1983, é lançado o UFS que se tornou padrão nos sistemas Unix. Ele consolidou e aprimorou os conceitos de bootblocks, superblocks, data blocks e inodes e, ainda, trouxe inovações importantes como o mapeamento dos discos em cilindros.

Em 1999, o UFS incorporou a tecnologia soft updates para manter a integridade da estrutura de arquivos. Este tipo de "journaling" faz um constante flush de metadados, através de escritas assíncronas, registrando operações que estão em memória, sem incorrer em algumas reduções de performance causadas por chamadas sync/fsync. Isto ajuda previnir inconsistências em caso de desastres e aumenta a chance de uma recuperação mais rápida porque evita longas operações com verificadores de sistema de arquivos.

As qualidades e características inovadoras do UFS influenciaram, diretamente, o desenvolvimento de quase todos os sistemas de arquivos usados em Linux.

Extended File System

As primeiras versões do Linux usavam o próprio sistema de arquivos do Minix, por questões de compatibilidade e praticidade.

Ainda em 1992, o programador Rémy Card implementa o EXT (primeiro sistema de arquivos padrão para Linux), inspirado na estrutura de metadados do UFS. Sua intenção era superar limitações do MinixFS, como tamanho reduzido dos nomes de arquivos, partições com capacidade de apenas 64 MB e baixa performance nas operações de I/O.

O EXT passa a se consolidar em sua segunda série (EXT2), lançada em 1993. Isso ocorreu porque esta tecnolgia mostrou ser superior aos concorrentes da época (XiaFS e o próprio MinixFS).

Atualmente, o EXT4 é padrão na maioria das distribuições Linux. É um sistema bastante confiável, principalmente por sua escrita em modo data=ordered que garante maior intregridade em caso de falhas.

XFS, JFS e ReiserFS

As primeiras distribuições Linux (Slackware, Debian, Red Hat, etc.) passaram, rapidamente, a conquistar usuários e atrair atenção de desenvolvedores por todo mundo. Surgiram novas demandas de armazenamento e sistemas de arquivos.

File systems como XFS e JFS, que antes eram proprietários, tiveram suas licenças alteradas para poderem ser usados em Linux. Eles passaram ser excelentes alternativas ao EXT.

O XFS foi portado para Linux em 2001. É um filesystem projetado para ter elevado poder de escalabilidade, desfragmentação on-line e alto desempenho. Para esse ganho na velocidade de escrita, o XFS opera em modo data=writeback, com a gravação (sync) de dados ocorrendo de forma assíncrona e com uso agressivo de caching. Entretanto, esses atributos para ganho de performance podem aumentar o risco de perda de dados em casos de queda de energia.

O JFS (Journaled File System) foi lançado no ano de 1990, como sendo o primeiro com suporte a journaling (registro de operações). Ele foi portado para Linux em 2002.

O ReiserFS é um poderoso sistema de arquivos que foi projetado para uso exclusivo em Linux, lançado no ano de 2001. Ele tem velocidade superior no acesso a pequenos arquivos e sua checagem de consistência é muito rápida - o que o impulsionou muito seu uso em servidores de maior porte. No entanto, em 2006, o desenvolvimento do ReiserFS sofreu enorme prejuízo após seu criador (Hans Reiser) ser preso pelo assassinato da esposa.

ZFS e OpenZFS

ZFS é um dos sistemas de ficheiros mais inovadores da atualidade. Sua idealização e implementação original, foram realizadas pela Sun, em 2005, e seu desenvolvimento vem sido mantido pela Oracle, desde 2010. O OpenZFS é a implementação livre do ZFS, que é usada em Linux e outros Unixes. Atualmente, ele funciona de modo muito estável nas distribuições Linux e já vem sendo usado em ambientes de produção.

O ZFS usa logs transacionais em vez de journal, registrando suas operações de gravação no ZIL (ZFS Intent Log) que é uma área dedicada de memória, pool ou disco. Em processos de recuperação de dados em ZFS, é necessário que o perito ou analista tenha ampla compreensão sobre essa estrutura.

Por questões de incompatibilidade de licença, o ZFS e suas ferramentas não costumam a ser inseridos diretamente nas mídias de instalação das distribuições Linux. Ele é instalado como um módulo que precisa ser compilado para se agregar ao kernel.

Muitos dos atributos do ZFS serviram de inspiração para o BTRFS. Ambas tecnologias de armazenamento são parecidas e têm desenvolvedores em comum.

B-tree File System

O BTRFS é um moderno, inovador e poderoso sistema de arquivos, criado pela Oracle, que foi introduzido no kernel Linux em 2009. Ele tem qualidades parecidas com o ZFS e já está incluso nas mídias de instalação das principais distribuições.

Esse filesystem tem um sofisticado algoritmo de preservação da integridade dos dados, que computa um código hash para cada bloco gravado e faz a devida conferência quando é solicitada sua leitura. Em caso de falhas, ocorre a realocação automática de blocos defeituosos para outros dispositivos ou partições redundantes. Essa tecnologia de autorreparo (self-healing, em inglês) permite alta disponibilidade, de modo transparente aos consumidores do recurso de storage.

Dentre suas principais qualidades, podemos destacar:

  • Integração entre volume e sistema de arquivos;
  • Alocação de recursos em modo COW (copy-on-write);
  • Blocos com conferência de integridade por checksum;
  • Self-healing (auto-reparo) em tempo real;
  • Criação de snapshots e pontos de reparo.

O BTRFS já é utilizado em ambientes de produção de grandes corporações e será, possivelmente, o substituto do EXT4 em ambientes escaláveis e de alta disponibilidade.

Estrutura dos File Systems

As principais estruturas de um sistema de arquivos Linux são: boot block, superblock, inode e file.

Boot Block

Bloco de inicialização é uma área especial de disco (de 512 à 4096 bytes) que contém informações sobre as dimensões do drive e o código de arranque do sistema operacional - que será lido pelo BIOS/UEFI quando o computador é ligado. Em Linux, o boot block contém o programa responsável pelo carregamento do kernel, que é controlado por gerenciadores de boot (LILO, GRUB, etc.).

Superblock

Superbloco é a estrutura primária de metadados acessada durante a montagem de uma partição. Ele informa o ID do filesystem, seu estado de consistência, capacidade de armazenamento, etc. O superblock 0 (principal) possui cópias espalhadas pelo sistema de arquivos.

Inode

Nó de índice (Index Node ou I-node) guarda registros sobre cada objeto contido no filesystem. Ele armazena informações sobre metadados e atributos dos arquivos alocados. Ou seja, contém registros de índices ou ponteiros (endereços dos blocos pertencentes aos objetos), permissões de acesso, proprietário, data de criação, etc.

File

Conjunto de blocos alocados, logicamente ligados entre si. Pode ser um arquivo, diretório, link simbólico, ou qualquer objeto que esteja em espaço de usuário.

Localização de Dados

Quando um arquivo é solicitado pelo sistema, ocorre a consulta do seu inode para obter a localização dos blocos que o compõe. Assim, a cabeça de leitura do HD percorre a sequência de setores (conjunto de blocos) associados ao arquivo, o fragmenta na memória RAM e o disponibiliza.

A maioria dos sistemas de arquivos usados em Linux têm índices B-Tree (Arvore B), garantindo agilidade na localização e acesso aos seus dados.

Modos de Journaling

Os sistemas de arquivos atuais monitoram as transações de gravação e atualização dos dados. A implementação mais comum desse gerenciamento é o journaling. Trata-se de uma tecnologia que registra as operações de escrita, através de log (journal) rotativo, possibilitando corrigir inconsistências em arquivos (verificadas através dos inodes), por motivo de desligamento incorreto, falhas de energia elétrica e travamentos de sistema.

É possível customizar o comportamento do journal em alguns file systems, principalmente em EXT2, EXT3 e EXT4. Algumas alterações visam mais segurança, mas sacrificam o desempenho; outras são o inverso disso.

  • Journal

    Quando ocorre uma soliticação de escrita de arquivo em um sistema que está em modo journal, tanto os metadados (atributos do arquivo) quanto o conteúdo (o arquivo em si) são gravados na área de journal. Depois disso, ambos são gravados no sistema de arquivos. Por fim, metadados e conteúdos são removidos do journal e o sistema registra que a operação foi bem sucedida. Esse é o modo mais seguro porque, tanto os metadados quando os dados estarão disponíveis, possibilitando reparo em caso de falhas. No entanto, a performance é comprometida por causa da maior quantidade de operações em disco.

  • Ordered

    Apenas os metadados são gravados na área de journal. Em seguida, os conteúdos (arquivos) são escritos de forma síncrona na mídia de armazenamento. Esse é um modo intermediário que concilia segurança e desempenho.

  • Writeback

    Assim como em ordered, o modo writeback registra apenas os metadados. No entanto, a gravação efetiva dos arquivos não é feita de forma síncrona, nem de modo ordenado. O kernel aguarda um momento oportuno para que as operações de I/O ocorram de modo otimizado. Tal comportamento eleva os riscos de corrupção de dados diante de acidentes. No entanto, essa é a configuração que com melhor desempenho.

Consistência e Resiliência

Segue uma rápida análise de tolerância a falhas e correção de erros nos principais sistemas de arquivos usados em Linux:

EXT2

Não possui área reservada para armazenar logs de operações de escrita. Por ser uma tecnologia antiga, possui capacidade limitada de resposta a erros de hardware, desligamentos incorretos e interrupção abrupta de energia elétrica.

EXT3

Introduz a tecnologia de journaling na família EXT, registrando todas as alterações ocorridas no sistema de arquivos. Esses registros de transações proporcionam maior consistência do sistema de arquivos diante de desmontagens acidentais de volumes ou desligamento abrupto da mídia de armazenamento (HD, SSD, etc.). Faz reparos mais rápidos e eficientes que o Ext2, mas é muito limitado em reparos de tempo real.

EXT4

Traz aprimoramentos de escalabilidade e autorreparo em relação ao seu antecessor. Dentre essas melhorias, destaca-se a verificação de integridade (checksum) do próprio journal, garantindo alterações válidas em disco.

ZFS

Opera em modo COW (cópia em gravação), otimizando o uso de recursos e garantindo que sempre haja uma versão íntegra dos arquivos, como ocorre no Journaling em modo journal. Possui um eficiente método de registro de logs transacionais que garante permanente integridade dos dados.

BTRFS

Além de operar em modo copy-on-write, possui suporte nativo a snapashots e espelhamento de drives. Também oferece desfragmentação online, verificação de integridade offline (btrfs check) e suporte a backup incremental.


Considerações

Os sistemas de arquivos usados em Linux atingiram um alto grau de refinamento nas suas capacidades de auto regeneração. No entanto, resiliência e alta disponibilidade não substituem soluções de backup e disaster recovery. É recomendado que todo cenário computacional possua estes recursos.

Em caso de desastres é aconselhado evitar ações (fsck ou rotinas de autorreparo) que causem stress em HDs ou SSDs com suspeita de dano físico. Recomenda-se manter os drives desligados e consultar uma empresa especializada na recuperação de dados em Linux.

#Linux #FileSystem #resiliencia #journal #falha #fsck