# JFS

O JFS (Journaled File System) é um sistema de arquivos de 64 bits com journaling desenvolvido pela IBM. Existem versões para os sistemas operacionais AIX, eComStation, OS/2 e Distribuições Linux. No Linux está disponível como software livre sob os termos da Licença Pública Geral GNU (GPL).
No sistema operacional AIX, existem duas versões do sistema de arquivos JFS que são chamadas respectivamente JFS (JFS1) e JFS2. Nos outros sistemas operacionais, como OS/2 e Linux, só a segunda versão existe, que se chama JFS. Ela não deve ser confundida com JFS no AIX que se refere atualmente como JFS1.

## História

A IBM introduziu o JFS com o lançamento inicial da versão 3.1 do AIX em fevereiro de 1990. Este sistema de arquivos, agora chamado de JFS1 no AIX, foi o principal sistema de arquivos do AIX na década seguinte e foi instalado em milhares ou milhões de sistemas AIX dos clientes. Historicamente, o sistema de arquivos JFS1 está muito ligado ao gerenciador de memória do AIX, que é um projeto típico para um sistema de arquivos que suporta apenas um sistema operacional. O JFS foi um dos primeiros sistemas de arquivos a suportar o Journaling.
Em 1995, começou um trabalho para melhorar o sistema de arquivos para ser mais escalável e para suportar máquinas que possuíam mais de um processador. Outro objetivo era ter um sistema de arquivos mais portátil, capaz de funcionar em vários sistemas operacionais. Após vários anos de design, programação e testes, o novo JFS foi lançado pela primeira vez no OS/2 Warp Server para eBusiness em abril de 1999, e depois no OS/2 Warp Client em outubro de 2000. Em dezembro de 1999, um instantâneo do código fonte original do JFS do OS/2 foi concedida à comunidade de código aberto e iniciou-se o trabalho para portar o JFS para o Linux. A primeira versão estável do JFS para Linux apareceu em junho de 2001. O projeto JFS para Linux é mantido por um pequeno grupo de colaboradores, conhecido como JFS Core Team. Este lançamento de código fonte também funcionou para formar a base de uma reportagem do JFS de código aberto para o OS/2.
Paralelamente a esse esforço, várias pessoas da equipe de desenvolvimento do JFS retornaram ao Grupo de Desenvolvimento do Sistema Operacional AIX em 1997 e começaram a mover esta nova base de código fonte do JFS para o sistema operacional AIX. Em maio de 2001, um segundo sistema de arquivos com journaling, Enhanced Journaled File System (JFS2), foi disponibilizado para o AIX 5L.
No início de 2008, haviam especulações de que a IBM não estaria mais interessada em manter o JFS e, portanto, ele não deveria ser usado em ambientes de produção. No entanto, Dave Kleikamp, ​​membro do IBM Linux Technology Center e JFS Core Team, explicou que eles ainda seguem as mudanças no kernel do Linux e tentam corrigir possíveis erros de software . Ele acrescentou que determinadas distribuições esperam um maior compromisso de recursos com elas e optam por não suportar o sistema de arquivos.
Em 2012, o suporte ao comando TRIM para unidades de estado sólido foi adicionado ao JFS.

## Recursos

JFS suporta os seguintes recursos:

### Journal

JFS é um sistema de arquivos com journaling. Ao invés de adicionar o journaling como um recurso separado como no sistema de arquivos ext3, ele foi implementado desde o início. O jounal pode ter até 128MB de tamanho. JFS faz journaling somente nos metadados, o que significa que os metadados ficarão consistentes mas os arquivos dos usuários ficarão corrompidos depois de um crash ou queda de energia. O journaling do JFS é similar ao do XFS em que ele só faz journaling em partes do inode.

### Árvore B+

JFS usa uma Árvore B+ para acelerar a busca em diretórios. JFS pode guardar 8 entradas de um diretório no inode do diretório antes de mover as entradas para uma Árvore B+. JFS também indexa extents em uma Árvore B+.

### Alocação Dinâmica De Inodes

JFS aloca dinamicamente espaço para os inodes no disco quando necessário. Cada inode têm 512 Bytes. 32 inodes são alocados em um extent de 16 Kilobytes.

### Extents

JFS aloca arquivos como um extent. Um extent é uma sequência de comprimento variável de blocos agregados. Um extent deve ser localizado em vários grupos de alocação. Para resolver isso os extents são indexados em uma Árvore B+ para melhor desempenho quando busca-se as localizações dos extents.

### Compressão

Compressão é suportada somente no JFS1 no AIX e usa uma variação do algoritmo LZ. Por causa do alto uso de CPU e maior fragmentação do espaço livre, compressão não é recomendada para outro uso além de uma estação de trabalho de usuário único ou áreas de cópias de segurança offline.

### Superblocos do JFS

O superbloco guarda informação sobre todo o sistema de arquivos e incluem os seguintes campos:
* Tamanho do sistema de arquivos
* Número de blocos de dados no sistema de arquivos
* Uma bandeira indicando o estado do sistema de arquivos
* Tamanho dos grupos de alocação
* Tamanho do bloco do sistema de arquivos