In uno scenario tipico, durante il processo di avvio, gli script di avvio del sistema a livello di esecuzione vengono eseguiti uno per uno.
Un particolare script di avvio a livello di esecuzione non verrà eseguito fino a quando lo script precedente non verrà eseguito completamente. Se un particolare servizio durante l'avvio si blocca per qualche motivo, potrebbe volerci un po' prima che scada e passi allo script di avvio successivo.
L'utilità Startpar viene utilizzata per eseguire più script a livello di esecuzione in parallelo. Questo aiuta ad accelerare il processo di avvio del tuo server.
L'utilità Startpar fa parte del pacchetto sysvinit.
La sintassi generale per startpar è riportata di seguito:
startpar –p par –i iorate –t timeout –T global timeout –a arg prg1 prg2 startpar –p par –I iorate –t timeout –T global timeout –M boot|start|stop
Le seguenti sono le varie opzioni di startpar:
- -p Numero di processi da eseguire in parallelo.
- -i Modifica il fattore di pesatura del blocco di processo. Il valore predefinito è 800.
- -t Timeout per svuotare il buffer di uno script se non si è verificato alcun output.
- -T Timeout globale. Viene utilizzato per svuotare l'output del buffer degli script precedenti.
- -a Argomenti da fornire a tutti gli script.
- -M Passa alla modalità "make" di startpar.
- -P Specifica il livello di esecuzione precedente
- -N Specifica il livello di esecuzione successivo
Quando startpar esegue gli script a livello di esecuzione, l'output degli script viene memorizzato nel buffer per consentire la scrittura controllata nelle strutture di registrazione.
Se altri script vengono eseguiti in parallelo, attende il completamento della registrazione e quindi scrive i dati dal buffer nell'area di registrazione. Le opzioni –t e –T vengono utilizzate per controllare la cancellazione di questi buffer in base al tempo trascorso dall'ultimo output acquisito nel buffer.
Sul mio sistema, ho la seguente versione per startpar:
# startpar -v startpar version 0.54
Il comando Startpar può essere utilizzato in modalità "make" utilizzando l'opzione –M. In questa modalità, startpar utilizza i seguenti file per decidere come eseguire gli script di avvio.
/etc/init.d/.depend.start
/etc/init.d/.depend.stop
/etc/init.d/.depend.boot
Ecco un esempio di file .depend.start:
# cat /etc/init.d/.depend.start TARGETS = halt fbset lvm_wait_merge_snapshot microcode.ctl earlysyslog dbus acpid random purge-kernels reboot network haldaemon boot.clock syslog ford_tso_off Sts splash_early haveged rpcbind multipathd nfs smbfs kbd irq_balancer alsasound mcelog network-remotefs sshd java.binfmt_misc clamd logd gpm ntp single atd clamav-milter canna amavis cups nscd postfix xdm cron smartd INTERACTIVE = kbd ntp single network: dbus haldaemon: dbus acpid syslog: network earlysyslog ford_tso_off: network Sts: network splash_early: syslog haveged: syslog random rpcbind: syslog multipathd: syslog nfs: rpcbind . . . . mcelog: smbfs network-remotefs: smbfs haldaemon
Nella modalità "make", startpar utilizza il file .depend.start per trovare quali servizi dipendenti devono essere avviati per avviare un servizio specifico.
Nell'output precedente, quando startpar viene eseguito con la modalità di avvio utilizzando l'opzione make, gli script dipendenti vengono avviati prima prima che gli script vengano eseguiti in parallelo.
Ecco un esempio di come utilizzare startpar in modalità make durante la sequenza di avvio del sistema,
# startpar -p 4 -t 20 -T 3 -M start -P N -R 2 D-Bus already started. Not starting. Starting acpid done Re-Starting syslog services done Starting service at daemon done Starting sound driver done Starting cupsd done Starting CRON daemon/usr/sbin/cron: can't lock /var/run/cron.pid, otherpid may be 3506: Resource temporarily unavailable startproc: exit status of parent of /usr/sbin/cron: 1 done Starting irqbalance unused HAL already started. Not starting. Starting mcelog... already running done Setting up network interfaces: eth0 device: Intel Corporation 82545EM Gigabit Ethernet Co eth0 IP address: 19.86.xxx.xxx/24 done eth1 device: Intel Corporation 82545EM Gigabit Ethernet Co eth1 IP address: 19.86.xxx.xxx/24 done Setting up service network . . . . . . . . . . done Hint: you may set mandatory devices in /etc/sysconfig/network/config Setting up (remotefs) network interfaces: Setting up service (remotefs) network . . . . . . . . . . done Initializing random number generator done Starting smartd unused Disabling TSO on all interfaces and adding ETHTOOL_OPTIONS to nic config files done Re-Starting syslog services done Starting haveged daemon done failed_service="alsasound" skipped_service="irq_balancer smartd"
Nell'esempio sopra, startpar viene eseguito con il numero totale di 4 processi da eseguire in parallelo con un timeout di 20 secondi, timeout globale di 3 secondi per svuotare l'area del buffer, -M in modalità make con l'opzione "start" per indicare che l'avvio è in uso nella sequenza di avvio.
Questo utilizzerà /etc/init.d/.depend. start per verificare gli script che dipendono l'uno dall'altro. –P è il livello di esecuzione precedente –N è il nuovo livello di esecuzione.
Ecco un altro esempio per usare startpar solo per eseguire 2 script in parallelo, puoi anche definire questo script su /etc/init.d/rc per assicurarti che questi script vengano avviati in parallelo durante l'avvio del sistema, se necessario.
# startpar -p 4 -t 20 -T 3 -a start /etc/init.d/ypxfrd /etc/init.d/drbd Starting rpc.ypxfrd done Starting DRBD resources: . .
Anche in alcune distribuzioni Linux, puoi configurare il sistema per utilizzare l'opzione startpar nel file /etc/init.d/rc.
Nel file rc, basta modificare il valore "CONCURRENCY=SHELL" in "CONCURRENCY=STARTPAR", che dovrebbe calcolare le dipendenze automaticamente e avviare gli script applicabili in parallelo.
# vi /etc/init.d/rc CONCURRENCY=STARTPAR