martedì 8 aprile 2008

Come installare Ubuntu su un Hard Disk esterno USB

Maria Susana Diaz | 08:31 |
Con l'arrivo sul mercato di memorie USB dell'ordine del GB ed in particolar modo con alcuni dischi rigidi esterni mi sono chiesto: sarebbe possibile installare una distribuzione Linux su questi supporti ed essere in grado di avviarla su qualsiasi macchina?

Dopo varie prove ho raggiunto il mio obiettivo e in questo tutorial cerchero' di spiegare come ho fatto.

Prima di addentrarmi nei dettagli implementativi desidero sottolineare alcuni vantaggi che porta questa soluzione:

· per prima cosa l'utente ha a disposizione tutte le feature di una distribuzione come Ubuntu installata in maniera canonica su un disco fisso;
· secondariamente questo sistema ha la capacita' di autoconfigurarsi all'avvio esattamente come una distro Live;
· infine esso e' in grado, grazie ad una chain load da floppy o da CD, di avviarsi su qualsiasi macchina.
A queste tre caratteristiche ne vanno aggiunte altre di natura secondaria ma pur sempre rilevanti come:
· i privilegi di root su qualsiasi macchina;
· il vantaggio di poter customizzare il proprio ambiente di lavoro;
· ed in ultima analisi questo sistema e' potenzialmente il miglior Rescue System che si possa desiderare.

Ho optato per un disco rigido piuttosto che una memoria flash in quanto quest'ultima ha un numero predefinito di scritture, limite inaccettabile per un S.O. che deve continuamente scrivere log files, aggiornare il database dei file ecc...

Scelta della distribuzione:



La scelta e' ricaduta su Xubuntu perche':
· ha tutti i pregi di una Ubuntu
· e' leggera, requisito necessario per la portabilita'
· e' di dimensioni contenute, 600MB in meno rispetto a Ubuntu/Kubuntu
piu' nello specifico la release che ho usato e' Xubuntu 6.06.1 (Dapper Drake)
update: dove necessario ho specificato le modifiche nel caso utilizziate la nuova Edgy Eft.

Installare Xubuntu sul disco esterno USB:
La fase di installazione non presenta particolari accorgimenti rispetto ad una normale installazione di Xubuntu, per questo vi rimando alla Ubuntu Installation Guide che trovate sul CD di installazione sotto doc/install/manual/en/index.html o al wiki in italiano

Le varie fasi dell'installazione sono:
1. Check available memory
2. Selecting Localization Options
3. Choosing a Keyboard
4. Looking for the Ubuntu Installer ISO Image
5. Configuring Network
6. Partitioning and Mount Point Selection

a questo punto bisogna conoscere qual'e' il disco da partizionare.

Se usate il Desktop-CD: per aprire un terminale Applications->Terminal (caso Dapper Drake) , Applications->System->Terminal (caso Edgy Eft)
Se usate l'Alternate-CD: Con il comando ctrl+alt+F2 entrate nella console #2 (ctrl+alt+F1 per tornare alla console #1)

Con il comando fdisk -l viene visualizzata una lista dei dispositivi di storage disponibili ( e' facile riconoscere il disco in base alla dimensione, nel mio caso 10GB )
user@ubuntu:~$ fdisk -l

Disk /dev/sda: 10.0 GB, 10000005120 bytes
255 heads, 63 sectors/track, 1215 cylinders
Units = cilindri of 16065 * 512 = 8225280 bytes

Dispositivo Boot Start End Blocks Id System
/dev/sda1 1 1215 9759456 b W95 FAT32
Eventuali ambiguita' possono essere risolte con il comando dmesg | less che visualizza i messaggi del kernel, nel mio caso mostra: user@ubuntu:~$ dmesg | less
....
usb 4-6: new high speed USB device using ehci_hcd and address 2
Initializing USB Mass Storage driver...
scsi0 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 2
usb-storage: waiting for device to settle before scanning
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
Vendor: Model: TOSHIBA MK2006GA Rev: BY30
Type: Direct-Access ANSI SCSI revision: 00
usb-storage: device scan complete
Driver 'sd' needs updating - please use bus_type methods
SCSI device sda: 19531260 512-byte hdwr sectors (10000 MB)
sda: assuming drive cache: write through
SCSI device sda: 19531260 512-byte hdwr sectors (10000 MB)
sda: assuming drive cache: write through
sda: sda1
sd 0:0:0:0: Attached scsi disk sda
sd 0:0:0:0: Attached scsi generic sg0 type 0
.....
Solitamente i dischi USB vengono visti come dischi SCSI col nome sda, sdb, sdc ecc.., mentre le partizioni all'interno di un disco sono viste come sd?1 sd?2 ecc..

Per una guida al partizionamento consultate Partizioni per Ubuntu Desktop

Come configurazione ho scelto:
o Una partizione swap da 500MB (/dev/sda1)
o Un'unica partizione per Linux da 3.5 GB di tipo ext3 (/dev/sda2)
o Una partizione da 6GB vista come "chiavetta USB" di tipo fat32 (/dev/sda3)
user@ubuntu:~$ fdisk -l

Disk /dev/sda: 10.0 GB, 10000005120 bytes
255 heads, 63 sectors/track, 1215 cylinders
Units = cilindri of 16065 * 512 = 8225280 bytes

Dispositivo Boot Start End Blocks Id System
/dev/sda1 1 62 497983+ 82 Linux swap / Solaris
/dev/sda2 63 488 3421845 83 Linux
/dev/sda3 489 1215 5839627+ b W95 FAT32
7. Base System Installation
8. Copying Remaining Packages to the Hard Disk
9. Detecting other operating systems

N.B.: Aggiungere altri S.O. al boot loader, che non risiedano sul disco USB, e' inutile.

10. Install the Grub Boot Loader on a Hard Disk

Il boot loader deve essere installato sul MBR del vostro disco USB, nel mio caso su /dev/sda
( non /dev/sda1, non /dev/sda2 e non /dev/hda ma su /dev/sda )
Boot del sistema:
Se il BIOS lo supporta e' possibile fare il boot da USB. In tali bios sono presenti le opzioni di boot usb-hdd, usb-fdd e usb-zip.
N.B. Si deve usare l'opzione usb-hdd, per ulteriori spiegazioni rimando a { README on using SYSLINUX with USB keys }
The proper mode to boot a USB key drive in is "USB-HDD". That is the
ONLY mode in which the C/H/S geometry encoded on the disk itself
doesn't have to match what the BIOS thinks it is. Since geometry on
USB drives is completely arbitrary, and can vary from BIOS to BIOS,
this is the only mode which will work in general.

Altrimenti e' necessario fare il boot da floppy/CD.
L'idea e' quella di fare il boot da floppy/CD del kernel Linux presente sul disco USB (chain load).
Attualmente non e' disponibile "in modo esplicito" un boot loader che riesca a fare un chain load verso dispositivi USB.

Alcuni risolvono questo problema copiando su un CD l'immagine del kernel + l'initram e poi facendo il boot da CD. Qusto comporta 2 svantaggi: in primo luogo con ogni aggiornamento del kernel e' necessario rimasterizzare il CD di boot, secondariamente, poiche' la dimensione del kernel + l'initram superano abbondantemente la capacita' di un floppy, su quei sistemi che non supportano il boot direttamente da CD e' necessario bootare da floppy (chain load) ad esempio con Smart Boot Manager
Io ho risolto il problema grazie a kboot.
kboot is a proof-of-concept implementation of a Linux boot loader based on kexec.

Praticamente ho creato un piccolo Linux composto dal solo kernel ( con supporto alla Tastiera, USB, CPU, Video Testuale e poco piu' ) e l'initram, il quale, una volta avviato da floppy o da CD, e' in grado tramite kexec di caricare il Linux presente sul disco esterno.
kexec is a set of systems call that allows you to load another kernel
from the currently executing Linux kernel.

Mi sto' dilungando troppo per i dettagli relativi a questo metodo, forse faro' un tutorial piu' avanti.

Per ora scaricate l'archivio kboot_usb.tar.gz e estraetelo.

Alcune note:

Come pre-bootloader ho usato Grub. Il mio metodo prevede che sul disco USB siano presenti, nella root della partizione indicata dal parametro usbboot, i file:
vmlinuz
initrd.img
vmlinuz.old
initrd.img.old

Nel caso di Ubuntu dovrebbero esistere di default come link all'ultimo kernel e al precedente.
Se come parametro viene passato oldkernel viene caricato vmlinuz.old
Inoltre i parametri che iniziano con t_ (target) verranno passati al kernel residente sul disco USB senza il prefisso t_

Quindi in generale si tratta di editare il file menu.lst e impostare
usbboot=nome partizione che contiene i file vmlinuz ecc..
root=/dev/nome partizione radice del sistema

Nel mio caso, avendo fatto un'unica partizione per Linux, coincidono e sono sda2.

Come dicevo, dopo averlo estratto, troverete una cartella bootcd e un'immagine di un floppy floppy.img

Come creare il CD di avvio:
1. entrate nella cartella bootcd/boot/grub
2. editate il file menu.lst
3. Sia da un sistema win che Linux aprite un terminale/prompt dei comandi
portatevi nella cartella appena prima di bootcd ed eseguite
user@ubuntu:~$ mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o bootcd.iso bootcd
mkisofs fa parte del pacchetto cdrecord
4. adesso siete proti a masterizzare l'immagine bootcd.iso con il vostro software preferito
Come creare il floppy di avvio:
1. scrivere l'immagine sul floppy:
da Linux usate il comando dd
user@ubuntu:~$ dd if=floppy.img of=/dev/fd0
oppure da win usate rawwrite
2. entrate nel floppy e editate il file boot/grub/menu.lst
Riavviate facendo il boot dal CD o dal floppy.
Vi si presenta la schermata di Grub con le seguenti opzioni:
· Ubuntu, kernel: avvia Ubuntu usando le ultime impostazioni
· Ubuntu, kernel autoconfigure: avvia Ubuntu eseguendo l'autoconfigurazione
· Ubuntu, kernel (recovery mode): avvia Ubuntu in recovery mode
· le precendenti con il kernel old: usa i file vmlinuz.old e initrd.img.old
Fatta la scelta, carica kboot e vi presenta una shell
kboot:
aspettate che trovi il disco usb
kboot: sda: assuming drive cache: write through
sda: assuming drive cache: write through
e poi premete invio. Se tutto e' andato bene dovrebbe caricare Ubuntu.
Rendere il nuovo sistema autoconfigurabile come una distribuzione Live:
Dopo un po' di reverse engineering/ricerche ho capito come funziona il boot di Ubuntu:

Alcuni link interessanti che spiegano il funzionamento di initramfs e come usarlo sono:
· New Models for Initial RAM Disks 'Introducing initramfs'
· How to use initramfs

Qui di seguito riassumo brevemente: all'avvio il boot loader carica il kernel, il quale controlla la presenza del parametro initrd= che specifica qual'e' l'initial root filesystem.
Se e' presente viene scompattato in RAM e montato come radice del sistema "/" . A questo punto se il filesystem in RAM contiene un programma chiamato "/init" il kernel lo esegue come primo programma.
Fino a qui il comportamento e' il medesimo per tutte le distribuzioni che usano il kernel 2.6.X.

Cio' che cambia da distribuzione a distribuzione e' il comportamento dettato dal file init.

Una prima cosa utile da sapere è che Ubuntu usa la funzione log_begin_msg per stampare i messaggi che appaiono durante il boot nella splash screen.

Diversamente da quello che si potrebbe pensare la diversita' tra l'avvio della versione Live rispetto a quella normale risiede nel parametro di avvio boot=casper il quale, dopo essere analizzato dallo script init, fa si che BOOT assuma il valore "casper" sovrascrivendo il valore di default "local" ( /conf/initramfs.conf ) in questo modo init carica le funzioni contenute nel file /scripts/casper al posto di /scripts/local
file: init
...
boot=*)
BOOT=${x#boot=}
;;
...
. /scripts/${BOOT}


Ricerca personalizzata






Se ti è piaciuto l'articolo, iscriviti al feed per tenerti sempre aggiornato sui nuovi contenuti del blog:

Trovato questo articolo interessante? Condividilo sulla tua rete di contatti in Twitter, sulla tua bacheca su Facebook, in Linkedin, Instagram o Pinterest. Diffondere contenuti che trovi rilevanti aiuta questo blog a crescere. Grazie!

LINKEDIN