cls@truffula.sj.ca.us
),
Alessandro Rubini (rubini@linux.it
).Nonostante la documentazione distribuita con i sorgenti di Lilo sia ad
ampio spettro (mi riferisco qui ai file che trovate anche sotto
/usr/doc/lilo
-versione sulla vostra macchina Linux), la
maggior parte degli utenti Linux trovano qualche difficoltà
durante la costruzione del proprio file /etc/lilo.conf
.
Questo documento è volto ad aiutare queste persone fornendo
l'informazione minimale che serve per scrivere un file di
configurazione e fornendo cinque installazioni esemplificative:
/dev/hdc
facendo in modo che
tutto funzioni correttamente quando il disco viene collegato
come /dev/hda
e viene usato per il boot. Questo tipo
di configurazione è quella che serve usare quando si
installa un nuovo sistema Linux dall'interno del proprio
sistema già funzionante.
Gli ultimi tre esempi sono stati forniti da Cameron Spitzer,
cls@truffula.sj.ca.us
, che ha scritto le prime versioni di questo
documento. Il manutentore attuale usa solo Linux sulle sue macchine, e
non è quindi in grado di controllare né di aggiornare
gli esempi forniti. Sentitevi liberi di mandare il vostro contributo a
questo documento, preferibilmente mandandomi un messaggio di posta
elettrica.
Quando Lilo avvia il sistema è in grado di accedere solo ai
settori del disco che possono essere letti dal BIOS della
macchina. Tutti i pathname che vengono inseriti in
/etc/lilo.conf
vengono utilizzati durante l'installazione del
programma (cioè quando si invoca il comando lilo);
è questo in fatti il momento in cui il programma costruisce le
sue tabelle che elencano i settori del disco fisicamente utilizzati da
ciascun file. Una conseguenza di questo è che i file devono per
forza risiedere in una partizione che può essere vista dal
BIOS; inoltre, bisogna reinstallare Lilo ogni volta che questi file
vengono modificati (in altre parole, occorre reinvocare il comando
lilo tutte le volte che si sostituisce un'immagine del kernel).
All'interno di /etc/lilo.conf
, la direttiva boot =
dice
a Lilo dove installare il loader primario, quello che viene eseguito
dal BIOS all'accensione della macchina. Come regola generale, questo
codice può essere installato nel ``master boot sector''
(cioè in /dev/hda
) oppure nella partizione root
dell'installazione Linux (di solito /dev/hda1
o
/dev/hda2
).
Se il proprio disco contiene un altro sistema operativo oltre a Linux, conviene installare Lilo sulla partizione root. In questo caso occorre marcare la partizione come ``bootable'' (usando il comando ``a'' di fdisk o il comando ``b'' di cfdisk. Se il master boot sector non viene sovrascritto risulterà più facile la disinstallazione di Linux, se ne sorgerà il bisogno.
Personalmente nel mio BIOS preferisco non specificare né LBA né LARGE per i miei dischi; ma ricorate che io uso solo Linux. Questi due modi di accesso sono degli accrocchi orribili, inventati solamente come pezza a fronte di alcune deficienze progettuali del primi PC. Specificare i propri dischi come NORMAL vuol dire che il proprio kernel deve stare all'interno dei primi 1024 cilindri del disco, ma questo non è un problema se il disco è correttamente partizionato e se la partizione di root è piccola (questa è una buona norma in ogni caso, indipendentemente da Lilo).
Se il disco invece contiene già un altro sistema operativo, non si potranno modificare i settaggi del BIOS o il vecchio sistema non funzionerà più. Tutte le distribuzioni recenti di Linux, comunque, sono in grado di gestire dischi configurati come LBA o LARGE.
Se si ha più di un disco rigido e alcuni di essi sono usati solo da Linux senza far parte del processo di avvio del sistema, si può evitare di dire al BIOS che questi dischi esistono. Il sistema si avvierà più velocemente e Linux riconoscerà automaticamente e velocemente tutti i dischi. A me capita spesso di aggiungere e togliere dischi dal mio sistema, ma non cambio mai la configurazione del BIOS.
Quando appare il prompt di Lilo, premendo il tasto <Tab> si ottiene la lista di tutte le possibilità di boot offerte da Lilo. Se Lilo non è configurato per interagire con l'utente si può comunque renderlo interattivo premendo il tasto <Alt> o il tasto <Shift> prima che appaia il messaggio ``LILO'', e tenendo premuto tale tasto.
Se al prompt di Lilo si sceglie un'immagine di kernel Linux è possibile passare dei parametri di linea di comando al kernel stesso. Il kernel Linux riconosce molti parametri, e non credo che questo sia il luogo in cui elencarli tutti. Alcuni di questi parametri, d'altra parte, secondo me sono particolarmente importanti:
root=
: si può dire al kernel di usare come
partizione di root una partizione diversa da quella che appare
nel file lilo.conf
. Per esempio, io ho dedicato una
piccola partizione ad ospitare una installazione minimale di
Linux; grazie a questa sono stato in grado di accendere il mio
calcolatore anche dopo aver distrutto per sbaglio la
partizione di root (questi danni comunque succedono solo se si
smanetta con le strutture interne del kernel).
init=
: la versione 1.3.43 e tutte le successive possono
ricevere dalla linea di comando il pathname di un programma da
eseguire al posto di /sbin/init
. Se il sistema si
blocca durante il processo di boot a causa di un errore negli
script di accensione è ancora possibile accedere al
sistema specificando init=/bin/sh
al prompt di
Lilo. Dopo aver acceso il sistema in questo modo probabilmente
occorrerà accedere ai propri dischi, che saranno
inaccessibili; per questo occorre invocare ``/sbin/mount
-w -n -o remount /; mount -a
'', e ricordarsi di chiamare
``/sbin/umount -a
'' prima di spegnere il calcolatore.
/etc/inittab
e ai vari file che si trovano in /etc/rc.d
.
Quando Lilo sovrascrive un settore di boot, una copia del settore
viene salvata in /boot/boot.
xxyy, dove xxyy sono i
due numeri che rappresentano la periferica, scritti in esadecimale. Si
possono vedere questi due numeri, chiamati ``major number'' e ``minor
number'' chiamando ``ls -l /dev/
device''. Per esempio,
il primo settore del disco /dev/hda
(che ha 3 e 0 come numeri
di periferica) verrà salvato in /boot/boot.0300
; se si
installa lilo su /dev/fd0
il file si chiamerà
/boot/boot.0200
, se si installa su /dev/sdb3
(con
major number 8 e minor 19) il file si chiamerà
/boot/boot.0813
. Si noti che Lilo non salva il primo settore
del disco se il file corrispondente esiste già, quindi non
occorre preoccuparsi quando si reinstalla Lilo (per esempio dopo aver
ricompilato il kernel).
Se per caso occorre disinstallare Lilo (per esempio nella malaugurata
ipotesi che si cancelli Linux dal disco) occorre semplicemente
rimettere al suo posto il settore di boot originale. Se Lilo è
installato in /dev/hda
, basta fare ``dd if=/boot/boot.0300
of=/dev/hda bs=446 count=1
'' (personalmente preferisco fare ``cat
/boot/boot.0300 > /dev/hda
'', ma questo comando non è sicuro,
in quanto copia anche la tabella delle partizioni, che potrebbe essere
stata modificata nel frattempo). Questo comando è molto più
facile che dover far partire il DOS per chiamare ``fdisk /mbr
'':
permette di togliere Linux da un disco senza mai avviare alcun altro
sistema operativo. Dopo aver rimosso Lilo dal disco occorre
anche ricordarsi di far girare il comando fdisk di Linux per
distruggere tutte le partizioni Linux, in quanto la versione DOS del
comando non è in grado di cancellare partizioni non-dos.
Se Lilo è stato installato sulla partizione root del sistema
Linux, (per esempio /dev/hda2
), invece, non occorre fare
niente di particolare per disinstallare Lilo. In questo caso basta far
andare il programma fdisk di Linux per rimuovere le
partizioni Linux dalla tabella delle partizioni. Bisogna anche
ricordarsi di marcare la partizione DOS come partizione ``bootable''
(``attiva'' in gergo DOS).
La maggior parte delle installazioni di Lilo utilizzano un file di configurazione come il seguente:
boot = /dev/hda # oppure la partizione root delay = 0 # l'attesa si specifica in decimi di secondo vga = 0 # opzionale. Si usi "vga=1" per un modo testo 80x50 image = /boot/vmlinux # il proprio file zImage root = /dev/hda1 # la partizione root label = Linux # o un'altro bel nome read-only # root va montato in sola lettura other = /dev/hda4 # la partizione dos, se esiste table = /dev/hda # la tabella delle partizioni attuale label = dos # o un altro stupido nome
Si possono specificare diverse sezioni ``image'' e ``other'' se serve. È in effetti abbastanza comune configurare nel proprio lilo.conf diverse immagini del kernel, almeno per chi cerca di rimanere aggiornato con le versioni di sviluppo del sistema.
hdc
per avviare come hda
Lilo permette di creare la mappa dei settori da un disco e allo
stesso tempo di dire al BIOS di leggere i settori da un altro disco.
Per esempio a me capita spesso di installare Linux su un disco collegato
come hdc
(disco principale del secondo cavo IDE), e usare
poi tale disco come unico disco di un nuovo calcolatore (hda
). Ho
fatto una copia del dischetto di installazione in una piccola
partizione, in modo da installare su hdc
facendo chroot
da un terminale virtuale, senza dover smettere di usare il calcolatore.
Il file lilo.conf che uso in questo caso è fatto così:
# Questo file deve essere usato da un sistema ospitato in /dev/hdc boot = /dev/hdc # sovrascrivi il settore di boot di hdc disk = /dev/hdc # e specifica come accedere ad hdc: bios = 0x80 # il BIOS lo vedra' come primo disco delay = 0 vga = 0 image = /boot/vmlinux # all'interno di /dev/hdc1 root = /dev/hda1 # che all'accensione sara' hda1 label = Linux read-only
Questo file di configurazione deve venir usato da un Lilo che gira
su /dev/hdc1. Le mappe di Lilo che vengono scritte nel settore
di boot (/dev/hdc
) devono riferirsi alle copie
di vmlinux
e di /boot/boot.b
che saranno disponibili
al momento dell'accensione, cioè quelle che adesso stanno in
hdc
.
Personalmente chiamo questo file /mnt/etc/lilo.conf.hdc
e installo
Lilo con questo comando: ``cd /mnt; chroot . sbin/lilo -C
/etc/lilo.conf.hdc
'', avendo montato /dev/hdc1
sotto /mnt
.
Ho due dischi IDE e un disco SCSI. Il disco SCSI non viene visto dal BIOS. Siccome Lilo usa le chiamate al BIOS non può accedere ai dischi che non vengono visti dal BIOS. Il mio stupido AMI-BIOS può solo avviare il sistema da "A:" o da "C:", e la mia partizione di root sta sul disco SCSI.
La soluzione in questo caso consiste nel mettere il kernel, la mappa dei settori e il secondo stadio di caricamento di Lilo in una partizione Linux nel primo disco IDE. Si noti che non serve mettere il kernel nella partizione root.
La seconda partizione del mio primo disco IDE (/dev/hda2
, la
partizione Linux usata per avviare il sistema) è montata in
/u2
. Questo è il file /etc/lilo.conf
che ho usato.
# Installa LILO su settore di boot del primo disco IDE # boot = /dev/hda # /sbin/lilo (l'installatore) copia il loader di Lilo da # questo file sopra al settore di boot. install = /u2/etc/lilo/boot.b # Ho scritto un messaggio prolisso in questo file. message = /u2/etc/lilo/message # Il comando "lilo" scrive in questo file la mappa dei settori # di disco occupati dal kernel map = /u2/etc/lilo/map compact prompt # Aspetta diecisecondi, poi attiva 1.2.1 per default. timeout = 100 # Il kernel viene salvato dive il BIOS può leggerlo in questo modo: # cp -p /usr/src/linux/arch/i386/boot/zImage /u2/z1.2.1 image = /u2/z1.2.1 label = 1.2.1 # Lilo dice al kernel di montare la prima partizione SCSI come root. # Non serve che il BIOS sia in grado di accedervi. root = /dev/sda1 # La partizione è montata in sola lettura read-only # Ho tenuto un vecchio kernel Slackware da usare se quello appena # ricompilato non funziona. In effetti una volta questo mi e' servito image = /u2/z1.0.9 label = 1.0.9 root = /dev/sda1 read-only # La mia partizione DR-DOS 6 other = /dev/hda1 loader=/u2/etc/lilo/chain.b label = dos alias = m
Il sistema che ho in ufficio ha un disco IDE da 1GB. Il BIOS può
solo accedere ai primi 504MB del disco (con MB intendo 2**10 byte, non
10**6). Perciò ho messo il sistema DOS su una partizione da 350MB
in /dev/hda1
e la partizione root di Linux in 120MB
come /dev/hda2
.
Il DOS non è stato in grado di installarsi correttamente quando il disco era nuovo. La versione 7 del DOS Novell aveva lo stesso problema. Fortunatamente il servizio "opzioni di IBM" ha dimenticato di mettere il dischetto "OnTrack" nella scatola del disco. Il disco sarebbe dovuto arrivare con un prodotto chiamato "OnTrack Disk Manager". Se avete solo il DOS immagino che lo abbiate usato.
Allora ho fatto una partizioni con il programma fdisk di Linux.
Il DOS 6.2 ha rifiutato di installarsi su /dev/hda1
dicendo qualcosa come ``questa versione di MS-DOS è per le nuove
installazioni; questo computer ha già il DOS installato quindi serve
una versione "aggiornamento" al posto di questa''. In effetti, il disco
era nuovo di zecca.
Che schifo! Allora ho usato ancora fdisk di Linux e ho cancellato la partizione 1 dalla tabella. Questo ha reso felice il mio DOS 6.2 che ha ricreato la partizione da me rimossa per potersi installare. MS-DOS 6.2 ha scritto il suo settore di boot sul disco ma non è riuscito ad avviarsi.
Per fortuna avevo un kernel Slackware in un floppy creato dal programma
di installazione della mia Slackware, per cui ho acceso Linux e installato
Lilo sopra al settore di boot difettoso del DOS. Questo funziona. Ecco
il file /etc/lilo.conf
che ho usato:
boot = /dev/hda map = /lilo-map delay = 100 ramdisk = 0 # Disattiva il ram-disk timeout = 100 prompt disk = /dev/hda # Il BIOS vede solo 500MB di questo disco bios = 0x80 # che e' il primo disco IDE sectors = 63 # e ha questi parametri (dalla documentazione heads = 16 # del disco stesso) cylinders = 2100 image = /vmlinuz append = "hd=2100,16,63" root = /dev/hda2 label = linux read-only vga = extended other = /dev/hda1 label = msdos table = /dev/hda loader = /boot/chain.b
Dopo aver installato questi sistemi ho verificato che la partizione
contenente i file zImage
, boot.b
, map
, chain.b
e message
possono usare una partizione DOS, basta che non
sia compressa con stacker o doublespace. Perciò in questo caso
avrei potuto dare tutti i 500MB alla partizione DOS.
Ho anche imparato successivamente che "OnTrack" avrebbe scritto la tabella delle partizioni spostata di alcune decine di byte all'interno del disco invece che all'inizio, e ho saputo che è possibile modificare il driver IDE di Linux per gestire questa situazione, ma l'installazione in questo caso sarebbe stata impossibile con il kernel slackware precompilato [NDT: ecco un'altro caso in cui i produttori di hardware fanno delle porcate immonde per sistemare le mancanze di Microsoft]). Alla fine la IBM mi ha mandato il dischetto "OnTrack"; ho contattato il loro supporto tecnico e mi hanno detto che Linux è bacato perché non usa il BIOS. Ho buttato via il dischetto.
Successivamente ho installato Windows-95 sul calcolatore in ufficio. Ovviamente ha bruciato il mio bel settore di boot di Lilo, ma non ha toccato la mia partizione Linux. Siccome il BIOS impiega molto tempo a caricare il kernel dal dischetto ho creato preventivamente un dischetto con Lilo installato in modo da poter caricare il kernel dal disco IDE. Il floppy è stato creato così:
fdformat /dev/fd0H1440 # scrivi le traccie su disco nuovo mkfs -t minix /dev/fd0 1440 # crea il filesystem di tipo minix mount /dev/fd0 /mnt # aggancialo nella directory convenzionale cp -p /boot/chain.b /mnt # copia il loader sul dischetto lilo -C /etc/lilo.flop # installa lilo e la mappa sul floppy umount /mnt
Si noti che il dischetto deve essere montato quando si invoca lilo, in modo che Lilo possa scrivere il file con la mappa dei settori del kernel.
Questo è /etc/lilo.flop, ed è molto simile all'ultimo che vi ho fatto vedere:
# Crea un dischetto che legge i kernel dal disco fisso boot = /dev/fd0 map = /mnt/lilo-map delay = 100 ramdisk = 0 timeout = 100 prompt disk = /dev/hda # 1 GB IDE, ma il BIOS vede solo i primi 500 MB. bios=0x80 sectors = 63 heads = 16 cylinders = 2100 image = /vmlinuz append = "hd=2100,16,63" root = /dev/hda2 label = linux read-only vga = extended other = /dev/hda1 label = msdos table = /dev/hda loader = /mnt/chain.b
Infine, mi è successo di aver bisogno del DOS 6.2 in ufficio,
ma non volevo toccare il primo disco IDE. Ho aggiunto un controller
e un disco SCSI e ho creato un filesystem DOS su questo disco
con il comando mkdosfs di Linux. Questo disco viene
visto come "D:" da Windows-95. Naturalemnte il DOS non vuole
partide dal disco D, ma questo non è un problema quando si ha Lilo.
Ho aggiunto queste righe al file lilo.conf
del penultimo
esempio:
other = /dev/sda1 label = d6.2 table = /dev/sda loader = /boot/any_d.b
Con questa modifica il DOS 6.2 parte e crede di essere sul disco C mentre Windows-95 si trova su D [NDT: demenziale!].