Software RAID 1 (mirroring) con kernel 2.4.x su Debian

Marcus Schopen <marcus dot schopen at uni dash bielefeld dot de>

Stand: 18.06.2002

Giuseppe Barichello <beppuz at supereva dot it>

Italian translation: 07.12.2003

Flavio Boniforti <boniforti dot f |at| gmail dot com>

Italian translation: 17.08.2004

Se sembrano ancora troppi 110 € circa per un controller IDE hardware RAID (p. es. Promise Fasttrack/100 TX2), si può pensare alla variante economica del RAID Software per harddisk SCSI ed IDE. Il seguente breve "HOW TO" descrive un RAID-1 avviabile su Debian Woody.


0. Premessa

Prima di procedere è consigliabile effettuare un backup del Sistema (DAT, CD, Partition Image etc.). Nonostante la soluzione descritta sia praticabile su un Sistema avviato senza effettuarne un backup, è insensato correre inutili rischi.
Il presente HOW TO è estendibile anche al RAID-5. Ulteriori indicazioni si trovano ai link in fondo alla pagina.
Il secondo harddisk è consigliato connetterlo al secondo canale IDE/SCSI e jumperarlo come Master (purtroppo non è questo il caso).


1. Partizionamento dei dischi

Parto dal presupposto che sia già stato installato Debian Woody con kernel 2.4.x o che l'utente sappia installare tale Sistema. Chi a questo punto volesse installare un nuovo Sistema, può utilizzare i dischetti di boot con kernel 2.4.x e partizionare durante l'installazione entrambi i dischi allo stesso identico modo. L'installazione procederà normalmente sul primo disco fisso (hda).
I punti di "mount" sul primo disco (hda) sono i seguenti:

Punto di mount

Partizione hda (primo disco)

/

/dev/hda4

/boot

/dev/hda1

/usr

/dev/hda5

/home

/dev/hda6

/var

/dev/hda7

/tmp

/dev/hda8

/vol

/dev/hda9


Il secondo disco (hdb) deve essere partizionato in modo speculare. Una volta partizionati entrambi i dischi allo stesso modo (p. es. con cfdisk), è necessario impostare tutte le partizioni del secondo disco (hdb) - tranne la partizione di swap - con il tipo "fd" (= Linux raid autodetect):
Partitionierung hdc
Per il momento non è necessario formattare il secondo disco (hdb).


2. Kernel

Si rende necessario crearci un kernel personalizzato, visto che nel kernel 2.4.18 di Debian il RAID viene supportato soltanto come modulo. Il kernel lo scarichiamo da ftp.it.kernel.org e lo scompattiamo sotto /usr/src/ nella cartella "linux".
Entriamo nella cartella "/usr/src/linux" ed avviamo la configurazione con "make menuconfig". La configurazione relativa al RAID-1 dovrebbe rispecchiare questa:
RAID Konfiguration 2.4.18 Kernel
Ora lanciamo la sequenza di comandi
make dep; make clean; make bzlilo; make modules; make modules_install; lilo
ed il nuovo kernel dovrebbe essere pronto. Riavviamo il computer giusto per verificare che il nuovo kernel funzioni senza problemi.
Informazioni aggiuntive: per poter compilare il kernel devono essere installati almeno questi pacchetti: gcc, make, libc6-dev e libncurses5-dev. Eventuali ulteriori dipendenze saranno riconosciute e gestite in automatico da apt.


3. RAID2-Tools

Ora ci installiamo i RAID2 Tools:
apt-get install raidtools2



4. Configurare RAID

Procediamo alla creazione di /etc/raidtab. La seguente tabella riassuntiva ci aiuta a mantenere una visione corretta tra RAID e partizioni:

Punto di mount

Partizione RAID

Partizione hda (primo disco)

Partizione hdb (secondo disco)

/

/dev/md0

/dev/hda4

/dev/hdb4

/boot

/dev/md1

/dev/hda1

/dev/hdb1

/usr

/dev/md2

/dev/hda5

/dev/hdb5

/home

/dev/md3

/dev/hda6

/dev/hdb6

/var

/dev/md4

/dev/hda7

/dev/hdb7

/tmp

/dev/md5

/dev/hda8

/dev/hdb8

/vol

/dev/md6

/dev/hda9

/dev/hdb9


E' importantissimo che il primo disco (hda) sie ancora marchiato come "failed-disk"!
# example /etc/raidtab
# md0 is the root array
raiddev /dev/md0
raid-level 1
nr-raid-disks 2
chunk-size 32
# Spare disks for hot reconstruction
nr-spare-disks 0
persistent-superblock 1
device /dev/hdb4
raid-disk 0
# this is our old disk, mark as failed for now
device /dev/hda4
failed-disk 1 # md1 is the /boot array raiddev /dev/md1 raid-level 1 nr-raid-disks 2 chunk-size 32 # Spare disks for hot reconstruction nr-spare-disks 0 persistent-superblock 1 device /dev/hdb1 raid-disk 0 # boot is marked failed as well device /dev/hda1 failed-disk 1 # md2 is the /usr array raiddev /dev/md2 raid-level 1 nr-raid-disks 2 chunk-size 32 # Spare disks for hot reconstruction nr-spare-disks 0 persistent-superblock 1 device /dev/hdb5 raid-disk 0 # boot is marked failed as well device /dev/hda5 failed-disk 1 # md3 is the /home array raiddev /dev/md3 raid-level 1 nr-raid-disks 2 chunk-size 32 # Spare disks for hot reconstruction nr-spare-disks 0 persistent-superblock 1 device /dev/hdb6 raid-disk 0 # boot is marked failed as well device /dev/hda6 failed-disk 1 # md4 is the /var array raiddev /dev/md4 raid-level 1 nr-raid-disks 2 chunk-size 32 # Spare disks for hot reconstruction nr-spare-disks 0 persistent-superblock 1 device /dev/hdb7 raid-disk 0 # boot is marked failed as well device /dev/hda7 failed-disk 1 # md5 is the /tmp array raiddev /dev/md5 raid-level 1 nr-raid-disks 2 chunk-size 32 # Spare disks for hot reconstruction nr-spare-disks 0 persistent-superblock 1 device /dev/hdb8 raid-disk 0 # boot is marked failed as well device /dev/hda8 failed-disk 1 # md6 is the /vol array raiddev /dev/md6 raid-level 1 nr-raid-disks 2 chunk-size 32 # Spare disks for hot reconstruction nr-spare-disks 0 persistent-superblock 1 device /dev/hdb9 raid-disk 0 # boot is marked failed as well device /dev/hda9 failed-disk 1
Nota: la partizione di swap non entra in RAID. Le partizioni di swap vengono trattate nativamente dal kernel in maniera simile ad un RAID di tipo "stripe".


5. Impostare RAID

Ora impostiamo il RAID su ogni singola partizione. Il primo disco (hda) non viene ancora considerato in quanto marchiato come "failed-disk".
bob:~# mkraid /dev/md0
bob:~# mkraid /dev/md1
bob:~# mkraid /dev/md2
bob:~# mkraid /dev/md3
bob:~# mkraid /dev/md4
bob:~# mkraid /dev/md5
bob:~# mkraid /dev/md6


6. Formattare RAID

Procediamo alla formattazione delle singole partizioni RAID sul secondo disco (hdb) con filesystem ext3:
bob:~# mkfs.ext3 /dev/md0
bob:~# mkfs.ext3 /dev/md1
bob:~# mkfs.ext3 /dev/md2
bob:~# mkfs.ext3 /dev/md3
bob:~# mkfs.ext3 /dev/md4
bob:~# mkfs.ext3 /dev/md5
bob:~# mkfs.ext3 /dev/md6

7. Copiare il Sistema

Copiamo l'intero Sisyema dal primo disco (hda) sul disco con il sistema RAID (hdb). A questo scopo creiamo in /mnt la struttura di directory che rispecchia le nostre partizioni:
bob:~# mkdir /mnt/root
bob:~# mkdir /mnt/boot
bob:~# mkdir /mnt/usr
bob:~# mkdir /mnt/home
bob:~# mkdir /mnt/var
Ora eseguiamo il "mount" di tutte le partizioni su questi punti di mount:
bob:~# mount /dev/md0 /mnt/root
bob:~# mount /dev/md1 /mnt/boot
bob:~# mount /dev/md2 /mnt/usr
bob:~# mount /dev/md3 /mnt/home
bob:~# mount /dev/md4 /mnt/var
e copiamo l'intero Sistema, tralasciando soltanto /mnt/, /proc/ e ad esempio nfs, nelle directory appena montate:
bob:~# cp -a /boot/ /mnt/boot/
bob:~# cp -a /usr/ /mnt/usr/
bob:~# cp -a /home/ /mnt/home/
bob:~# cp -a /var/ /mnt/var/
Ora copiamo la partizione / root:
bob:~# cp -a /bin/ /mnt/root/
bob:~# cp -a /dev/ /mnt/root/
bob:~# cp -a /etc/ /mnt/root/
bob:~# cp -a /initrd/ /mnt/root/
bob:~# cp -a /lib/ /mnt/root/
bob:~# cp -a /opt/ /mnt/root/
bob:~# cp -a /root/ /mnt/root/
bob:~# cp -a /sbin/ /mnt/root/
bob:~# cp -a /vmlinuz* /mnt/root/
bob:~# cp /*.* /mnt/root/
In funzione della struttura si dovranno tralasciare (o aggiungere) alcune directory, ma il principio dovrebbe essere stato chiarito.
Ora dobbiamo solamente creare i singoli punti di mount sulla partizione RAID di root (/mnt/root/):
bob:~# mkdir /mnt/root/boot
bob:~# mkdir /mnt/root/home
bob:~# mkdir /mnt/root/tmp
bob:~# mkdir /mnt/root/usr
bob:~# mkdir /mnt/root/var
bob:~# mkdir /mnt/root/vol
Infine, non scordiamoci la directory /proc:
bob:~# mkdir /mnt/root/proc
Ci si deve assolutamente accertare che il Sistema presente sul disco in RAID (hdb) sia identico a quello presente sul primo disco (hda). Dovessimo scordarci dei dati (file o cartelle che siano) a questo punto della procedura, questi risulteranno irrecuperabili successivamente.


8. File System

Sulla partizione root del disco in RAID (hdb) adeguiamo "fstab" su "/mnt/root/etc/" come segue:
# /etc/fstab: Tabella dei filesystem collegati.
#
# <Dispositivo> <Punto di mount> <Tipo> <Opzioni> <dump> <pass>
/dev/md0 / ext3 defaults,errors=remount-ro 0 1
/dev/hda2 none swap sw 0 0
/dev/hdb2 none swap sw 0 0
proc /proc proc defaults 0 0
/dev/fd0 /floppy auto defaults,user,noauto 0 0
/dev/cdrom /cdrom iso9660 defaults,ro,user,noauto 0 0
/dev/md1 /boot ext3 defaults 0 2
/dev/md2 /usr ext3 defaults 0 2
/dev/md3 /home ext3 defaults 0 2
/dev/md4 /var ext3 defaults 0 2
/dev/md5 /tmp ext3 defaults 0 2
/dev/md6 /vol ext3 defaults 0 2


9. Boot Floppy

Ci creiamo un dischetto d'avvio con il quale avviare il Sistema dal RAID sul secondo disco fisso (hdb):
dd if=/vmlinuz of=/dev/fd0 bs=2k
rdev /dev/fd0 /dev/md0
rdev -r /dev/fd0 0
rdev -R /dev/fd0 1
ed avviamo il Sistema da questo dischetto. Prima del riavvio è consigliabile "smontare" tutte le partizioni md montate in precedenza sotto /mnt. Il Sistema dovrebbe ora avviarsi dalle partizioni RAID presenti sul secondo disco (hdb). Il comando "mount" ci darà:
bob:~# mount
/dev/md0 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/md1 on /boot type ext3 (rw)
/dev/md2 on /usr type ext3 (rw)
/dev/md3 on /home type ext3 (rw)
/dev/md4 on /var type ext3 (rw)
/dev/md5 on /tmp type ext3 (rw)
/dev/md6 on /vol type ext3 (rw)
Se questo non è il nostro caso, riavviamo il Sistema da hda e verifichiamo tutti i passaggi precedenti.
Proseguite con il prossimo passaggio (inserimento del primo disco (hda) nell'array RAID) solo quando siete assolutamente sicuri che il Sistema funziona in maniera totalmente affidabile da RAID. Successivamente, infatti, tutti i dati del primo disco (hda) saranno irrimediabilmente perduti. Esisterà soltanto la copia sul disco hdb.


10. Completamento del RAID

Premessa:
Ora aggiungiamo il primo disco all'array RAID mediante "raidhotadd":
bob:~# raidhotadd /dev/md0 /dev/hda4
bob:~# raidhotadd /dev/md1 /dev/hda1
bob:~# raidhotadd /dev/md2 /dev/hda5
bob:~# raidhotadd /dev/md3 /dev/hda6
bob:~# raidhotadd /dev/md4 /dev/hda7
bob:~# raidhotadd /dev/md5 /dev/hda8
bob:~# raidhotadd /dev/md6 /dev/hda9
In funzione della dimensione delle singole partizioni, la sincronizzazione dei due dischi può avere durata differente. La situazione attuale è consultabile in tempo reale mediante il comando "cat /proc/mdstat":
bob:~# cat /proc/mdstat
Personalities : [linear] [raid1] [multipath]
read_ahead 1024 sectors
md1 : active raid1 hda1[1] hdb1[0]
15936 blocks [2/2] [UU]

md2 : active raid1 hda5[1] hdb5[0]
13671168 blocks [2/2] [UU]

md3 : active raid1 hda6[1] hdb6[0]
13671168 blocks [2/2] [UU]

md4 : active raid1 hda7[1] hdb7[0]
9767424 blocks [2/2] [UU]

md5 : active raid1 hda8[1] hdb8[0]
489856 blocks [2/2] [UU]

md6 : active raid1 hda9[2] hdb9[0]
29294400 blocks [2/1] [U_]
[=====>...............] recovery = 25.1% (7364608/29294400) finish=144.4min speed=2528K/sec
md0 : active raid1 hda4[1] hdb4[0]
10747392 blocks [2/2] [UU]

unused devices: <none>
E' consigliabile attendere il completamento della sincronizzazione di tutte le partizioni prima di riavviare. In alcuni casi potrebbe durare anche alcune ore.


11. Rendere avviabile il RAID:

Procediamo con la creazione di un nuovo file "lilo.conf" per permettere al Sistema di avviarsi direttamente da RAID:
# /etc/lilo.conf - con supporto RAID

# Support LBA for large hard disks.
#
lba32

# Overrides the default mapping between harddisk names and the BIOS'
# harddisk order. Use with caution.
disk=/dev/md0 bios=0x80 partition=/dev/md1 # Specifies the boot device. This is where Lilo installs its boot # block. It can be either a partition, or the raw device, in which # case it installs in the MBR, and will overwrite the current MBR. # boot=/dev/hda # Specifies the device that should be mounted as root. (`/') # root=/dev/md0 # Installs the specified file as the new boot sector # You have the choice between: bmp, compat, menu and text # Look in /boot/ and in lilo.conf(5) manpage for details # install=/boot/boot-menu.b # Specifies the location of the map file # map=/boot/map # Specifies the number of deciseconds (0.1 seconds) LILO should # wait before booting the first image. # delay=20 # Specifies the VGA text mode at boot time. (normal, extended, ask, <mode>) # vga=normal # Boot up Linux by default. # default=Linux image=/vmlinuz label=Linux read-only image=/vmlinuz.old label=LinuxOLD read-only optional
e la scriviamo nel Master Boot Record (MBR) del disco hda col comando:
bob:~# lilo -C /etc/lilo.conf 
Chi volesse, può anche creare un "lilo.conf" per il disco hdb, in modo da poter avviare il Sistema direttamente da hdb nel caso dovesse guastarsi il primo disco (hda). A questo scopo creiamo il file "lilo.conf.hdb" e modifichiamo la riga "boot=/dev/hda" in "boot=/dev/hdb". Eseguiamo
bob:~# lilo -C /etc/lilo.conf.hdb
per scrivere le informazioni di boot nel MBR di hdb. Comparirà un avviso: »/dev/hdb is not on the first disk«, ma questo non ci deve preoccupare, in quanto in caso di backup questo disco diventerà il primo disco del Sistema. Per farlo sarà evidentemente necessario collegarlo al primo canale (E)IDE!
In caso di guasto di hda dovrebbe comunque essere sufficiente riavviare da hdb con il dischetto di avvio creato in precedenza.

12. Per chi lo vuole provare

Arrestiamo il server, scolleghiamo il primo disco (hda) e colleghiamo al suo posto (primo canale IDE) il secondo disco (hdb). Avviamo il server, il quale dovrebbe avviarsi da hdb (che ora però è diventato hda). Qualora non dovesse funzionare, utilizziamo il dischetto di boot creato in precedenza. Spegniamo nuovamente il server, ricolleghiamo hda e -dopo il riavvio - ricolleghiamo a mano con "raidhotadd" le partizioni di hda al RAID-Array.

13. Cosa è successo a Bob?

Il Sistema non si avvia più con il RAID software: aiuto, cosa faccio?
In questa caso è sempre possibile avviare con il "Rescue Disc" di Debian, dal quale con ALT-F2 si può aprire una shell e montare la partizione di root dei due dischi RAID (hda4 o hdb4) con il comando "mount /dev/hda4 /mnt".
Nel file "fstab" in "/mnt/etc/" sostituiamo tutti i devices md con i corrispondenti hda o hdb (vedi la tabella di corrispondenza presentata più sopra). Poi si riavvia dal dischetto che ci siamo creati in precedenza ed al prompt di LiLo digitiamo "linux root=/dev/hda4". Il Sistema dovrebbe ora avviarsi dal disco hda o hdb senza RAID.

14. Aggiunta

La velocità dei dischi può spesso essere incrementata con "hdparm":
bob:~# apt-get install hdparm
prima:
bob:~# hdparm -Tt /dev/hda
Timing buffer-cache reads: 128 MB in 0.46 seconds =278.26 MB/sec
Timing buffered disk reads: 64 MB in 17.25 seconds = 3.71 MB/sec
dopo l'ottimizzazione:
bob:~# hdparm -Tt /dev/hda
Timing buffer-cache reads: 128 MB in 0.46 seconds =278.26 MB/sec
Timing buffered disk reads: 64 MB in 2.54 seconds = 25.20 MB/sec
Una descrizione dettagliata di "hdparm" si trova qui.

15. Link


Variazioni e critiche costruttive a: marcus dot schopen at uni dash bielefeld dot de

Have fun!