[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 49.   Caricamento di GNU/Linux

Di solito, il caricamento di un sistema operativo avviene perché, all'atto dell'accensione di un elaboratore, il firmware (il BIOS degli elaboratori x86) si occupa di leggere ed eseguire un piccolo programma residente all'inizio di un disco o di un altro tipo di unità di memorizzazione. Negli elaboratori x86 questa porzione iniziale della memoria di massa è nota come MBR, ovvero Master boot record, costituito da un solo settore (512 byte). Eventualmente, quando si fa riferimento a una unità che non si suddivide in partizioni (come con i dischetti), si parla semplicemente di settore di avvio o di boot. Questo piccolo programma iniziale si occupa a sua volta di avviare il kernel (direttamente o attraverso un programma intermedio).

Nei sistemi con architettura x86 esistono diversi modi per effettuare il caricamento di GNU/Linux; in questo capitolo si trattano i metodi di avvio più facili da comprendere, mentre in capitoli separati viene descritto l'uso di GRUB e di LILO, che sono invece i sistemi di avvio più importanti per un sistema GNU/Linux.

49.1   Kernel in un dischetto

Dal punto di vista tecnico, il modo più semplice di avviare GNU/Linux è quello di creare un disco di avvio contenente solo il kernel. Nell'esempio seguente si copia il kernel vmlinuz nel dischetto contenuto della prima unità.(1)

cp vmlinuz /dev/fd0[Invio]

La copia fatta in questo modo non è la copia di un file in un dischetto che contiene un file system: il dischetto diventa il file stesso e questo tipo di dischetto non può contenere più di un file. Questo particolare è molto importante e deve essere compreso necessariamente.

Il file del kernel Linux è qualcosa di molto raffinato: contiene il codice necessario per autoavviarsi dopo essersi decompresso. Infatti, la parte più consistente del kernel viene compressa alla fine del procedimento di compilazione. Naturalmente, il kernel non ha sempre la necessità di autoavviarsi, ma questa possibilità è importante per facilitare ancora di più l'avvio del sistema.

Il kernel è così in grado di avviarsi da solo, ma può non essere stato predisposto per utilizzare esattamente il file system principale desiderato, così come altri elementi predefiniti potrebbero non corrispondere alla realtà. Si può utilizzare il programma rdev (2) per alterare questi elementi direttamente nel file del kernel o nell'immagine copiata nel dischetto:

rdev [opzioni] [immagine [altre_opzioni]]

Il programma rdev legge o imposta i parametri di un'immagine di un kernel. L'immagine in questione può essere indicata come un nome di file, o un nome di dispositivo (tipicamente /dev/fd0).

Tabella 49.1. Scomposizione della sintassi in base ad alcune opzioni.

Sintassi Descrizione
rdev immagine
Visualizza il nome di dispositivo corrispondente al file system principale (root) indicato attualmente nell'immagine. Si tratta di visualizzare il nome del file di dispositivo corrispondente alla partizione che viene utilizzata per innestare la directory radice del file system.
rdev immagine dispositivo
Specifica un nuovo nome di dispositivo da utilizzare come partizione da innestare nella directory radice.
rdev -R immagine 1
Indica di attivare inizialmente in sola lettura il dispositivo da innestare nella directory radice.
rdev -R immagine 0
Indica di attivare inizialmente in lettura e scrittura il dispositivo da innestare nella directory radice.

Segue la descrizione di alcuni esempi.

Un programma analogo per alterare queste informazioni nel file del kernel è knl (3) che forse è un po' più semplice da utilizzare:

knl [--kernel=]immagine [opzioni]

Come già per rdev, l'immagine può essere costituita da un file su disco o dal nome di un file di dispositivo che la contiene (come nel caso di un dischetto).

Tabella 49.2. Alcune opzioni.

Opzione Descrizione
[--kernel=]immagine
Il file del kernel o il file di dispositivo che corrisponde al kernel può essere indicato come argomento iniziale, prima delle altre opzioni, oppure può essere argomento dell'opzione --kernel.
--flags=ro
Imposta l'apertura del file system principale in sola lettura.
--flags=none
Azzera tutti gli indicatori.
--noram
Annulla le opzioni --prompt e --ram.
--prompt
Richiede l'utilizzo di un disco RAM iniziale e fa sì che venga richiesto l'inserimento del dischetto da caricare in memoria.
--ram=scarto
Specifica l'utilizzo di un disco RAM iniziale, tenendo conto che l'immagine del file system inizia a partire dal blocco indicato (blocchi da 512 byte). Il valore dello scarto non può essere superiore a 8 191 blocchi.
--root=dispositivo
Specifica il file di dispositivo da usare per innestare il file system principale. Il file di dispositivo viene indicato come di consueto, con la forma /dev/..., dove il prefisso /dev/ può essere omesso. Al posto del file di dispositivo si può indicare la parola chiave boot, a indicare di usare lo stesso file di dispositivo corrispondente all'unità usata per l'avvio.
--root=mode-n.m
Al posto di indicare il nome di un file di dispositivo, si può specificare direttamente il numero primario (n) e il numero secondario (m) corrispondente.
--swap=dispositivo
--swap=mode-n.m
Specifica il file di dispositivo per fare riferimento a una partizione o a un disco da usare come area di scambio per la memoria virtuale (swap).
--video={ask|evga|vga|n}
Specifica la modalità video, attraverso una parola chiave intuitiva o un numero, da 0 a 65 499.

Segue una sequenza di esempi, partendo da un kernel contenuto nel file vmlinuz-test, che si trova nella directory corrente, nel quale si modificano alcune opzioni di funzionamento in fasi successive. Gli esempi non sono descritti, ma si mostra ogni volta l'esito del risultato attraverso knl, chiamandolo senza l'indicazione di altre opzioni oltre al kernel stesso:

knl vmlinuz-test[Invio]

Kernel image configuration:

    Image:       vmlinuz-test

    Root Dev:    
    Swap Dev:    Mode-0.0

    Flags:       RO
    Video Mode:  VGA

    Ram Disk:    No

knl vmlinuz-test --root=/dev/hdb1[Invio]

knl vmlinuz-test[Invio]

Kernel image configuration:

    Image:       vmlinuz-test

    Root Dev:    Mode-3.65
    Swap Dev:    Mode-0.0

    Flags:       RO
    Video Mode:  VGA

    Ram Disk:    No

knl vmlinuz-test --swap=/dev/hdb2[Invio]

knl vmlinuz-test[Invio]

Kernel image configuration:

    Image:       vmlinuz-test

    Root Dev:    Mode-3.65
    Swap Dev:    Mode-3.66

    Flags:       RO
    Video Mode:  VGA

    Ram Disk:    No

knl vmlinuz-test --video=evga[Invio]

knl vmlinuz-test[Invio]

Kernel image configuration:

    Image:       vmlinuz-test

    Root Dev:    Mode-3.65
    Swap Dev:    Mode-3.66

    Flags:       RO
    Video Mode:  XVGA

    Ram Disk:    No

49.2   Loadlin

Se si utilizza ancora il Dos, si può avviare un kernel Linux attraverso il programma Loadlin, (4) quando è in funzione il Dos. Loadlin è quindi un programma Dos, che deve poter raggiungere il file del kernel all'interno di una partizione Dos.(5)

Se il programma LOADLIN.EXE e il kernel si trovano nel sistema GNU/Linux appena installato, che però si vuole avviare tramite il sistema Dos per qualche motivo, è necessario mettere in funzione il sistema GNU/Linux, temporaneamente in qualche altro modo, allo scopo di trasferire il kernel e il programma di avvio nella partizione Dos. Probabilmente, il modo più semplice di avviare provvisoriamente il sistema GNU/Linux è dato da un'unità di memorizzazione esterna (un dischetto, un CD, una memoria solida), che in qualche modo contiene un kernel adatto.

Attraverso GNU/Linux si deve copiare il programma LOADLIN.EXE nel disco Dos e con esso anche il file del kernel. Quindi si può arrestare il sistema nel modo tradizionale e riavviare l'elaboratore facendo in modo di mettere in funzione il sistema operativo Dos.

Una volta riavviato il sistema operativo Dos si dovrebbero trovare i due file copiati poco prima attraverso GNU/Linux: VMLINUZ (o qualunque altro nome riferito al file del kernel) e LOADLIN.EXE.

Per avviare in modo semplice il sistema GNU/Linux mentre è in funzione il Dos, dovrebbe bastare il comando seguente. Si suppone che la partizione dedicata a GNU/Linux sia la seconda del primo disco fisso ATA.

C:\> LOADLIN C:\VMLINUZ root=/dev/hda2 ro[Invio]

In pratica, si dice a LOADLIN.EXE di caricare il file del kernel C:\VMLINUZ in modo da utilizzare la seconda partizione del primo disco fisso (/dev/hda2) cominciando con un accesso in sola lettura (in modo da permetterne il controllo prima che il sistema sia messo completamente in funzione).

Prima di avviare LOADLIN.EXE, vale forse la pena di disattivare eventuali sistemi di memoria cache del disco fisso. Se si usa SMARTDRV.EXE conviene scaricare la memoria cache nel modo seguente:

C:\> SMARTDRV /C[Invio]

In generale, la cosa migliore dovrebbe essere l'inserimento della chiamata a LOADLIN.EXE all'interno di un sistema di file AUTOEXEC.BAT e CONFIG.SYS che permetta l'avvio di configurazioni multiple.

L'utilizzo del programma LOADLIN.EXE è il modo più ragionevole di avviare un sistema GNU/Linux installato in un file system UMSDOS. Ciò proprio perché un file system UMSDOS si trova nella stessa partizione utilizzata per il Dos.(6)

C:\> LOADLIN C:\VMLINUZ root=/dev/hda1 rw[Invio]

In questo caso, si dice a LOADLIN.EXE di caricare il file del kernel C:\VMLINUZ in modo da utilizzare la prima partizione del primo disco fisso (/dev/hda1) cominciando con un accesso sia in lettura, sia in scrittura.

Con un file system UMSDOS non è possibile iniziare in sola lettura perché non c'è un programma in grado di eseguire il controllo e la correzione di questo tipo di file system. Di conseguenza, l'unico modo per controllare e correggere eventuali errori in un file system UMSDOS è l'uso di programmi Dos quali CHKDSK.EXE, SCANDISK.EXE e simili.

49.3   SYSLINUX

SYSLINUX (7) è un sistema di avvio di GNU/Linux per dischetti o partizioni con un file system Dos-FAT (deve trattarsi precisamente di FAT16), basato su architettura x86. A prima vista può sembrare qualcosa di superfluo, come una sorta di tentativo ulteriore di far convivere Dos e GNU/Linux in uno stesso disco. In realtà non è così, perché SYSLINUX consente l'avvio di un sistema GNU/Linux in modo abbastanza semplice, nelle situazioni dove con altri metodi ciò può risultare troppo complicato.

SYSLINUX mette a disposizione un programma Dos, SYSLINUX.EXE, e un programma per GNU/Linux, syslinux, che predispone un dischetto, o una partizione, inizializzati precedentemente con un file system Dos-FAT, in modo da avviare un kernel Linux. Si procede nel modo seguente per creare un dischetto di avvio nella prima unità a dischetti:

C:\> SYSLINUX A:[Invio]

Oppure:

syslinux /dev/fd0[Invio]

Ma in modo analogo si potrebbe agire se al posto del dischetto si sta preparando una partizione, avendo però l'accortezza che questa partizione si trovi entro i primi 1 024 cilindri dell'unità di memorizzazione e facendo in modo che la partizione risulti avviabile in qualche modo.

Ciò che si ottiene con l'uso di uno dei comandi appena mostrati è l'inserimento nel dischetto o nella partizione del programma LDLINUX.SYS e la creazione di un settore di avvio opportuno, che si occupa di avviare tale programma. Il minimo indispensabile per avviare il sistema è l'aggiunta nel dischetto o nella partizione (nella directory radice) di un kernel Linux denominato convenzionalmente LINUX. Tuttavia, è conveniente predisporre un file di configurazione, SYSLINUX.CFG, in modo da poter sfruttare effettivamente i vantaggi di questo sistema di avvio.

Una volta predisposto il dischetto o la partizione, il kernel può essere sostituito quanto si vuole e così anche la configurazione nel file SYSLINUX.CFG. Il settore di avvio del dischetto o della partizione si limita ad avviare il programma LDLINUX.SYS, il quale provvede poi a leggere la configurazione e ad avviare il kernel.

49.3.1   Configurazione

Il file SYSLINUX.CFG, che serve alla configurazione di questo sistema di avvio, è un file di testo normale, in cui le righe sono terminate indifferentemente con il carattere <LF> o con la sequenza <CR><LF> (in pratica, si può creare sia utilizzando strumenti Dos che Unix).

Concettualmente assomiglia al file /etc/lilo.conf di LILO, con il vantaggio, rispetto a questo, di non dover creare un collegamento tra il settore di avvio, la configurazione e il kernel. Qui tutto viene gestito dal programma LDLINUX.SYS che si occupa di leggere la configurazione all'avvio e di agire di conseguenza.

L'esempio seguente mostra le caratteristiche principali di questo file di configurazione. In particolare permette di avviare il kernel contenuto nel file LINUX, con diversi comandi di avvio.

DEFAULT linux
TIMEOUT 0
DISPLAY INTRO.TXT
PROMPT 1

F1 INTRO.TXT
F2 VARIE.TXT
 
LABEL linux
        KERNEL LINUX

LABEL floppy
        KERNEL LINUX
        APPEND "ramdisk_start=0 load_ramdisk=1 prompt_ramdisk=1"

LABEL hda1
        KERNEL LINUX
        APPEND "root=/dev/hda1 ro"

Segue la descrizione delle direttive che appaiono nell'esempio.

49.3.2   File di aiuto

SYSLINUX ha una caratteristica importante: consente di predisporre diversi file di aiuto selezionabili dall'utente, prima dell'avvio del kernel. Questi file possono essere visualizzati premendo i tasti funzionali, secondo quanto definito all'interno del file di configurazione.

Dal momento che SYSLINUX non visualizza l'elenco dei tasti utilizzabili, è opportuno che uno di questi file sia visualizzato inizialmente, attraverso l'istruzione DISPLAY; inoltre è opportuno che in tutti questi file ci sia il riepilogo dei vari tasti che possono essere premuti.

Figura 49.8. Esempio di come potrebbe apparire una guida del genere, con i suggerimenti del caso.

Dischetto di avvio multiuso.

        "linux"  avvia il kernel nel modo predefinito
        "floppy" avvia un dischetto come ramdisk
        "hda1"   avvia il filesystem contenuto nella partizione /dev/hda1

Per ulteriori informazioni si può leggere la guida abbinata al tasto F2.

F1=INTRO  F2=VARIE

49.4   Parametri di avvio

Il kernel non è sempre in grado di individuare da solo tutti i dispositivi fisici installati e a volte si desidera comunque di potergli dare delle istruzioni prima del suo avvio. Si tratta di parametri che gli possono essere passati in vari modi, per esempio:

Questi parametri, quando sono forniti, vengono indicati tutti insieme, separati tra loro da uno spazio. Ogni parametro non può contenere spazi.

Nella sezione seguente vengono indicati solo alcuni tipi di questi parametri. In particolare, non vengono descritti quelli specifici per i vari tipi di hardware. Il capitolo 73 raccoglie più dettagli sui parametri di avvio.

49.4.1   Opzioni generali di avvio ed esempi

Si tratta di indicazioni date al kernel senza riferimenti a tipi particolari di hardware.

Tabella 49.9. File system principale.

Sintassi Descrizione
root=dispositivo
Permette di indicare un dispositivo differente da quello predefinito per innestare il file system principale.
ro
Permette di definire un accesso iniziale al file system principale in sola lettura. Questa è la condizione necessaria per poter eseguire un controllo dell'integrità del file system prima di passare alla gestione normale.
rw
Permette di definire un accesso iniziale al file system principale in lettura e scrittura.

Tabella 49.10. Memoria.

Sintassi Descrizione
mem=dimensione
In caso di necessità, permette di definire la dimensione di memoria RAM che si ha a disposizione effettivamente. Si può indicare un numero esadecimale nella forma 0x..., oppure un numero decimale normale, seguito eventualmente dalla lettera k, che sta a indicare kibibyte (simbolo: «Kibyte»), oppure dalla lettera M, che sta a indicare mebibyte (simbolo: «Mibyte»).

Tabella 49.11. Varie.

Sintassi Descrizione
init=programma_iniziale
Permette di definire il nome, completo di percorso, del programma che deve svolgere le funzioni di «processo iniziale» (Init). Il kernel provvede da solo a cercare /sbin/init e in alternativa /etc/init. Come ultima risorsa tenta di avviare /bin/sh. Se per qualunque motivo non funziona il programma Init standard, si può tentare di avviare il sistema facendo partire la shell al suo posto.
reserve=indirizzo_i_o,estensione\
  \[,indirizzo_i/o,estensione]...
Permette di isolare una o più zone di indirizzi di I/O in modo che il kernel non esegua alcun tentativo di identificazione di componenti in quella zona. Di solito, dopo un'opzione del genere, si inseriscono le dichiarazioni esplicite dei dispositivi che ci sono effettivamente. Il primo valore, quello che esprime l'indirizzo, viene espresso attraverso una notazione esadecimale del tipo consueto (0x...), mentre il secondo è un numero decimale.

Come è accennato nella sezione 49.4, esistono diversi modi per fornire al kernel delle opzioni di avvio. Questi esempi dovrebbero chiarire le possibilità che ci sono a disposizione.

49.5   1024 cilindri

Quando si utilizza l'architettura x86, il firmware, cioè il BIOS, potrebbe non essere in grado di accedere a settori oltre il 1 024-esimo cilindro (cioè oltre il cilindro numero 1 023 di un disco fisso). Di conseguenza, se il programma che si occupa di caricare il kernel (qualunque sia il sistema operativo) si deve avvalere delle funzioni del BIOS per questo, non può raggiungere file oltre quel limite dei 1 024 cilindri.

Generalmente, i sistemi di avvio installati nel disco fisso si avvalgono di porzioni di codice inserito all'interno di settori che altrimenti sarebbero inutilizzati, con cui gestiscono in proprio il caricamento del kernel, senza dover utilizzare le funzioni limitate del BIOS. Tuttavia, anche così facendo, ci sono situazioni in cui il problema non viene aggirato in modo efficace, oppure si ripresenta benché con limiti meno stretti.

Quando ci si trova in difficoltà la directory /boot/ di un sistema GNU/Linux, assieme a tutto il suo contenuto, e il kernel, devono trovarsi fisicamente entro il 1 024-esimo cilindro. In pratica, per essere certi che questo si avveri, si può utilizzare una partizione apposita per questi file, nella parte sicura del disco. È poi sufficiente innestare questa partizione nel file system generale, eventualmente riproducendo la directory /boot/ attraverso un semplice collegamento simbolico.

49.6   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) Probabilmente, questa possibilità riguarda solo gli elaboratori x86.

2) util-linux: rdev   GNU GPL

3) KNL   GNU GPL

4) Loadlin   GNU GPL

5) Per conoscere i dettagli sul funzionamento di Loadlin conviene consultare la documentazione allegata al programma.

6) Il file system UMSDOS utilizza un file system Dos-FAT attraverso degli artifici, in modo da mostrare a un sistema GNU/Linux un file system Unix. È importante osservare che questo tipo di file system è estremamente fragile ed è assolutamente sconsigliabile il suo utilizzo, salvo per scopi dimostrativi.

7) SYSLINUX   GNU GPL


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome caricamento_di_gnu_linux.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!