# HFS Plus

HFS Plus o HFS+ è un file system sviluppato da Apple per sostituire il precedente Hierarchical File System (HFS) come file system primario sui computer Macintosh. Viene inoltre utilizzato come uno dei formati dal riproduttore di musica digitale iPod. HFS Plus è il nome usato dai progettisti, ma nella documentazione ufficiale il formato è denominato Mac OS Extended (Mac OS esteso). Durante la fase di sviluppo, Apple si è spesso riferita al file system col nome in codice Sequoia.
HFS Plus è una versione migliorata di HFS, supporta file più grossi (gli indirizzi dei blocchi sono a 32 bit anziché a 16) ed usa Unicode (invece del Mac OS Roman) per i nomi degli oggetti (file e cartelle). HFS Plus permette di avere nomi di file lunghi fino a 255 caratteri UTF-16 e n-forked file in modo simile al NTFS, anche se praticamente nessun software sfrutta i fork che non siano i data fork ed i resource fork.
HFS Plus usa inoltre una tabella della mappa di allocazione a 32 bit invece di quella a 16 bit di HFS. Questa era una seria limitazione di HFS ed implicava che nessun disco formattato in HFS potesse supportare più di 65.536 (pari a 2$^{16}$) blocchi allocabili. Quando i dischi erano piccoli, ciò non aveva grosse conseguenze, ma, con l'avvicinarsi del traguardo del Gigabyte, significava che il minimo spazio occupabile da un file (un blocco di allocazione) era diventato troppo grande, sprecando una significativa quantità di spazio su disco. Ad esempio: su un disco di 1 GB, la dimensione del blocco di allocazione in HFS era di 16 kB, quindi anche un file di 1 byte avrebbe riservato 16 KB di spazio su disco.
Così come HFS, anche HFS Plus usa i B*-tree per memorizzare la maggior parte dei metadati del disco.

## Storia

HFS Plus fu introdotto con la release di Mac OS 8.1 del 19 gennaio 1998. La sua prima apparizione, come file system in fase beta fu, però, il mai rilasciato sistema operativo Copland.
Con il rilascio dell'aggiornamento di Mac OS X alla versione Mac OS X Jaguar dell'11 novembre 2002, Apple aggiunse le prestazioni di journaling ad HFS Plus per migliorare l'affidabilità dei dati. Tali prestazioni erano facilmente accessibili in macOS Server, ma solo da riga di comando. Con Mac OS X Panther tutti i volumi HFS Plus su tutti i Mac furono posti come journaled per default. Nel sistema tali volumi sono identificati come HFSJ.
Mac OS X 10.3 introdusse anche un'altra versione di HFS Plus chiamata HFSX. I volumi HFSX sono quasi identici a quelli HFS Plus tranne per il fatto che non sono mai circondati dal HFS Wrapper e supportano la sensibilità alle maiuscole per i nomi dei file e delle cartelle. I volumi HFSX possono essere riconosciuti da due indici nella testata del volume, un valore di HX nel campo signature e 5 nel campo versione.
Con Mac OS X Tiger, Apple ha aggiunto il supporto per i record Inline Attribute Data, che avevano fatto parte di HFS Plus sin da Mac OS X Cheetah, ma erano sempre stati contrassegnati come "riservati per usi futuri". Fino alla pubblicazione di Mac OS X Server 10.4, HFS Plus ha supportato il sistema di privilegi standard di Unix, questa versione ha introdotto il supporto per il controllo di sicurezza basato su lista di controllo degli accessi (ACL), progettato per essere pienamente compatibile con il sistema di permessi usato da Windows XP e Windows Server 2003.
Sebbene il formato di HFS Plus consenta capacità quasi illimitate, le varie versioni di Mac OS ne supportano solo un sottoinsieme:
| Sistema operativo | massimo numero di file per cartella | dimensione massima del file | dimensione massima del volume |
| Mac OS 8.1 | $2^{15}$ | 2 GiB | 2 TiB |
| Mac OS 9 | $2^{15}$ | 2 TiB | 2 TiB |
| Mac OS X Cheetah e Mac OS X Puma | $2^{31}$ | 2 TiB | 2 TiB |
| Mac OS X Jaguar | $2^{31}$ | 8 TiB | 8 TiB |
| Mac OS X Panther e Mac OS X Tiger | $2^{31}$ | 16 TiB | 16 TiB |
| Limiti intrinseci | illimitato | 16 EiB | 16 EiB |
Il massimo numero di elementi dentro una cartella è inoltre limitato dalla dimensione massima del volume diviso la dimensione del blocco.

## Caratteristiche

I volumi HFS Plus sono divisi in settori (che in HFS erano chiamati blocchi logici), che sono solitamente dimensionati a 512 byte. Questi settori sono raggruppati in blocchi di allocazione che possono contenere uno o più settori; il numero di blocchi di allocazione dipende dalla dimensione totale del volume. HFS Plus usa un valore maggiore per indirizzare i blocchi di allocazione di quanto non faccia HFS, 32 bit invece di 16; ciò significa che può accedere a 4.294.967.296 ($=2^{32}$) blocchi invece di 65.536 ($=2^{16}$)
Tipicamente un volume HFS Plus è inserito all'interno di un HFS Wrapper, anche se ultimamente questo sta diventando meno frequente. Questa busta è stata pensata per due scopi: consentiva ai Mac che non supportavano HFS Plus a livello di ROM di eseguire il boot di volumi HFS Plus e consentire una transizione degli utenti verso HFS Plus includendo un volume minimale HFS con un file a sola lettura chiamato Where_have_all_my_files_gone? (Dove sono finiti tutti i miei file?), per mostrare agli utenti con versioni di Mac OS precedenti al supporto per HFS Plus che il volume richiede un sistema operativo che lo supporti. Il volume HFS originale contiene un identificatore e lo spiazzamento al volume HFS Plus inserito dentro la sua testata. Tutti i blocchi di allocazione nel volume HFS che contengono volumi HFS Plus sono descritti nella mappa di allocazione di HFS come blocchi danneggiati.
Le strutture che costituiscono un tipico volume HFS Plus sono nove:
* i Boot Block . Sono identici ai boot block di un volume HFS, fanno parte del HFS Wrapper e sono sempre nei settori 0 e 1.
* il Volume Header. È equivalente al Master Directory Block di un volume HFS. Contiene una vasta quantità di informazioni sul volume stesso, ad esempio la dimensione dei blocchi di allocazione, un timestamp che indica quando è stato creato e la posizione di altre strutture del volume come il Catalog File o lExtent Overflow File. Il Volume Header è sempre situato nel settore 2.
* l'Allocation File. Tiene traccia di quali blocchi di allocazione sono liberi e quali in uso. Similmente alla Volume Bitmap di HFS, ogni blocco è rappresentato da un bit, la principale differenza è che l'Allocation File è memorizzato come un file normale e non occupa uno spazio riservato all'inizio del volume, può cambiare di dimensione e non deve essere memorizzato in blocchi contigui nel volume.
* il Catalog File. È un B*-Tree che contiene i record di tutti i file e direttori memorizzati nel volume. Il Catalog File di HFS Plus è molto simile a quello di HFS, la principale differenza sta nel fatto che i record sono molto più grandi (per contenere molti più campi e consentire ai campi di essere a loro volta più grandi (ad esempio, per consentire nomi di file lunghi fino a 255 caratteri Unicode). Un record del Catalog File di HFS è grande 512 byte, mentre in HFS Plus è di 4kB in Mac OS e 8KB in Mac OS X. I campi in HFS hanno lunghezza fissa, mentre in HFS Plus la dimensione è variabile in funzione dell'informazione da memorizzare.
* l'Extents Overflow File. È un B*-Tree che registra i blocchi allocati ad ogni estensione di file. Ogni record nel Catalog File è in grado di registrare otto estensioni per ogni fork di file; una volta che queste sono state usate, le ulteriori estensioni sono registrate nel Extents Overflow File. Vi sono anche registrati i blocchi danneggiati. La dimensione di default di un record di estensione è di 1KB in Mac OS e di 4KB in Mac OS X.
* l'Attributes File. È un B*-Tree che non ha una corrispondente struttura in HFS. l'Attribute File può registrare fino a tre differenti tipi di record di 4 KB: i record Inline Data Attribute (che contengono piccoli attributi che possono essere memorizzati nel record stesso), i record Fork Data Attribute (che contengono riferimenti ad un massimo di otto estensioni che possono contenere attributi più grandi) ed i record Extension Attribute (che vengono usati per estendere i record Fork Data Attribute quando i primi otto sono già stati usati).
* lo Startup File. È progettato per sistemi non Mac OS che non supportano HFS o HFS Plus ed è simile al Boot Block di un volume HFS.
* l'Alternate Volume Header. È equivalente al Alternate Master Directory Block di HFS e si trova sempre nel penultimo settore.
* l'ultimo settore del volume è riservato da Apple e viene usato durante il processo di manifattura del computer.