Guida alle tecnologie

Sostituzione di un disco guasto in un array RAID1

6 min read System Administration Aggiornato 13 Oct 2025
Sostituzione disco guasto in RAID1
Sostituzione disco guasto in 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/sdb5

Quindi spegnete il sistema:

shutdown -h now

Poi 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/mdstat

Esempio 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 -l

Esempio 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/sdb

Esempio 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/sdb5

Poi aggiungete le partizioni all’array:

mdadm -a /dev/md0 /dev/sdb1
mdadm -a /dev/md1 /dev/sdb5

Verificate lo stato della ricostruzione:

cat /proc/mdstat

Esempio 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/sdb

A 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:
    1. Isolare il disco fallito.
    2. Inserire disco nuovo con partizioni equivalenti.
    3. Azzerare superblocchi residui.
    4. Aggiungere partizioni all’array.
    5. Attendere la sincronizzazione.
    6. 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)

  1. Conferma disco guasto: mdadm –detail /dev/mdX e dmesg.
  2. Preparazione: comunicare e programmare finestra di manutenzione.
  3. Sostituzione fisica: hot-swap o spegnimento come necessario.
  4. Replica partizioni: sfdisk -d /dev/sda | sfdisk –force /dev/sdb.
  5. Pulizia: mdadm –zero-superblock su partizioni nuove.
  6. Aggiunta: mdadm -a /dev/mdX /dev/sdY1 …
  7. Monitoraggio: tail -f /proc/mdstat; attendere [UU].
  8. 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

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.

Autore
Redazione

Materiali simili

Installare e usare Podman su Debian 11
DevOps

Installare e usare Podman su Debian 11

Guida rapida a apt-pinning su Debian
Linux

Guida rapida a apt-pinning su Debian

Forzare FSR 4 con OptiScaler: guida completa
Guide.

Forzare FSR 4 con OptiScaler: guida completa

Dansguardian + Squid NTLM su Debian Etch
Rete

Dansguardian + Squid NTLM su Debian Etch

Riparare errore installazione SD su Android
Android

Riparare errore installazione SD su Android

Cartelle di rete con KNetAttach e remote:/
Linux

Cartelle di rete con KNetAttach e remote:/