# Unix File System

Unix File System (UFS) és un sistema d'arxius utilitzat per diversos sistemes operatius UNIX i POSIX. És un descendent llunyà del sistema de fitxers original utilitzat per la versió 7 d'Unix.

## Disseny

Un volum UFS es compon de les parts següents:
* Uns quants blocs al començament de la partició reservats per als blocs d'arrencada (que s'han d'inicialitzar per separat del sistema de fitxers)
* Una superilla, que conté un número màgic que l'identifica com un sistema de fitxers UFS, i alguns altres números vitals que descriuen la geometria i les estadístiques d'aquest sistema de fitxers i els paràmetres d'ajust del comportament.
* Col·lecció de grups de cilindres. Cada grup de cilindres té els components següents:
** Una còpia de seguretat del superbloc
** Una capçalera de grup de cilindres, amb estadístiques, llistes lliures, etc., sobre aquest grup de cilindres, semblant a les de la superilla
** Un nombre d’inodes, cadascun dels quals conté atributs de fitxer
** Una sèrie de blocs de dades
Els inodes es numeren seqüencialment, començant per 0. L'inode 0 es reserva per a les entrades de directoris no assignades, l'inode 1 era l'inode del fitxer de blocs dolents en versions històriques d'UNIX, seguit de l'inode per al directori arrel, que sempre és l'inode 2 i l'inode per al directori perdut+trobat que és l'inode. 3.
Els fitxers de directori només contenen la llista de noms de fitxers del directori i l'inode associat a cada fitxer. Totes les metadades del fitxer es guarden a l'inode.
Els primers sistemes de fitxers Unix s'anomenaven simplement FS. FS només incloïa el bloc d'arrencada, el superbloc, un grup d’inodes i els blocs de dades. Això va funcionar bé per als discs petits per als quals es van dissenyar els primers Unix, però a mesura que la tecnologia va avançar i els discos es van fer més grans, moure el cap cap endavant i cap enrere entre el grup d'inodes i els blocs de dades als quals es referien va provocar una batuda. Marshall Kirk McKusick, aleshores estudiant de postgrau a Berkeley, va optimitzar el disseny V7 FS per crear el FFS (Fast File System) de BSD 4.2 inventant grups de cilindres, que divideixen el disc en trossos més petits, amb cada grup amb els seus propis inodes i blocs de dades.
La intenció de BSD FFS és intentar localitzar blocs de dades i metadades associats al mateix grup de cilindres i, idealment, tots els continguts d'un directori (tant dades com metadades per a tots els fitxers) al mateix grup de cilindres o propers, per tant reduir la fragmentació causada per la dispersió del contingut d'un directori per tot un disc.
Alguns dels paràmetres de rendiment del superbloc incloïen el nombre de pistes i sectors, la velocitat de rotació del disc, la velocitat del capçal i l'alineació dels sectors entre pistes. En un sistema totalment optimitzat, el cap es podria moure entre pistes properes per llegir sectors dispersos de pistes alternes mentre s'espera que el plat giri.
A mesura que els discs es feien més i més grans, l'optimització a nivell de sector es va tornar obsoleta (especialment amb els discos que utilitzaven la numeració de sectors lineals i els sectors variables per pista). Amb discs més grans i fitxers més grans, les lectures fragmentades es van convertir en un problema més gran. Per combatre-ho, BSD va augmentar originalment la mida del bloc del sistema de fitxers d'un sector a 1 K en 4,0 BSD; i, a FFS, va augmentar la mida del bloc del sistema de fitxers d'1 K a 8 K. Això té diversos efectes. La possibilitat que els sectors d'un fitxer siguin contigus és molt més gran. La quantitat de sobrecàrrega per llistar els blocs del fitxer es redueix, mentre que s'augmenta el nombre de bytes representables per un nombre determinat de blocs.
També són possibles mides de disc més grans, ja que el nombre màxim de blocs està limitat per un nombre de bloc d'amplada de bits fix. Tanmateix, amb mides de blocs més grans, els discs amb molts fitxers petits perdran espai, ja que cada fitxer ha d'ocupar almenys un bloc. Per això, BSD va afegir una fragmentació a nivell de bloc, també anomenada subassignació de blocs, fusió de cua o empaquetament de cua, on l'últim bloc parcial de dades de diversos fitxers es pot emmagatzemar en un únic bloc de "fragment" en lloc de diversos blocs majoritàriament buits.
El treball sobre Berkeley FFS va ser àmpliament adoptat per altres venedors d'Unix, i la família de sistemes de fitxers que se'n deriven es coneixen col·lectivament com UFS.

## Implementacions

Els venedors d'alguns sistemes Unix propietaris, com ara SunOS / Solaris, System V Release 4, HP-UX i Tru64 UNIX, i sistemes derivats Unix oberts com illumos, han adoptat UFS. La majoria d'ells van adaptar UFS als seus propis usos, afegint extensions propietàries que potser no eren reconegudes per les versions d'Unix d'altres venedors. Molts han continuat utilitzant la mida del bloc original i l'amplada del camp de dades com a UFS original, de manera que es manté un cert grau de compatibilitat de lectura entre plataformes. La compatibilitat entre les implementacions en conjunt és irregular en el millor dels casos.
A partir de Solaris 7, Sun Microsystems va incloure UFS Logging, que va portar el registre del sistema de fitxers a UFS, que encara està disponible a les versions actuals de Solaris i illumos. Solaris UFS també té extensions per a fitxers grans i discs grans i altres funcions.
En els sistemes Unix 4.4BSD i BSD derivats d'ell, com ara FreeBSD, NetBSD, OpenBSD i DragonFlyBSD, la implementació d'UFS1 i UFS2 es divideix en dues capes: una capa superior que proporciona l'estructura de directoris i admet metadades (permisos, propietat, etc.) a l'estructura de l'inode i les capes inferiors que proporcionen contenidors de dades implementats com a inodes. Això es va fer per donar suport tant al sistema de fitxers estructurat en registre FFS tradicional com a LFS amb codi compartit per a funcions comunes. La capa superior s'anomena "UFS", i les capes inferiors s'anomenen "FFS" i "LFS". En alguns d'aquests sistemes, el terme "FFS" s'utilitza per a la combinació de la capa inferior FFS i la capa superior UFS, i el terme "LFS" s'utilitza per a la combinació de la capa inferior LFS i la capa superior UFS.
Kirk McKusick va implementar la reassignació de blocs, una tècnica que reordena els blocs del sistema de fitxers just abans de fer les escriptures per reduir la fragmentació i controlar l'envelliment del sistema de fitxers. També va implementar actualitzacions suaus, un mecanisme que manté la coherència del sistema de fitxers sense limitar el rendiment de la manera com ho feia el mode de sincronització tradicional. Això té l'efecte secundari de reduir el requisit de la comprovació del sistema de fitxers després d'una fallada o una fallada d'alimentació. Per superar els problemes restants després d'un error, es va introduir una utilitat fsck de fons.

## Referències

* ↑ “A Fast File System for UNIX”, Universitat de Wisconsin–Madison
* ↑ «Open Sources: Voices from the Open Source Revolution», 29-03-1999.
* ↑ McKusick, K M; Joy, W; Leffler, S; Fabry, R ACM Transactions on Computer Systems, 2, 3, 8-1984, pàg. 181–197. DOI: 10.1145/989.990 [Consulta: 8 abril 2013].
* ↑ Allen, Hervey. «UFS2 and Soft Updates make for a powerful combination». Introduction to FreeBSD, PacNOG I Workshop, Additional Topics. Network Startup Resource Center, 20-06-2005. [Consulta: 8 abril 2013].
* ↑ «UFS Logging». Oracle Documentation. [Consulta: 27 setembre 2022].

## Enllaços externs

* (anglès) Petit FAQ d'UFS2
* (anglès) Eines UFS2 per Linux