Speed up boot slack

Da LugMan TNG.

SlackWare è una distribuzione molto snella ed elegantemente semplice come struttura. A differenza della stragrande maggioranza delle altre distribuzioni, SlakWare è fondamentalmente un sistema BSD-like in cui al termine del bootstrap viene chimato il processo init, ossia il primo processo del sistema. Questo processo in funzione del runlevel chiama uno specifico script contenuto nella directory /etc/rc.d il quale, a sua volta chiama in sequenza altri script presenti, salvo qualche eccezione, in questa directory.

Normalemte ogni a file di questa directory compete lo startup di uno specifico servizio, demone o funzione. I files sono chiamati con rc.[nome_servizio]; per esempio lo script a cui compete l'attivazione del demone SSH si chiama rc.sshd, il quale internamente chiamerà proprio l'eseguibile sshd (dove la 'd' finale sta proprio per demone). se ora si entra in questa directory tramite shell, eseguendo il comando ls --col -al dovrebbero comaprire tutti i files presenti di cui è riportato uno stralcio di seguito:

drwxr-xr-x   2 root root  1152 2006-12-17 12:05 ./
drwxr-xr-x  49 root root  5336 2007-07-07 17:16 ../
lrwxrwxrwx   1 root root     4 2006-04-24 16:14 rc.0 -> rc.6*
-rwxr-xr-x   1 root root   893 2003-01-29 22:43 rc.4*
-rwxr-xr-x   1 root root  5764 2005-08-01 20:12 rc.6*
-rwxr-xr-x   1 root root  1989 2004-06-21 16:04 rc.K*
-rwxr-xr-x   1 root root  8178 2007-03-11 19:35 rc.M*
-rwxr-xr-x   1 root root 10996 2005-08-04 21:29 rc.S*
-rwxr-xr-x   1 root root   466 2004-11-05 09:20 rc.acpid*
-rwxr-xr-x   1 root root  1650 2005-07-22 20:41 rc.alsa*
-rw-r--r--   1 root root  1032 2003-02-02 04:47 rc.atalk
[...]

Tutti i files che appaiono verdi o con l'asterisco finale sono files eseguibili (come si nota dalla stringa dei permessi iniziale in cui compare la x per owner, group e users).
I files che presentano un solo carattere dopo la stringa rc. (identificabili con il comando ls rc.?) sono i files che vengono caricati in funzione del runlevel i quali a loro volta eseguono tutti gli script che gli competono se questi file sono eseguibili. Per fare ciò viene controllata l'eseguibilità come segue:

if [ -x /etc/rc.d/rc.inet1 ]; then
  . /etc/rc.d/rc.inet1
fi

In questo caso viene controllato se lo script che configura l'hardware di rete è eseguibile e se lo è, viene eseguito.

E' chiaro che un primo metodo per velocizzare il boot è rendere non eseguibili gli script. Per fare questo si può dare da root il comando

chmod 644 rc.[nome_servizio]
che imposta i diritti di lettura e scrittura.

Tipicamente viene tolta l'esecuzione agli script che configurano l'hardware che sul computer non è presente come rc.pcmcia su vecchi sistemi che non presentano queso connettore, oppure che configurano servizi che non sono richiesti o che sono stati sostituiti con altri (come spesso si fa con sendmail per esempio); alcuni servizi invece si disabilitano perchè è possibile caricarli con altri metodi, ossia configurando /etc/inetd.conf. Un esempio è SAMBA: andando a decommentare le tre riche relative a questo servizio in /etc/initd.conf

netbios-ssn    stream  tcp     nowait  root    /usr/sbin/smbd  smbd
netbios-ns     dgram   udp     wait    root    /usr/sbin/nmbd  nmbd
#La riga seguente è bene non commentarla anche se si usa rc.samba in modo da attivare il sistema di configurazione via web
swat           stream  tcp     nowait.400 root /usr/sbin/swat  swat

è possibile rendere inattivo rc.samba.

hotplug: esistono però degli script che eseguono alcune funzioni fondamentali, come l'inizializzazione di hotplug o di udev. Il primo di questi in particolare svolge alcune operazioni che possono essere tranquillamente eseguite in parallelo. Quindi una soluzione per accelerare il tutto è porre una & alla fine del comando relativo a hotplug. Hotplug viene chiamato dallo script rc.M al quale occorre apportare la modiffica appena descritta:

if cat /proc/mounts | grep -wq sysfs ; then
  if ! grep -wq nohotplug /proc/cmdline ; then
    if [ -x /etc/rc.d/rc.udev ]; then
      if [ -d /dev/.udev/failed ]; then
       for i in /dev/.udev/failed/*; do
         echo "add" > "${i}/uevent"
       done
      fi
    elif [ -x /etc/rc.d/rc.hotplug ]; then
      . /etc/rc.d/rc.hotplug start &       # <-- Mando il processo in background
    fi
  fi
elif [ -x /etc/rc.d/rc.hotplug -a -w /proc/sys/kernel/hotplug ]; then
  if ! grep -wq nohotplug /proc/cmdline ; then
    . /etc/rc.d/rc.hotplug start &         # <-- Mando il processo in background
  fi
fi

Questo tipo di modifica è applicabile anche ad altri script presenti come rc.pcmcia, chiamato anch'esso in rc.M.

fc-chache: un altro punto in cui vi può essere una notevole perdita di tempo è l'aggiornamento della chache dei fonts, ossia quando viene chiamato il seguente script:

# Update the X font indexes:
if [ -x /usr/X11R6/bin/fc-cache ]; then
  echo "Updating X font indexes:  /usr/X11R6/bin/fc-cache"
  /usr/X11R6/bin/fc-cache &                # <-- Mando il processo in background
fi

e anche in questo caso si può porre il processo in background. Si noti comunque che fc-cache impiega tanto più tempo quanti più font sono presenti nel sistema.

ldconfig: viene chiamato anch'esso in rc.M (tipicamente appena prima di fc-chache) e come di consueto lo si può porre in background.:

# Update all the shared library links:
if [ -x /sbin/ldconfig ]; then
  echo "Updating shared library links:  /sbin/ldconfig"
  /sbin/ldconfig &
fi

Questo comando non fa altro che ricreare tutti i link simbolici alle librerie di sistema. Questo lavoro, oltre che ad essere molto lento, è a mio avviso inutile perchè i link ci sono già e non ha senso aggiornarli se non si installano (o aggioprnano) nuove librerie. Inoltre sia che si compili, sia che si installi un pacchetto .tgz, il comando ldconfig viene sempre chiamato; al più per precauzione è sufficiente che lo lanci l'utente root al termine dell'aggiornamento. Per questo a mio avviso questa istruzione può essere commentata:

# Update all the shared library links:
if [ -x /sbin/ldconfig ]; then
  echo "Updating shared library links:  /sbin/ldconfig -- NON ESEGUITO --"
  #/sbin/ldconfig
fi

Note:

  1. le moditiche qui suggerite sono arbitrarie e non necessarie.
  2. questo tipo di modifiche sono sate testate fino a SlackWare 11 e SlAMD64 11.
  3. quanto riportato è solo frutto dell'esperienza e delle prove fatte.