Guida alle tecnologie

Creare gli array RAID e migrare i dati

8 min read Sysadmin Aggiornato 29 Sep 2025
Creare RAID e migrare dati con mdadm e LVM
Creare RAID e migrare dati con mdadm e LVM

Introduzione

Questo documento descrive passo dopo passo come creare due array RAID software (mdadm), prepararli per l’uso con e senza LVM, aggiornare la configurazione di boot (GRUB), migrare i dati e infine aggiungere le vecchie partizioni locali agli array per completare la ridondanza. Le procedure sono pensate per sistemi CentOS/RHEL con LVM già in uso.

Importante: eseguire queste operazioni con accesso root. Eseguire un backup completo prima di modificare partizioni, LVM o configurazioni di avvio.

Requisiti e concetti rapidi

  • mdadm: gestione RAID software. Definizione rapida: mdadm è lo strumento per creare e amministrare array software RAID su Linux.
  • LVM: Logical Volume Manager. Usato per gestire volumi logici su volumi fisici.
  • /proc/mdstat: file che mostra lo stato degli array RAID in tempo reale.
  • Fare attenzione ai comandi che scrivono sulla tabella delle partizioni (fdisk) e al riavvio richiesto per applicare alcune modifiche al kernel.

Prerequisiti minimi:

  • Due dischi fisici (nell’esempio /dev/sda e /dev/sdb).
  • Partizioni create su /dev/sdb per il nuovo RAID (/dev/sdb1 per /boot, /dev/sdb2 per LVM) e partizioni corrispondenti su /dev/sda.
  • mdadm, lvm2 installati.

Sommario dei passaggi (breve)

  1. Creare due array RAID degradati con placeholder “missing” per le partizioni ancora in uso.
  2. Formattare /dev/md0 e inizializzare /dev/md1 come PV LVM.
  3. Aggiungere /dev/md1 al Volume Group e aggiornare mdadm.conf, /etc/fstab, /etc/mtab e GRUB.
  4. Rigenerare initrd e riavviare (opzionale a seconda dei casi).
  5. Spostare i dati con pvmove, aggiungere le partizioni a RAID e attendere la sincronizzazione.
  6. Verifiche finali e pulizia.

4 Creazione dei nostri array RAID

Ora creiamo i nostri array RAID /dev/md0 e /dev/md1. Nel nostro esempio, /dev/sdb1 verrà aggiunta a /dev/md0 e /dev/sdb2 a /dev/md1. /dev/sda1 e /dev/sda2 non possono essere aggiunte subito perché il sistema sta attualmente usando /dev/sda, quindi usiamo il placeholder missing nei due comandi seguenti:

mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2

Il comando seguente mostra lo stato degli array RAID:

cat /proc/mdstat

Dovreste vedere ora che avete due array RAID degradati ( [U] o [U] significa che un array è degradato, [UU] significa che l’array è integro). Un esempio di output è:

[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb2[1]
10377920 blocks [2/1] [_U]

md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]

unused devices: 
[root@server1 ~]#

Creare filesystem su array non-LVM

Creiamo ora un filesystem ext3 su /dev/md0 (array non-LVM destinato a /boot):

mkfs.ext3 /dev/md0

Preparare l’array LVM (/dev/md1)

Per preparare /dev/md1 all’utilizzo con LVM eseguiamo:

pvcreate /dev/md1

Quindi aggiungiamo /dev/md1 al volume group VolGroup00:

vgextend VolGroup00 /dev/md1

Verifica dei Physical Volumes:

pvdisplay

Esempio di output previsto:

[root@server1 ~]# pvdisplay
--- Physical volume ---
PV Name               /dev/sda2
VG Name               VolGroup00
PV Size               9.90 GB / not usable 22.76 MB
Allocatable           yes (but full)
PE Size (KByte)       32768
Total PE              316
Free PE               0
Allocated PE          316
PV UUID               aikFEP-FB15-nB9C-Nfq0-eGMG-hQid-GOsDuj

--- Physical volume ---
PV Name               /dev/md1
VG Name               VolGroup00
PV Size               9.90 GB / not usable 22.69 MB
Allocatable           yes
PE Size (KByte)       32768
Total PE              316
Free PE               316
Allocated PE          0
PV UUID               u6IZfM-5Zj8-kFaG-YN8K-kjAd-3Kfv-0oYk7J

[root@server1 ~]#

Verifica del Volume Group:

vgdisplay

Esempio di output:

[root@server1 ~]# vgdisplay
--- Volume group ---
VG Name               VolGroup00
System ID
Format                lvm2
Metadata Areas        2
Metadata Sequence No  4
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                2
Open LV               2
Max PV                0
Cur PV                2
Act PV                2
VG Size               19.75 GB
PE Size               32.00 MB
Total PE              632
Alloc PE / Size       316 / 9.88 GB
Free  PE / Size       316 / 9.88 GB
VG UUID               ZPvC10-cN09-fI0S-Vc8l-vOuZ-wM6F-tlz0Mj

[root@server1 ~]#

Generare /etc/mdadm.conf

Salviamo la configurazione corrente degli array in /etc/mdadm.conf:

mdadm --examine --scan > /etc/mdadm.conf

Controllare il contenuto:

cat /etc/mdadm.conf

Dovreste vedere le righe che descrivono gli array:

ARRAY /dev/md0 level=raid1 num-devices=2 UUID=0a96be0f:bf0f4631:a910285b:0f337164
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=f9e691e2:8d25d314:40f42444:7dbe1da1

Aggiornare /etc/fstab

Sostituire la riga che monta /boot (tipicamente LABEL=/boot o /dev/sda1) con /dev/md0. Il file /etc/fstab dovrebbe somigliare a questo:

/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
/dev/md0             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0

Aggiornare /etc/mtab

Sostituire /dev/sda1 con /dev/md0 in /etc/mtab così che il mount corrente riflesse la nuova situazione:

vi /etc/mtab

Esempio di contenuto aggiornato:

/dev/mapper/VolGroup00-LogVol00 / ext3 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
/dev/md0 /boot ext3 rw 0 0
tmpfs /dev/shm tmpfs rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0

Configurare GRUB per fallback

Modificare /boot/grub/menu.lst e aggiungere fallback=1 subito dopo default=0:

vi /boot/grub/menu.lst

Dovrebbe comparire così:

default=0
fallback=1

Questo forza GRUB a provare il kernel successivo se il primo fallisce.

Poi copiare la voce kernel esistente e aggiungere una copia che punti a root (hd1,0) (che mappa /dev/sdb) prima della voce che punta a (hd0,0). Esempio:

[...]
title CentOS (2.6.18-128.el5)
        root (hd1,0)
        kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-128.el5.img
title CentOS (2.6.18-128.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-128.el5.img

Il risultato finale del file può essere simile a quanto mostrato nelle precedenti sezioni. root (hd1,0) indica /dev/sdb e permette di provare a bootare dal disco nuovo in caso di guasto del disco principale.

Aggiornare initrd

Spostiamo l’attuale ramdisk e rigeneriamolo per il kernel corrente:

mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img_orig
mkinitrd /boot/initrd-`uname -r`.img `uname -r`

Questo assicura che il nuovo initrd contenga i driver e gli script necessari per montare md e LVM all’avvio.


5 Spostare i dati negli array RAID

Dopo aver aggiornato le configurazioni possiamo copiare i contenuti da /dev/sda a /dev/sdb. In particolare spostiamo il contenuto del PV LVM (/dev/sda2) sul nuovo PV (/dev/md1) usando pvmove.

Spostamento LVM con pvmove

Eseguire:

pvmove /dev/sda2 /dev/md1

Nota: questa operazione può richiedere tempo in base al volume di dati. Monitorare CPU, I/O e spazio disponibile.

Dopo che pvmove ha completato, rimuoviamo /dev/sda2 dal volume group:

vgreduce VolGroup00 /dev/sda2

Quindi indichiamo che /dev/sda2 non è più un PV LVM:

pvremove /dev/sda2

Verifica finale di pvdisplay:

[root@server1 ~]# pvdisplay
--- Physical volume ---
PV Name               /dev/md1
VG Name               VolGroup00
PV Size               9.90 GB / not usable 22.69 MB
Allocatable           yes (but full)
PE Size (KByte)       32768
Total PE              316
Free PE               0
Allocated PE          316
PV UUID               u6IZfM-5Zj8-kFaG-YN8K-kjAd-3Kfv-0oYk7J

[root@server1 ~]#

Modificare tipo partizione e aggiungere la partizione a RAID

Cambiare il tipo di partizione di /dev/sda2 in “fd” (Linux raid autodetect) con fdisk:

fdisk /dev/sda

Esempio di sessione interattiva (mostrata come riferimento):

[root@server1 ~]# fdisk /dev/sda

The number of cylinders for this disk is set to 1305.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): <-- t
Partition number (1-4): <-- 2
Hex code (type L to list codes): <-- fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): <-- w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@server1 ~]#

Aggiungere infine /dev/sda2 all’array md1:

mdadm --add /dev/md1 /dev/sda2

Controllare la sincronizzazione con:

cat /proc/mdstat

Esempio in corso di sincronizzazione:

[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[2] sdb2[1]
10377920 blocks [2/1] [_U]
[====>................]  recovery = 23.4% (2436544/10377920) finish=2.0min speed=64332K/sec

md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]

unused devices: 
[root@server1 ~]#

Potete usare watch per monitorare automaticamente:

watch cat /proc/mdstat

Attendere fino al termine della sincronizzazione; l’output finale sarà simile a:

[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[0] sdb2[1]
10377920 blocks [2/2] [UU]

md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]

unused devices: 
[root@server1 ~]#

Montare /dev/md0 e copiare /boot

Creare il punto di mount e montare l’array /dev/md0:

mkdir /mnt/md0
mount /dev/md0 /mnt/md0

Verificare con mount:

[root@server1 ~]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/md0 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/md0 on /mnt/md0 type ext3 (rw)
[root@server1 ~]#

Copiare il contenuto di /boot (presumibilmente su /dev/sda1) in /dev/md0 montato su /mnt/md0:

cd /boot
cp -dpRx . /mnt/md0

Nota: l’opzione -p preserva i permessi, -R copia ricorsivamente, -d preserva link simbolici, -x evita di attraversare filesystem diversi.


Controlli finali e pulizia

  • Assicurarsi che /etc/fstab punti a /dev/md0 per /boot.
  • Controllare /etc/mdadm.conf e aggiornare initramfs se richiesto.
  • Eseguire grub-install su entrambi i dischi (opzionale ma consigliato) per garantire che entrambi i dischi siano avviabili:
# Esempio (usare con cautela e adattare al proprio sistema):
grub-install /dev/sda
grub-install /dev/sdb
  • Rivedere il file /boot/grub/menu.lst e testare il riavvio in una finestra operativa controllata.

Importante: qualche modifica alla tabella delle partizioni potrebbe richiedere un riavvio per essere pienamente riconosciuta dal kernel.


Criteri di accettazione (verifiche richieste)

  • /proc/mdstat mostra [UU] per gli array attivi (o [_U] temporaneamente durante la ricostruzione).
  • pvdisplay e vgdisplay mostrano che tutte le Physical Extents sono allocate come previsto.
  • /boot è montato su /dev/md0 (controllare mount e /etc/fstab).
  • mdadm –examine –scan è salvato in /etc/mdadm.conf e riflette gli UUID attuali.
  • Il sistema è avviabile dal disco secondario (hd1) senza errori, e il fallback verso (hd0) è configurato.

Playbook rapido (SOP) — operazioni sequenziali

  1. Verificare lo stato attuale: cat /proc/mdstat, pvdisplay, vgdisplay, mount.
  2. Creare gli array degradati con missing per le partizioni occupate.
  3. mkfs.ext3 /dev/md0
  4. pvcreate /dev/md1 && vgextend VolGroup00 /dev/md1
  5. mdadm –examine –scan > /etc/mdadm.conf
  6. Aggiornare /etc/fstab, /etc/mtab e /boot/grub/menu.lst (default/fallback e root(hd1,0)).
  7. Rigenerare initrd: mkinitrd ...
  8. pvmove /dev/sda2 /dev/md1
  9. vgreduce VolGroup00 /dev/sda2
  10. pvremove /dev/sda2
  11. fdisk /dev/sda (impostare tipo fd per la partizione 2) e mdadm –add /dev/md1 /dev/sda2
  12. Attendere la sincronizzazione (cat /proc/mdstat o watch).
  13. Montare /dev/md0 e copiare /boot: cp -dpRx . /mnt/md0.
  14. (Opzionale) grub-install su entrambi i dischi.

Checklist per ruolo

  • Amministratore di sistema:
    • Eseguire backup completi prima di iniziare.
    • Verificare GRUB e initrd.
    • Coordinare il riavvio se necessario.
  • Operatore/SRE:
    • Monitorare cat /proc/mdstat durante la sincronizzazione.
    • Verificare velocità I/O e impatto su servizi critici.
  • Responsabile della sicurezza:
    • Controllare permessi di /boot e file di configurazione.
    • Assicurarsi che il disco rimosso non contenga dati sensibili non cancellati.

Risoluzione problemi comuni

  • La sincronizzazione è lenta: verificare I/O, carico di sistema, e processi che saturano il disco. Considerare di eseguire l’operazione in orario di bassa attività.
  • Dopo fdisk il kernel riporta la vecchia tabella: riavviare se non è possibile ricaricarla in altro modo.
  • GRUB non trova il kernel su /dev/md0: controllare che i file siano stati copiati correttamente e che initrd sia aggiornato.
  • pvmove fallisce per spazio insufficiente: ripristinare lo stato, liberare spazio o aggiungere altro storage temporaneo.

Mini-metodologia (heurstica)

  • Procedere dal livello più basso (dischi/partizioni) al livello più alto (volumi logici e file system).
  • Applicare cambiamenti non distruttivi prima (creazione array degradati) e solo quando i dati sono spostati, rimuovere le vecchie risorse.
  • Verificare dopo ogni passo critico usando comandi di stato (mdadm, pvdisplay, vgdisplay, mount).

Glossario in una riga

  • mdadm: strumento per creare e gestire array RAID su Linux.
  • LVM: sistema di gestione di volumi logici sopra volumi fisici.
  • PV: Physical Volume in LVM; VG: Volume Group; LV: Logical Volume.

Note di sicurezza e privacy

  • Se i dischi contengono dati sensibili, valutare politiche di cifratura a riposo prima della migrazione.
  • La rimozione fisica di dischi da un sistema dovrebbe seguire la policy aziendale per cancellazione o conservazione dei dati.

Riepilogo

  • Abbiamo creato due array RAID degradati, preparato l’array LVM, esteso il VG, aggiornato mdadm.conf, fstab e GRUB, spostato i dati con pvmove e poi riportato le partizioni su RAID per ricostituire la piena ridondanza. Tutte le azioni critiche devono essere verificate con i comandi di stato e precedute da backup.

Note finali: testare il processo in un ambiente di staging prima di applicarlo in produzione. Se non siete sicuri, coinvolgete un collega esperto in LVM/RAID per la revisione.

Autore
Redazione

Materiali simili

Dettatura vocale in WhatsApp: guida rapida
Guide.

Dettatura vocale in WhatsApp: guida rapida

Trovare collaborazioni su IMDb
Guide.

Trovare collaborazioni su IMDb

Citazione sul desktop con Rainmeter
Guida

Citazione sul desktop con Rainmeter

Installare e configurare NFS su AlmaLinux 9
Linux

Installare e configurare NFS su AlmaLinux 9

Creare RAID e migrare dati con mdadm e LVM
Sysadmin

Creare RAID e migrare dati con mdadm e LVM

Livello batteria Android senza widget
Android

Livello batteria Android senza widget