Cosa succede nel processo di avvio di Mac OS X?

Sono lontani i tempi dell'OS 9, guardando i nostri Mac che si avviano con una serie di estensioni e pannelli di controllo che potremmo sempre identificare. Oggi, con le basi Unix di OS X, molti utenti sono completamente inconsapevoli di ciò che accade dietro le quinte. Quindi, cosa succede esattamente durante il processo di avvio di Mac OS X? Un segmento di KernelThread elenca attentamente la sequenza di eventi, dall'inizio alla fine. È abbastanza completo e merita una lettura. Viene ripetuto di seguito per gli utenti curiosi di Mac OS X là fuori.


Nota: come indicato da un lettore, PPC utilizza OF, i386 utilizza EFI

Accendi il tuo Mac e questo è ciò che accade:

  • L'alimentazione è accesa.
  • Il codice OF o EFI è eseguito.
  • Le informazioni sull'hardware vengono raccolte e l'hardware viene inizializzato.
  • Qualcosa (di solito il sistema operativo, ma anche cose come l'Apple Hardware Test, ecc.) È selezionato per l'avvio. All'utente potrebbe essere richiesto di selezionare cosa avviare.
  • Il controllo passa a /System/Library/CoreServices/BootX, il caricatore di avvio. BootX carica il kernel e disegna anche i badge del sistema operativo, se presenti.
  • BootX tenta di caricare un elenco di driver di periferica precedentemente memorizzato nella cache (creato / aggiornato da /usr/sbin/kextcache ). Tale cache è di tipo mkext e contiene i dizionari di informazioni e file binari per più estensioni del kernel. Si noti che se la cache mkext è corrotta o mancante, BootX cercherà in /System/Library/Extensions per le estensioni necessarie nello scenario corrente (come determinato dal valore della proprietà OSBundleRequired nel file Info.plist del pacchetto dell'estensione .
  • La routine init del kernel viene eseguita. Il dispositivo di root del sistema di avvio è determinato. A questo punto, il Firmware non è più accessibile.
  • Varie strutture di dati Mach / BSD sono inizializzate dal kernel.
  • Il kit I / O è inizializzato.
  • Il kernel avvia /sbin/mach_init, il daemon di denominazione del servizio Mach (bootstrap). mach_init mantiene i mapping tra i nomi dei servizi e le porte Mach che forniscono accesso a tali servizi.

Da qui in poi, l'avvio diventa a livello di utente:

  • mach_init avvia /sbin/init, il processo di avvio BSD tradizionale. init determina il runlevel ed esegue /etc/rc.boot, che imposta la macchina abbastanza per eseguire un singolo utente.

Durante la sua esecuzione, rc.boot e gli altri script rc source /etc/rc.common, uno script di shell contenente funzioni di utilità, come CheckForNetwork() (controlla se la rete è GetPID() ), GetPID(), purgedir() (elimina solo il contenuto della directory, non la struttura), ecc.

  • rc.boot calcola il tipo di avvio (multiutente, sicuro, CD-ROM, rete ecc.). In caso di avvio di rete (la variabile sysctl kern.netboot sarà impostata su 1 nel qual caso), esegue /etc/rc.netboot con un argomento di start .

/etc/rc.netboot gestisce vari aspetti dell'avvio della rete. Ad esempio, esegue la rete e (se ce ne sono) supporti locali. Chiama anche /usr/bin/nbst per associare un file shadow con l'immagine del disco utilizzata come dispositivo root. L'idea è di reindirizzare le scritture nel file shadow, che si spera sia nella memoria locale.

  • rc.boot calcola se è richiesto un controllo di coerenza del file system. Gli stivali per utente singolo e CD-ROM non eseguono fsck. SafeBoot esegue sempre fsck. rc.boot gestisce anche lo stato di ritorno di fsck.
  • Se rc.boot viene rc.boot correttamente, /etc/rc, viene quindi eseguito lo script di avvio multiutente. Se si avvia da un CD-ROM, lo script passa a /etc/rc.cdrom (installazione).
  • /etc/rc monta i file system locali (HFS +, HFS, UFS, /dev/fd, /.vol ), assicura che la directory /private/var/tmp esista e avvia /etc/rc.installer_cleanup, se ne esiste uno ( lasciato da un programma di installazione prima del riavvio).
  • /etc/rc.cleanup viene eseguito. "Pulisce" un certo numero di directory / file specifici di Unix e Mac.
  • BootCache è avviato.
  • Sono impostate varie variabili di sysctl (ad esempio per il numero massimo di vnode, IP V del sistema V, ecc.). Se esiste /etc/sysctl.conf (più /etc/sysctl-macosxserver.conf su Mac OS X Server), viene letto e vengono impostate le variabili sysctl ivi contenute.
  • syslogd è avviato.
  • Il file del simbolo Mach è stato creato.
  • /etc/rc avvia kextd, il processo daemon che carica l'estensione del kernel su richiesta dai processi del kernel o del client.
  • /usr/libexec/register_mach_bootstrap_servers viene eseguito per caricare vari servizi basati su bootstrap Mach contenuti in /etc/mach_init.d
  • portmap e netinfo sono iniziati.
  • Se /System/Library/Extensions.mkext è precedente a /System/Library/Extensions, /etc/rc cancella il mkext esistente e ne crea uno nuovo. Ne crea anche uno se uno non esiste.
  • /etc/rc avvia /usr/sbin/update, il daemon che scarica frequentemente le cache del file system interno sul disco.
  • /etc/rc avvia il sistema di memoria virtuale. /private/var/vm è impostato come directory di swap. /sbin/dynamic_pager viene avviato con gli argomenti appropriati (modello del percorso del file di scambio, dimensione dei file di swap creati, trigger di avviso di acqua alta e bassa che specificano quando creare file di scambio aggiuntivi o eliminare quelli esistenti).
  • /etc/rc avvia /usr/libexec/fix_prebinding per correggere i binari di prebound errati.
  • /etc/rc esegue /etc/rc.cleanup per pulire e ripristinare file e dispositivi.
  • /etc/rc avvia finalmente /sbin/SystemStarter per gestire gli elementi di avvio da posizioni come /System/Library/StartupItems e /Library/StartupItems . Un oggetto Startup è un programma, in genere uno script della shell, il cui nome corrisponde al nome della cartella. La cartella contiene un file di elenco di proprietà contenente coppie chiave-valore come Description, Provides, Requires, OrderPreference, avvia / interrompe messaggi, ecc. È possibile eseguire SystemStarter -n -D come utente root per avere il debug di stampa del programma e le informazioni di dipendenza (senza effettivamente eseguire qualsiasi cosa).
  • L'elemento di avvio di CoreGraphics avvia il daemon Apple Type Services ( ATSServer ) e il Window Server ( WindowServer ).

Fonte: KernelThread