Il kernel del Linux supporta due file system per i dischi di root
che possono essere copiati automaticamente in un disco RAM.
Questi sono i file system minix e ext2, dei quali l'ext2 è
il migliore. Il supporto per l'ext2 è stato aggiunto tra le
versioni 1.1.17 e 1.1.57. Non sono sicuro quale esattamente.
Se avete un kernel di una di queste versioni allora guardate nel
file /usr/src/linux/drivers/block/ramdisk.c
e cercate la parola ``ext2''.
Se non c'è, allora dovrete usare un file system minix, e quindi il comando ``mkfs'' per crearlo. (Se usate mkfs, usate l'opzione -i per specificare un maggior numero di ``inode'' rispetto al valore di dafault; -i 2000 è il valore suggerito).
mke2fs -m 0 /dev/fd0
Il comando mke2fs riconoscerà automaticamente lo spazio libero e
si configurerà automaticamente da solo. Non c'è quindi bisogno
di nessun parametro.
Un facile modo per testare il risultato è quello di creare un sistema usando il comando sopra o uno simile, e poi tentare di eseguire il mount del dischetto. Se è un sistema ext2, allora il comando:
mount -t ext2 /dev/fd0 /<mount point>
dovrebbe funzionare.
Nella maggior parte dei casi sarà possibile copiare il vostro kernel corrente e eseguire il boot da questo. Comunque ci possono essere casi in cui volete compilarne uno diverso.
Una ragione è la grandezza. Il kernel è uno dei file più grossi in un sistema minimizzato, quindi se avete bisogno di creare un disco di root/boot allora dovete anche ridurre la grandezza del kernel il più possibile. Il kernel ora supporta il cambio dei dischetti dopo aver eseguito il boot e prima di eseguire il mount del disco root, così non è più necessario inglobare il kernel nello stesso dischetto come tutto il resto, quindi questi commenti si rivolgono solo a chi decide di creare un disco di root/boot.
Ci sono due modi per ridurre la grandezza del kernel:
make zImage
Fate riferimento alla documentazione inclusa nei sorgenti del kernel
per una informazione più aggiornata su come compilare un kernel
compresso. Notate che i sorgenti del kernel sono generalmente in
/usr/src/linux
.Una volta che avete deciso cosa non inserire nel kernel, dovete decidere cosa includere. Probabilmente l'uso più comune che si fa di un disco root/boot è quello di esaminare e recuperare il file system di root rovinato, e per fare questo potreste aver bisogno che il kernel supporti determinate cose.
Per esempio, se i vostri backup sono tutti conservati su nastro e usate Ftape per accedere al drive, allora, se perdete la vostra installazione contenente Ftape, non sarete più in grado di recuperare i vostri backup dal nastro. Dovrete reinstallare Linux, reinstallare Ftape, e poi potrete accedere ai vostri backup.
È certamente preferibile mantenere una copia della stessa utility, così non dovrete perdere tempo installando versioni che non possono leggere i vostri backup.
Il punto è che, qualunque supporto I/O che voi avete aggiunto al vostro kernel per supportare i backup dovrebbe essere anche aggiunto al vostro disco di root/boot. Notate inoltre che il modulo Ftape (o almeno quello che ho io) è piuttosto grosso e non potrà risiedere sul vostro disco di root/boot. Dovrete aggiungerlo su un dischetto di utility - ciò è descritto in una sezione intitolata ``AGGIUNGERE DISCHETTI DI UTILITÀ"
Attualmente la procedura per compilare il kernel è descritta
nella documentazione che accompagna i sorgenti dello stesso.
È abbastanza semplice, incominciate a guardare in /usr/src/linux
.
Attenti che se avete problemi nel compilare il kernel, allora
probabilmente è meglio che non tentiate di creare un disco
di boot/root.
La directory /dev
, che contiene dei file speciali per tutti i device
che devono essere usati dal sistema, è d'obbligo per qualsiasi
sistema Linux. Questa directory è una directory normale, e può
essere creata con il comando mkdir nel modo usuale. I file speciali
dei device, però, devono essere creati in un modo particolare,
usando il comando mknod.
C'è anche una via più semplice, comunque - copiare la vostra
directory /dev
esistente, e cancellare i device che non vi servono.
L'unica accortezza è che i file devono essere copiati usando
l'opzione -R
. Così verrà copiata la directory senza tentare di
copiare il contenuto dei file. Notate che usare le lettere
minuscole, cioè ``-r
'', fa una grossa differenza, perché
finirete per copiare tutto il contenuto del vostro disco fisso!
Quindi, state attenti, e usate il comando:
cp -dpR /dev /mnt
assumendo che sia stato eseguito il mount del dischetto in /mnt.
L'opzione dp assicura che i link simbolici siano copiati come link
(anziché come i file a cui puntano) e che siano conservati gli
attributi originali, preservando anche le proprietà.
Se volete farlo con il metodo più difficile, usate ls -l
per
vedere i numeri `mayor' e `minor' dei device che volete,
e createli sul dischetto usando mknod.
Molte distribuzioni includono uno script di shell chiamato MAKEDEV
nella directory /dev
. Questo script di shell può essere usato per
creare i file, ma probabilmente è più facile copiare quelli
esistenti, specialmente per un disco destinato al recupero dei
sistemi danneggiati.
In qualunque modo venga copiata la directory, è bene controllare che ogni device speciale di cui avete bisogno sia stato copiato nel dischetto. Per esempio, Ftape usa i device per i nastri, quindi avete bisogno di copiarli tutti.
È possibile usare solamente le directory /dev
,
/proc
e /etc
per far funzionare un sistema Linux. Non sono
sicuro - non l'ho mai provato. Comunque un ragionevole set minimo di
directory è il seguente:
/dev
Richiesta per motivi di I/O con i device
/proc
Richiesta dal comando ps
/etc
File di configurazione del sistema
/bin
Eseguibili e utility per il sistema
/lib
Shared libraries per il supporto run-time
/mnt
Un ``mount point'' per la gestione di un disco in generale
/usr
Utility e applicazioni generali
Notate che la struttura delle directory presentata qui è da usare solo nel disco di root. Fate riferimento al Linux File System Standard per maggiori informazioni su come i file system dovrebbero essere strutturati su un sistema Linux ``standard''.
Quattro di queste directory possono essere create molto facilmente:
Le rimanenti 3 directory sono descritti nelle sezione seguenti.
/etc
Questa directory deve contenere un certo numero di file di configurazione. Nella maggior parte dei sistemi, questi possono essere suddivisi in 3 gruppi:
fstab
, passwd
.I file che non sono essenziali possono essere identificati con il comando:
ls -ltru
Questo lista in ordine inverso i file che sono stati modificati
ultimamente (dal più recente al più vecchio), quindi se ci sono
file che non vengono usati, questi possono essere tralasciati in
un eventuale disco di root.
Sui miei dischi di root, io ho al massimo 15 file di configurazione. Questo riduce il mio lavoro con questi tre insiemi di file:
rc system startup script
fstab lista dei file systems di cui fare il mount
inittab parametri per il processo di init - il
primo processo a partire al boot del sistema.
passwd lista delle login
shadow password
Queste dovrebbero essere presenti in un sistema sicuro
in modo tale che eseguendo il boot dal dischetto siano
rigettate le login non abilitate. A parte questo, ho veramente bisogno di solo 2 file, e ciò che contengono è sorprendentemente poco.
rc
dovrebbe contenere:
#!/bin/sh
/etc/mount -av
/bin/hostname boot_root
e non ho bisogno di eseguire hostname - semplicemente risulta più
simpatico se lo faccio. Anche mount è necessario solamente, per ora,
ad eseguire il mount di /proc
per supportare il comando ps - Linux
funziona anche senza hostname.fstab
dovrebbe essere:
/dev/fd0 / ext2 defaults
/proc /proc proc defaults
Non penso che la prima riga sia veramente necessaria, ma ho trovato
che se la lascio fuori, mount non riesce ad eseguire il mount di /proc.inittab
dovrebbe essere a posto così com'è, a meno che non vogliate
essere sicuri che gli utenti non possano connettersi attraverso
le porte seriali. Per prevenire questo, togliete i commenti a tutte
le righe con /etc/getty
che includono ttys o ttyS alla fine della riga.
Lasciate però le porte tty altrimenti non potrete collegarvi tramite
la console.
inittab
definisce cosa il sistema eseguirà in varie situazioni
incluso l'inizio della sessione, la chiusura, il passaggio
a un modo multi-utente.
Bisogna controllare attentamente che i comandi passati a inittab
siano presenti e nella directory corretta. Se inserite i vostri
comandi nel vostro dischetto di recupero usando il listato
della directory di esempio di questo HOWTO, e poi copiate
il vostro inittab nel dischetto di recupero senza controllare,
allora avrete grosse possibilità che qualcosa vada storto, perché
metà delle righe nell'inittab faranno riferimento a programmi
inesistenti o residenti in directory sbagliate.
Molti programmi non possono essere spostati da una directory a un'altra
altrimenti non riuscriranno a funzionare correttamente.
Per esempio sul mio sistema, /etc/shutdown
chiama il
comando /etc/reboot
. Se sposto reboot in /bin/reboot
,
e poi chiamo il comando shutdown, questo fallirà, perché non
può trovare il file reboot.
Per il resto, copiate semplicemente tutti i file di testo nella vostra
directory /etc
, più gli eseguibili nella directory
/etc
di cui non potete essere sicuri se vi serviranno. Come guida,
consultate la lista nella sezione ``Listato della directory di un Root Disk
usando ls-lR'' - questo è quello che io ho, così probabilmente
sarà sufficiente per voi se copiate solo questi file.
In pratica, un solo file rc
è restrittivo; molti sistemi ora
usano una directory /etc/rc.d
contenente gli script di shell, ma
è probabilmente più semplice copiare la directory inittab e
/etc/rc.d
dal vostro sistema esistente, e controllare poi gli
script di shell per togliere quelle parti che non servono in un sistema che
partirà da dischetto.
/bin
Ecco una directory adatta a contenere tutte le utility extra che vi
servono per avere a disposizioni le funzionalità di base; utility
come ls, mv, cat, dd ecc.
Andate alla sezione intitolata ``Esempio di ls-lR su un disco di Boot/Root''
per una lista di file che io ho messo nella mia directory /bin
del mio
disco di boot/root. Noterete che non contengono utility per recuparare
i backup, come cpio, tar, gzip etc. Questo perché io ho messo queste
utility su un dischetto separato, per salvare spazio sul disco di
root/boot. Una volta che ho fatto partire il sistema dal mio disco di
root/boot, esso si copia in memoria come ramdisk lasciando il disk drive
libero per un altro dischetto: il dischetto utility! Di solito
io ne faccio il mount in /usr
.
La creazione di un disco di utility è descritta successivamente nella sezione intitolata ``Aggiungere un Dischetto di Utility''.
/lib
Due librerie sono necessarie per il funzionamento di molte utility sotto Linux:
Se non sono nella directory /lib
allora il sistema non sarà in grado
di partire. Se siete fortunati potreste vedere un messaggio di errore
che vi dice perché.
Queste dovrebbero essere presenti nella vostra directory /lib
.
Notate che libc.so.4
può essere un link simbolico a un libreria libc
con la versione nel nome del file. Se usate il comando:
ls -l /lib
dovreste vedere qualcosa del genere:
libc.so.4 -> libc.so.4.5.21
In questo caso, la libreria libc che vi serve è la libc.so.4.5.21.
Un dischetto di root/boot perché sia utilizzabile, deve essere in grado di eseguire il boot. Per ottenere ciò, la via più semplice (forse l'unica?) è quella di installare un boot loader, che è una parte di codice eseguibile salvata sul settore 0, cilindro 0 del disco. Andate alla sezione intitolata ``Dischetti di Boot'' per saperne di più sui processi di boot.
LILO è un boot loader disponibile su ogni Linux site. Permette di configurare il boot loader, compreso:
È un modo molto conveniente per specificare come il kernel deve comportarsi al momento del boot. Il mio file di configurazione per LILO 0.15 sul disco di root/boot è:
boot = /dev/fd0
install = ./mnt/boot.b
map = ./mnt/lilo.map
delay = 50
message = ./mnt/lilo.msg
timeout = 150
compact
image = ./mnt/zImage
ramdisk = 1440
root = /dev/fd0
Notate che boot.b, lilo.msg e il kernel devono essere copiati sul dischetto usando un comando del tipo:
cp /boot/boot.b ./mnt
Se questo non viene fatto, LILO non potrà essere eseguito correttamente durante il boot se l'hard disk non è disponibile, e c'è da perdere tempo nel creare un dischetto di salvezza che richieda un hard disk per partire.
Io eseguo LILO con il comando:
/sbin/lilo -C <configfile>
Lo eseguo da una directory contenente la directory mnt nella quale ho ``messo'' il disco. Questo significa che sto dicendo a LILO di installare un boot loader nel device di boot (/dev/fd0 in questo caso), di eseguire il boot del kernel nella directory principale del disco.
Ho anche specificato che voglio che il root device sia il dischetto, e che voglio un RAM disk di 1440 blocchi da 1K, la stessa grandezza del dischetto. Siccome ho creato un dischetto con un file system di tipo ext2, ho fatto tutto ciò che dovevo fare affinché il sistema usi come root device il ramdisk, e copi il contenuto del dischetto in quest'ultimo.
Le caratteristiche di un ram disk sono descritte più approfonditamente nella sezione intitolata ``RAM DISK E SISTEMI BOOT/ROOT''.
È anche utile considerare la possibilità di usare il parametro ``singolo'' per fare in modo che Linux esegua il boot in modalità utente-singolo. Questo può essere utile per prevenire la connessione di utenti attraverso le porte seriali.
Uso inoltre le opzioni ``DELAY'' ``MESSAGE'' e ``TIMEOUT'' in modo che quando il sistema parte dal disco, LILO mi darà l'opportunità di inserire dei comandi da passare al kernel. Non ne ho bisogno ora come ora, ma potrebbe tornarmi utile se volessi usare un'altro root device o eseguire il mount di un file system in sola lettura.
Il file di messaggio che io uso è così fatto:
Linux Boot/Root Diskette
========================
Inserisci un linea di comando del tipo:
zImage [ command-line options]
Se non scrivi niente linux partira` dopo 15 secondi.
Mi ricorda semplicemente quali sono le mie scelte.
I lettori sono invitati a leggere la documentazione di LILO
attentamente prima di tentare di installare qualcosa. È facile
rovinare le partizioni se usate il parametro ``boot =
'' in modo
sbagliato. Se non siete esperti non usate LILO finché non siete
sicuri di avere capito e avete controllato 3 volte i vostri
parametri.
Notate che dovete rieseguire lilo ogni volta che cambiate kernel, così LILO può settare la sua mappa dei file per descrivere correttamente il nuovo file del kernel. È di fatto possibile sostituire il file del kernel con uno quasi identico senza rieseguire LILO, ma è molto meglio non rischiare - se cambiate kernel, rieseguite LILO.
Finché sono sull'argomento LILO è bene che vi dica un'altra cosa: se avete installato lilo su un drive contenente DOS, potete sempre ripristinare il boot sector con il comando:
FDISK /MBR
dove MBR sta per ``Master Boot Record''. Alcuni non vedono di buon occhio questo metodo, però funziona.
LILO ha molte opzioni utili le quali sono difficili da ricordare quando si deve creare un disco di boot:
zImage aha152x=0x340,11,3,1 ro
passa il parametro aha152x al driver per i dischi scsi aha152x
(ammesso che il kernel sia stato compilato con il supporto per
questi dischi) e chiede che venga eseguito il mount del root file
system in sola lettura.
zImage aha152x=0x340,11,3,1 root=/dev/sda8 ro lock
APPEND = "aha152x=0x340,11,3,1"