Rendere il nuovo sistema
autoconfigurabile come una distribuzione Live:
Dopo un po' di reverse
engineering/ricerche ho capito come funziona il boot di Ubuntu:
Alcuni link interessanti che spiegano il funzionamento di initramfs e come usarlo sono:
Qui di seguito riassumo brevemente: all'avvio il boot loader carica il
kernel, il quale controlla la
presenza del
parametro
initrd=
che specifica qual'e' l'
initial
root filesystem.
Se e' presente viene scompattato in RAM e montato come radice del
sistema "/" . A questo punto se il
filesystem in RAM contiene un programma chiamato "/init" il kernel lo
esegue come primo programma.
Fino a qui il comportamento e' il medesimo per tutte le distribuzioni
che
usano il kernel 2.6.X.
Cio' che cambia da distribuzione a distribuzione e' il comportamento
dettato dal file init.
Una prima cosa utile da sapere è che Ubuntu usa la funzione
log_begin_msg per
stampare i messaggi che appaiono durante il boot nella splash screen.
Diversamente da quello che si potrebbe pensare la diversita' tra
l'avvio della versione Live rispetto a quella normale risiede nel
parametro di avvio
boot=casper
il quale, dopo essere analizzato dallo script
init, fa si che
BOOT assuma il
valore "casper" sovrascrivendo il valore di
default "local" ( /conf/initramfs.conf ) in questo modo init carica le
funzioni contenute nel file /scripts/casper al
posto di /scripts/local
file: init
...
boot=*)
BOOT=${x#boot=}
;;
...
. /scripts/${BOOT}
...
Nella splash screen all'avvio appare
|
|
Loading essential drivers...
Mounting root file system... |
| Waiting
for root filesystem... |
Moving
mount points...
Adding
live CD user...
..... |
|
| Preparing restricted drivers... |
Per vedere i messaggi nella Edgy Eft bisogna togliere il parametro del kernel
quiet.
come si puo' notare fino a
Mounting
root file system... il comportamento
è uguale
file: init
...
maybe_break mount
log_begin_msg "Mounting root file system..."
mountroot
log_end_msg
...
Dopo aver stampato il messaggio
Mounting
root file system..., chiama
mountroot , funzione
che è definita sia in /scripts/casper che in
/scripts/local
Quella in casper monta la root / in ram mentre quella in local monta il
filesystem presente su disco.
In modo astratto il compito che svolgono è lo stesso, cambia
però verso la fine dove
file: scripts/local
...
[ "$quiet" != "y" ] &&
log_begin_msg "Running /scripts/local-bottom"
run_scripts /scripts/local-bottom
[ "$quiet" != "y" ] &&
log_end_msg
...
file: scripts/casper
...
maybe_break casper-bottom
[ "$quiet" != "y" ] &&
log_begin_msg "Running /scripts/casper-bottom"
caso Dapper Drake
PATH=/root/usr/bin:/root/usr/sbin:/root/bin:/root/sbin:$PATH
run_scripts /scripts/casper-bottom
caso Edgy Eft
pulsate
run_scripts /scripts/casper-bottom
[ "$quiet" != "y" ] &&
log_end_msg
...
Uno esegue gli script presenti in /scripts/local-bottom e l'altro
quelli in /scripts/casper-bottom
se osserviamo local-bottom è vuoto mentre casper-bottom
contiene tutti gli script che eseguono le
varie autoconfigurazioni. Di questi a noi interessano:
14locales
19keyboard
20xconfig
23etc_modules
23networking
gli altri sono utili solo ad una live.
Una volta eseguito mountroot il flusso di esecuzione torna al file init
il quale verso la fine esegue /sbin/init
file: init
....
export init=/sbin/init
....
exec run-init ${rootmnt} ${init} "$@" <${rootmnt}/dev/console
>${rootmnt}/dev/console
....
/sbin/init fa parte del metodo classico di inizializzazione di Linux
(System V initialization)
per una spiegazione riguardo al suo funzionamento
man init
Questo era vero fino alla Dapper Drake, dalla Edgy Eft il nuovo sistema
di inizializzazione e'
upstart
Upstart is an event-based
replacement for the /sbin/init daemon which handles starting of tasks
and services during boot, stopping them during shutdown and supervising
them while the system is running.
In entrambi i casi comunque il risultato è che vengono
eseguiti gli scripts
presenti sul disco USB in /etc/rcS.d
Da tutta questa analisi ricaviamo che il pacchetto
responsabile di rendere
live Ubuntu e'
casper.
Quindi non dobbiamo far altro che: installare
casper, copiare i file di
interesse in /scripts/casper-bottom, fare qualche modifica a /init e
ricreare l'initram.
Modifiche da apportare a /usr/share/initramfs-tools/init
( vanno aggiunte le parti in grassetto )
....
export debug=
export autoconfigure=
....
for x in $(cat /proc/cmdline); do
.....
debug)
debug=y
exec
>/tmp/initramfs.debug 2>&1
set -x
;;
autoconfigure)
autoconfigure=y
;;
break=*)
break=${x#break=}
;;
.....
if [ "$autoconfigure" = "y" ]
then
readonly=n
fi
.....
mountroot
log_end_msg
if [ "$autoconfigure" = "y" ]
then
maybe_break autoconfigure
[ "$quiet" != "y" ] &&
log_begin_msg "Running /scripts/autoconfigure"
caso Dapper Drake
PATH=/root/usr/bin:/root/usr/sbin:/root/bin:/root/sbin:$PATH
run_scripts /scripts/autoconfigure
caso Edgy Eft
pulsate
run_scripts /scripts/autoconfigure
[ "$quiet" != "y" ] &&
log_end_msg
fi
maybe_break bottom
....
In questo modo quando all'avvio aggiungiamo il parametro
autoconfigure
verà fatta l'autoconfigurazione altrimenti verranno tenute
le
ultime impostazioni
Ora va creata la cartella
/etc/mkinitramfs/scripts/autoconfigure
( caso Dapper Drake )
/etc/initramfs-tools/scripts/autoconfigure
( caso Edgy Eft )
e
al suo interno vanno copiati i file
14locales
19keyboard
20xconfig
23etc_modules
23networking
prendendoli da
/usr/share/initramfs-tools/scripts/casper-bottom/
In fine, per ricreare l'initramfs aggiornato:
user@ubuntu:~$ sudo mkinitramfs -o /boot/initrd.img-`uname -r`
/lib/modules/`uname -r`
Nel caso di boot da floppy/CD avevo gia' previsto una voce in
menu.lst che avvia Ubuntu eseguendo l'autoconfigurazione. Mentre per
l'avvio diretto da USB bisogna modificare il file /boot/grub/menu.lst
ad esempio duplicando la voce dell'ultimo kernel installato, a
cui
va aggiunto il parametro
autoconfigure.
Nel mio caso risulta:
title
Ubuntu, kernel 2.6.15-27-386
root
(hd0,0)
kernel
/boot/vmlinuz-2.6.15-27-386 root=/dev/sda2 ro quiet splash
initrd
/boot/initrd.img-2.6.15-27-386
savedefault
boot
title
Ubuntu, kernel autoconfigure 2.6.15-27-386
root
(hd0,0)
kernel
/boot/vmlinuz-2.6.15-27-386 root=/dev/sda2 ro quiet splash autoconfigure
initrd
/boot/initrd.img-2.6.15-27-386
boot