RAID 1
RAID 1 STAVOLTA ESAGERO !
Di articoli ne ho scritti tanti, ma questa volta esagero proprio.
L’obiettivo vuol essere quello di avere 2 hard disk in RAID 1 per le partizioni del sistema operativo ed LVM + RAID 1 per la partizione di /work.
Fin qui nulla di strano, direte voi, ma quando apprenderete la notizia che il tutto gira su un micro pc mi darete del matto, io credo che non si sia mai visto prima un micro pc barebone con 2 hard disk in configurazione RAID 1.
Cominciamo con il dire che il RAID 1 è uno specchio dei dati, infatti questi verranno scritti ora su un disco ora sull’altro e allineati appena possibile, in caso di guasto di uno dei due dischi l’altro disco continuerà a funzionare.
Per essere sicuri che il nostro RAID 1 funzioni davvero, faremo anche delle prove di degrado del disco, di reboot a singolo disco ed infine ricostruiremo l’array.
Volendo si possono fare diversi livelli di RAID, noi faremo il RAID 1, per completezza spiego sommariamente cosa sono gli altri livelli di RAID in modo tale che nel prossimo articolo, se mai ne scriverò uno, mi troverò avvantaggiato.
Cominciamo con il dire che RAID vuol dire Redundant Array of Independent Disks.
RAID 0
Eseguto con un minimo di 2 dischi permette di raddoppiare o quasi la capacità del disco più piccolo utilizzato.
RAID 1 (il nostro caso)
Eseguito con un minimo di 2 dischi permette di avere al massimo la capacità del disco più piccolo utilizzato ma con la sicurezza di una copia fedele dei 2 dischi. Consente di lavorare con un numero di dischi pari a 1, ovvero se ho un raid con 2 dischi se ne può rompere uno solo, se ho un raid con 3 dischi se ne possono rompere 2 e così via. Sconsiglio comunque di avere un RAID 1 con una quantità superiore a 2 dischi.
RAID 3 (chi ha numerato i RAID ha deciso che il 2 gli sta sulle palle)
Esegiuto con un numero minimo di 3 dischi tutti uguali, consente una capacità pari a C*(N-1) ovvero con 3 dischi da 1000 Gb l’uno ho una capacità di 2000 Gb, in caso di guasto di uno dei 3 dischi continuano a funzionare (male) gli altri 2. Il RAID 3 non viene quasi mai usato perchè non permette l’accesso simultaneo ai dati.
RAID 4
Come il RAID 3 ma con la possibilità di accedere in lettura contemporaneamente a più blocchi
RAID 5
Anche lui come i suoi precedenti, lo si esegue su un minimo di 3 dischi, ha una capacità massima di C * (N-1), può lavorare con un disco rotto, molto più veloce nel ricostruire l’array in caso di degrado rispetto ai suoi fratelli RAID 3 e 4.
RAID 6
Lo si esegue con un minimo di 4 dischi, ha una capacità totale pari a C *(N-2)
Può lavorare comodamente con 2 dischi rotti, molto lento nel ricostruire l’array e molto lento in scrittura perché esegue 6 accessi per ogni disco per ogni dato, la lentezza è accettata grazie alla sicurezza elevatissima offerta da questo tipo di RAID.
Se mai dovessi scrivere altro sul RAID, lo scriverò su RAID 5 e RAID 6 perchè sono gli unici due livelli di cui ne vale la pena parlare, personalmente non ho mai visto un RAID 3 o un RAID 4 in vita mia.
Fatto questo preambolo veniamo a noi, anzichè installare sul solito HD, stavolta installo su una pendrive, pertanto andrò a modificare il boot e gli dirò di usare la USB per il sistema operativo, come al solito debootstrap e installo un sistema minimale ma perfettamente funzionante, reboot e mi accerto che tutto funzioni.
A questo punto devo installare il software che mi servirà per creare l’array, copiare il sistema operativo ed editare i vari file
Quindi:
# apt-get install -y mdadm vim mc initramfs-tools lvm2 dmsetup reiserfsprogs xfsprogs system-config-lvm
A questo punto cominciamo con creare le partizioni sul primo disco, con fdisk creiamo una partizione da 200Mb per la /boot, una da 100Gb per il sistema operativo ed una dell’intera rimanenza del disco per la work.
Volendo potrei creare anche un array dell’intero disco, ma preferisco fare le cose separatamente.
Con il comando t cambiamo l’id di tutte le partizioni in fd (Linux Raid)
salviamo ed usciamo, rientriamo con fdisk per essere sicuri di avere le partizioni corrette, se tutto è OK copiamo le partizioni del SDA sul SDB
# sfdisk -d /dev/sda | sfdisk /dev/sdb
A questo punto abbiamo una copia esatta delle partizioni di SDA su SDB
Cominciamo a costruire il primo array
# mdadm –create /dev/md0 –level=mirror –raid-devices=2 /dev/sda1 /dev/sdb1
Controlliamo che tutto sia in ordine con un:
# cat /proc/mdstat
Il risultato dovrebbe essere tipo questo:
# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
261824 blocks super 1.2 [2/2] [UU]
unused devices:
Benissimo, il primo array è stato creato, procediamo con il secondo
# mdadm –create /dev/md1 –level=mirror –raid-devices=2 /dev/sda2 /dev/sdb2
e ricontrolliamo mdstat
# cat /proc/mdstat
Questo è più grande, impiegherà molto tempo, l’ultimo ne impiegherà molto di più.
Personalities : [raid1]
md1 : active raid1 sdb2[1] sda2[0]
104792064 blocks super 1.2 [2/2] [UU]
[>………………..] resync = 0.1% (206528/104792064) finish=16.8min speed=103264K/sec
md0 : active raid1 sdb1[1] sda1[0]
261824 blocks super 1.2 [2/2] [UU]
unused devices:
#
Quando avrà finito il secondo processeremo md2
# mdadm –create /dev/md2 –level=mirror –raid-devices=2 /dev/sda3 /dev/sdb3
Non conviene digitare i comandi prima che l’array sia effettivamente costruito perché verremmo messi in attesa ed il procedimento verrebbe rallentato, di conseguenza conviene attendere il termine del processo di md1 per passare a md2.
Una volta terminato il processo di costruzionje del array è il momento di nomenclare le partizioni dentro il nostro ARRAY RAID
quindi con fdisk /dev/md0 creaiamo la nostra partizione che formatteremo in ext2 e la destineremo al boot. La partizione di /dev/md0 da origine a /dev/md0p1, quindi per formattare useremo:
# mkfs.ext2 /dev/md0p1
Ripetiamo la stessa operazione in md1, qui volendo possiamo definire una partizione per la root ed una per la /home, dando vita a /dev/md1p1 e /dev/md1p2, io sconsiglio di mettere una partizione di swap qui dentro, possiamo usare il solito file o avere una swap su lvm nel disco /dev/md2
Nel frattempo, poichè la cosa diventa lunga, comincio a copiare il contenuto di /boot nella partizione /dev/md0p1 visto che mdstat mi ha informato che md0 è pronto.
Quindi:
# mount /dev/md0p1 /mnt/
con l’ausilio di mc copio il contenuto di /boot /mnt
#sync
Smonto la partizione
# umount /dev/md0p1
Preparo la partizione di root
# fdisk /dev/md1
Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x18000631.
Command (m for help): p
Disk /dev/md1: 100 GiB, 107307073536 bytes, 209584128 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x18000631
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-209584127, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-209584127, default 209584127):
Created a new partition 1 of type ‘Linux’ and of size 100 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
Adesso la formatto
# mkfs.ext4 /dev/md1p1
mke2fs 1.42.12 (29-Aug-2014)
Creazione del file system con 26197760 4k blocchi e 6553600 inode
Etichetta del file system=090216e4-611c-4f7d-ac9e-f5b976cbfbde
Backup del superblocco salvati nei blocchi:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: fatto
Scrittura delle tavole degli inode: fatto
Creating journal (32768 blocks): fatto
Scrittura delle informazioni dei super-blocchi e dell’accounting del file system: fatto
La monto in /mnt e comincio a copiarci dentro tutto tranne:
/boot
/dev
/proc
/sys
/mnt (perchè in /mnt c’è dentro se stesso)
Anche se alla fine creerò le directory mancanti
# mount /dev/md1p1 /mnt/
e poi con mc faccio il resto
Al termine della copia
# cd /mnt
# mkdir proc sys dev mnt boot
Adesso dobbiamo preparer il file fstab e copiare il bootloader sui dischi fisici
# mount –bind /dev/ /mnt/dev/
# mount –bind /proc/ /mnt/proc
# mount –bind /sys/ /mnt/sys/
# chroot /mnt/
#
# mount /dev/md0p1 /boot
Prepariamo la fstab
# blkid /dev/md0p1
/dev/md0p1: UUID=”9226fd2e-953e-4ef2-9845-2b247fb57f2f” TYPE=”ext2″ PARTUUID=”7d708bfe-01″
Prendiamo il nostro UUID e lo mettiamo nella boot di fstab
# vi /etc/fstab
Poi passiamo alla /
# blkid /dev/md1p1
/dev/md1p1: UUID=”090216e4-611c-4f7d-ac9e-f5b976cbfbde” TYPE=”ext4″ PARTUUID=”18000631-01″
# vi /etc/fstab
# grub-install /dev/sda
Ripetiamo l’operazione anche per il disco sdb
# grub-install /dev/sdb
Il boot loader deve stare su tutti e due i dischi, in caso di crash, i dischi devono essere indipendenti.
Update delle configurazioni
# update-grub2
Mappiamo l’array in modo definitivo
# mdadm –detail –scan –verbose >>/etc/mdadm/mdadm.conf
e controlliamo in fondo al file che ci sia la giusta mappa
#vi /etc/mdadm/mdadm.conf
# update-initramfs -k all -u
se non spara errori il nostro disco è RAIDATO a dovere
Iniziamo la procedura di smontaggio
# umount /boot/
# exit
# umount /mnt/dev
# umount /mnt/proc
# umount /mnt/sys
# umount /mnt
# reboot
Creiamo l’ultima partizione
# fdisk /dev/md2
Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xc7fe63c2.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-766269439, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-766269439, default 766269439):
Created a new partition 1 of type ‘Linux’ and of size 365,4 GiB.
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition ‘Linux’ to ‘Linux LVM’.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
Adesso abbiamo creato una partizione LVM nel nostro RAID md2 dando vita, anche se non ce ne frega niente a /dev/md2p1
Qui dentro ci costruiamo il nostro volume fisico
# pvcreate /dev/md2p1
Physical volume “/dev/md2p1” successfully created
In questo caso specifico il mio volume fisico abbraccia un solo device, qualora avessi voluto abbracciare più device avrei dovuto aggiungerli in coda, così:
pvcreate /dev/md2p1 /dev/sdc /dev/sdd /dev/md3 etc etc
Il bello di avere LVM è proprio quello di poter aggiungere/togliere dischi o partizioni di grandezza differente per ottenere un unico grande volume.
Ecco i comandi PV
Comandi PV
pvcreate = Inizializza la partizione o il disco con le direttive LVM
pvchange = Cambia gli attribbuti al volume fisico
pvck = Esegue in check dei metadata sul volume fisico
pvdisplay = Mostra lo stato del volume fisico con tutti i suoi attribbuti
pvmove = Muove un volume fisico su un’altro device
pvremove = Cancella un volume fisico
pvresize = Modifica la grandezza di un volume fisico
pvscan = Trova tutti i volumi fisici presenti sul sistema
Adesso dobbiamo creare il gruppo dei volumi, ovvero quel gruppo che racchiuderà tutti i volumi logici, questo darà vita a /dev/mapper/nomegruppo_di_volumi
Nel mio caso voglio creare il gruppo di volumi Pinocchio
Quindi procedo come segue:
# vgcreate Pinocchio /dev/md2p1
Volume group “Pinocchio” successfully created
Anche qui abbiamo una serie di comandi VG
Comandi VG
vgcfgbackup = Marca un gruppo di volumi come volumi di backup
vgcfgrestore = Marca il gruppo di volumi come area di recupero dati
vgchange = Cambia gli attributi del gruppo di volumi
vgck = Esegue un check del descrittore dei metadata del gruppo di volumi
vgconvert = Converte il tipo di di gruppo di volumi
vgcreate = Crea un nuovo gruppo di volumi
vgdisplay = Mostra tutti i gruppi di volume presenti su un device
vgexport = Esporta un gruppo di volumi
vgimportclone = Importa e rinomina gruppi di volume duplicati
vgmerge = Unisce gruppi di volume in un unico volume
vgmknodes = Ricrea gruppi di volume destinati ai file speciali tipo il /dev
vgreduce = Riduce il gruppo di volumi rimuovendo uno o più volumi fisici
vgremove = Rimuove il gruppo di volumi
vgrename = Rinomina il gruppo dei volumi
vgs = Crea un report gruppo dei volumi
vgscan = Esegue la scansione di tutti i volumi e ricostruisce la cache
vgsplit = Splitta il volume in volumi più piccoli al fine di consentire lo spostamento di interi volumi fisici
Giunti fin qui, andiamo a creare il nostro primo volume logico e lo creiamo con una capacità pari a 10Gb
Il volume logico lo chiamerò work e lo creerò all’interno del gruppo Pinocchio precedentemente creato.
# lvcreate -n work -L 10g Pinocchio
Logical volume “work” created
A questo punto avrò dato vita ad un nuovo device, il /dev/Pinocchio/work
Anche per LV c’è una sua lista di comandi.
Comandi LV
lvchange = Cambia gli attributi del volume logico
lvconvert = Converte il volume logico da snapshot a mirror o lineare
lvcreate = Crea un volume logico in un gruppo di volumi esistente
lvdisplay = Mostra gli attributi di un volume logico
lvextend = Ingrandisce un volume logico
lvreduce = Riduce la capacità di un volume logico
lvremove = Rimuove un volume logico
lvrename = Rinomina un volume logico
lvresize = Ridimensiona un volume logico
lvs = Mostra informazioni dettagliate di un volume logico
lvscan = Effettua una scansione su tutti i dischi per trovare volumi logici
A questo punto non ci resta che formattare il nostro volume
Poichè sto lavorando con un sistema evoluto, mi sembra logico utilizzare un filesystem altrettanto evoluto
# mkfs.reiserfs /dev/Pinocchio/work
mkfs.reiserfs 3.6.24
Guessing about desired format.. Kernel 3.16.0-4-amd64 is running.
Format 3.6 with standard journal
Count of blocks on the device: 2621440
Number of blocks consumed by mkreiserfs formatting process: 8291
Blocksize: 4096
Hash function used to sort names: “r5”
Journal Size 8193 blocks (first block 18)
Journal Max transaction length 1024
inode generation number: 0
UUID: 60780db5-ed10-42b8-a501-63175f7fad8c
ATTENTION: YOU SHOULD REBOOT AFTER FDISK!
ALL DATA WILL BE LOST ON ‘/dev/Pinocchio/work’!
Continue (y/n):y
Initializing journal – 0%….20%….40%….60%….80%….100%
Syncing..ok
ReiserFS is successfully created on /dev/Pinocchio/work.
In un batter d’occhio ho formattato 10 Gb
# mkdir /work
e ci eseguiamo il mount del nostro disco appena creato
# mount -t reiserfs /dev/Pinocchio/work /work/
#
Perfetto
Test di velocità
# dd if=/dev/zero of=/work/test ibs=1M count=100
100+0 record dentro
204800+0 record fuori
104857600 byte (105 MB) copiati, 0,505598 s, 207 MB/s
mmmm, non male per essere un disco che copiava a 45Mb al secondo il suo RAID
Ultimi ritocchi, dopo aver fatto le opportune prove ad aver staccato un disco e fatto ripartire in degraded mode (un disco solo)
Dopo aver riattaccato il disco ed aver guardato il RAID che si ricostruiva ed aver staccato l’altro disco per verivicare la partenza in degraded mode con altro disco, è ora di ingrandire al volo il nostro volume logico.
Diamo un occhio ai punti di mount
# df -H
File system Dim. Usati Dispon. Uso% Montato su
/dev/md1p1 106G 1,3G 99G 2% /
udev 11M 0 11M 0% /dev
tmpfs 1,3G 9,0M 1,2G 1% /run
tmpfs 3,1G 0 3,1G 0% /dev/shm
tmpfs 5,3M 0 5,3M 0% /run/lock
tmpfs 3,1G 0 3,1G 0% /sys/fs/cgroup
/dev/md0p1 259M 35M 211M 15% /boot
/dev/mapper/Pinocchio-work 11G 34M 11G 1% /work
Benissimo il nostro Pinocchio/work è di 10 Gb, come avevamo previsto
Smontiamo il filesystem Pinocchio/work
# umount /dev/mapper/Pinocchio-work
# lvextend -L 20G Pinocchio/work
Size of logical volume Pinocchio/work changed from 10,00 GiB (2560 extents) to 20,00 GiB (5120 extents).
Logical volume work successfully resized
Ok adesso abbiamo ingrandito la partizione, adesso dobbiamo ingrandire il filesystem contenuto nella partizione
# resize_reiserfs /dev/mapper/Pinocchio-work
resize_reiserfs 3.6.24
ReiserFS report:
blocksize 4096
block count 5242880 (2621440)
free blocks 5234509 (2613149)
bitmap block count 160 (80)
Syncing..done
resize_reiserfs: Resizing finished successfully.
Adesso rimontiamo la partizione e verifichiamo cosa è accaduto.
# mount -a
# df -H
File system Dim. Usati Dispon. Uso% Montato su
/dev/md1p1 106G 1,3G 99G 2% /
udev 11M 0 11M 0% /dev
tmpfs 1,3G 9,0M 1,2G 1% /run
tmpfs 3,1G 0 3,1G 0% /dev/shm
tmpfs 5,3M 0 5,3M 0% /run/lock
tmpfs 3,1G 0 3,1G 0% /sys/fs/cgroup
/dev/md0p1 259M 35M 211M 15% /boot
/dev/mapper/Pinocchio-work 22G 34M 22G 1% /work
MAGIAAAAAAA 🙂
Il filesystem è diventato di 20Gb
Purtroppo io non riesco a ridimensionare verso il basso i filesystem reiserFS, ovvero riesco ad ingrandirlo ma non riesco a rimpicciolirlo, quindi non mi riesce di rimpicciolirlo, cosa poco grave visto che non ne comprendo l’utilità.
Per ingrandire il volume logico che contiene una partizione ext4 procediamo così
#lvextend -L 20G Pinocchio/work
#e2fsck -f /dev/mapper/Pinocchio-work
# resize2fs /dev/mapper/Pinocchio-work
#mount -a
e controlliamo
#df -H
/dev/mapper/Pinocchio-work 22G 29M 20G 1% /work
perfetto, 20 Gb
Proviamo a riportarlo a 10 Gb
# umount /work
# e2fsck -f /dev/mapper/Pinocchio-work
# resize2fs /dev/mapper/Pinocchio-work 9G
Rendiamo il FS leggermente più piccolino per poi reingrandirlo dopo il resize della partizione
# lvreduce -L -10G Pinocchio/work
# e2fsck -f /dev/mapper/Pinocchio-work
# resize2fs /dev/mapper/Pinocchio-work
# mount /dev/mapper/Pinocchio-work
# df -H /dev/mapper/Pinocchio-work
File system Dim. Usati Dispon. Uso% Montato su
/dev/mapper/Pinocchio-work 11G 24M 9,9G 1% /work
Perfetto è tornato com’ era prima.
Adesso creiamo la partizione di swap
# lvcreate -n swap -L 4g Pinocchio
La formattiamo
# mkswap /dev/mapper/Pinocchio-swap
e la aggiungiamo al file fstab.
A questo punto penso di aver finito 🙂
Pingback: XEN su Debian Jessie - Il pensiero di un uomo libero
Pingback: Raid 6 con distribuzione dei dati su diversi cloud - Il pensiero di un uomo libero
Pingback: Logical Volume Manager - Il pensiero di un uomo libero