Sostituzione di un disco guasto in un array RAID1
TL;DR
Simula la perdita di un disco, copia la tabella delle partizioni dal disco sano al nuovo disco, azzera i superblocchi RAID, aggiungi le partizioni al RAID e attendi la sincronizzazione. Infine installa il bootloader su entrambi i dischi e verifica che l’array sia nuovamente sano.
Test
Simuliamo ora la caduta di un disco rigido. Non ha importanza se scegliate /dev/sda o /dev/sdb: nell’esempio seguente si assume che sia /dev/sdb ad aver fallito.
Per simulare la perdita del disco potete spegnere la macchina e rimuovere fisicamente /dev/sdb, oppure rimuoverlo in modo “soft” con mdadm:
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md1 --fail /dev/sdb5
mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm --manage /dev/md1 --remove /dev/sdb5Quindi spegnete il sistema:
shutdown -h nowPoi inserite un nuovo disco destinato a diventare /dev/sdb (se stavate simulando un guasto di /dev/sda, dovete rimettere i dischi nella posizione corretta: il disco sano nel posto di /dev/sda e il nuovo disco come /dev/sdb) e riavviate. Il sistema dovrebbe avviarsi senza problemi.
Ora verificate lo stato dell’array:
cat /proc/mdstatEsempio di output:
root@server1:~# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sda5[2]
4989940 blocks super 1.2 [2/1] [U_]
md0 : active raid1 sda1[2]
248820 blocks super 1.2 [2/1] [U_]
unused devices:
root@server1:~# L’array deve risultare “degraded” (ridotto): una delle sottounità è assente ([U_]).
Controllate anche le tabelle delle partizioni e i dispositivi visibili:
fdisk -lEsempio di output (omesso spiegazioni):
root@server1:~# fdisk -l
Disk /dev/sda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 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: 0x0003717c
Device Boot Start End Blocks Id System
/dev/sda1 * 1 32 248832 fd Linux raid autodetect
Partition 1 does not end on cylinder boundary.
/dev/sda2 32 653 4990977 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 32 653 4990976 fd Linux raid autodetect
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 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: 0x00000000
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/md0: 254 MB, 254791680 bytes
2 heads, 4 sectors/track, 62205 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/md0 doesn't contain a valid partition table
Disk /dev/md1: 5109 MB, 5109698560 bytes
2 heads, 4 sectors/track, 1247485 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/md1 doesn't contain a valid partition table
Disk /dev/dm-0: 4844 MB, 4844421120 bytes
255 heads, 63 sectors/track, 588 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: 0x00000000
Disk /dev/dm-0 doesn't contain a valid partition table
Disk /dev/dm-1: 264 MB, 264241152 bytes
255 heads, 63 sectors/track, 32 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: 0x00000000
Disk /dev/dm-1 doesn't contain a valid partition table
root@server1:~#Copiare la tabella delle partizioni sul nuovo disco
Ora copiamo la tabella delle partizioni da /dev/sda (disco sano) a /dev/sdb (nuovo disco):
sfdisk -d /dev/sda | sfdisk --force /dev/sdbEsempio di esecuzione e output:
root@server1:~# sfdisk -d /dev/sda | sfdisk --force /dev/sdb
Checking that no-one is using this disk right now ...
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
OK
Disk /dev/sdb: 652 cylinders, 255 heads, 63 sectors/track
sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/sdb: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0
Device Boot Start End #sectors Id System
/dev/sdb1 * 2048 499711 497664 fd Linux raid autodetect
/dev/sdb2 501758 10483711 9981954 5 Extended
/dev/sdb3 0 - 0 0 Empty
/dev/sdb4 0 - 0 0 Empty
/dev/sdb5 501760 10483711 9981952 fd Linux raid autodetect
Warning: partition 1 does not end at a cylinder boundary
Successfully wrote the new partition table
Re-reading the partition table ...
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
root@server1:~#Questo comando duplica le partizioni esatte su /dev/sdb (incluse le partizioni RAID flaggate come “fd”). La cosa importante è che gli start/end e gli UUID delle partizioni possano corrispondere al layout atteso.
Pulire eventuali superblocchi RAID residui e aggiungere il disco
Prima di aggiungere il disco all’array pulite eventuali superblocchi residui (se il disco era in precedenza parte di un array):
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb5Poi aggiungete le partizioni all’array:
mdadm -a /dev/md0 /dev/sdb1
mdadm -a /dev/md1 /dev/sdb5Verificate lo stato della ricostruzione:
cat /proc/mdstatEsempio di output durante la ricostruzione:
root@server1:~# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb5[3] sda5[2]
4989940 blocks super 1.2 [2/1] [U_]
[========>............] recovery = 44.7% (2233024/4989940) finish=0.2min speed=159501K/sec
md0 : active raid1 sdb1[3] sda1[2]
248820 blocks super 1.2 [2/2] [UU]
unused devices:
root@server1:~# Attendete il completamento della sincronizzazione; quando finisce lo stato diventerà “[UU]”:
root@server1:~# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb5[3] sda5[2]
4989940 blocks super 1.2 [2/2] [UU]
md0 : active raid1 sdb1[3] sda1[2]
248820 blocks super 1.2 [2/2] [UU]
unused devices:
root@server1:~# Installare il bootloader su entrambi i dischi
Installate GRUB su entrambi i dischi fisici per garantire che il sistema sia avviabile anche se uno dei dischi fallisce all’avvio:
grub-install /dev/sda
grub-install /dev/sdbA questo punto avete sostituito con successo un disco guasto nell’array RAID1.
Cosa può andare storto (controesempi e scenari di fallimento)
- Il nuovo disco non viene riconosciuto come /dev/sdb: controllate dmesg e udev, possibile rimappatura dei nomi (usate UUID o /dev/disk/by-id per riferimento persistente).
- La tabella delle partizioni non viene copiata correttamente: verificare con fdisk -l e sfdisk -d; in caso di geometrie diverse usare parted o gdisk per creare partizioni equivalenti.
- Superblocchi non azzerati causano rifiuto nell’aggiunta al RAID: eseguire mdadm –zero-superblock su ogni partizione interessata.
- Ricostruzione lenta o interrotta: causa tipica I/O limitato o carico del sistema; pianificate ricostruzioni in finestre di manutenzione e monitorate con /proc/mdstat.
- Il sistema non si avvia dopo l’installazione di GRUB: assicuratevi che il /boot sia sul RAID corretto e reinstallate GRUB sui dispositivi fisici, controllate anche fstab e UUID.
Approcci alternativi
- Clonazione bit-a-bit: usare dd o clonezilla per copiare il disco intero prima di unirlo all’array (utile per dischi con layout particolari).
- Usare partclone/partimage per partizioni specifiche quando il disco di destinazione ha identica capacità.
- In ambienti con hardware RAID usare gli strumenti del vendor per sostituire il disco e lasciare che il controller gestisca la ricostruzione.
- Utilizzare device-mapper (LVM) sopra RAID per flessibilità maggiore nella gestione di volumi.
Modello mentale e regole pratiche
- RAID1 = mirroring: ogni scrittura è replicata su tutti i dischi membri. Se un disco fallisce, l’altro contiene dati completi.
- Procedura generale di recupero:
- Isolare il disco fallito.
- Inserire disco nuovo con partizioni equivalenti.
- Azzerare superblocchi residui.
- Aggiungere partizioni all’array.
- Attendere la sincronizzazione.
- Ripristinare il bootloader su tutti i dischi.
Questa sequenza è il minimo indispensabile per recuperare la ridondanza in sicurezza.
Checklist operativa (ruoli e responsabilità)
Operatore / Tecnico:
- Verificare quale disco ha fallito (dmesg, /proc/mdstat).
- Segnalare downtime previsto e finestra di manutenzione.
- Sostituire fisicamente il disco guasto (se hot-swap, farlo a caldo).
Sysadmin:
- Copiare la tabella delle partizioni dal disco sano al nuovo disco.
- Azzerare superblocchi con mdadm –zero-superblock.
- Aggiungere le partizioni all’array con mdadm -a.
- Monitorare /proc/mdstat fino a sincronizzazione completata.
- Installare GRUB su entrambi i dischi e testare il boot.
Test e QA:
- Verificare che /proc/mdstat mostri [UU] per tutte le partizioni RAID.
- Eseguire reboot di prova (se possibile) per confermare avviabilità.
- Controllare i log (dmesg, syslog) per eventuali errori I/O.
Diagramma decisionale rapido
flowchart TD
A[Disco guasto rilevato] --> B{Il server è hot-swap?}
B -- Sì --> C[Sostituisci il disco a caldo]
B -- No --> D[Spegnere il server e sostituire il disco]
C --> E[Replica tabella partizioni]
D --> E
E --> F{Superblocchi precedenti?}
F -- Sì --> G[mdadm --zero-superblock su partizioni]
F -- No --> H[Aggiungi partizioni al RAID]
G --> H
H --> I[Monitorare /proc/mdstat]
I --> J{Stato [UU]?}
J -- No --> K[Indagare errori I/O o incompatibilità]
J -- Sì --> L[Reinstallare GRUB su entrambi i dischi]
L --> M[Fatto: array ridondante e avviabile]Criteri di accettazione
- L’output di cat /proc/mdstat mostra [UU] per tutte le partizioni RAID.
- Il sistema si avvia correttamente se uno dei dischi viene rimosso.
- GRUB è installato su tutti i dischi fisici rilevanti (/dev/sda e /dev/sdb).
- Non sono presenti errori I/O critici nei log (dmesg/syslog) dopo la ricostruzione.
Rischi e mitigazioni
- Rischio: Corruzione della tabella delle partizioni durante la copia. Mitigazione: Verificare con fdisk -l e confrontare start/end prima di procedere.
- Rischio: Perdita di dati dovuta a operazioni errate su device sbagliato. Mitigazione: Usare identificatori persistenti (/dev/disk/by-id) e confermare con lsblk.
- Rischio: Ricostruzione che impatta le prestazioni della produzione. Mitigazione: Limitare velocità di ricostruzione tramite /proc/sys/dev/raid/speed_limit_max o pianificare fuori orario.
Piccola metodologia rapida (mini-playbook)
- Conferma disco guasto: mdadm –detail /dev/mdX e dmesg.
- Preparazione: comunicare e programmare finestra di manutenzione.
- Sostituzione fisica: hot-swap o spegnimento come necessario.
- Replica partizioni: sfdisk -d /dev/sda | sfdisk –force /dev/sdb.
- Pulizia: mdadm –zero-superblock su partizioni nuove.
- Aggiunta: mdadm -a /dev/mdX /dev/sdY1 …
- Monitoraggio: tail -f /proc/mdstat; attendere [UU].
- Ripristino boot: grub-install su entrambi i dischi; test di reboot.
Glossario (1 riga per termine)
- RAID1: mirroring dei dati su due o più dischi per ridondanza.
- mdadm: utility Linux per gestire array software RAID (md devices).
- Superblocco RAID: metadati scritti alla fine di una partizione per identificare il membro RAID.
- GRUB: bootloader comune per avviare Linux su sistemi x86.
Link utili
- The Software-RAID Howto: http://tldp.org/HOWTO/Software-RAID-HOWTO.html
- Debian: http://www.debian.org/
Sommario
Hai visto come simulare la perdita di un disco, copiare la tabella delle partizioni, azzerare eventuali superblocchi, aggiungere il nuovo disco all’array, attendere la sincronizzazione e reinstallare il bootloader. Segui la checklist e i criteri di accettazione per assicurare che il sistema torni in uno stato ridondante e avviabile.