Please enable JS

Resiliência em Sistemas de Arquivos Linux

Artigo criado em 10/08/2019, por Hosco Tecnologia.

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.

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 essa 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. Foi 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 implementação original foi criada 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. 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 de dedicada de memória, partição ou disco. Em processo de recuperação de dados em ZFS, é necessário que o perito tenha ampla compreensão sobre essa estrutura.

Por questões de incompatibilidade de licença, o ZFS e suas ferramentas não podem ser inseridas direto no 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 e ambos são muito parecidos.

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 a usuários e computadores cliente.

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, I-node e File

O 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.).

O 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.

O inode (nó de índice) guarda registros sobre cada objeto contido no filesystem. Ele guarda 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.

O file é o 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.

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 usam índices B-Tree (Arvore B), garantindo agilidade na localização e acesso de seus objetos.

Modos de Journaling

Os sistemas de ficheiros 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 gravação 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 e removidos do jounal, registrando para o sistema que a operação foi bem sucedida. Esse modo é o mais seguro porque, em caso de falhas, tanto os metadados quando os dados estarão disponíveis, possibilitando reparo. No entanto, a performance é comprometida por causa da duplicidade de operações de escrita.

Ordered

Os metadados são gravados na área de journal, mas os arquivos reais não são. Despois disso, os dados são escritos de fato no HD, de forma síncrona. Esse é um modo intermediário porque concilia segurança e desempenho.

Writeback

Assim como em ordered, o modo writeback registra apenas os metadados. No entanto, a gravação efetiva não ocorre rapidamente, nem de modo ordenado. O kernel aguarda um momento oportuno para que estas operações ocorram de modo otimizado. Tal comportamento eleva os riscos de corrupção de dados mediante acidentes digitais, mas é a configuração que proporciona 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, garantindo permanente integridade dos dados.

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


Embora os ambientes Linux sejam resilientes, é sempre aconselhado não executar ações (fsck ou rotinas de autorreparo) que causem stress em drives com suspeita de dano físico. Nessas situações, recomenda-se manter o HD desligado e consultar uma empresa especializada na recuperação de dados em Linux com drives de armazenamento danificados.

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