INTRODUZIONE ================================================================================ Questo e` un tutorial passo passo che spiega come convertire in maniera non distruttiva un'installazione standard di Debian 6.0 (Squeeze) da "normale" a "ridondante", ossia da configurazione con singolo disco fisso a configurazione con doppio disco fisso in schema RAID level 1. Non sara` necessario un controller dei dischi che implementi le funzionalita` RAID in hardware, in quanto si utilizzera` la funzionalita` RAID software del kernel Linux. In questo modo il computer risultera` immune al guasto di un singolo disco. Piu` precisamente il sistema verra` configurato in modo da utilizzare un array RAID1 per la partizione di sistema e un altro array RAID1 per la partizione di swap. NOTA: e` anche possibile impostare la configurazione RAID al momento dell'iniziale installazione del sistema operativo. Questo tutorial si applica invece ai casi in cui questo non sia stato fatto, magari perche' all'epoca era disponibile un solo disco fisso, oppure perche' semplicemente non ci si aveva pensato. * Per maggiori informazioni sulla tecnologia RAID, i livelli RAID e quant'altro, vedere http://en.wikipedia.org/wiki/RAID * Per maggiori informazioni sulla funzionalita` RAID software implementata nel kernel Linux vedere https://raid.wiki.kernel.org/index.php/Linux_Raid A causa di una diffusa difficolta` dei bootloader ad accedere agli array RAID software di Linux, le configurazioni RAID che vengono suggerite di solito prevedono che la partizione di boot sia una piccola partizione senza ridondanza RAID, destinata esclusivamente a contenere il kernel da caricare al boot e poco altro. In questi casi, pero`, la partizione di boot stessa non risultera` immune ai guasti e la rottura del disco di boot provochera` l'impossibilita` di effettuare il boot del sistema, se non utilizzando altri media (USB stick, floppy disk o CD-ROM avviabili). Fortunatamente, utilizzando un piccolo accorgimento, il bootloader grub (usato da Debian e da altre distribuzioni) e` invece in grado di accedere agli array RAID software di Linux. L'accorgimento in questione consiste nell'usare un formato particolare di superblock (opzione '--metadata=0.90' del comando mdadm) in modo tale che le partizioni che costituiscono l'array RAID siano non troppo differenti da una partizione ordinaria. Con questa procedura si otterra` una configurazione in grado di effettuare il boot a partire dallo stesso array RAID1 che sara` utilizzato come partizione di sistema. Il sistema sara` quindi immune al guasto singolo anche per quanto concerne il boot. PREREQUISITI E AVVERTIMENTI ================================================================================ Questo e` un tutorial pensato per gli amministratori di sistema, in particolare di sistemi Debian GNU/Linux. Sono necessari la padronanza di certi concetti di base dei sistemi operativi Unix e GNU/Linux in generale quali la sequenza di boot, l'arresto/il riavvio del sistema, il concetto di albero dei filesystem e di "montaggio/smontaggio" dei filesystem, il concetto di file di periferica, quello di periferiche a blocchi/a caratteri, il concetto di kernel e di moduli del kernel, etc. Inoltre, gran parte delle operazioni sara` svolta all'interno di una shell Bash nella console testuale. Questo comporta che, per affrontare questo tutorial, occorre una buona esperienza di uso e di amministrazione di Debian GNU/Linux dal terminale. In particolare e` richiesta la capacita` di interagire con il sistema da linea di comando (shell Bash), la conoscienza di strumenti di amministrazione di base da linea di comando, la conoscienza di almeno un editor di testo da linea di comando (ad esempio 'vi' o 'nano'), e la conoscienza _approfondita_ di almeno un programma per la modifica della tabella delle partizioni dei dischi fissi da linea di comando (ad esempio 'fdisk'). Sebbene relativo a Debian 6.0 (Squeeze), questo tutorial puo` essere utilizzato, con qualche piccolo cambiamento, anche con altre versioni di Debian, con distribuzioni derivate da Debian (una per tutte: Ubuntu) e con distribuzioni del tutto differenti. Requisito imprescindibile e` che il bootloader utilizzato sia grub in una sua recente incarnazione (versione >= 1.9). Prima di lanciarsi su una macchina reale - magari di produzione - consiglio caldamente di farsi le ossa su una macchina virtuale, o comunque di prova, in modo da comprendere pienamente il significato e lo scopo di ogni singolo passaggio ed essere cosi` in grado di approntare delle contromosse nel caso in cui qualcosa non vada nel modo previsto. IMPORTANTE: ovviamente, prima di partire, un sano backup e` d'obbligo. LEGALESE ================================================================================ Il presente tutorial e` stato messo a punto su un PC virtuale VirtualBox 3.2.12 (http://www.virtualbox.org/). Verosimilmente lo stesso procedimento ha alte probabilita` di successo anche su una macchina reale. Ciononostante l'autore non si assume nessuna responsabilita` per qualsivoglia perdita di dati incorsa a causa dell'esecuzione di questa procedura, sia su PC reali che su PC virtuali. Usa liberamente tutto quanto riportato in questo documento, ma "a tuo rischio e pericolo". Copyright 2011 Alessandro Morgantini Rilasciato sotto la licenza CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/legalcode) CONTATTI ================================================================================ Per qualsiasi problema riscontrato, osservazione o suggerimento, per favore, aggiungi un commento a questo post sul blog dell'autore: http://gpz500.wordpress.com/2011/02/19/convertire-una-macchina-debian-in-raid1-senza-reinstallare/ oppure contatta l'autore privatamente mandando un'email a questo indirizzo: Alessandro Morgantini < gpz500 at technologist dot com > Parte 0: Partenza ================================================================================ L'installazione iniziale di Debian e` stata fatta scegliendo sempre le impostazioni predefinite. Alla fine dell'installazione l'unico disco presente era partizionato come segue: Nome Tipo Descrizione ---------------------------------------------------------------------- /dev/sda1 ext3 Sistema /dev/sda2 - Partizione estesa /dev/sda5 swap Unita` logica (dentro la partizione estesa) 0. Con Debian GNU/Linux 6.0 (Squeeze) installato sul computer con un singolo disco fisso, arrestare e spegnere il computer. Parte 1: Creare gli array RAID1 e riempirli con i dati ================================================================================ 1. Aggiungere un secondo hard disk alla macchina. 2. Avviare in modalita` di ripristino: scegliere dal menu` di avvio di Debian una delle voci con la dicitura '(recovery mode)' o equivalente e premere INVIO. 3. Inserire la password di root quando richiesto. Questo aprira` una shell per l'utente root (prompt che termina con '#', non con '$'). ATTENZIONE: Tutti i comandi digitati all'interno di questa shell saranno eseguiti con i diritti di superutente (nome utente 'root'). Adesso il sistema accede ai due dischi fissi attraverso i file di periferica /dev/sda (disco gia` presente) e /dev/sdb (disco appena aggiunto). 4. Caricare il modulo del kernel per gestire gli array RAID level 1: # modprobe raid1 5. Installare il programma utente per la gestione degli array RAID: # apt-get install mdadm 6. Partizionare il secondo disco /dev/sdb: creare una grossa partizione dati (/dev/sdb1), poi una partizione estesa (/dev/sdb2) e, all'interno della partizione estesa, creare la partizione di swap (/dev/sdb5). Impostare i tipi delle partizioni /dev/sdb1 e /dev/sdb5 uguali a 'fd' (Linux raid autodetect). Al termine il disco deve risultare partizionato piu` o meno cosi`: # fdisk -l /dev/sdb Disk /dev/sdb: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x3b3b30fd Device Boot Start End Blocks Id System /dev/sdb1 1 995 7992306 fd Linux raid autodetect /dev/sdb2 996 1044 393592+ 5 Extended /dev/sdb5 996 1044 393561 fd Linux raid autodetect 7. Creare due array RAID1 per i dati e per la partizione di swap, a partire dalle partizioni appena create sul disco /dev/sdb. All'inizio i due array saranno degradati, ossia con una sola partizione ciascuno (al termine del tutorial saranno integrati aggiungendovi anche le partizioni del disco /dev/sda): # mdadm --create /dev/md1 --level=1 --metadata=0.90 --raid-devices=2 /dev/sdb1 missing # mdadm --create /dev/md5 --level=1 --metadata=0.90 --raid-devices=2 /dev/sdb5 missing 8. Verificare che i due array siano attivi (notare che e` presente una sola partizione per array): # cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md5 : active (auto-read-only) raid1 sdb5[0] <-------------------| /dev/sdb5 393549 blocks [2/1] [U_] ^------------------------| Manca una periferica | per completare | l'array md1 : active (auto-read-only) raid1 sdb1[0] <-------------------| /dev/sdb1 7991270 blocks [2/1] [U_] ^-----------------------| Manca una periferica | per completare | l'array unused devices: 9. Aggiornare il file /etc/mdadm/mdadm.conf in modo che riporti i due array appena creati: # mdadm --examine --scan >>/etc/mdadm/mdadm.conf 10. Aggiornare le immagini dei RAM disk da utilizzare al boot: # update-initramfs -u -k all 11. Formattare i due arry: # mkfs.ext3 /dev/md1 [...] # mkswap /dev/md5 12. Montare l'array dei dati in una cartella temporanea: # mkdir -p /mnt/newroot # mount /dev/md1 /mnt/newroot 13. Copiare tutto il contenuto dell'attuale partizione di sistema sull'array RAID1 che sara` la nuova partizione di sistema: # cp --archive --one-file-system / /mnt/newroot Attendere che la copia sia terminata (ci vorranno diversi minuti). Parte 2: rendere avviabile il secondo hard disk ================================================================================ 14. Aggiornare la mappa delle periferiche di grub sull'array RAID: # grub-mkdevicemap --device-map=/mnt/newroot/boot/grub/device.map 15. Installare grub sul Master Boot Record del secondo hard disk: # grub-install --root-directory=/mnt/newroot /dev/sdb 16. Generare una nuova configurazione per grub, da collocare sull'array RAID: # grub-mkconfig -o /mnt/newroot/boot/grub/grub.cfg 17. ATTENZIONE: PASSAGGIO IMPORTANTE * Occorre correggere a mano il file /mnt/newroot/boot/grub/grub.cfg: tutte le stringhe del tipo 'UUID=.....' che fanno riferimento a /dev/sda1 devono essere sostituite con la stringa letterale '/dev/md1'. Dare il comando 'ls -l /dev/disk/by-uuid' per scoprire quali sono. Ad esempio, trasformare tutte le occorrenze di 'root=UUID=.....' come segue: root=UUID=0905fbb9-802a-46fa-94ba-013377ec88df -> root=/dev/md1 * Tutte le istanze del comando 'search' vanno eliminate. Ad esempio, eliminare tutte le linee del tipo seguente: search --no-floppy --fs-uuid --set 0905fbb9-802a-46fa-94ba-013377ec88df 18. Fare un'analoga sostituzione anche nel file /mnt/newroot/etc/fstab, sia per i riferimenti a /dev/sda1 che per quelli a /dev/sda5 (partizione di swap). Ad esempio, la linea UUID=77687aba-a8db-41de-9d3a-bd9d106036cf none swap sw 0 0 deve diventare /dev/md5 none swap sw 0 0 e la linea UUID=0905fbb9-802a-46fa-94ba-013377ec88df / ext3 errors=remount-ro,user_xattr 0 1 deve diventare /dev/md1 / ext3 errors=remount-ro,user_xattr 0 1 Parte 3: usare gli array RAID1 appena creati e includervi anche l'altro disco ================================================================================ 19. Arrestare e spegnere la macchina. 20. Scollegare i due hard disk e ricollegarli scambiati di posizione (il primo deve diventare il secondo, il secondo deve diventare il primo). 21. Riavviare la macchina normalmente. Se tutto e` OK la macchina avra` montato gli array RAID1 appena costruiti (/dev/md1 e /dev/md5). Verificarlo con i comandi 'mount' e 'swapon -s': # mount /dev/md1 on / type ext3 (rw,errors=remount-ro,user_xattr) [...] # swapon -s Filename Type Size Used Priority /dev/md5 partition 393540 0 -1 22. Verificare che la situazione degli array RAID sia simile alla seguente (adesso il disco con gli array RAID e` collegato al primo connettore, quindi le partizioni che compongono gli array RAID avranno file di periferica /dev/sda1 e /dev/sda5): # cat /proc/mdstat Personalities : [raid1] md5 : active (auto-read-only) raid1 sda5[0] <------------------| /dev/sda5 393549 blocks [2/1] [U_] md1 : active raid1 sda1[0] <-----------------------------| /dev/sda1 7992192 blocks [2/1] [U_] unused devices: 23. Ripartizionare l'attuale secondo disco (/dev/sdb) come fatto in precedenza sull'attuale primo disco (passaggio 6). Usare dimensioni delle partizioni maggiori o uguali a quelle usate nel passaggio 6; se i due dischi sono uguali, di solito, si usano dimensioni uguali. 24. Aggiungere /dev/sdb1 all'array /dev/md1, e /dev/sdb5 all'array /dev/md5: # mdadm /dev/md1 --add /dev/sdb1 # mdadm /dev/md5 --add /dev/sdb5 A questo punto il sistema avvia automaticamente la sincronizzazione dei due array RAID1. La sincronizzazione, per ogni array, consiste nel copiare i dati dalla prima periferica (/dev/sda{1,5}) alla seconda periferica (/dev/sdb{1,5}) appena connessa all'array. La sincronizzazione e` completamente trasparente per l'utente: durante la sincronizzazione il sistema puo` essere utilizzato normalmente. Bisogna comunque dire che, fintanto che la sincronizzazione non e` stata portata a termine, il sistema non e` ancora ridondato essendo, in effetti, ancora vulnerabile rispetto alla rottura del primo disco. 25. Verificare la fase di sincronizzazione: # cat /proc/mdstat Personalities : [raid1] md5 : active raid1 sdb5[2] sda5[0] 393549 blocks [2/1] [U_] resync=DELAYED md1 : active raid1 sdb1[2] sda1[0] 7992192 blocks [2/1] [U_] [>....................] recovery = 2.7% (222656/7992192) finish=11.0min speed=11718K/sec unused devices: 27. Attendere che la fase di sincronizzazione sia terminata su entrambi gli array (controllare di quando in quando l'avanzamento con 'cat /proc/mdstat'). Quando gli array saranno completi e sincronizzati l'output sara` simile al seguente: # cat /proc/mdstat Personalities : [raid1] md5 : active (auto-read-only) raid1 sda5[0] sdb5[2] 393549 blocks [2/2] [UU] ^--------------------| Entrambe le periferiche | dell'array sono OK md1 : active raid1 sda1[0] sdb1[1] 7992192 blocks [2/2] [UU] ^---------------| Entrambe le periferiche | dell'array sono OK unused devices: Parte 4: rendere avviabile l'attuale secondo hard disk ================================================================================ 28. Una volta che la fase di sincronizzazione è terminata, aggiornare la device map di grub: # grub-mkdevicemap 29. Installare grub anche sull'attuale secondo disco (in modo da poter effettuare il boot anche con solo il secondo disco): # grub-install /dev/sdb 30. Rigenerare la configurazione di grub: # grub-mkconfig -o /boot/grub/grub.cfg 31. Fatto! 32. (Opzionale) In /etc/fstab, sostituire i riferimenti a /dev/md1 e /dev/md5 con i relativi UUID=..... (fai 'ls -l /dev/disk/by-uuid' per vedere quali sono).