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 tipomkext
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 fileInfo.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 variabilesysctl
kern.netboot
sarà impostata su1
nel qual caso), esegue/etc/rc.netboot
con un argomento distart
.
/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
vienerc.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 variabilisysctl
ivi contenute. syslogd
è avviato.- Il file del simbolo Mach è stato creato.
/etc/rc
avviakextd
, 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
enetinfo
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 comeDescription
,Provides
,Requires
,OrderPreference
, avvia / interrompe messaggi, ecc. È possibile eseguireSystemStarter -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