Capire ed usare Launchd
Dopo aver parlato di come Mac OS X esegue il bootstrap cerchiamo di addentrarci nei diversi programmi che svolgono un ruolo chiave durante l’avvio del sistema operativo; tra questi launchd ricopre un ruolo molto importante.
Introdotto con l’avvento della quarta incarnazione di OS X, launchd ha lo scopo di affiancare e sostituire diversi altri programmi classici in ambiente Unix: stiamo parlando in particolare di cron, xinetd, mach_init e anche init che per anni e anni e’ stato il primo processo ad essere lanciato durante il boot di sistema.
Ognuno di questi programmi si occupa di preparare il sistema all’utente effettuando la pulizia della cache, controllando il disco ed effettuando dei task periodici.
Tutti questi programmi sono ancora disponibili e supportati all’interno di Mac OS X 10.4, tuttavia launchd ne sta raccogliendo buona parte dell’eredità (cosa che probabilmente raggiungerà il culmine col prossimo major upgrade).
Launchd tra le altre cose si occupa di caricare i cosidetti daemon, ovvero dei programmi che girano tipicamente in background e offrono all’utente i piu’ disparati servizi software. Come abbiamo gia’ detto launchd ha preso il posto di init diventando cosi’ il processo con PID 1 in OS X; la prima operazione di launchd e’ quella di listare il contenuto di due particolari tipi di directory: le cartelle LaunchDaemons che contengono i programmi da eseguire come utente root (in questi casi si tratta generalmente di processi in background); ci sono poi le LaunchAgents che contengono le cosidette Agents Applications (eseguite in modalita’ utente). Questi programmi possono essere scripts, oppure applicazioni con o senza interfaccia. Tutte queste directory sono disponibili nella cartella /Library di Mac OS X.
Launchd e’ molto diverso da SystemStarter poiché esso non lancia tutti i processi durante il boot. La differenza principale di launchd sta proprio nel fatto di eseguire un daemons soltanto quando questo viene effettivamente richiesto (la stessa tecnica e’ usata anche da un altro agente; xinetd). Quando launchd esegue la scansione dei diversi job (si tratta di file plist come vedremo in dettaglia piu’ avanti nel corso dell’articolo) si occupa di restare in ascolto per eventuali richieste dei servizi possibili. La chiave “OnDemand” contenuta in ogni plist che descrive un deamon permette appunto di effettuare l’esecuzione dell’agente soltanto quando un processo o lo stesso utente ne ha effettivamente bisogno, in modo tale da risparmiare risorse.
Inoltre launchd fa anche di meglio: “ascolta il processo” e verifica che esso sia effettivamente utilizzato, in caso contrario si occupa anche di terminarlo.
Questa e’ sicuramente la ragione principale per cui il boot di Tiger e’ decisamente veloce rispetto ad altre versioni e ad altri sistemi operativi. Mac OS X non fa altro che registrare i deamons disponibili senza lanciarli. In effetti la barra di progresso e’ piu’ un effetto scenico che altro; la cosa si fa molto evidente soprattutto in hardware recente che stenta a farla vedere (ed e’ anche questo il motivo vero per cui spesso e volentieri la percentuale di progresso non arriva neanche alla fine).
Se sentite quindi la mancanza potete aprire il vostro terminale e digitare:
Launchd offre quindi una interfaccia unica e standardizzata per tutti i programmi che possono essere lanciati all’avvio della macchina. I file di configurazione permettono inoltre di specificare alcune caratteristiche su come deve comportarsi il demone, le risorse a sua disposizioni, eventuali dipendenze e altra roba riguardo la sicurezza del sistema.
E’ possibile lanciare diverse copie di launchd, per lo piu’ utilizzando un account non root. In questo caso launchd offre un ambiente separato dai processi lanciati come root mantenendo i livelli di sicurezza.
Come abbiamo detto launchd utilizza dei file di configurazione di tipo plist (gli stessi file utilizzati da molte applicazioni per gestire le proprie preferenze). E’ quindi necessario creare un file di tipo XML per gestire l’apertura di un demone (sull’ADC e’ disponibile una guida esplicativa su come migrare verso launchd se si hanno script gia’ pronti; la trovate qui).
Esistono almeno due chiavi obbligatorie: quella “Label” che indichera a launchd il riferimento al job scelto, e “ProgramArguments” per gli argomenti che eventualmente il job può accettare al suo avvio. Altre chiavi sono disponibile poi per configurare nel dettaglio il demone: si tratta di “UserName” (per lanciarlo come un altro utente), “inetdCompatibility” (per indicare che il demone si aspetta di essere lanciato come da inetd), “Program” (permette di nominare il path verso l’eseguibile), “LowPriorityIO” (indica al kernel che il processo deve essere eseguito affidandogli bassa priorita’ per quanto riguarda le operazioni di access ai dischi), “Sockets” (permette di indicare se il processo può essere lanciato da remoto).
Per verificare i demoni attualmente caricati e’ possibile utilizzare il comando
Questa lista, é bene ricordare, comprenderà soltanto i processi che sono stati lanciati a livello utente (userland). Attraverso l’aggiunta del comando sudo prima sarà invece possibile listare tutti i demoni root.
Si trattera’ di una lista tipo questa:
Password:
com.apple.dashboard.advisory.fetch
com.apple.KernelEventAgent
com.apple.mDNSResponder
com.apple.nibindd
com.apple.periodic-daily
com.apple.periodic-monthly
com.apple.periodic-weekly
com.apple.portmap
com.apple.syslogd
com.vix.cron
org.samba.nmbd
org.postfix.master
org.xinetd.xinetd
com.apple.cups-lpd
org.samba.smbd
com.openssh.sshd
Caricare un demone manualmente a partire dal suo file di configurazione e’ molto facile:
