The book
Transcript
The book
The book Nicola Corriero - Eustrat Zhupa Indice I Primo Avvio 1 1 Download 2 2 How to 3 2.1 Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2 Hard Disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.3 Grub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.4 Bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.5 How To . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3 Whys 7 3.1 7 Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1 Configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.1.2 Componenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Hard Disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.2.1 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.3 BootLoader - Grub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.4 Bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.5 Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.5.1 24 3.2 Configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 FAQ 25 4.1 Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 4.2 Hard disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.3 Grub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.4 Bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 I II Shell 27 5 Download 28 6 How to 29 6.1 Coreutils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 6.2 e2fsprogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 6.3 Util-Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 6.4 Startup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 III Emacs 37 7 Download 38 II Parte I Primo Avvio Capitolo 1 Download Il seguente è un elenco esaustivo delle componenti da scaricare dalla rete e necessarie per la creazione della distribuzione in questione. Si suggerisce di scaricare i sorgenti all’interno della cartella /usr/src della distro ospite e scompattare i sorgenti ognuno in una propria cartella. A tal proposito si suggerisce la creazione di uno script in bash per automatizzare il tutto. #! /bin/sh for i in *.tar.gz; { tar xvf $i } for j in *.tar.bz2; { tar xjvf $j } Salviamo il file in scompatta.s e dopo aver reso eseguibile lo script tramite il comando chmod +x scompatta.s. Il risultato sarà la creazione per ogni file all’interno della cartella di esecuzione dello script di una cartella contenente la decompattazione del file sorgente. • Scaricare i (file) sorgente del kernel dal sito http://www.kernel.org/pub/linux/kernel/ • Scaricare i sorgenti dal sito ftp://alpha.gnu.org/gnu/grub/grub-0.97.tar.gz • Scaricare i sorgenti dal sito http://ftp.gnu.org/gnu/bash/ 2 Capitolo 2 How to 2.1 Kernel 1. Aprire la cartella /usr/src/Linux-source-{ versione } 2. Lanciare la configurazione del kernel tramite uno dei comandi • make menuconfig • make xconfig • make qconfig 3. Includere nel kernel, non come moduli, le componenti relative al riconoscimento delle perifiche usb o sata 4. Includere nel kernel le componenti relative ai filesystem ext e alle perifiche di input come mouse e tastiera1 5. Salvare la configurazione appena creata (di default nel file .config) 6. Lanciare il comando make 7. Lanciare il comando make bzImage 8. Lanciare il comando make modules 1 Si veda la sezione Whys per un esempio di selezione moduli 3 2 – How to 2.2 Hard Disk 1. Procurarsi una hard disk rimovibile usb di almeno 1 gb (consigliate 2 gb). 2. Avviare Linux e collegarlo al pc 3. Entrare nella shell 4. Lanciare il comando cfdisk /dev/sda (sdb o sdc o ... nel caso siano presenti altre periferiche usb o sata) 5. Creare una partizione delle dimensioni desiderate di tipo Linux (83). 6. Confermare i cambiamenti effettuati tramite la scrittura sul disco. 7. Uscire da cfdisk 8. Lanciare il comando mkfs.ext2 /dev/sda1 (mkfs.ext3) per creare una filesystem sul hard disk rimovibile 9. Creare la cartella come punto di montaggio /mnt/hd 10. Montare l’hd appena formattato tramite mount -t ext2 /dev/sda1 /mnt/hd 11. Entrare nella cartella /mnt/hd 12. Creare alcune cartelle tramite il comando mkdir bin boot etc dev lib sbin boot/grub lib/tls tmp var 13. Entrare nella cartella dev e lanciare il seguente comando mknod console c 5 1 2.3 Grub 1. Entrare nella cartella /usr/src/grub-0.97 2. Lanciare la verifica della configurazione tramite lo script ./configure 3. Lanciare il comando make per la compilazione del codice sorgente 4. Verificare la presenza dei file stage1 e stage2 nella cartella 5. Entrare nella sottocartella /usr/src/grub-0.97/grub 6. Verificare la presenza dell’eseguibile chiamato grub 4 2 – How to 7. Copiare all’interno della cartella boot/grub dell’hard disk rimovibile i file stage1 e stage2 presenti nella cartelle /usr/src/grub-0.97/{ stage1 - stage2} 8. Copiare i file ∗ stage1 5 dalla cartella ./grub-0.97/stage2 alla cartella /mnt/hd/boot/grub 9. Avviare grub tramite il comando grub da digitare nella shell di comando 10. Lanciare il comando root ( e tramite il tasto TAB verificare le possibiltà 11. Dovrebbero essere almeno 2 uno per l’hard disk su cui è attualmente installato Linux, l’altro per l’hard disk rimovibile su cui stiamo installando Linux. In particolare saranno visualizzati anche le partizioni presenti con i relativi filesystem 12. Scegliamo il secondo hard disk, cioè l’hard disk rimovibile (il comando sarà qualcosa simile a root (hd1,0) ) 13. Lanciamo il comando setup (hd1) si noti che non è necessario specificare la partizione 14. Se tutto è ok, possiamo lanciare il comando quit per uscire dal grub. 2.4 Bash 1. Entrare nella cartella /usr/src/bash-3.2 2. Lanciare il comando ./configure per verificare la configurazione del sistema 3. Lanciare il comando make per compilare i sorgenti 4. Verificare la presenza dell’eseguibile bash nella cartella 5. Entrare nella cartella /usr/src/{ linux-source - versione}/arch/i386/boot 6. Copiare il file bzImage qui presente nella cartella boot dell’hard disk rimovibile cambiando il nome in vmlinuz tramite il comando cp bzImage /mnt/hd/boot/vmlinuz 7. Copiare l’eseguibile di bash compilato nella cartella bin dell’hard disk rimovibile 8. Entrare nella shell 9. Posizionarsi nella cartella dove è presente l’eseguibile bash 10. Lanciare il comando ldd ./bash 11. Verranno visualizzate un elenco di librerie necessarie per l’esecuzione di bash ciascuna con il proprio PATH. 5 2 – How to 12. Copiare tutte le librerie rispettando il PATH sull’hard disk rimovibile. 13. Entrare nella cartella /bin dell’hard disk rimovibile 14. Creare un link simbolico a bash tramite il comando ln -s bash sh 2.5 How To 1. Spegnere il pc 2. Inserire l’hard disk rimovibile 3. Avviare il pc 4. Entrare nel Bios (solitamente i tasti per accedervi sono DEL o F12 o F2) 5. Entrare nel menu Boot 6. Verificare la presenza del proprio hard disk rimovibile tra i dischi rigidi e impostare la priorità di boot come primaria per l’hd stesso 7. Nel caso in cui l’hd non sia presente tra i dischi rigidi impostare come primo dispositivo di boot le periferiche rimovibili seguite dagli hard disk. 8. Salvare le modifiche ed uscire dal bios (solitamente tramite F10) 9. Attendere l’avvio del pc dall’hard disk rimovibile 10. Verrà mostrato la riga di comando del grub 11. Lanciare il comando root(hd0,0) 12. Lanciare il comando kernel con i parametri kernel /boot/vmlinuz root=/dev/sda1 rootdelay=10 init=/bin/bash 13. Lanciare il comando boot 6 Capitolo 3 Whys 3.1 Kernel Tutte le componenti del sistema operativo Linux hanno il codice sorgente aperto e disponibile per la consultazione e la compilazione. Il codice sorgente del kernel di Linux è depositato sul sito www.kernel.org. Su questo sito è possibile scaricare qualsiasi versione del kernel a partire dalla 1.0 datata 1994 e di soli 1,2 mb. Per ogni versione sono disponibili i codici sorgenti, eventuali patch applicabili su di essi, un file per ogni release in cui sono contenute le differenze rispetto la precedente. La versione attuale è la 2.6. Le sue dimensioni sono di circa 50 mb. La gestione delle release avviene tramite l’uso della punteggiatura. L’importanza del dominio va da sinistra a destra. Con la versione attuale è stato deciso di aumentare il numero di livelli di dominio e portarli a 4. L’ultima versione sarà la 2.6.24.3. Qualsiasi cosa presente su questo sito scaricabile è fornita in due tipi di compressione la bz2 e la gz. Il codice del kernel presenta un’ulteriore compressione, applicata prima di queste ultime, la tar. Le compressioni sono in formato tipico per ambienti Linux. Per questioni puramente di semantica delle cartelle sarebbe opportuno scaricare e decomprimere il codice appena scaricato all’interno della cartella /usr/src, la quale rappresenta di default la cartella contenente il codice scaricato dall’utente all’interno del filesystem Linux. Si veda la man page per la sintassi e semantica dei comandi da usare per questa sezione quali ad esempio tar. La configurazione del kernel è la parte più importante e problematica. Il kernel è composto da tante componenti. Alcune di queste sono parte integrante e necessaria. Per tante altre, invece, si ha sia la possibilità di includerle direttamente, facendole quindi diventare parte integrante, sia di implementarle come moduli da includere nel kernel quando questo è già in esecuzione. La procedura di compilazione del kernel è preceduta dalla configurazione dello stesso tramite un 7 3 – Whys qualsiasi ambiente di configurazione. Per poter entrare in uno di questi ambienti è necessario andare sulla shell, entrare all’interno della cartella in cui si è scompattato il codice sorgente del kernel, e lanciare uno di questi comandi: make menuconfig Tool di configurazione basato su menu testuale. make xconfig Tool di configurazione basato su librerie QT. make gconfig Tool di configurazione basato su librerie GTK+. make oldconfig Aggiorna la configurazione corrente del kernel usando il file .config corrente e chiedendo conferma per ogni nuova opzione aggiunta al kernel. make silentoldconfig Come oldconfig, ma non stampa nulla su schermo tranne quando una questione ha bisogno di una risposta. make defconfig Tool di configurazione che usa le risposte presenti nel file /$ARCH/defconfig. per tutte le opzioni. make allyesconfig Genera una nuova configurazione del kernel nel quale tutte le opzioni sono impostate a yes. make allmodconfig Genera una nuova configurazione del kernel nel quale i moduli sono attivati dove possibile. make allnoconfig Genera una nuova configurazione del kernel nel quale tutte le opzioni sono impostate a no. make randconfig Genera una nuova configurazione di kernel con risposte casuali a tutte le differenti opzioni. In questi ambienti si ha la possibilità di scegliere per ogni componente tra le tipologie. Y (include nel kernel quella componente come parte integrante); M (compila la componente come modulo inizialmente esterno al kernel); N (non specifica niente su quella componente ossia non la compila). La differenza tra gli ambienti è di tipo grafico. I primi tre comandi permettono di accedere ad un’interfaccia grafica in cui tramite una vista ad albero si ha la possibilità di scegliere l’opzione da attivare per ogni componente del kernel. Ognuna di queste interfacce utilizza delle librerie particolari, quindi è probabile che il tentativo di eseguire uno di questi comandi non vada a buon fine per la mancanza all’interno del proprio sistema di alcune librerie o programmi necessari. In tal caso si può tentare di esaudire le richieste dell’interfaccia installando le librerie o i programmi o di optare per un altro ambiente di configurazione. L’ultimo comando, invece, fornisce la possibilità di configurare le componenti tramite un’interfaccia di tipo testuale molto semplice e poco personalizzabile dall’utente per la presenza di molte scelte di default che l’utente non può modificare. Quando si lancia il comando per la configurazione, vengono eseguiti dei controlli e delle verifiche 8 3 – Whys del sistema al fine di accertarsi la presenza delle librerie e dei programmi necessari per poter eseguire la configurazione e successivamente la compilazione del kernel stesso. Nei prossimi paragrafi saranno presentati alcuni errori comuni per ogni tipologia di configurazione scelte con le relative soluzioni. Il comando make è uno dei più importanti dell’intero sistema Linux. Esso, infatti, è il responsabile della compilazione del codice. É possibile compilare un singolo file o programma o un’intera gerarchia di file come nel caso dei sorgenti di Linux. Per poter essere eseguito, make necessita di alcune regole di compilazione. Queste regole sono scritte nel makefile e di solito sono generate dallo script che precede la compilazione chiamato configure. Nel kernel, in particolare, oltre al makefile si ha la necessità di leggere ciò che è scritto nel .config che è il file generato dalla configurazione del passo precedente e che contiene informazioni circa ogni componente del kernel. Il comando make quindi leggendo dal makefile e dal .config compila ricorsivamente il codice C presente nei sorgenti. Le figure che seguono illustrano come si presenta l’esecuzione dei diversi comandi utili alla configurazione del kernel. Figura 3.1. Schermata comando config Compilazione. Il comando make bzImage ha l’obiettivo di creare un eseguibile del kernel bzImage, collocato nella cartella /usr/src/Linux-source/arch/i386/boot/ e compresso tramite il formato bz. Nei vecchi kernel era presente solamente il formato zImage solo che per la scarsa capacità di questo formato a gestire kernel di grosse dimensioni e dal momento che con il passare del tempo i kernel stanno inglobando moduli sempre più voluminosi si è pensato di usare un 9 3 – Whys Figura 3.2. Figura 3.3. Schermata comando menuconfig Schermata comando xconfig formato di compressione più efficiente. Il kernel compresso in fase di esecuzione si decomprime automaticamente. Compilazione dei moduli. La compilazione dei moduli è altrettanto importante in quanto ci fornisce la possibilità di avere a disposizione tutti le componenti del kernel che in fase di compilazione abbiamo scelto di compilare come moduli e di usarli inserendoli nel kernel già in esecuzione. 10 3 – Whys Figura 3.4. Schermata comando gconfig Se necessario dopo la compilazione è utile lanciare il comando make modules install il quale avrà come output la creazione della cartella /lib/modules/{versione − del − kernel} al cui interno sarà presente l’albero dei moduli appena compilati. 3.1.1 Configurazione La configurazione del kernel è alla base di tutto il lavoro utile per la realizzazione della distro. A questo proposito ci si soffermi sull’importanza della scelta di includere alcuni moduli piuttosto che altri: oltre alla scelta del processore per un’ottimizzazione del kernel, alla disattivazione di funzioni di cui non si necessita , alla scelta del dispositivo adatto per il funzionamento corretto delle unità disco IDE e all’attivazione del supporto per i file system presenti e cosı̀ via, ci sono delle opzioni, apparentemente nascoste, che invece possono essere molto più importanti di quanto non si possa credere. Cambiando postazione ospitante, da una portatile ad una fissa, ci si accorge che mentre il mouse e/o la tastiera prima funzionavano perfettamente, ora il pc, che ha le periferiche stesse collegate tramite porta PS/2, non le riconosce assolutamente. Il tutto inizialmente può sembrare strano, ma cosı̀ non è, infatti è sufficiente andare a ricercare all’interno dell’ambiente di configurazione del kernel la voce riguardante i collegamenti del mouse e la tastiera e includerle nel kernel. Un semplice riavvio del kernel permette di notare che tutti i dispositivi ora collegati al pc funzionano perfettamente. Questo appena riscontrato è un semplice caso che però può essere esteso a una qualsiasi altra componente hardware del pc. In parole povere spesso la causa di problemi di natura hardware del computer risiede nel kernel, o meglio nella sua configurazione. 11 3 – Whys Una volta raggiunta una configurazione accettabile si può pensare di migliorare il kernel stesso seguendo questi tre punti: • SNELLIRE. Il kernel standard fornito con i CD di installazione è un modello universale adatto un pò per tutti i computer e tutti i componenti hardware, ma contenente una sovrabbondanza di accessori inutili per il caso specifico. Ricompilandolo, si eliminano i driver relativi a dispositivi che non sono presenti nel vostro computer e quindi il kernel occupa meno spazio in memoria. Lo spazio liberato diventa disponibile per eseguire altri programmi. • OTTIMIZZARE. Il kernel può essere impostato in modo da sfruttare le caratteristiche specifiche del vostro particolare modello di processore, consentendo elaborazioni più rapide ed efficienti. • AGGIORNARE. Periodicamente il kernel di Linux viene aggiornato per perfezionarlo o consentirgli di gestire nuovi componenti hardware. La ricompilazione serve per includere questi aggiornamenti nella vostra installazione senza dover reinstallare tutto il sistema operativo. 3.1.2 Componenti Solitamente nelle distro Linux si usa una initrd da passare tramite Grub all’avvio del sistema operativo. Per poter eseguire il boot, il kernel deve arrivare a montare il filesystem radice. Se si usa un initrd, il kernel carica prima un file initrd e lo monta nella RAM come RAM disk. L’initrd contiene essenzialmente i moduli del kernel necessari a montare il filesystem radice ed uno o più script che caricano questi moduli e quando è possibile montano il vero filesystem radice ed eseguono il programma init, che completerà l’avvio del sistema operativo. I moduli fondamentali che un’initrd passa al kernel sono quelli relativi ai driver necessari al funzionamento del dispositivo in cui è presente il file system radice, ad esempio IDE o SCSI o USB. Per precisa scelta progettuale legata alla scarsa possibilità di personalizzazione dell’initrd, si è optati per la creazione di un kernel contenente i moduli necessari all’avvio senza quindi, utilizzare l’in initrd stesso. Questa scelta rende la fase di configurazione del kernel molto importante. I moduli fondamentali da includere sono quelli relativi come detto ai device di memorizzazione e al filesystem. • Sezione Device Driver – SCSI device support – Serial Ata and Parallel Ata drivers 12 3 – Whys – Usb Support • Sezione File Systems – Scegliere il filesystem da utilizzare (consigliato ext3) – Scegliere il supporto per eventuali filesystem Windows (NTFS,VFAT) • Sezione Processor Type and features – Processor Family Esiste un comando che elenca i dispositivi collegati tramite la porta pci. In questo esempio di esecuzione del comando si ha un’idea dell’importanza di tale comando. debian:~# lspci 0000:00:00.0 Host bridge: Intel Corporation 915G/P/GV/GL/PL/910GL Processor to I/O Controller (rev 0e) 0000:00:02.0 VGA compatible controller: Intel Corporation 82915G/GV/910GL Express Chipset Family Graphics Controller (rev 0e) 0000:00:1d.0 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1 (rev 04) 0000:00:1d.1 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2 (rev 04) 0000:00:1d.2 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3 (rev 04) 0000:00:1d.3 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4 (rev 04) 0000:00:1d.7 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller (rev 04) 0000:00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev d4) 0000:00:1e.2 Multimedia audio controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC’97 Audio Controller (rev 04) 0000:00:1f.0 ISA bridge: Intel Corporation 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge (rev 04) 0000:00:1f.1 IDE interface: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller (rev 04) 0000:00:1f.2 IDE interface: Intel Corporation 82801FB/FW (ICH6/ICH6W) SATA Controller (rev 04) 0000:00:1f.3 SMBus: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller (rev 04) 0000:01:01.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10) debian:~# L’output del comando ci fornisce le direttive per la scelta dei moduli da includere nel kernel in fase di configurazione. Bus options (PCI, PCMCIA, EISA, MCA, ISA) ---> -- PCI support ... [*] PCI Express support Processor type and features ---> Processor family (Pentium-Pro) ---> ( ) 386 ( ) 486 ( ) 586/K5/5x86/6x86/6x86MX ( ) Pentium-Classic 13 3 – Whys ( ) Pentium-MMX (X) Pentium-Pro Device Drivers ---> SCSI device support ---> <*> SCSI device support ... --- SCSI support type (disk, tape, CD-ROM) <*> SCSI disk support ... SCSI low-level drivers ---> <*> Serial ATA (SATA) support ... <*> File systems Intel PIIX/ICH SATA support ---> <*> Second extended fs support ... <*> Ext3 journalling file system support Per la versione del kernel 2.6.23 l’insieme dei moduli minimo necessari per l’avvio di un sistema linux da penna usb con filesystem ext3 è rappresentato dal seguente elenco Processor type and features ---> Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon) Device Drivers ---> <*> ATA/ATAPI/MFM/RLL support <*> ---> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support --- Please see Documentation/ide.txt for help/info on ID [*] Support for SATA (deprecated; conflicts with libata [*] Use old disk-only driver on primary interface <*> Include IDE/ATA-2 DISK support [*] Use multi-mode by default ... <*> SCSI emulation support [*] IDE ACPI support SCSI device support ---> <*> RAID Transport Class --- SCSI device support <*> SCSI target support [*] legacy /proc/scsi/ support --- SCSI support type (disk, tape, CD-ROM) <*> SCSI disk support ... <*> SCSI generic support <*> SCSI media changer support 14 ---> 3 – Whys <*> Serial ATA (prod) and Parallel ATA (experimental) drivers <*> ---> AHCI SATA support ... <*> Generic ATA support [*] USB support <*> ---> Support for Host-side USB [*] USB verbose debug messages --- Miscellaneous USB options [*] USB device filesystem [*] USB device class-devices (DEPRECATED) <*> EHCI HCD (USB 2.0) support ... <*> USB Mass Storage verbose debug [*] Datafab Compact Flash Reader support (EXPERIMENTAL) [*] Freecom USB/ATAPI Bridge support [*] ISD-200 USB/ATA Bridge support [*] Microtech/ZiO! CompactFlash/SmartMedia support [*] USBAT/USBAT02-based storage support (EXPERIMENTAL) [*] SanDisk SDDR-09 (and other SmartMedia) support [*] SanDisk SDDR-55 SmartMedia support (EXPERIMENTAL) [*] Lexar Jumpshot Compact Flash Reader (EXPERIMENTAL) [*] Olympus MAUSB-10/Fuji DPC-R1 support (EXPERIMENTAL) [*] [*] File systems USB Mass Storage support [*] Support for Rio Karma music player The shared table of common (or usual) storage devices ---> ... <*> Ext3 journalling file system support ... DOS/FAT/NT Filesystems ---> <*> VFAT (Windows-95) fs support <*> NTFS file system support 3.2 [*] NTFS debugging support [*] NTFS write support Hard Disk Per poter eseguire tutte le operazioni di seguito è necessario aver installato su un calcolatore una qualsiasi release di Linux. Data la generalità dei comandi usati e dei programmi cui si è fatto riferimento, infatti, qualsiasi release di Linux soddisfa i requisiti minimi richiesti. Tuttavia è necessario ricordare come talvolta sarà necessario installare delle librerie, programmi o pacchetti 15 3 – Whys di utility alla nostra release per poter soddisfare le singole richieste di requisiti dei singoli software che si andrà a compilare. La shell rappresenta nei sistemi Linux la riga di comando. Nel corso degli anni sono state implementate diverse versioni di shell. La shell che abbiamo adottato è Bash, comunissima shell con cui è possibile lanciare comandi built-in e comandi di sistema esterni a bash stesso. [1 - 7] Creazione della partizione. Nell’ambiente di shell sono presenti due possibilità per poter creare una partizione: una testuale (fdisk), l’altra grafica (cfdisk). Sono due programmini molto semplice e con un help abbastanza esauriente. Per poter comprendere quale dispositivo aprire è necessario inserire l’hard disk e lanciare il comando mount il quale mostrerà un elenco di tutti i dispositivi o risorse montate nel filesystem. L’output del comando mount è in forma tabellare e ci dà la possibilità di leggere molte informazioni sui dispositivi montati quale: punto di montaggio, tipo di file dispositivo cui si fa riferimento, filesystem del dispositivo e le opzioni per il montaggio. Il motivo per cui abbiamo lanciato il comando mount è quello di verificare se vi sono presenti altri dispositivi che utilizzano i file dispositivo di tipo sd. Nel caso non ci sia alcun dispositivo possiamo lanciare il comando cfdisk /dev/sda. In alternativa i file cui si farà riferimento sono /dev/sdb o /dev/sdc a seconda se vi siano presenti uno o più hard disk sul proprio computer di tale tipologia. É consigliata una partizione di 1 gb per il sistema base. Figura 3.5. Schermata comando cfdisk [8] 16 3 – Whys Creazione del filesystem. In questa fase sarà creato il filesystem sulla partizione appena creata. La scelta del filesystem non è univoca, infatti, per Linux sono disponibili alcuni filesystem diversi ognuno con delle peculiarità che li rendono molto caratteristici. Nonostante ciò è consigliabile usare un filesystem della famiglia ext perchè più performante. I filesystem tra cui scegliere sono il filesystem ext2 ed ext3. Con il filesystem ext3 sono state introdotte alcuni funzionalità , prima non previste, molto interessanti quali il journaling.Un filesystem che supporta il journaling registra i cambiamenti prima di effettuarli sul sistema principale. Questi filesystem hanno minori probabilità di risultare alterati (corrotti) in caso di mancata alimentazione o di caduta del sistema. Figura 3.6. Schermata comando gparted Un’alternativa più user-friendly del sistema di gestione delle partizioni e dei filesystem è l’uso di un programma grafico gparted di cui è possibile osservare uno screenshot nella figura precedente. [9 - 11 ] Montaggio del dispositivo. La fase del montaggio è molto importante in quanto ci dà la possibilità di scrivere e leggere dal dispositivo. Questo è possibile poichè il montaggio prevede l’inserimento all’interno dell’albero del filesystem del contenuto del dispositivo in questione. Per una questione di pura semantica delle cartelle del filesystem di Linux sarebbe opportuno montare il dispositivo nella cartella /mnt. La sintassi del comando mount è semplice e prevede una prima parte per definire il file dispositivo ed una seconda che definisce il mount-point all’interno del filesystem. Questa impostazione di default può essere eventualmente estesa con delle opzioni tra cui la specifica del filesystem (-t ext2, -t vfat , -t ntfs, ...) o i permessi di scrittura sul disposito (ro , rw). [ 12 ] 17 3 – Whys Creazione dell’albero del filesystem. Tramite il comando mkdir si creano le cartelle dell’albero del filesystem. Il comando dà la possibiltà di creazione delle cartelle inserendo sia un path assoluto sia relativo a partire dalla cartella in cui siamo. Infatti al punto precedente era richiesto di cambiare la cartella locale per non appesantire la sintassi del comando. Alcune cartelle per il momento resteranno vuote, altre saranno riempite a seconda delle necessità . [ 13 ] Creazione della console. Il comando mknod è usato per la creazione di file speciali quali quelli a caratteri o a blocchi. Nel caso in questione si sta cercando di creare un file speciale a caratteri di tipo console. L’opzione c, infatti, fa riferimento ai file a caratteri e i due interi successivi sono il numero primario e secondario di dispositivo. É possibile dichiarare ed usare sino a 63 console facendo variare il numero secondario tra il valore 1 e il 63. La console per il momento è l’unico dispositivo di cui abbiamo bisogno per poter visualizzare a video i messaggi. 3.2.1 Problems I file di dispositivo o device file sono particolari file che i sistemi Unix-like associano ai dispositivi fisici. La maggior parte dei file dei device sono creati durante l’installazione della distribuzione. La lista dei file di device supportati dal kernel Linux si trova in /usr/src/linux/Documentation/devices.txt. Un file di dispositivo è caratterizzato da : • nome è il nome del file che identifica il dispositivo (non ha nessuna influenza sul funzionamento del dispositivo); • tipo è il tipo del dispositivo. Può essere a blocchi (hard disk, CD-ROM, ...) o a caratteri (terminali, unità a nastro, ...); • major number indica il driver che gestisce il funzionamento del dispositivo; • minor number identifica il dispostivo per il driver; Nel caso fosse necessario creare un nuovo file di device, si può usare lo script MAKEDEV presente in /dev/MAKEDEV o all’interno della cartella /sbin. Questi file di dispositivo fungono da driver per il sistema e permettono di gestire i meccanismi per la comunicazione con un particolare dispositivo considerato. A tal proposito provando a far partire la distribuzione all’interno di una partizione del pc, senza utilizzare un hard disk rimovibile, ci si rende conto dell’assenza dei file dispositivo corretti, e se mentre con lo script MAKEDEV si erano creati sotto /dev i file sd*, ora ci sarà bisogno di altri file che però siano hd*. L’elenco delle partizioni riconosciute dal sistema è contenuto nel file /proc/partitions. 18 3 – Whys 3.3 BootLoader - Grub Il BootLoader è un programma indispensabile per l’avvio del sistema operativo Linux. La sua importanza risiede nel fatto che fornisce la possibilità di definire gli eseguibili da avviare e di poter specificare delle opzioni su questi eseguibili. Inoltre è possibile anche specificare su quale hard disk e su quale partizione risiedono questi eseguibili. Vi sono diversi bootloader presenti nel mondo Linux. Si è scelti di usare il grub senza un motivo preciso essendo tutti molto semplici da usare e configurare. [1 - 3] La compilazione della maggior parte dei programmi in ambiente Linux è preceduta dalla configurazione la quale avviene solitamente tramite l’esecuzione di uno script il cui scopo principale è verificare che il sistema sia in grado di affrontare con successo la compilazione. In questa fase, infatti, vengono verificate le presenze dei programmi e librerie necessarie per la compilazione. La scelta di far precedere la compilazione con l’esecuzione di questo script è funzionale anche alla ricerca dei problemi in quanto lo script è progettato per il blocco immediato in caso di problemi in modo da dar la possibiltà all’utente di capire e risolvere velocemente i problemi incontrati. L’output di questo script è la creazione del makefile la cui assenza impedisce l’esecuzione del comando di compilazione make. Il comando make come detto anche in precedenza compila ricorsivamente tutte le cartelle presenti. Per questo motivo è necessario spostarsi nella sottocartella grub per poter ritrovare il grub appena compilato. [4 - 8] La fase di installazione è abbastanza atipica ed è dovuta al fatto di installare un programma su un computer diverso da quello su cui si è effettuati la compilazione. La prima fase prevede la copia di alcuni eseguibili dalla cartella di origine alla cartella /boot/grub presente sull’hard disk di destinazione. Questi nomi hanno un significato molto chiaro, riferendosi agli stadi in cui è suddivisa la fase di avvio. Se si osserva bene, si può notare che il file stage1 è lungo esattamente 512 byte, ovvero un settore: questo è il primo pezzo di codice che viene utilizzato durante l’avvio. Il file stage2 rappresenta invece il codice necessario al completamento dell’avvio, mentre i file della serie ∗ stage1 5 rappresentano una fase intermedia che potrebbe inserirsi, sempre se necessario, subito prima di stage2. Si può notare come i file eseguibili, i cui nomi hanno come suffisso stage1 5, hanno come prefisso il nome di un filesystem. Tra questi, quindi, sarebbe opportuno copiare quelli rappresentanti filesystem in uso sul computer su cui si farà partire il sistema. Ovviamente sono consigliati i filesystem windows (vfat e ntfs) e quelli Linux. [9 - 14] All’interno dell’ambiente grub è possibile eseguire alcuni comandi tipici. Per poter avere un elenco 19 3 – Whys di questi comandi è sufficiente premere il tasto TAB. Un’interessante funzionalità della linea di comando di grub è il completamento automatico sia dei comandi che dei valori in input. Tramite il tasto TAB, infatti, è possibile sia avere il completamento della scrittura del comando sia ottenere, fissato il comando, un elenco dei possibili valori di input. Ad esempio, il comando root prevede in input il disco e la partizione da far diventare root. Dopo aver scritto il comando e aperta la parentesi premendo il tasto TAB ci apparirà una lista esaustiva degli hard disk rilevati, delle partizioni rilevate su ogni hard disk e dei filesystem presenti su ogni partizione facilitando in maniera considerevole la comprensione e la ricerca della partizione. Nel caso di ambiguità sulla scelta lanciare il comando find /boot/grub/stage1 per ottenere l’elenco delle partizioni candidate Figura 3.7. Schermata comando root all’interno di grub nella shell Il comando root come detto serve per poter definire quale partizione contiene i file per l’avvio, mentre il comando setup contiene solo l’identificativo del disco sul cui Master Boot Record (MBR) andrà ad installare il bootloader. Durante l’esecuzione del comando setup verrà verificata la presenza dei su citati file richiesti per una corretta installazione di grub. Eventualmente è possibile estendere il grub tramite alcuni file di configurazione da inserire all’interno della cartella /boot/grub quali ad esempio il menu.lst. In questo file sarà possibile creare e settare un menu testuale che facilita l’inserimento dei comandi in quanto dà la possibilità di definire delle voci rappresentanti dei gruppi di comandi con opzioni (root - kernel - boot). 20 3 – Whys Figura 3.8. 3.4 Schermata comando setup all’interno di grub nella shell Bash Installazione del kernel. In questa fase verrà copiato il kernel compilato in precedenza sull’hard disk. Per questioni storiche e di semantica sarebbe opportuno rinominare nella copia il nome della bzImage in vmlinuz. La bzImage si trova nella cartella /usr/src/{ linux-source-versione }/arch/i386/boot, mentre la copia va inserita nella cartella /mnt/hd/boot/. Installazione di bash. Ogni eseguibile in ambiente Linux necessita di alcune librerie per poter essere eseguito. Il comando ldd fornisce in output una tabella rappresentante la lista delle librerie necessarie per l’esecuzione del file in input. La lista comprende anche la collocazione fisica della libreria in questione all’interno del filesystem. Per poter quindi installare bash o qualsiasi altro eseguibile dal disco ospite a quello target è necessario copiare, rispettando fedelmente il percorso fisico all’interno del filesystem, le librerie in output dal comando ldd. Si noterà sicuramente la presenza di ridondanza nelle librerie in quanto molti eseguibili dipendono dallo stesso gruppo di librerie. Infine si può notare come le cartelle in cui saranno copiate le librerie e quindi da cui saranno prelevate sono la cartella /lib e la cartella /usr/lib. Nel nostro caso avviando il comando ldd bash nella shell della distro ospite otterremo l’elenco delle librerie e la loro collocazione fisica all’interno del nostro filesystem. /usr/src/bash-3.2... ldd ./bash 21 3 – Whys linux-gate.so.1 => (0xffffe000) libncurses.so.5 => /lib/libncurses.so.5 (0xb7f68000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7f64000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7e1b000) /lib/ld-linux.so.2 (0xb7fad000) /usr/src/bash-3.2... L’output è composto da due colonne indicanti il nome della libreria e la collocazione fisica della stessa nel filesystem dopo il simbolo =>. Durante la copia delle librerie è necessario rispettare il path della stessa nel filesystem. L’unica eccezione riguarda la libreria linux-gate.so.1 a cui non fa riferimento alcun file fisico ma solo una cella di memoria. Tale libreria è infatti creata dinamicamente dal kernel (a partire dalla versione 2.6) ed è usata per gestire gli interrupt. Infatti il kernel all’avvio quando riconosce il processore su cui sta partendo il sistema crea tale libreria a seconda della tipologia dello stesso per ottimizzare la gestione delle chiamate di sistema. 3.5 Test Il Bios (Basic Input Output System) è il primo codice eseguito da un personal computer. Le sue funzionalità sono inerenti l’hardware. Entrando nel menu del Bios, infatti, è possibile settare l’orario e la data di sistema, verificare la presenza e il corretto funzionamento dei dispostivi hardware installati, decidere su quale componente reperire il codice del sistema operativo. La nostra necessità di interagire con il menu del Bios è proprio quella di modificare e impostare la componente su cui ricercare il sistema operativo da avviare. Gli hard disk rimovibili dovrebbero essere riconosciuti dal Bios tra le perifiche rimovibili, ma dal momento che sono presenti numerose varianti di Bios diverse tra loro, a volte capita di ritrovare il proprio hard disk rimovibile tra gli hard disk (non rimovibili). Ora, poichè è molto frequente la presenza di più hard disk su di un computer, è stato introdotto nel menu del Bios la funzionalità di scelta della priorità tra gli hard disk in fase di boot. Qualora il proprio hard disk rimovibile fosse incluso in questo menu di scelta basterà settare la priorità maggiore. Nel Bios è presente sia la possibilità di salvare le modifiche sia quella di resettare le scelte di default in modo da evitare spiacevoli problemi all’avvio. Dopo aver avviato il pc dall’hard disk rimovibile appare la shell di grub dal momento che non abbiamo ancora personalizzato grub con il menu (file menu.lst). Lanciamo il comando root (hd0,0). Per conferma è possibile usare il tasto Tab per capire quanti hard disk vengono rilevati dal grub. Nel nostro caso non ci sono dubbi in quanto hd0 risulta coincidere sempre con l’hard disk di boot, quindi 22 3 – Whys quello rimovibile. Lanciamo il comando kernel. Questo comando serve a definire in maniera precisa quale sarà il file eseguibile da avviare e soprattutto fornisce la possibilità di settare alcuni parametri fondamentali per il corretto avvio del sistema operativo. Nella definizione dell’eseguibile dobbiamo indicare esplicitamente il percorso in cui si trova quindi dobbiamo precisare il file /boot/vmlinuz. Le opzioni necessarie in questa fase sono root, rootdelay e init. L’opzione root. Dopo l’esecuzione del kernel e il riconoscimento da parte dello stesso dei dispositivi presenti sul pc in esecuzione, il kernel passa il comando ad una partizione con un proprio filesystem su un hard disk presente. Per poter specificare quale partizione e quale hard disk aver come riferimento è necessario passare al boot loader tramite l’opzione root= il device di riferimento con la relativa partizione. Si noti che la partizione e l’hard disk vengono individuati come se l’ambiente Linux fosse già caricato. In particolare quindi viene specificata la cartella su cui sarà presente il file dispositivo e il nome di tale file. La sintassi per il file è semplice: si specifica anzitutto il prefisso indicante la tipologia dell’hard disk, segue una lettera indicante la gerarchia tra i vari dispositivi dello stesso tipo. Infine viene specificata la partizione attraverso un numero. Per intenderci facciamo degli esempi: • /dev/hda1 Prima partizione presente sul primo hard disk di tipo eide/scsi. • /dev/hda4 Quarta partizione presente sul primo hard disk di tipo eide/scsi. • /dev/hdb1 Prima partizione presente sul secondo hard disk di tipo eide/scsi. • /dev/sda1 Prima partizione presente sul primo hard disk di tipo sata/usb. • /dev/sdc6 Sesta partizione presente sul terzo hard disk di tipo sata/usb. Con la versione del kernel 2.6.22 sono state implementate alcune nuove funzionalità . Per la gestione delle perferiche usb sono stati introdotti i device uba. Tale funzione ci permette di considerare in maniera distinta gli hard disk sata rispetto alle periferiche usb con vantaggi ben visibili all’interno del grub ad esempio dove il comando kernel diventa univoco per tutte le macchine kernel /boot/vmlinuz root=/dev/uba1 rootdelay=10 init=/bin/bash cosa che prima non accadeva in quanto era necessario personalizzarlo a seconda del numero di hard disk presenti. 23 3 – Whys 3.5.1 Configurazione L’opzione rootdelay, invece serve a definire il numero di secondi che deve attendere il kernel prima di cercare la root. Questa opzione è fondamentale per kernel su hard disk usb, in quanto queste necessitano di alcuni secondi per poter essere riconosciute. Un tempo abbastanza ragionevole si aggira sui 10 secondi. L’opzione init. Dopo aver caricato il kernel in memoria e dopo aver riconosciuto il filesystem della partizione di root, è necessario specificare quale sarà il processo iniziale tramite l’opzione init. Nelle distribuzioni Linux classiche questo è un processo fondamentale in quanto è il responsabile dell’avvio dei processi demoni, del caricamento in memoria dei moduli del kernel, dell’avvio degli script di configurazione, dell’avvio del server grafico o di altri server necessari al sistema operativo. Nel caso in questione non avendo ancora installato alcun programma sarà sufficiente specificare come processo iniziale l’eseguibile di bash collocato nella cartella /bin per poter far avviare il sistema con la shell di bash. Dopo aver lanciato questo comando grub preleva il kernel dal filesystem e lo carica in memoria verificando quindi che non vi siano problemi di file not found. Lanciando il comando boot verrà eseguito tale file dando l’avvio effettivo al sistema operativo. Alla fine del caricamento dovrebbe apparire la shell di bash. Ora è possibile verificare il funzionamento della stessa tramite il test di qualche comando presente (echo, eval,... ) e di qualche comando assente (ls, cd, ...). La procedura vista per l’installazione di bash sarà ripetuta in maniera piuttosto simile per altri comandi tipici della shell. 24 Capitolo 4 FAQ 4.1 Kernel Segnalate problemi ed eventuali domande da inserire in questa sezione • Cosa rappresenta un Kernel Panic? Una condizione di “kernel panic” si presenta quando il sistema operativo rileva un errore irreversibile che necessita il riavvio del sistema. La procedura del kernel che gestisce la condizione di “panico” è conosciuta come panic() ed è stata progettata per visualizzare un messaggio sulla console, copiare su disco un’immagine della memoria del kernel per consentire un successivo debugging e attende un riavvio manuale del sistema. Molto spesso le condizioni di “kernel panic” sono determinate dai tentativi del sistema operativo di leggere un indirizzo di memoria non valido o non autorizzato. In altri casi, sono determinate da un errore a livello di hardware oppure da un “bug” del sistema operativo. Quando Linux non sa come procedere, come in questo caso, esso visualizza un messaggio di “kernel panic” e si ferma. Ma, anche in caso di “panico”, il sistema si ferma in modo “elegante”. Cerca di scrivere su disco tutto quello che non è stato possibile trascrivere (operazione che si chiama “syncing”), e se l’operazione riesce, viene visualizzato il messagio “not syncing”. Chiaramente il messaggio visualizzato è fuorviante, perché in realtà non è quello il motivo del “panico”. Molto spesso nei casi di “panico” viene visualizzato il messaggio “tried to kill init”. In realtà , il messaggio indica che il processo chiamato init sta “morendo”, cosa che non è permessa perché init è un programma speciale per Linux, creato quando il sistema viene avviato. 25 4 – FAQ • Non parte il comando make menuconfig. Come faccio a capire il problema? 4.2 Hard disk • scrittura cfdisk 4.3 Grub • root(hd0,0) • setup(hd0) 4.4 Bash 26 Parte II Shell Capitolo 5 Download • Scaricare l’ultima versione dal sito ftp://ftp.gnu.org/gnu/coreutils/ attualmente la 6.9 • Scaricare dal sito http://sourceforge.net/projects/e2fsprogs/ il pacchetto contenente utility sul filesystem • Scaricare dal sito ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux/ l’ultima release del pacchetto util-Linux 28 Capitolo 6 How to 6.1 Coreutils 1. Entrare nella cartella /usr/src/coreutils-6.9 2. Lanciare il comando da shell ./configure 3. Lanciare il comando make 4. Entrare nella sottocartella src 5. In questa cartella è possibile ritrovare il codice sorgente dei comandi più comuni della shell, il codice oggetto frutto della compilazione e l’eseguibile appena creato 6. Copiare i più importanti e comuni da questa cartella alla cartella bin dell’hard disk tramite in comando cp. Ad esempio si potrebbe lanciare il comando cp cat chgrp chmod chown cp date dd df /mnt/hd/bin cp hostname ln ls mkdir mkfifo mknod /mnt/hd/bin cp mv rm rmdir stty su sync uname /mnt/hd/bin 7. Verificare la necessità di altre librerie da includere tramite il comando ldd come fatto per bash 8. Copiare le librerie necessarie rispettando lo stesso PATH. 6.2 e2fsprogs 1. Entrare nella directory e2fsprogs contenente i sorgenti 29 6 – How to 2. Configurare la variabile d’ambiente come segue export CC=“gcc -mcpu=i386” 3. Lanciare il comando ./configure –host=i386-pc-linux-gnu 4. Lanciare la compilazione tramite il comando make 5. Entrare nella cartella e2fsck 6. Lanciare il comando cp e2fsck.shared /mnt/hd/sbin/e2fsck 7. Entrare nella cartella ../misc 8. Lanciare il comando cp fsck mke2fs /mnt/hd/sbin 9. Entrare nella cartella /mnt/hd/sbin 10. Creare dei lik simbolici tramite i comandi • ln -s e2fsck fsck.ext2 • ln -s mke2fs mkfs.ext2 6.3 Util-Linux 1. Entrare nella cartella /usr/src/{util-Linux-versione} 2. Lanciare il comando ./configure 3. Lanciare il comando make 4. Copiare gli eseguibili appena creati sull’hard disk rimovibile tramite i comandi • cp disk-utils/mkfs /mnt/hd/sbin • cp fdisk/fdisk /mnt/hd/sbin • cp login-utils/agetty /mnt/hd/sbin • ln -s agetty /mnt/hd/sbin/getty • cp login-utils/login /mnt/hd/bin • cp misc-utils/kill /mnt/hd/bin • cp mount/mount /mnt/hd/bin • cp mount/umount /mnt/hd/bin • cp mount/swapon /mnt/hd/sbin 30 6 – How to • cp sys-utils/dmesg /mnt/hd/bin 5. Verificare la necessità di copiare le librerie necessarie tramite il comando ldd 6. Entrare nella cartella /mnt/hd/dev 7. Creare il file dispositivo • mknod null c 1 3 • mknod fd0 b 2 0 • mknod ram0 b 1 0 8. Entrare nella cartella /mnt/hd/etc 9. Usando un editor di testo (grafico o anche testuale come vi o emacs) creare il seguente file fstab proc /proc proc defaults 0 0 /dev/sda1 / ext2 defaults 1 1 10. Creare un file vuoto sempre nella cartella /mnt/hd/etc tramite il comando echo -n ¿ mtab 11. Lanciare il comando mkdir /mnt/hd/etc/init.d 31 6 – How to 12. Creare il seguente file in questa cartella e rinominarlo local fs #!/bin/sh # # local fs - check and mount local filesystems # PATH=/sbin:/bin ; export PATH fsck -ATCp if [ $? -gt 1 ]; then echo “Errori presenti nel filesystem! Si richiede intervento manuale.” /bin/sh else echo “Rimontaggio di / in modalità lettura-scrittura.” mount -n -o remount,rw / echo -n >/etc/mtab mount -f -o remount,rw / echo “Montaggio del filesystem locale.” mount -a -t nonfs,nosmbfs fi # # end of local fs 13. Lanciare il seguente comando per rendere eseguibile il file appena creato chmod +x local fs 6.4 Startup 1. Creare il file menu.lst all’interno della cartella /boot/grub sull’hard disk destinazione. 2. Popolare il file con default 0 timeout 3 color cyan/red white/blue title MVux 32 6 – How to root (hd0,0) kernel /boot/vmlinuz root=/dev/sda1 rootdelay=10 boot 3. Entrare nella cartella /usr/src/sysvinit{versione}/src sulla distro ospite 4. Lanciare il comando make 5. cp init halt shutdown /mnt/hd/sbin 6. ln -s halt /mnt/hd/sbin/reboot 7. ln -s init /mnt/hd/sbin/telinit 8. mknod /mnt/hd/dev/initctl p 9. Creare il seguente file di testo e salvarlo come /etc/inittab sull’hard disk destinazione # /etc/inittab - init daemon configuration file # # Default runlevel id:1:initdefault: # # System initialization si:S:sysinit:/etc/init.d/rc S # # Runlevel scripts r0:0:wait:/etc/init.d/rc 0 r1:1:respawn:/bin/sh r2:2:wait:/etc/init.d/rc 2 r3:3:wait:/etc/init.d/rc 3 r4:4:wait:/etc/init.d/rc 4 r5:5:wait:/etc/init.d/rc 5 r6:6:wait:/etc/init.d/rc 6 # # end of /etc/inittab 10. Creare il seguente file di testo e salvarlo come /etc/init.d/rc #!/bin/sh # /etc/init.d/rc - runlevel change script # PATH=/sbin:/bin SCRIPT_DIR="/etc/rc$1.d" # # Check that the rcN.d directory really exists. if [ -d $SCRIPT_DIR ]; then # Execute the kill scripts first. for SCRIPT in $SCRIPT_DIR/K*; do if [ -x $SCRIPT ]; then 33 6 – How to $SCRIPT stop; fi; done; # Do the Start scripts last. for SCRIPT in $SCRIPT_DIR/S*; do if [ -x $SCRIPT ]; then $SCRIPT start; fi; done; fi # end of /etc/init.d/rc 11. chmod +x /mnt/hd/etc/init.d/rc 12. Modificare il file local fs in modo da inserire la sezione per l’unmount del filesystem come di seguito riportato #!/bin/sh # # local_fs - check and mount local filesystems # PATH=/sbin:/bin ; export PATH case $1 in start) echo "Checking local filesystem integrity." fsck -ATCp if [ $? -gt 1 ]; then echo "Filesystem errors still exist! Manual intervention required." /bin/sh else echo "Remounting / as readwrite." mount -n -o remount,rw / echo -n > /etc/mtab mount -f -o remount,rw / echo "Mounting local filesystems." mount -a -t nonfs,smbfs fi ;; stop) echo "Unmounting local filesystems." umount -a -r ;; *) echo "usage: $0 start|stop"; ;; esac # # end of local_fs 13. Creare il seguente file di testo e salvarlo in /etc/init.d/hostname sull’hard disk destinazione 34 6 – How to #!/bin/sh # # hostname - set the system name to the name stored in /etc/hostname # PATH=/sbin:/bin:/usr/bin:/usr/sbin ; export PATH echo "Setting hostname." if [ -f /etc/hostname ]; then hostname $(cat /etc/hostname) else hostname mvux-linux fi # # end of hostname 14. Creare il seguente file di testo e salvarlo come /etc/init.d/halt sull’hard disk destinazione #!/bin/sh # # halt - halt the system # PATH=/sbin:/bin ; export PATH echo "Initiating system halt." halt # # end of /etc/init.d/halt 15. Creare il seguente file di testo e salvarlo come /etc/init.d/reboot sull’hard disk destinazione #!/bin/sh # # reboot - reboot the system # PATH=/sbin:/bin ; export PATH echo "Initiating system reboot." reboot # # end of /etc/init.d/reboot 16. chmod +x /mnt/hd/etc/init.d/* 17. cd /mnt/hd/etc 18. mkdir rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rcS.d 19. cd rcS.d 20. ln -s ../init.d/local fs S20local fs 21. ln -s ../init.d/hostname S30hostname 35 6 – How to 22. cd ../rc0.d 23. ln -s ../init.d/local fs K10local fs 24. ln -s ../init.d/halt K90halt 25. cd ../rc6.d 26. ln -s ../init.d/local fs K10local fs 27. ln -s ../init.d/reboot K90reboot 36 Parte III Emacs Capitolo 7 Download 1. Entrare nella cartella /var/cache/apt/archives 2. Lanciare il comando rm *.deb 3. Scaricare il seguente elenco di pacchetti debian tramite il comando apt-get install -d --reinstall nomepacchetto dove per nomepacchetto si intende: • libncurses5 • ncurses-base • ncurses-term • emacs22-nox 1 • emacs22-bin-common • emacs22-common • emacsen-common • bsdutils • bsdmainutils • liblockfile1 • debianutils 4. Creare il seguente file di testo e rinominarlo in scompattadeb 1A seconda della distro usata potrebbe essere necessario far riferimento alla versione 21 o precedente del pacchetto 38 7 – Download #! /bin/sh for i in *.deb; { dpkg-deb -x $i $1 } 5. Dare permessi di esecuzione al file appena creato tramite il comando chmod +x scompattadeb 6. Eseguire il comando scompattadeb emacs per creare la cartella emacs all’interno della directory 7. Cancellare i pacchetti appena scaricati. 8. Copiare il contenuto della cartella emacs all’interno dell’hard disk destinazione 9. Entrare nella cartella /var/cache/apt/archives/emacs/usr/bin 10. Lanciare il comando ldd emacs21 11. Verificare la presenza di tutte le librerie richieste ed eventualmente copiare quelle non presenti nell’hard disk destinazione (probabilmente manca libm.so.*) 12. Riavviare la distro e testare lanciando il comando all’interno della cartella /usr/bin ./emacs22. 39