Boot Copertina Indice

Articoli


Come creare un disco di root

In questo articolo vi descriveró come creare un disco di boot e root. Il disco di boot contiene il kernel e il necessario per eseguire il boot del pc. Non c'è bisogno di avere un boot loader (come lilo) per avviare il pc, ma puó essere usato anche il kernel stesso, se si ha cura di copiarlo all'inizio del boot sector(settore 0 , cilindro 0) con il comando:

cp zImage /dev/fd0

oppure usando il comando dd:

dd if=zImage of=/dev/fd0

Nota: il dischetto non deve essere montato.

L'utilizzo più comune di un disco di boot e di root è per il ripristino di un sistema bloccato o per il test di un nuovo kernel; in questi casi non c'è bisogno di lilo. In questi casi si può dunque usare la procedura descritta qui sopra. Il kernel va configurato in modo che supporti tutto il vostro hardware e il ramdisk. Per fare questo bisogna configurare il kernel prima di compilarlo... ma questa è un'altra storia. L'opzione ramdisk serve per usare la memoria ram come disco di root. È utile perché, oltre a liberare il drive del floppy, il sistema diventa molto più veloce, dato che i file vengono caricati da ram e non da floppy, che è notoriamente lentissimo. Una volta che abbiamo disponibile un kernel configurato e compilato, bisogna settare il ROOT device a /dev/fd0, usando il comando rdev:

rdev zImage /dev/fd0

la stessa cosa si può fare modificando il Makefile del kernel, impostando

ROOT_DEV=device

prima di compilarlo.

Vediamo ora come si crea un disco di root. Il disco di root contiene un filesystem (di tipo MINIX o ext2), che conterrà tutto il necessario per lavorare con un sistema Linux. Per creare un filesystem su un dischetto basta fare:

mkfs.ext2 /dev/fd0 -c

Normalmente, al boot, Linux, dopo aver controllato tutto l'hardware, monta il ROOT_DEV e cerca nelle directory bin, etc e /sbin il programma init e lo esegue. Se non lo trova, cerca di eseguire il programma sh, cercandolo in una delle stesse directory. Dato che quando si usa un disco di root non c'è bisogno di init (che serve per far partire daemon, impostare la data secondo il fuso orario, la tastiera ecc.), possiamo usare la seconda possibilità che ci offre il kernel, e far partire direttamente una shell, usando il link:

ln -sf /bin/shell_preferita /bin/sh

Vediamo ora quali file vanno copiati nel dischetto. Per prima cosa bisogna creare nel dischetto le directory: bin, etc, dev, lib, proc, sbin, usr, mnt. I programmi necessari per ripristinare il sistema (lilo, mkfs, tar, gzip, ftape, mount ecc.) andranno copiati in una delle directory bin o sbin. Nella directory dev andranno creati i vari devices, con mknod, se si conoscono i major e minor number di ogni device, o, più facilmente, con lo script di shell MAKDEV, che si trova in genere nella directory /dev. In ogni caso si consiglia la lettura della relativa man page. Un altro modo è copiare i file di device già esistenti nella directory /dev dell'hard disk, usando l'opzione -dpR, che copia i link simbolici e non i file a cui i link puntano. Fatto questo vanno copiati in etc i file ld.so.cache e ld.so.conf, i file di inizializzazione per la shell ed il comando ls (DIR_COLORS) ed il file fstab (opzionale). Vediamo adesso la dir lib/, che è la piu complicata. Da notare che quello che segue è valido per un sistema ELF. Saprete certamente che un programma linkato dinamicamente (la maggior parte dei programmi Unix) ha bisogno di librerie per funzionare. Per vedere quali librerie usa ogni programma si usa il comando

ldd programma

Bisognerà dunque copiare tutte le librerie usate dai programmi copiati nel dischetto, oltre a ld.so, ld-linux.so.1 ed il file a cui puntano. ld.so e ld-linux.so.1 sono dei link dinamici che servono per linkare dinamicamente gli eseguibili con le librerie necessarie. Per quanto riguarda la dir proc non c'è bisogno di copiarci nessun file; basta che esista e che venga montata con il comando:

mount /proc /proc -t proc Anche se non abbiamo usato init, risparmiando un po' di spazio, non sempre riusciamo a mettere nel dico di root tutti i comandi che ci servono. Si può ovviare a questo inconveniente comprimendo il disco. Vediamo come si fa. 1)Prima di tutto bisogna creare una directory sull hard disk, ad esempio pippo, all'interno della quale si creerà un'immagine fedele di tutto il disco di root. 2) Supponiamo che il vostro disco di root non compresso occupi 4Mb (4086 blochi). Dopo aver creato la directory, bisogna crearci dentro un filesystem ext2 da 4Mb. Senza dover ripartizionare il disco, basta dare i comandi

dd if=/dev/zero of=/dev/ram bs=1k cout=4096

mke2fs -vm0 /dev/ram 4096

Assicuratevi che il vostro kernel abbia il supporto per il ramdisk... ...quello che abbiamo fatto con questi comandi è creare un filesystem ext2 da 4Mb nel device /dev/ram, cioè nella memoria ram del vostro computer. Fatto ciò montate il device

mount /dev/ram /mnt/ -t ext2

e copiate la directory in cui avete l'immagine del disco di root in /mnt, poi smontatela:

cp pippo/* /mnt/ umount /mnt

Adesso bisogna comprimere il contenuto di /dev/ram e copiarlo sul dischetto: dd if=/dev/ram bs=1k count=4096|gzip -9v >file.gz

dd if=file.gz of=/dev/fd0 bs=1k

Va detto al kernel (del disco di boot) che il disco di root che verrà caricato in memoria sarà di 4Mb:

rdev -r /dev/fd0 49152

Attenzione: il comando con questa sintassi va bene se avet cominciato a scrivere sul disco di root dal settore 0, altrimenti a 49152 va aggiunto l'offset (cioè il settore da cui cominciare a scrivere). Questa attenzione è necessaria se avete intenzione di fare un solo disco di boot e root insieme: nel disco di boot c'è solo il kernel, che occupa circa 350Kb e va copiato dall'inizio del boot sector; sarà sufficiente quindi copiare il disco di root partendo da un offset di 400.

Per fare il reboot del sistema vanno smontati tutti i filesystem e si può premere Ctrl+Alt+Canc.

Questo è quello che ho messo nel mio disco di boot.

di Gerardo di Iorio


Boot Copertina Indice