Guida alle tecnologie

Migrare il sistema su RAID 1 e LVM

6 min read Storage Aggiornato 28 Sep 2025
Migrare sistema su RAID1 e LVM
Migrare sistema su RAID1 e LVM

Questo articolo mostra come creare array RAID 1 degradati con mdadm, preparare uno di essi per LVM, aggiornare i file di configurazione (mdadm.conf, fstab, mtab, GRUB), ricreare l’initrd e spostare i dati dal disco primario al nuovo array RAID. Include una checklist operativa, alternative e criteri di verifica.

Creazione degli array RAID

Ora creiamo i nostri array RAID /dev/md0 e /dev/md1. /dev/sdb1 sarà aggiunto a /dev/md0 e /dev/sdb2 a /dev/md1. /dev/sda1 e /dev/sda2 non possono essere aggiunti subito (perché il sistema è in esecuzione su di essi), quindi useremo il placeholder missing nei seguenti comandi:

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

cat /proc/mdstat

dovrebbe ora mostrare che hai due array RAID degradati ([U] o [U] significa che un array è degradato mentre [UU] significa che l’array è OK):

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

Successivamente creiamo un filesystem (ext3) sul nostro array RAID non-LVM /dev/md0:

mkfs.ext3 /dev/md0

Per /dev/md1, che sarà usato come Physical Volume LVM, prepariamo il disco per LVM:

pvcreate /dev/md1

Poi aggiungiamo /dev/md1 al volume group VolGroup00:

vgextend VolGroup00 /dev/md1

L’output di

pvdisplay

dovrebbe essere simile a questo (qui vengono mostrati i PV: /dev/sda2 e /dev/md1):

[root@server1 ~]# pvdisplay  
  --- Physical volume ---  
  PV Name               /dev/sda2  
  VG Name               VolGroup00  
  PV Size               4.80 GB / not usable 22.34 MB  
  Allocatable           yes  
  PE Size (KByte)      32768  
  Total PE              153  
  Free PE               1  
  Allocated PE          152  
  PV UUID               op2n3N-rck1-Pywc-9wTY-EUxQ-KUcr-2YeRJ0  
  
  --- Physical volume ---  
  PV Name               /dev/md1  
  VG Name               VolGroup00  
  PV Size               4.80 GB / not usable 22.25 MB  
  Allocatable           yes  
  PE Size (KByte)      32768  
  Total PE              153  
  Free PE               153  
  Allocated PE          0  
  PV UUID               pS3xiy-AEnZ-p3Wf-qY2D-cGus-eyGl-03mWyg  
  
[root@server1 ~]#

L’output di

vgdisplay

mostrerà informazioni sul VG aggiornato:

[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               9.56 GB  
  PE Size               32.00 MB  
  Total PE              306  
  Alloc PE / Size       152 / 4.75 GB  
  Free  PE / Size       154 / 4.81 GB  
  VG UUID               jJj1DQ-SvKY-6hdr-3MMS-8NOd-pb3l-lS7TA1  
  
[root@server1 ~]#

Successivamente creiamo /etc/mdadm.conf con la scansione automatica delle unità:

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

Mostriamo il contenuto del file:

cat /etc/mdadm.conf

Nel file dovresti ora vedere i dettagli sui nostri due array RAID (attualmente degradati):

| ARRAY /dev/md0 level=raid1 num-devices=2 UUID=7d2bf9c3:7cd9df21:f782dab8:9212d7cb ARRAY /dev/md1 level=raid1 num-devices=2 UUID=d93a2387:6355b5c5:25ed3e50:2a0e4f96 |

Quindi modifichiamo /etc/fstab. Sostituisci LABEL=/boot con /dev/md0 in modo che il file sia così:

vi /etc/fstab

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

Poi sostituisci /dev/sda1 con /dev/md0 in /etc/mtab:

vi /etc/mtab

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

Ora passiamo al boot loader GRUB. Apri /boot/grub/menu.lst e aggiungi fallback=1 subito dopo default=0:

vi /boot/grub/menu.lst

| [...] default=0 fallback=1 [...] |

Questo fa sì che se il primo kernel (contando da 0) fallisce nell’avvio, venga avviato il kernel di fallback.

Sempre nello stesso file, vai in fondo e troverai le sezioni kernel. Copia la prima e incollala prima della prima voce esistente; sostituisci root (hd0,0) con root (hd1,0):

| [...] title Fedora (2.6.23.1-42.fc8) root (hd1,0) kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.23.1-42.fc8.img title Fedora (2.6.23.1-42.fc8) root (hd0,0) kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.23.1-42.fc8.img |

Il file completo dovrebbe assomigliare a questo:

| # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 fallback=1 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Fedora (2.6.23.1-42.fc8) root (hd1,0) kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.23.1-42.fc8.img title Fedora (2.6.23.1-42.fc8) root (hd0,0) kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.23.1-42.fc8.img |

La riga root (hd1,0) si riferisce a /dev/sdb che è già parte dei nostri array RAID. Riavvieremo il sistema a breve; il sistema cercherà di avviare dai RAID degradati e, se fallisce, userà /dev/sda grazie a fallback=1.

Infine, rigeneriamo il ramdisk per riflettere la nuova configurazione:

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

Spostamento dei dati negli array RAID

Ora che abbiamo modificato i file di configurazione, possiamo copiare il contenuto di /dev/sda su /dev/sdb (inclusi i cambiamenti effettuati).

Per spostare il contenuto della partizione LVM /dev/sda2 verso l’array LVM /dev/md1, usiamo pvmove:

pvmove /dev/sda2 /dev/md1

Questa operazione può richiedere tempo, quindi attendi pazientemente.

Dopo di che rimuoviamo /dev/sda2 dal volume group VolGroup00:

vgreduce VolGroup00 /dev/sda2

… e diciamo al sistema di non usare più /dev/sda2 come PV LVM:

pvremove /dev/sda2

L’output di

pvdisplay

dovrebbe ora mostrare solo /dev/md1 come PV attivo:

[root@server1 ~]# pvdisplay  
  --- Physical volume ---  
  PV Name               /dev/md1  
  VG Name               VolGroup00  
  PV Size               4.80 GB / not usable 22.25 MB  
  Allocatable           yes  
  PE Size (KByte)      32768  
  Total PE              153  
  Free PE               1  
  Allocated PE          152  
  PV UUID               pS3xiy-AEnZ-p3Wf-qY2D-cGus-eyGl-03mWyg  
  
[root@server1 ~]#

Poi cambiamo il tipo di partizione di /dev/sda2 in Linux raid autodetect e aggiungiamo /dev/sda2 all’array /dev/md1:

fdisk /dev/sda

Output esempio dell’interazione con fdisk:

[root@server1 ~]# fdisk /dev/sda  
  
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 ~]#

Aggiungiamo la partizione a md1:

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

Ora guarda

cat /proc/mdstat

… e dovresti vedere che l’array /dev/md1 sta sincronizzando:

[root@server1 ~]# cat /proc/mdstat  
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]  
md1 : active raid1 sda2[2] sdb2[1]  
      5036288 blocks [2/1] [_U]  
      [=====>...............]  recovery = 28.8% (1454272/5036288) finish=2.8min speed=21132K/sec  
  
md0 : active raid1 sdb1[1]  
      200704 blocks [2/1] [_U]  
  
unused devices:   
[root@server1 ~]#

(Per aggiornamenti continui esegui:

watch cat /proc/mdstat

Per uscire da watch, premi CTRL+C.)

Attendi il completamento della sincronizzazione (l’output mostrerà [UU] quando l’array è sano):

[root@server1 ~]# cat /proc/mdstat  
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]  
md1 : active raid1 sda2[0] sdb2[1]  
      5036288 blocks [2/2] [UU]  
  
md0 : active raid1 sdb1[1]  
      200704 blocks [2/1] [_U]  
  
unused devices:   
[root@server1 ~]#

Montiamo /dev/md0 e copiamo i dati di /boot:

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

Dovresti ora vedere l’array nell’output di 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 ~]#

Ora copiamo il contenuto di /boot su /mnt/md0 (dove è montato /dev/md0):

cd /boot  
cp -dpRx . /mnt/md0

Criteri di accettazione

  • /proc/mdstat mostra gli array con stato [UU] dopo la sincronizzazione.
  • pvdisplay e vgdisplay mostrano /dev/md1 come PV attivo nel VG.
  • /boot è montato su /dev/md0 e il contenuto di /boot è stato copiato correttamente.
  • GRUB contiene fallback=1 e le voci root (hd1,0) per il disco secondario.
  • initrd è stato rigenerato per il kernel corrente.

Checklist operativa per l’amministratore

  • Backup completo prima di iniziare (immagini, configurazioni).
  • mdadm –create per md0 e md1 con placeholder missing.
  • mkfs.ext3 su /dev/md0.
  • pvcreate /dev/md1 e vgextend VolGroup00 /dev/md1.
  • Aggiornare /etc/mdadm.conf, /etc/fstab, /etc/mtab.
  • Aggiornare /boot/grub/menu.lst con fallback=1 e root (hd1,0).
  • Rigenerare initrd e verificare la presenza del nuovo initrd.
  • pvmove /dev/sda2 /dev/md1; attendere completamento.
  • vgreduce e pvremove su /dev/sda2.
  • Modificare partizione /dev/sda2 in fd e mdadm –add.
  • Copiare /boot su /dev/md0 e verificare mount.

Quando questo approccio può fallire

  • Se l’hardware ha controller RAID proprietari non gestiti da mdadm, la procedura non è applicabile.
  • Se non è stato fatto un backup, errori durante pvmove o modifica tabella partizioni possono causare perdita dati.
  • Se GRUB non è installato correttamente su entrambi i dischi, il fallback potrebbe non funzionare.
  • Sistemi con UUID o LABEL diversi richiedono attenzione per non lasciare voci fstab incoerenti.

Approcci alternativi

  • Clonazione byte-per-byte (dd) dei dischi e poi conversione a RAID: utile se non si può spegnere il sistema.
  • Usare un RAID hardware gestito dal controller della macchina se disponibile e supportato.
  • Creare nuovi volumi su /dev/sdb e migrare i servizi uno ad uno invece di usare pvmove.

Mini-metodologia (passi rapidi)

  1. Preparare array RAID con mdadm (missing per dischi attivi).
  2. Creare filesystem su /dev/md0 e PV su /dev/md1.
  3. Aggiungere PV al VG e aggiornare mdadm.conf, fstab, mtab.
  4. Aggiornare GRUB e rigenerare initrd.
  5. Eseguire pvmove, rimuovere PV vecchi e aggiungere le nuove partizioni agli array.
  6. Copiare /boot e verificare avvio.

Comandi rapidi (cheat sheet)

  • mdadm –create /dev/md0 –level=1 –raid-disks=2 missing /dev/sdb1
  • mdadm –create /dev/md1 –level=1 –raid-disks=2 missing /dev/sdb2
  • pvcreate /dev/md1
  • vgextend VolGroup00 /dev/md1
  • mdadm –examine –scan > /etc/mdadm.conf
  • mkinitrd /boot/initrd-uname -r.img uname -r
  • pvmove /dev/sda2 /dev/md1
  • vgreduce VolGroup00 /dev/sda2
  • pvremove /dev/sda2
  • mdadm –add /dev/md1 /dev/sda2

Ripristino e rollback essenziali

  • Se la sincronizzazione RAID fallisce, rimuovi la voce aggiunta e conserva il backup dei dati.
  • Se dopo pvmove il VG è corrotto, non eseguire ulteriori vgreduce: contatta un esperto LVM e usa i backup.
  • Se GRUB non si avvia, avvia da live CD/USB, monta /boot e reinstalla GRUB su entrambi i dischi.

Glossario rapido (1 riga per termine)

  • mdadm: utility Linux per gestire software RAID.
  • LVM: Logical Volume Manager per gestire volumi logici su PV e VG.
  • pvmove: comando LVM per spostare dati tra PV.
  • initrd: ramdisk iniziale caricato dal bootloader.

Important: Esegui sempre un backup prima di operazioni su partizioni e volume groups.

Sintesi finale

La procedura permette di migrare gradualmente un sistema attivo su array RAID 1 con LVM, minimizzando i tempi di inattività. Segui la checklist, controlla /proc/mdstat e i comandi LVM, e verifica il corretto avvio in modalità fallback prima di rimuovere i dischi originali.

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:/