Please enable JS

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.

Ao longo dos anos, os sistemas operativos baseados em kernel Linux passaram e ser conhecidos como distribuições Linux ou distros. Atualmente, eles são os sistemas operativos Unix-like mais usados do mundo, por sua estabilidade, segurança e licenciamento aberto. Serviços essenciais para o funcionamento da internet (DNS, HTTP, FTP, etc.) são, majoritariamente, servidos por computadores Linux ao redor do mundo.

Sistemas de Arquivos

Sistemas de arquivos (file systems, em inglês) são formas de organizar e gerenciar dados em dispositivos de armazenamento. Eles coordenam o acesso do sistema operacional a metadados (informações sobre arquivos) e seus respectivos dados (arquivos propriamente ditos), informando a localização dos blocos alocados, possibilitando operações de leitura e escrita nas devidas áreas de disco.

A primeira geração de computadores da história (era pré Unix) tinha file systems muito primitivos que apenas separavam e nomeavam os arquivos (datasets) entre si, alocando-os em blocos sequenciais, ocasionando constantes problemas de fragmentação e redução na capacidade original de armazenagem. Ainda havia o agravante das mídias de armazenamento serem muito rudimentares, gerando um cenário muito propício para a corrupção e perda de dados.

Com o surgimento do Unix, os sistemas de arquivos passam a ter uma estrutura (bootblocks, superblocks e inodes) parecida com que vemos hoje. Essas tecnologias sequer tinham um nome e eram, simplesmente, chamados de FS (file system).

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 ainda estão somente em memória, sem incorrer em algumas reduções de performance causadas por chamadas sync/fsync. Isto ajuda na prevenção de inconsistências em caso de desastres, podendo proporcionar uma recuperação mais rápida evitando 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 Minix, por questões de compatibilidade e praticidade. Ele era uma espécie de fork do UFS (Unix File System) com código simplificado.

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, o EXT2, lançada em 1993. Na mesma época foi criado o Xiafs, outro sistema de arquivos com a proposta de substituir o MinixFS. O EXT acabou virando padrão, sobretudo, por não fragmentar e - consequentemente - ter uma performance superior.

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 projetado para ter alto desempenho, consistência e desfragmentação on-line, sendo, em determinados casos, superior ao EXT. Ele foi portado para Linux em 2001.

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, principalmente, em servidores. Mas 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 com estrutura B-Tree (Arvore B), garantindo agilidade na localização e acesso de seus objetos.

Modos de Journaling

Quase todos os sistemas de ficheiros atuais computam as transações de gravação de arquivos. A implementação mais comum dessas rotinas é o journaling. Trata-se de uma tecnologia que registra, através de log (journal) rotativo, as operações de escrita em disco, possibilitando corrigir inconsistências em arquivos (verificadas através dos inodes), por motivo de desligamento incorreto, falhas de energia elétrica, travamentos de sistema, ou em consequência de certos erros de hardware.

É 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 o sistema operativo solicita a gravação de um arquivo, o Linux armazena os metadados (atributos) do arquivo e seu conteúdo (o arquivo em si), ambos na área de journal. Somente se estas operações forem bem sucedidas, o conteúdo é gravado fisicamente no dispositivo de armazenamento. O modo journal é 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.

Writeback

É o modo padrão usado nas principais distribuições. Todas as operações de armazenamento de dados são registradas e os metadados são gravados, mas não há armazenamento do conteúdo dos arquivos na área de journal. Logo que os metadados são guardados no journal, eles e seus arquivos correspondentes são gravados no HD. Esse é um modo intermediário porque concilia segurança e desempenho.

Ordered

Assim como em ordered, o modo writeback registra apenas os metadados. No entanto, a gravação efetiva, dos metadados e seus arquivos, não ocorre rapidamente, nem de modo ordenado. É esperado um momento de ociosidade do disco para que estas operações ocorram. 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 melhorais, 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. Nessas situações, recomenda-se manter o HD desligado e consultar uma empresa especializada na recuperação de dados em Linux.