XFS

Ícone de esboço Este artigo sobre informática é um esboço. Você pode ajudar a Wikipédia expandindo-o.

O XFS é um sistema de arquivos criado pela Silicon Graphics, Inc. para o seu sistema operacional IRIX. Posteriormente teve seu código fonte liberado e foi adaptado para funcionar no Linux.

História

A SGI usava, no seu sistema operacional IRIX, o sistema de arquivos EFS, que era baseado no FFS de Berkeley. Entretanto, o EFS já usava alocação por extensões, em vez da alocação por blocos do FFS.

As principais limitações do EFS eram: limite de 8 GiB para o volume, arquivos com tamanho máximo de 2 GiB, taxa de transferência menor que a disponibilizada pelo hardware. Isso no início da década de 1990. Assim, o XFS foi projetado para substituir o EFS, visando escalabilidade e suporte a arquivos grandes.

Foi disponibilizado em dezembro de 1994 no IRIX 5.3. Em março de 2000 o código fonte foi liberado para que a comunidade pudesse usá-lo em outras plataformas. Entre 1999 e 2000, a SGI fez apresentações para facilitar a adaptação do código do XFS para o Linux. Em maio de 2001 foi lançada a versão 1.0 para Linux, por meio de patches. Finalmente, foi incorporado ao kernel 2.4.25, em fevereiro de 2004.

Estrutura

Por ter sido projetado para ser escalável e gerenciar arquivos grandes, o XFS usa estruturas baseadas em 64 bits, embora completamente compatíveis com 32 bits. Em plataformas de 64 bits, suporta um volume de 18 EiB e arquivos com até 8 EiB; em 32 bits, o tamanho do volume e de um arquivo é limitado a 16 TiB.

O tamanho do bloco deve ser menor ou igual ao tamanho da moldura de página; portanto pode ser de 512, 1.024, 2.048 ou 4.096 bytes (x86, x86-64), até 8.192 bytes (várias arquiteturas RISC), ou até 16.384 bytes (IA-64 - Itanium). Não utiliza mapa de bits para gerenciamento de blocos e nós-i.

Um volume XFS é dividido em grupos de alocação (AG: Allocation Group), que são conjuntos de blocos (análogos aos grupos de blocos do Ext3 e grupos de cilindros do UFS1), cujo tamanho varia entre 16 MiB e 1 TiB. Por padrão são criados 8 grupos, exceto quando o tamanho da partição é maior que 8 GiB. A quantidade pode ser definida manualmente na formatação. Cada AG contém o superbloco (único, o superbloco em cada AG subseqüente é cópia do primeiro), os nós-i e informações dos blocos referentes ao próprio grupo.

Um nó-i tem um tamanho padrão de 256 bytes, podendo chegar a 2.048 bytes, desde que não exceda o tamanho do bloco. Os nós-i são criados dinâmicamente, em grupos (chunks) de 64. Uma estrutura em árvore balanceada (B-tree) é usada para gerenciar esses grupos. Um nó-i é dividido em 3 partes: (i) o núcleo (core); (ii) área de dados (data fork); (ii) atributos estendidos (extended attribute fork).

O núcleo, cujo tamanho é 96 bytes, contém as seguintes informações, dentre outras: permissões e tipo do arquivo; dono (UID) e grupo (GID); número de referências (nlink, análogo ao hard link); tempos (atime, ctime, mtime); tamanho do arquivo, em bytes; número de extensões.

A área de dados, quando o arquivo é regular, contém: (i) ponteiros para as extensões (no máximo 19, para nós-i de 256 bytes e sem o uso de atributos estendidos); ou (ii) ponteiro(s) para lista(s) de extensões (em árvores balanceadas). Neste caso, o ponteiro pode ser para um árvore em 2 níveis, onde o primeiro nível aponta para outra árvore, que finalmente irá conter os ponteiros para as extensões do arquivo. Cada árvore pode apontar para até 254 extensões.

A alocação é feita por extensões (extents), que são agrupamentos de blocos contíguos; cada extensão pode ter até 8 GiB, quando o tamanho do bloco é de 4 KiB (a estrutura que usa a extensão reserva 21 bits para o tamanho da extensão em blocos). Para cada AG são mantidas duas estruturas em árvore balanceada para gerenciar os blocos: uma ordenada (decrescentemente) pelo tamanho de cada extensão; outra pelo endereço do bloco inicial de cada extensão.

Possui journaling de metadados que vem com um robusto conjunto de funções.

Referências