<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.21"> <TITLE>Linux Bootdisk HOWTO: FAQ</TITLE> <LINK HREF="Bootdisk-HOWTO-6.html" REL=next> <LINK HREF="Bootdisk-HOWTO-4.html" REL=previous> <LINK HREF="Bootdisk-HOWTO.html#toc5" REL=contents> </HEAD> <BODY> <A HREF="Bootdisk-HOWTO-6.html">Avanti</A> <A HREF="Bootdisk-HOWTO-4.html">Indietro</A> <A HREF="Bootdisk-HOWTO.html#toc5">Indice</A> <HR> <H2><A NAME="s5">5.</A> <A HREF="Bootdisk-HOWTO.html#toc5">FAQ</A></H2> <H2><A NAME="ss5.1">5.1</A> <A HREF="Bootdisk-HOWTO.html#toc5.1">D. Come creo un boot disk con il driver XXX?</A> </H2> <P>Il modo più semplice è quello di prendere uno dei kernel precompilati distribuiti con la Slackware dal più vicino mirror site. I kernel della Slackware sono generici e includono il numero maggiore di driver per tutti i device possibili, e quindi se avete un controller SCSI o IDE, è probabile che il driver adatto sia incluso nel kernel della Slackware.</P> <P>Andate nella directory <CODE>a1</CODE> e selezionate il kernel IDE o SCSI a seconda del controller che avete. Controllate il file <CODE>xxxxkern.cfg</CODE> per il kernel scelto e controllate quali driver sono stati inclusi nel kernel. Se il device che volete è in quella lista, allora il kernel corrispondente dovrebbe essere in grado di far partire il vostro computer. Scaricate il file <CODE>xxxxkern.tgz</CODE> e copiatelo nel vostro disco di boot che è descritto sopra nella sezione su come costruire un disco di boot.</P> <P>Dovete poi controllare il root device nel kernel, usando il comando rdev:</P> <P> <BLOCKQUOTE><CODE> <PRE> rdev zImage </PRE> </CODE></BLOCKQUOTE> Rdev vi mostrerà il root device corrente nel kernel. Se questo non è lo stesso che voi volete, allora usate rdev per cambiarlo. Per esempio, il kernel che io ho provato era impostato su <CODE>/dev/sda2</CODE>, ma la mia partizione scsi root è <CODE>/dev/sda8</CODE>. Per usare un disco root, dovete usare questo comando:</P> <P> <BLOCKQUOTE><CODE> <PRE> rdev zImage /dev/fd0 </PRE> </CODE></BLOCKQUOTE> Se volete sapere come costruire un disco root tipo Slackware, sappiate che questo non è un argomento coperto da questo HOW-TO perché fuori dallo scopo per cui è stato fatto questo documento, quindi vi suggerisco di leggere la Linux Install Guide o di prendervi una distribuzione slackware. Consulate la sezione intitolata ``Referenze'' per saperne di più.</P> <H2><A NAME="ss5.2">5.2</A> <A HREF="Bootdisk-HOWTO.html#toc5.2">D. Come aggiornare il mio disco di boot con un nuovo kernel?</A> </H2> <P>Copiate il kernel sul vostro disco di boot usando il comando dd per un disco di boot senza file system, o il comando cp per un disco boot/root. Fate riferimento alla sezione intitolata ``Boot'' per maggiori dettagli.</P> <H2><A NAME="ss5.3">5.3</A> <A HREF="Bootdisk-HOWTO.html#toc5.3">D. Come tolgo LILO in modo da usare il DOS per eseguire il boot del DOS nuovamente?</A> </H2> <P>Questa non è propriamente un argomento riguardante i dischi di boot, ma è fatta così spesso... La risposta è, usate il comando DOS:</P> <P> <BLOCKQUOTE><CODE> <PRE> FDISK /MBR </PRE> </CODE></BLOCKQUOTE> MBR sta per Master Boot Record, e rimpiazza il boot sector con uno di tipo DOS, senza toccare la tavola delle partizioni. Alcuni non sono d'accordo con questo metodo, ma anche l'autore del LILO, Werner Almesberger, lo suggerisce. È semplice e funziona.</P> <P>Potete usare anche il comando dd per copiare il backup salvato dal LILO del boot sector vecchio sul boot sector nuovo - fate riferimento alla documentazione del LILO se intendete usare questo metodo.</P> <H2><A NAME="ss5.4">5.4</A> <A HREF="Bootdisk-HOWTO.html#toc5.4">D. Come posso eseguire il boot se ho perso il mio kernel _E_ il mio disco di boot?</A> </H2> <P>Se non avete un boot disk, allora la cosa più semplice da fare è procurarsi un kernel adatto dalla Slackware come descritto prima nella sezione ``Come creo un disco di boot con il driver XXX?''. Potete quindi far partire il computer usando questo kernel, e poi riparare qualunque danno sia successo.</P> <P>Il kernel che avete preso potrebbe non avere il root device settato con il tipo di disco e la partizione che voi volete. Per esempio, i kernel generici della Slackware per gli scsi hanno il root device settato a /dev/sda2, quando, invece, la mia partizione Linux si trova in /dev/sda8. In questo caso il root device del kernel deve essere cambiato.</P> <P>Potete cambiare il root device e i settaggi del ramdisk nel kernel anche se tutto ciò che avete è un kernel, e qualche altro sistema operativo come il DOS.</P> <P>Rdev cambia i parametri del kernel cambiando i valori in appositi punti del file immagine del kernel, in modo che potete fare lo stesso usando un semplice hex editor disponibile su qualunque sistema voi state usando - per esempio le Norton Utilities Disk Editor sotto DOS. Poi dovete controllare e se necessario, cambiare i valori nel kernel in questi punti:</P> <P> <BLOCKQUOTE><CODE> <PRE> 0x01F8 Low byte della grandezza del RAMDISK 0x01F9 High byte della grandezza del RAMDISK 0x01FC Root minor device number - vedi sotto 0X01FD Root major device number - vedi sotto </PRE> </CODE></BLOCKQUOTE> La grandezza di un ramdisk è il numero di blocchi di un ramdisk da creare. Se volete eseguire il boot da un disco root allora settatelo al decimale 1440, o 0x05A0, oltre ad impostare l'offset 0x01F8 a 0xA0 e l'offset 0x01F9 a 0x05. Questo allocherà sufficiente memoria per un disco da 1.4Mb.</P> <P>I numeri maggiori e minori dei device devono essere impostati sul device su cui voi volete che il root filesystem sia ``mountato''. Alcuni valori utili potrebbero essere:</P> <P> <BLOCKQUOTE><CODE> <PRE> device maggiore minore /dev/fd0 2 0 primo floppy drive /dev/hda1 3 1 partizione 1 sul primo drive IDE /dev/sda1 8 1 partizione 1 sul primo drive scsi /dev/sda8 8 8 partizione 8 sul primo drive scsi </PRE> </CODE></BLOCKQUOTE> Una volta che avete settato questi valori, potete scrivere il file su un dischetto usando o il Norton Utilities Disk Editor, o un programma chiamato <CODE>rawrite.exe</CODE>. Questo programma è incluso in molte distribuzioni, inclusa la distribuzione SLS e la Slackware. È un programma DOS che scrive un file su un disco vergine (``raw''), partendo dal boot sector, invece di scriverlo sul file system. Se usate le Norton Utilities, allora dovete scrivere il file su un disco fisico partendo dall'inizio del disco.</P> <H2><A NAME="ss5.5">5.5</A> <A HREF="Bootdisk-HOWTO.html#toc5.5">D. Come posso fare più copie di un dischetto boot/root?</A> </H2> <P>Non è mai desiderabile avere un solo set di disci di recupero; 2 o 3 copie dovrebbero essere mantenute nel caso che una non fosse leggibile.</P> <P>La via più semplice per creare delle copie di qualunque dischetto, inclusi i dischi di boot/root, è di usare il comando dd per copiare il contenuto del dischetto originale su un file sul vostro hard disk, e poi usare lo stesso comando per copiare il file su un nuovo dischetto. Notate che non avete, e non dovreste avere, bisogno di eseguire il mount dei dischi, perché dd scrive in maniere cruda sul device.</P> <P>Per copiare l'originale, usate il comando:</P> <P> <BLOCKQUOTE><CODE> <PRE> dd if=device of=nomefile dove device e` il nome del device del dischetto e nomefile e` il nome di un file su cui volete copiarlo </PRE> </CODE></BLOCKQUOTE> Per esempio, per copiare da <CODE>/dev/fd0</CODE> su un file temporaneo <CODE>/tmp/diskette.copy</CODE>, userei il comando:</P> <P> <BLOCKQUOTE><CODE> <PRE> dd if=/dev/fd0 of=/tmp/diskette.copy </PRE> </CODE></BLOCKQUOTE> </P> <P>Omettendo il parametro ``count'', come abbiamo fatto noi ora, significa che il dischetto intero di 2880 blocchi sarà copiato.</P> <P>Per copiare il file risultante su un nuovo dischetto, inserite il nuovo dischetto e usate il comando inverso:</P> <P> <BLOCKQUOTE><CODE> <PRE> dd if=nomefile of=device </PRE> </CODE></BLOCKQUOTE> Notate che il discorso precedente assume che voi abbiate un solo floppy drive. Se ne avete due dello stesso tipo, potete copiare il dischetto usando il comando:</P> <P> <BLOCKQUOTE><CODE> <PRE> dd if=/dev/fd0 of=/dev/fd1 </PRE> </CODE></BLOCKQUOTE> </P> <H2><A NAME="ss5.6">5.6</A> <A HREF="Bootdisk-HOWTO.html#toc5.6">D. Come posso eseguire il boot senza scrivere ogni volta ``ahaxxxx=nn,nn,nn''?</A> </H2> <P>Quando un device non può essere riconosciuto automaticamente dal kernel, è necessario passargli un stringa di comando, come:</P> <P> <BLOCKQUOTE><CODE> <PRE> aha152x=0x340,11,3,1 </PRE> </CODE></BLOCKQUOTE> Questo parametro può essere passato in molti modi usando LILO: <UL> <LI>Scrivendolo sulla linea di comando ogni volta che si esegue il boot del sistema, via LILO. Ciò è comunque noioso.</LI> <LI>Usando l'opzione di LILO ``lock'', in modo da memorizzare la linea di comando come la linea di comando di default; così facendo LILO userà la stessa linea di comando ogni volta.</LI> <LI>Usando l'opzione APPEND nel file di configurazione del LILO. Notate che la linea di comando deve essere racchiusa da virgolette.</LI> </UL> </P> <P>Per esempio, una riga di comando d'esempio che usa il parametro lock, dovrebbe essere:</P> <P> <BLOCKQUOTE><CODE> <PRE> zImage aha152x=0x340,11,3,1 root=/dev/sda1 lock </PRE> </CODE></BLOCKQUOTE> Questo dovrebbe passare la stringa per il device al kernel, oltre a settare il root device su <CODE>/dev/sda1</CODE> e salva l'intero comando per riutilizzarlo in futuro.</P> <P>Un esempio dell'uso di APPEND è: <BLOCKQUOTE><CODE> <PRE> APPEND = "aha152x=0x340,11,3,1" </PRE> </CODE></BLOCKQUOTE> </P> <P>Notate che il parametro NON viene incluso nelle virgolette.</P> <P>Notate inoltre che per la stringa che passate al kernel usando il parametro APPEND, bisogna che il kernel stesso abbia il supporto per quel comando. In caso contrario dovrete ricompilare il kernel con il supporto per il device richiesto. Per i dettagli su come ricompilare il kernel, cd su <CODE>/usr/src/linux</CODE> e leggete il file <CODE>README</CODE>, e leggete le LINUX FAQ e l'Installation HOWTO. Alternativamente potete ottenere un kernel generico che faccia al caso vostro.</P> <P>I lettori sono fortemente invitati a leggere la documentazione del LILO prima della sua installazione. Un uso incauto del parametro ``BOOT'' può danneggiare le partizioni.</P> <H2><A NAME="ss5.7">5.7</A> <A HREF="Bootdisk-HOWTO.html#toc5.7">D. Come creo un filesystem su un disco RAM più capiente?</A> </H2> <P>Un filesystem su un disco RAM è un filesystem residento su un disco in memoria che ha una capacità maggiore del disco di root dal quale è stato caricato. Questo può essere molto utile quando si usa Ftape, che richiede un controllo esclusivo del controller del floppy disk.</P> <P>Due cose sono richieste: creare un filesystem più capiente sul disco di root e poi applicare una ``patch'' al kernel in modo che sia in grado di caricare blocchi oltre la fine del dischetto.</P> <P>Due sono i metodi possibili: <UL> <LI>Usare il parametro ``blocks'' del programma e2fsck per specificare quanto occupa il filesystem che volete non disco RAM. Per esempio: <BLOCKQUOTE><CODE> <PRE> mke2fs /dev/fd0 3000 </PRE> </CODE></BLOCKQUOTE> creerà un filesystem su dischetto di 3000 blocchi da 1Kb. Il dischetto ha solo 1440 blocchi, ma mke2fs funzionerà correttamente lo stesso. L'importante è non usare più di 1440 blocchi per i dati (permettendo l'uso di blocchi come ``inodes'' o riservati etc).</LI> <LI>Creare una partizione sul vostro hard-disk capiente quanto il filesystem che intendete creare sul disco RAM. Poi creare un filesystem su questa partizione e mettervi i file che desiderate. Poi usate il comando dd per copiare i primi 1440 blocchi sul dischetto, e poi controllare che non sia rimasto nessun file non copiato. Per esempio: <BLOCKQUOTE><CODE> <PRE> dd if=/dev/hdb of=/dev/fd0 bs=1024 count=1440 dd if=/dev/hdb of=tailpart bs=1024 skip=1440 cmp -l tailparm /dev/zero </PRE> </CODE></BLOCKQUOTE> </LI> </UL> Scegliete una delle due; personalmente io preferisco la prima - sembra più facile e più sicura.</P> <P>La seconda cosa richiesta per avere un filesystem di maggior capienza è di far fermare il kernel alla fine fisica del disco quando tenta di caricare il dischetto di root nel disco RAM. Per fare questo bisogna apportare una piccola modifica al kernel nel driver per il disco RAM, che dovrebbe essere situato in <CODE>/usr/src/linux/drivers/block/ramdisk.c</CODE>. Il seguente ``patch'' è stato fatto da Bruce Elliot. È da applicare al kernel 1.2.0, ma dovrebbe essere facile applicarlo anche ai kernel più recenti. </P> <P> <BLOCKQUOTE><CODE> <PRE> ================================================================= X--- ramdisk.c~ Mon Jan 23 13:04:09 1995 X+++ ramdisk.c Mon May 29 00:54:52 1995 X@@ -113,6 +113,7 @@ X (struct ext2_super_block *)&sb; X int block, tries; X int i = 1; X+ int fblocks; X int nblocks; X char *cp; X X@@ -168,12 +169,16 @@ X nblocks, rd_length >> BLOCK_SIZE_BITS); X return; X } X- printk("RAMDISK: Loading %d blocks into RAM disk", nblocks); X+ fblocks = blk_size[MAJOR(ROOT_DEV)][MINOR(ROOT_DEV)]; X+ if (fblocks > nblocks) X+ fblocks = nblocks; X+ printk(``RAMDISK: Loading %d blocks into %d block filesystem " X+ "in RAM disk", fblocks, nblocks); X X /* We found an image file system. Load it into core! */ X cp = rd_start; X- while (nblocks) { X- if (nblocks > 2) X+ while (fblocks) { X+ if (fblocks > 2) X bh = breada(ROOT_DEV, block, BLOCK_SIZE, 0, PAGE_SIZE); X else X bh = bread(ROOT_DEV, block, BLOCK_SIZE); X@@ -184,7 +189,7 @@ X } X (void) memcpy(cp, bh->b_data, BLOCK_SIZE); X brelse(bh); X- if (!(nblocks-- & 15)) printk(``.''); X+ if (!(fblocks-- & 15)) printk(``.''); X cp += BLOCK_SIZE; X block++; X i++; ================================================================= </PRE> </CODE></BLOCKQUOTE> Con questa modifica, il kernel si fermerà nel caricare alla fine fisica del disco, lasciando un filesystem più capiente del disco.</P> <P>Alcuni avvertimenti: io sono stato in grado di creare in questo modo un filesystem su un disco RAM di 3500 blocchi, ma provando con 3600 o più il kernel collassava con un errore come ``fixup table corrupt''. Non sono riuscito a evitare questa cosa, ma in ogni caso 3500 blocchi mi sembrano più che sufficienti.</P> <H2><A NAME="ss5.8">5.8</A> <A HREF="Bootdisk-HOWTO.html#toc5.8">D. All'atto del boot, rivevo un errore tipo <CODE>A: cannot execute B</CODE>.</A> Perché?</H2> <P>Ci sono diversi casi di programmi che sono chiamati da altri programmi. Questi casi non avvengono sempre, ma possono spiegare perché un eseguibile apparentemente non può essere trovato su un sistema anche se potete vedere che è effettivamente presente. Potete vedere se un programma chiama un altro programma usando il comando ``strings'' e filtrando l'output attreverso il programma grep. </P> <P>Esempi conosciuti sono: <UL> <LI>Shutdown in diversi versioni chiama <CODE>/etc/reboot</CODE>, quindi <CODE>reboot</CODE> deve essere posto nella directory <CODE>/etc</CODE>.</LI> <LI>Init ha causato problemi per almeno una persona, con il kernel che non riusciva a trovarlo. </LI> </UL> Per risolvere questi problemi, spostate i programma nelle directory corrette, o cambiate i file di configurazione (per esempio <CODE>inittab</CODE>) per puntare alla directory corrette. Se siete in dubbio, mettete i programmi nelle stesse directory in cui sono sul vostro disco fisso, e usate lo stesso <CODE>inittab</CODE> e i file contenuti in <CODE>/etc/rc.d</CODE>, così come appaiono sul vostro disco fisso.</P> <HR> <A HREF="Bootdisk-HOWTO-6.html">Avanti</A> <A HREF="Bootdisk-HOWTO-4.html">Indietro</A> <A HREF="Bootdisk-HOWTO.html#toc5">Indice</A> </BODY> </HTML>