Linux Stivaletti

A quanto pare, non c'è molto per il processo di avvio:

1. Un boot loader trova l'immagine del kernel sul file disk, lo carica in memoria e lo avvia.
2. Il kernel inizializzare i dispositivi ei driver STI.
3. Il kernel monta il file rootsystem.
4. Il kernel inizia init Chiamato da pianificare.
5. init imposta il resto dei processi in movimento.
6. Gli ultimi processi che avvia init come parte della sequenza di avvio consentono di effettuare l'accesso.

Identificare ogni fase del processo di avvio è inestimabile per risolvere i problemi di avvio e comprendere il file system nel complesso. Per iniziare, concentrati sul boot loader, che è la schermata iniziale o il prompt che ricevi dopo che il computer ha eseguito il test automatico all'accensione, chiedendo quale system correre. Dopo aver effettuato una scelta, il caricatore di avvio esegue il file Linux kernel, passando il controllo del system al kernel.

C'è una discussione dettagliata del kernel Altrove in questo libro da cui è tratto questo articolo. Questo articolo riguarda il inizializzazione del kernel fase, la fase in cui il kernel stampa una serie di messaggi sull'hardware presente in system. Il kernel avvia init subito dopo aver visualizzato un messaggio che proclama che il kernel ha montato il file root filesystem:

VFS: Mounted root (file ext2system) sola lettura.

Subito dopo, vedrai un messaggio sull'avvio di init, seguito da system messaggi di avvio del servizio e, infine, viene visualizzato un prompt di accesso di qualche tipo.

NOTA Su Red Hat Linux, la nota init è particolarmente ovvia, perché ti dà il benvenuto in Red Hat Linux. ” Tutti i messaggi successivi mostrano il successo o il fallimento tra parentesi sul lato destro dello schermo.

La maggior parte di questo capitolo si occupa di init, perché è la parte della sequenza di boot dove si ha il maggior controllo.
init

Non c'è niente di speciale in init. È un programma come tutti gli altri sul Linux system, e lo troverai in / sbin insieme ad altri system binari. Lo scopo principale di init è avviare e arrestare altri programmi in una sequenza particolare. Tutto quello che devi sapere è come funziona questa sequenza.

Ci sono alcune varianti diverse, ma la maggior parte Linux le distribuzioni usano il System Stile V discusso qui. Alcune distribuzioni usano una versione più semplice che assomiglia all'init BSD, ma è improbabile che tu lo incontri.

Runlevel

In qualsiasi momento su a Linux system, è in esecuzione un determinato insieme di processi di base. Questo stato di machine è chiamato runlevel ed è indicato con un numero compreso tra 0 e 6. Il system trascorre la maggior parte del tempo in un unico runlevel. Tuttavia, quando chiudi il file machine down, init passa a un runlevel diverso per terminare il file system services in modo ordinato e per dire al kernel di fermarsi. Ancora un altro runlevel è per utente singolo mode, discusso in seguito.

Il modo più semplice per ottenere un controllo sui runlevel è esaminare il file di configurazione di init, /etc/inittab. Cerca una riga come la seguente:

ID: 5: initdefault:

Questa riga significa che il file default runlevel su system è 5. Tutte le righe nel file inittab assumono questa forma, con quattro campi separati da due punti che si presentano nel seguente ordine:
# Un identificatore univoco (una breve stringa, come ID nell'esempio precedente)
# Il numero di runlevel del caso (s)
# L'azione che init dovrebbe intraprendere (nell'esempio precedente, l'azione è impostare il file default runlevel a 5)
# Un comando da eseguire (opzionale)

Non c'è alcun comando da eseguire nell'init precedentedefault esempio perché un comando non ha senso nel contesto dell'impostazione di default runlevel. Guarda un po 'più in basso in inittab, finché non vedi una riga come questa:

l5: 5: attendere :/ etc / rc.d / rc 5

Questa linea attiva la maggior parte dei file system configurazione e servizi tramite le directory rc * .d e init.d. Puoi vedere che init è impostato per eseguire un comando chiamato /etc/rc.d/rc 5 quando si trova nel runlevel 5. L'azione wait dice quando e come init esegue il comando: esegui rc 5 una volta quando entering runlevel 5, quindi attendi il completamento di questo comando prima di eseguire qualsiasi altra operazione.

Ci sono diverse azioni in addione per iniziaredefault e aspetta, specialmente riguardo al risparmio energetico, e la pagina di manuale inittab (5) ti dice tutto su di loro. Quelle che è più probabile incontrare sono spiegate nelle sezioni seguenti.

respawn

L'azione respawn fa sì che init esegua il comando che segue e, se il comando termina l'esecuzione, lo esegua nuovamente. Probabilmente vedrai qualcosa di simile a questa riga nel tuo file inittab:

1: 2345: respawn :/ sbin / mingetty tty1

I programmi getty Fornire prompt di login. La linea precedente è per la prima console virtuale (/ dev / tty1), quella che si vede quando si preme ALT o CTRL-ALT-F1 F1. L'azione respawn riporta il prompt di login dopo l'uscita.

ctrlAltDel

I ctrlL'azione altdel controlla cosa il file system fa quando si preme CTRL-ALT-CANC su una console virtuale. Sulla maggior parte systems, questa è una sorta di comando di riavvio che utilizza il comando shutdown.

sysinit

L'azione sysinit è la prima cosa che init dovrebbe eseguire all'avvio, prima enterin tutti i runlevel.

Come Processi in runlevel avvia

Ora sei pronto per imparare come avviare il file system servizi, subito prima che ti consenta di accedere. Ricorda questa riga inittab di prima:

l5: 5: attendere :/ etc / rc.d / rc 5

Questa linea piccolo innesca molti altri programmi. rc sta per ordini di marcia, e si sente la gente si riferisce ai comandi, script, programmi o servizi. Allora, dove sono questi comandi, in ogni caso?

Per il runlevel 5, in questo esempio, i comandi sono probabilmente in /etc/rc.d/rc5.d o /etc/rc5.d. Il runlevel 1 usa rc1.d, il runlevel 2 usa rc2.d e così via. Potresti trovare quanto segue items nella directory rc5.d:

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
S20logoutdS89cron

Il rc 5 comando avvia i programmi in questa directory di runlevel eseguendo i seguenti comandi:

S10sysklogd casa
S12kerneld casa
S15netstd_init casa
S18netbase casa
...
S99sshd casa

Notare l'argomento iniziale in ciascun comando. La S in un nome di comando significa che il comando dovrebbe essere eseguito all'inizio mode, e il numero (da 00 a 99) determina dove nella sequenza rc inizia il comando.

Il * rc. Comandi D è di solito avviare programmi che gli script di shell in / sbin o / usr / sbin. In genere, si può capire ciò che uno dei comandi effettivamente si, cercando in script con meno o cercapersone Un altro programma.

Puoi avviare manualmente uno di questi servizi. Ad esempio, se si desidera avviare manualmente il programma del server Web httpd, eseguire S99httpd start. Allo stesso modo, se hai mai bisogno di uccidere uno dei servizi quando il file machine è attivo, puoi eseguire il comando nella directory rc * .d con l'argomento stop (S99httpd stop, per esempio).

Alcune directory rc*.d contengono comandi che iniziano con K (per "kill" o stop mode). In questo caso, rc esegue il comando con l'argomento stop invece di start. È molto probabile che incontri comandi K nei runlevel che chiudono il file system giù.

Adding e rimozione di servizi

Se desideri add, eliminare o modificare i servizi nelle directory rc*.d, è necessario dare un'occhiata più da vicino ai file all'interno. Un lungo elenco rivela una struttura come questa:

lrwxrwxrwx. . . S10sysklogd -> .. / init.d / sysklogd
lrwxrwxrwx. . . S12kerneld -> .. / init.d / kerneld
lrwxrwxrwx. . . S15netstd_init -> .. / init.d / netstd_init
lrwxrwxrwx. . . S18netbase -> .. / init.d / netbase
...

I comandi in una directory rc*.d sono in realtà collegamenti simbolici ai file in una directory init.d, solitamente in /etc o /etc/rc.d. Linux le distribuzioni contengono questi collegamenti in modo che possano utilizzare gli stessi script di avvio per tutti i runlevel. Questa convenzione non è affatto un requisito, ma spesso rende l'organizzazione un po' più semplice.

Per evitare che uno dei comandi nella directory init.d venga eseguito in un particolare runlevel, potresti pensare di rimuovere il collegamento simbolico nella directory rc * .d appropriata. Funziona, ma se commetti un errore e hai bisogno di rimettere a posto il collegamento, potresti avere problemi a ricordare il nome esatto del collegamento. Pertanto, non dovresti rimuovere i collegamenti nelle directory rc * .d, ma piuttosto, add un carattere di sottolineatura (_) all'inizio del nome del collegamento in questo modo:

mv S99httpd _S99httpd

Al momento dell'avvio, rc ignora _S99httpd perché non inizia con S o K. Inoltre, il nome originale è ancora ovvio e hai un rapido accesso al comando se sei in difficoltà e devi avviarlo manualmente.

A add un servizio, è necessario creare uno script come gli altri nella directory init.d e quindi creare un collegamento simbolico nella directory rc * .d corretta. Il modo più semplice per scrivere uno script è esaminare gli script già presenti in init.d, fare una copia di uno che si comprende e modificare la copia.

Quando adding un servizio, assicurati di scegliere un punto appropriato nella sequenza di avvio per avviare il servizio. Se il servizio si avvia troppo presto, potrebbe non funzionare a causa di una dipendenza da un altro servizio. Per i servizi non essenziali, la maggior parte systems administratorPreferiscono i numeri negli anni '90, dopo la maggior parte dei servizi forniti con il system.

Linux le distribuzioni di solito vengono fornite con un comando per abilitare e disabilitare i servizi nelle directory rc * .d. Ad esempio, in Debian, il comando è update-rc.d e in Red Hat Linux, il comando è chkconfig. Sono disponibili anche interfacce utente grafiche. L'uso di questi programmi aiuta a mantenere coerenti le directory di avvio e aiuta con gli aggiornamenti.

SUGGERIMENTO: Uno dei più comuni Linux installation è un server XFree86 configurato in modo errato che si accende e si spegne, rendendo system inutilizzabile su console. Per interrompere questo comportamento, avvia in single-user mode e modificare il runlevel o i servizi runlevel. Cerca qualcosa che contenga xdm, gdm o kdm nelle tue directory rc*.d, o nel tuo /etc/inittab.

Controllo init

Occasionalmente, è necessario dare un piccolo calcio a init per dirgli di cambiare runlevel, di rileggere il file inittab o semplicemente di shut down , il system. Perché init è sempre il primo processo su un file system, il suo ID processo è sempre 1.

È possibile controllare init con sedano. Ad esempio, se si desidera passare a runlevel 3, utilizzare questo comando:

telinit 3

Quando si cambia runlevel, init tenta di terminare tutti i processi che non sono nel file inittab per il nuovo runlevel. Pertanto, dovresti stare attento a cambiare i runlevel.

Quando è necessario add o rimuovi lavori di respawn o apporti qualsiasi altra modifica al file inittab, devi informare init della modifica e fargli rileggere il file. Alcune persone usano kill -HUP 1 per dire a init di farlo. Questo metodo tradizionale funziona sulla maggior parte delle versioni di Unix, purché lo digiti correttamente. Tuttavia, puoi anche eseguire questo comando telinit:

telinit q

Puoi anche usare telinit s per passare a utente singolo mode.

spegnimento

init controlla anche come il file system si spegne e si riavvia. Il modo corretto per shut down a Linux machine consiste nell'usare il comando shutdown.

Esistono due modi di base per utilizzare l'arresto. Se interrompi il file system, chiude il macabbassa e lo tiene basso. Per rendere il file machine halt immediatamente, usa questo comando:

shutdown-h now

Nella maggior parte dei casi modern machines con versioni ragionevolmente recenti di Linux, un arresto interrompe l'alimentazione al machine. Puoi anche riavviare il file machine. Per un riavvio, usa -r invece di -h.

Il processo di spegnimento richiede diversi secondi. Non si dovrebbe mai resettare o spegnere un file machine durante questa fase.

Nell'esempio precedente, ora è il momento di shut down. Questo argomento è obbligatorio, ma ci sono molti modi per specificarlo. Se vuoi il file macPer diminuire in futuro, un modo consiste nell'usare + n, dove n è il numero di minuti che lo spegnimento deve attendere prima di eseguire il proprio lavoro. Per altro options, guarda la pagina di manuale di spegnimento (8).

Per rendere system riavvia tra 10 minuti, esegui questo comando:

shutdown-r + 10

On Linux, lo spegnimento notifica a chiunque abbia effettuato l'accesso che il file machine sta andando giù, ma fa poco lavoro reale. Se specifichi un'ora diversa da adesso, shutdown crea un file chiamato /etc/nologin. Quando questo file è presente, il file system proibisce l'accesso da parte di chiunque tranne il superutente.

Quando system finalmente arriva il momento dello spegnimento, shutdown dice a init di passare al runlevel 0 per un arresto e al runlevel 6 per un riavvio. Quando init enters runlevel 0 o 6, si verifica tutto quanto segue, che è possibile verificare guardando gli script all'interno di rc0.d e rc6.d:

1. init uccide ogni processo che può (come sarebbe Quando si passa a qualsiasi altro runlevel).

# I comandi iniziali rc0.d / rc6.d vengono eseguiti in blocco system file in posizione e fare altri preparativi per l'arresto.
# I successivi comandi rc0.d/rc6.d smontano tutti i filesystems diverso dalla radice.
# Ulteriori comandi rc0.d/rc6.d rimontano il file rootsystem di sola lettura.
# Ancora più comandi rc0.d/rc6.d scrivono tutti i dati bufferizzati nel filesystem con il programma di sincronizzazione.
# Gli ultimi rc0.d / rc6.d comandi dicono al kernel di riavviare o arrestare con il riavvio, halt, poweroff o programma.

I programmi di riavvio e arresto si comportano in modo diverso per ogni runlevel, causando potenzialmente confusione. di default, questi programmi chiamano lo spegnimento con -r o -h options, ma se il file system è già al runlevel di arresto o riavvio, i programmi dicono al kernel di spegnersi immediatamente. Se vuoi davvero chiudere il tuo file machine down in fretta (ignorando ogni possibile danno da uno spegnimento disordinato), usa l'opzione -f.

Appassionato di tecnologia, scrivo con piacere su StealthSettings.com dal 2006. Ho un'ampia esperienza nei sistemi operativi: macOS, Windows e Linux, nonché nei linguaggi di programmazione e nelle piattaforme di blogging (WordPress) e per i negozi online (WooCommerce, Magento, PrestaShop).

Lascia un tuo commento