# XFS

O XFS é um sistema de arquivos com registro de 64 bits de alto desempenho criado pela Silicon Graphics, Inc (SGI) em 1993. Era o sistema de arquivos padrão no sistema operacional IRIX da SGI, começando com sua versão 5.3. O XFS foi portado para o núcleo do Linux em 2001. A partir de junho de 2014, o XFS passou a ser suportado pela maioria das distribuições Linux, algumas das quais o usam como o sistema de arquivos padrão.
O XFS é excelente na execução de operações paralelas de entrada/saída (E/S) devido ao seu design, que é baseado em grupos de alocação (um tipo de subdivisão dos volumes físicos nos quais o XFS é usado - também abreviado para AGs). Por causa disso, o XFS permite extrema escalabilidade de threads de E/S, largura de banda do sistema de arquivos e tamanho dos arquivos e do sistema de arquivos em si, ao abranger vários dispositivos de armazenamento físico. O XFS garante a consistência dos dados, empregando o registro de metadados e suportando barreiras de gravação. A alocação de espaço é realizada por meio de extensões com estruturas de dados armazenadas em árvores B +, melhorando o desempenho geral do sistema de arquivos, especialmente ao lidar com arquivos grandes. A alocação atrasada auxilia na prevenção da fragmentação do sistema de arquivos. Desfragmentação online também é suportada. Um recurso exclusivo do XFS é a pré-alocação da largura de banda de E/S a uma taxa pré-determinada. Isso é adequado para muitos aplicativos em tempo real, no entanto, esse recurso era suportado apenas no IRIX e somente com hardware especializado.
Um usuário notável do XFS, a Divisão de Supercomputação Avançada da NASA, aproveitou esses recursos para implantar dois sistemas de arquivos XFS de 300+ terabytes em dois servidores de armazenamento de arquivamento SGI Altix, cada um deles diretamente conectado a várias matrizes de disco Fibre Channel.
O XFS foi originalmente projetado e criado pela SGI e usado no sistema operacional IRIX e posteriormente foi portado para o Linux. Foi explicitamente projetado para lidar com grandes conjuntos de dados, bem como para lidar com tarefas de I/O paralelo de forma muito eficaz.
O XFS pode lidar com:
Até 16 EB (exabytes) de tamanho total do sistema de arquivos
Até 8 EB de tamanho máximo para um arquivo individual
O alto desempenho é um dos elementos principais do projeto XFS, que implementa métodos para:
Potencializar o DMA (Acesso direto a memória)
Garantir uma taxa de I/O
Ter flexibilidade para ajustar o tamanho do bloco para casar com o tamanho do bloco da camada de nível de disco como RAID ou LVM.
Em contraste com os sistemas de arquivos tradicionais, o XFS também pode fazer journal das informações cota. Isso reduz o tempo de recuperação de um sistema de arquivos que usa cotas. Além disso, o journal pode ficar em um dispositivo externo.
Tal como acontece com os outros sistemas de arquivos UNIX e Linux, o XFS suporta atributos estendidos.
A manutenção de um sistema de arquivos XFS é facilitada pelo fato de que a maior parte das tarefas de manutenção podem ser feitas on-line (ou seja, com o sistema de arquivos montado).
Exemplos dessas operações:
Desfragmentar
Aumentar o tamanho do sistema de arquivos
Fazer Dump e Restore (Backup de baixo nível)
Backup e restauração de baixo nível podem ser feitos com os utilitários nativos do XFS:
xfsdump
xfsrestore
que podem ser convenientemente colocados em pausa para continuar depois.
Como esses utilitários também são multi-thread, as operações de dump e restore do XFS podem ser realizados muito rapidamente.
Enquanto o XFS não suporta diretamente snapshots, o utilitário xfs-freeze pode ser usado para suspender o sistema de arquivos, permitindo assim que um snapshot possa ser feito por uma ferramenta que opera no nível do disco como as ferramentas do Linux LVM. O LVM usará automaticamente o xfs-freeze para desativar o sistema de arquivos para fazer snapshots.
O XFS suporta cotas e os comandos tradicionais de cota podem ser usados. No entanto, se você usar o comando xfs-quota você pode usar as cotas por diretórios que o XFS suporta.

## História

A SGI usava, no seu sistema operacional IRIX, o sistema de arquivos EFS (Extent File System), o qual era baseado no FFS (Fast File System) de Berkeley (criado por Marshall McKusick [McKusick, 2004]). O EFS 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. [SWEENEY et al, 1996]
Em outubro de 1993 foram publicados alguns artigos descrevendo o projeto para um novo sistema de arquivos [ANDERSON et al, 1993; DOUCETTE, 1993] — o nome do projeto era xFS. O XFS foi disponibilizado em dezembro de 1994 no IRIX 5.3 [ELLIS e RAITHEL, 1994].
Em outubro de 1999, no 3rd annual Atlanta Linux Showcase, Mostek et al apresentaram um trabalho mostrando como adaptar o XFS para o Linux [MOSTEK, 1999]. Em maio de 2001 foi lançada a versão 1.0 para Linux, por meio de patches. Finalmente, foi incorporado ao Linux 2.4.25, em fevereiro de 2004.

## Principais características

* O XFS é um sistema de arquivos desenvolvido em 64 bits, compatível com sistemas de 32 bits. Em plataformas de 64 bits, possui um limite de tamanho de 8 EiB para um volume e para cada arquivo; em 32 bits, usando page frame de 4 KiB, o tamanho máximo do volume ou de um arquivo é limitado a 16 TiB.
* Efetua alocação por extensões (v. abaixo) em vez de alocação por blocos.
* Usa alocação dinâmica de nós-i.
* É um sistema de arquivos com journaling.

## Estrutura

A descrição será baseada no texto de Naujok [2006]. Algumas particularidades atuais referem-se à implementação para Linux, pois a última versão do Irix é de 2006.
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 dinamicamente, 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 e um extenso conjunto de ferramentas para manutenção, otimização e recuperação de dados e metadados. Não possui ferramenta para recuperar arquivos apagados. XFS(estrutura)
O XFS oferece suporte ao endereçamento de 64 bits e fornece desempenho bastante elevado utilizando árvores B+ tanto para a alocação de diretórios quanto de arquivos. O XFS também usa alocação baseada em extensão com suporte a tamanhos de blocos variáveis (de 512 bytes a 64KB). Junto com as extensões, o XFS usa alocação com atraso, na qual a alocação dos blocos do disco é atrasada até que os blocos sejam gravados no disco. Essa funcionalidade aprimora as opções de alocação de blocos sequenciais de discos, pois o número total necessário já será conhecido.

## Propriedades

Outras propriedades interessantes do XFS são a taxa garantida de entrada/saída (E/S —por meio de uma reserva de largura de banda para usuários do sistema de arquivos) e E/S direta, na qual os dados são copiados diretamente entre o disco e o buffer de espaço do usuário (em vez de serem armazenados por meio de vários buffers). O XFS usa a política com registro de mudanças no modo nova gravação.