Creare gli array RAID e migrare i dati
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)
- Creare due array RAID degradati con placeholder “missing” per le partizioni ancora in uso.
- Formattare /dev/md0 e inizializzare /dev/md1 come PV LVM.
- Aggiungere /dev/md1 al Volume Group e aggiornare mdadm.conf, /etc/fstab, /etc/mtab e GRUB.
- Rigenerare initrd e riavviare (opzionale a seconda dei casi).
- Spostare i dati con pvmove, aggiungere le partizioni a RAID e attendere la sincronizzazione.
- 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
- Verificare lo stato attuale:
cat /proc/mdstat
,pvdisplay
,vgdisplay
,mount
. - Creare gli array degradati con
missing
per le partizioni occupate. - mkfs.ext3 /dev/md0
- pvcreate /dev/md1 && vgextend VolGroup00 /dev/md1
- mdadm –examine –scan > /etc/mdadm.conf
- Aggiornare /etc/fstab, /etc/mtab e /boot/grub/menu.lst (default/fallback e root(hd1,0)).
- Rigenerare initrd:
mkinitrd ...
- pvmove /dev/sda2 /dev/md1
- vgreduce VolGroup00 /dev/sda2
- pvremove /dev/sda2
- fdisk /dev/sda (impostare tipo fd per la partizione 2) e mdadm –add /dev/md1 /dev/sda2
- Attendere la sincronizzazione (
cat /proc/mdstat
owatch
). - Montare /dev/md0 e copiare /boot:
cp -dpRx . /mnt/md0
. - (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.
- Monitorare
- 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.