Darwin: il core di macOS. Com’è fatto?

Dopo aver visto le componenti della GUI di macOS, passiamo ad nuovo argomento. Cos’è effettivamente Darwin? Durante lo sviluppo di macOS, gli strati più bassi del sistema operativo, composti dal kernel XNU e dallo strato BSD furono pacchettizati e distribuiti sotto il nome di Darwin con licenza open source: ve ne avevamo già parlato in questo articolo.

Darwin xnu journaling hfs apfs

Sostanzialmente Darwin è un’implementazione Unix a tutti gli effetti (certificata a partire da macOS 10.5 Leopard); questa notizia potrebbe essere nuova per qualcuno, infatti la GUI di macOS nasconde molto bene le classiche directory presenti in un sistema Unix-Like.

La shell

L’accesso all’interprete dei comandi di macOS è davvero semplice: selezionando l’applicazione Terminale, si aprirà un emulatore di terminale con una shell Unix che di default è /bin/bash, anche se macOS fornisce una scelta abbastanza ampia di shell come abbiamo già visto.

Facendo un veloce sunto, perchè usare una shell?

  • Potenza: supponiamo vogliate recuperare un file da un server copiandolo direttamente sul vostro spazio di lavoro: quanto può essere comodo eseguire un comando come scp <sorgente> <destinazione>?
  • Rapidità: è indubbiamente rapido e vantaggioso (non per tutti, me ne rendo conto) scrivere pochi caratteri da tastiera per eseguire operazioni complesse: se voleste creare una chiavetta bootable, semplicemente potreste usare il comando dd if=<pendrive> of=<file.iso>.
  • Accessibilità: come sopra, usare una shell è il metodo più veloce per accedere ad un sistema remoto.

Se su macOS è così semplice ed intuitivo, su iOS la situazione è capovolta: la shell è disabilitata e ovviamente di connessione SSH neanche a parlarne! Potete eseguire un test provando a collegarvi tramite SSH al vostro dispositivo con a bordo iOS, usando l’ip interno..ricevereste un bel connection refused! Solo i dispositivi jailbroken hanno questa possibilità.

Il file system

Per anni, prima dell’introduzione del nuovo file system da parte di Apple, macOS utilizzava Hierarchical File System Plus (HFS+), successore di un vecchissimo file system.

HFS+ è disponibile in varie forme:

  • Case sensitive/insensitive: è da premettere che HFS+ è sempre un file system di tipo case preserving (cioè, se creiamo un file di testo chiamato Prova.txt, allora il file system preserverà questo nome, non apparirà mai come PROVA.txt o prova.txt) ma può essere sensibile alla distinzione tra maiuscole e minuscole; nella forma case sensitive, HFS+ cambia nome e si trasforma in HFSX. La particolarità è che venne introdotto in macOS e poi dismesso successivamente, mentre fu lo standard (prima dell’introduzione di APFS) in iOS.
  • Journaling: HFS+ può facoltativamente impiegare un journal, ed in questo caso viene comunemente chiamato JHFS (o JHFSX). Il journaling è una tecnica utilizzata da molti al file system per preservare l’integrità dei dati in situazioni impreviste, come un forte calo di tensione che potrebbe corrompere i dati. Per farla breve e spiegarla a grandi linee è come se si avesse all’interno del file System una sorta di registro nel quale vengono annotati i cambiamenti che vengono fatti a file e relativi metadata. In questo modo il filesystem ha comunque tutte le informazioni necessarie per riparare i disallineamenti che potrebbero verificarsi.

I file system HFS hanno delle caratteristiche uniche, come gli attributi estesi e la compressione trasparente, che discuteremo in modo più approfondito in seguito. A livello di codice, tuttavia, le interfacce per i file system HFS+ e HFSX sono identiche a quelle degli altri file system: le API che il kernel espone vengono fornite attraverso uno strato chiamato Virtual File System (VFS) che è un’interfaccia uniforme per tutti i tipi di file system.

Sia HFS+ che HFSX offrono all’utente l’esperienza standard di un file system Unix: autorizzazioni, collegamenti e proprietà dei file sono esattamente le stesse di un comune sistema Unix, motivo per cui all’interno della shell di macOS potete eseguire gli stessi comandi che usate, ad esempio, su Ubuntu!

macOS (come in un traduzionale sistema Unix) funziona con le directory standard:

  • /bin: contiene i comandi Unix di uso comuni (come ad esempio, ls, rm, mv).
  • /sbin: contiene i binari di sistema utilizzati per l’amministrazione del sistema, come per la gestione del file system, la configurazione della rete e così via.
  • /usr: è una directory nella quale è possibile installare software di terze parti. Ma non solo: ad esempio il percorso /usr/lib è usato per oggetti condivisi (come le dll in Windows).
  • /etc: è una directory contenente la maggior parte dei file di configurazione del sistema.
  • /dev: contiene file speciali che rappresentano dispositivi hardware sul sistema.
  • /tmp: è una directory temporanea con collegamento simbolico a /private/tmp.
  • /var: è directory per i file di registro, archivi di posta, spool di stampa e altri dati.

E ne aggiunge a sua volta di nuove:

  • /Applications: cartella famosissima, dove risiedono le varie app all’interno del sistema
  • /Developer: è una cartella presente solo nel caso in cui XCode è installato: è il punto di installazione per tutti i tool da developer.
  • /Library: è un insieme di file di dati, guide, documentazioni e così via, utili per le applicazioni di sistema.
  • /Network: directory per la gestione della rete.
  • /System: usata per i file di sistema. E’ importantissima: contiene solo una subdirectory Library, ma questa directory possiede al suo interno praticamente tutti i componenti principali del sistema, come i framework (/System/Library/Frameworks), i moduli del kernel (/System/Library/Extensions), i font e così via.
  • /Users: è la directory base per ogni utente ed ogni utente ha la sua cartella Home personalizzata all’interno.
  • /Volumes: è una cartella che funziona come punto di mount per i dispositivi rimovibili.

Focus su iOS

Dal punto di vista del file system, iOS è molto simile a macOS, anche se possiede alcune differenze strutturali, le principali sono:

  1. Il file system (HFSX) fa distinzione tra maiuscole e minuscole (a differenza di HFS+, che è case preserving, ma insensitive)
  2. Il kernel è preconfezionato con le sue estensioni nella kernelcache (è un insieme di kernel prelinkati che macOS mantiene salvati per garantire che delle modifiche non danneggino il sistema): a differenza di macOS le cui kernelcache sono immagini compresse, in iOS sono crittografate in img3.
  3. Non c’è /Users, ma a /User – che è un collegamento simbolico a /var/mobile.
  4. Non esiste la cartella /Volumes. (e non ce n’è bisogno, dato che in iOS non si ha modo di aggiungere altro spazio di archiviazione)

Anche per questo articolo è tutto!

Se avete domande, curiosità o semplicemente volete lasciare un feedback potete farlo commentando qui in basso, a presto!

HotAcquista iPhone 15 su Amazon!
Approfondimenti