# Unix File System

O Sistema de Arquivos Unix, do inglês Unix File System (UFS), é um sistema de arquivos usado por muitos sistemas operacionais Unix e assemelhados. Também é conhecido como Berkeley Fast File System (Sistema de Arquivos Rápido da Berkeley), BSD Fast File System ou simplesmente FFS.

## Estrutura

Um volume UFS é composto das seguintes partes:
* Alguns blocos no inicio da partição reservados para blocos de boot (os quais devem ser inicializados separadamente do sistema de arquivos);
* Um superbloco, contendo um número mágico identificando-o como um sistema de arquivos UFS, e alguns outros números virtuais descrevendo sua geometria, estatísticas e parâmetros de ajuste comportamental;
* Uma coleção de grupos de cilindros. Cada grupo contendo os seguintes componentes:
** Uma cópia de segurança do superbloco;
** Um cabeçalho de grupo de cilindros, com estatísticas, listas livres etc, sobre o grupo de cilindros, similar a àqueles no superbloco;
** Um número de nós-i, cada qual contendo atributos de arquivos;
** Um número de blocos de dados;
Os Nós-i, do inglês i-nodes, são numerados seqüencialmente. Os vários nós-i iniciais são reservados por razões históricas, seguidos pelo nó-i do diretório root.
Arquivos do tipo diretório contêm apenas a lista de nomes de arquivos no diretório e o nó-i associado a cada arquivo. Todos os metadados são mantidos no nó-i.

## História e evolução

As versões mais antigas do Unix usaram sistemas de arquivos referenciados simplesmente como FS. Os FS incluíam apenas o bloco de inicialização ou boot, superbloco, um conjunto de nós-i e os blocos de dados. Isso funcionou bem nos antigos Unixes com discos com pouca capacidade, para os quais esses sistemas de arquivos foram desenvolvidos. No entanto, enquanto a tecnologia avançava e os discos ganharam mais capacidade, o movimento dos cabeçotes para frente e para trás entre os nós-i e os blocos de dados foram apontados como causadores de problemas de performance num processo chamado Thrashing. O BSD melhorou essa situação no FFS(Fast File System ou Sistema de arquivos rápido), inventando grupos de cilindros e dividindo o disco em pedaços menores, cada qual com seu próprio conjunto de nós-i e blocos de dados.
A invenção do BSD FFS foi uma tentativa de acomodar blocos de dados associados e metadados em um mesmo grupo de cilindros, e teoricamente, todos os conteúdos de um diretório (ambos dados e metadados para todos os arquivos) no mesmo grupo de cilindros ou em grupos vizinhos, reduzindo deste modo a fragmentação causada por conteúdos de diretório espalhados ao longo do disco inteiro.
Alguns dos parâmetros de desempenho no superbloco incluíam número de faixas e setores, velocidade de rotação de disco, velocidade de cabeçote e alinhamento de setores entre faixas. Em um sistema integralmente otimizado, o cabeçote poderia ser movido entre faixas próximas para ler setores espalhados a partir de faixas alternativa enquanto esperava o disco girar.
Como os discos cresceram mais e mais em armazenagem, a otimização a nível de setor se tornou obsoleta (especialmente com discos que usavam numeração de setores linear e setores variáveis por faixa). Com discos maiores e arquivos maiores também, leituras fragmentadas viraram mais um problema. Para enfrentar isso, o BSD primeiramente aumentou o tamanho do bloco para sistema de arquivos de um setor para 1k no BSD4.0, e, no FFS, aumentou o bloco de sistema de arquivos de 1k para 8k. Isso trouxe diversos efeitos. As chances de um arquivo ficar em setores vizinhos ficaram maiores. O montante de sobrecarga para listar os blocos de arquivos foi reduzido. O número de blocos representáveis em um número de blocos de tamanho fixo aumentou (permitindo discos maiores ainda).
Com blocos maiores, os discos que possuíam muitos arquivos pequenos poderiam desperdiçar um monte de espaço, então o BSD adicionou a fragmentação a nível de bloco (também chamada subalocação de blocos, na qual o último bloco parcial de dados de vários arquivos devia ser armazenado em um único bloco de fragmento, ao invés de múltiplos blocos quase vazios (Allen 2005).

## Implementações

Fornecedores de algumas versões comerciais do Unix adotaram o UFS, tais como Solaris, System V, HP-UX e Tru64 UNIX. A maioria adaptou o UFS para seus usos, adicionando extensões proprietárias que não podiam ser reconhecidas por versões de Unix de outros fornecedores. Por surpresa, muitos continuaram a usar o tamanho de bloco e tamanho de campo do UFS original. Assim, certo nível de compactibilidade, ao menos de leitura, permanece entre as plataformas. Compactibilidade entre implementações
Quando do surgimento do Solaris 7, Sun Microsystems incluiu no UFS Logging (registro de dados), o qual possibilitou o uso da técnica de Journaling no sistemas de arquivos UFS. O UFS do Solaris também tem extensões para arquivos longos e discos grandes, bem como outras características.
O Linux inclui uma implementação do UFS para manter compactibilidade ao nível de leitura com outros Unix. Como não há implementação padrão para os fornecedores de extensões UFS, o Linux não possui suporte completo para a escrita UFS. O sistema de arquivos nativo anterior do linux ext2 foi inspirado no UFS. Na verdade, em alguns sistemas derivados do BSD4.4 a camada UFS é possível usar uma camada ext2 como uma camada contâiner, assim como se faz com as camadas FFS e LFS.
O NeXTStep, que foi um derivado BSD, também usou uma versão do UFS. No Mac OS X da Apple Inc., o UFS está disponível como uma alternativa ao HFS Plus, seu sistema de arquivos proprietário. No entanto, quando do surgimento do Mac OS X v10.5, não se pode instalar Mac OS X "Leopard" em um volume formatado em UFS. Além disso, não se pode fazer upgrade de versões antigas do Mac OS X instaladas em volumes UFS para Leopard. Para atualizar para a versão Leopard é necessário reformatar todo o volume .