Raid 6 con distribuzione dei dati su diversi cloud

RAID 6

RAID 6 con distribuzione dei dati su diversi servizi di cloud

Vi sono differenti scuole di pensiero riguardo l’hot spare, ovvero il disco di riserva, in una catena raid 6.
Io personalmente preferisco tenere uno o più dischi “sprecati” per il disco di riserva, piuttosto che andarlo a comprare quando mi servirà, tanto più in questo caso specifico che non mi costa nulla perchè il mio disco sarà realmente soltanto un contenitore virtuale. Il costo di un disco “sprecato” in un hot spare è nettamente inferiore al costo del tempo che impiegherei per procurarmi un disco uguale e ricostruire l’intera catena raid in caso di fault di uno o più dischi della catena raid 6.
Raid_6Fatto questo preambolo, mantengo fede alla promessa fatta in questo mio precedente articolo,  in cui promettevo che ne avrei scritto un altro nel quale costruivo un raid 6 che mi permettesse di salvare i dati in caso di fault di uno dei servizi cloud che sto adoperando.
Assumendo per buono che sia stato ben recepito il precedente articolo, faccio alcuni riferimenti, soprattutto per l’installazione del software, a questo mio precedente articolo in cui installo degli hard disk in raid 0, dando per scontato che il lettore abbia già una certa conoscenza della materia.
Il mio sito è un susseguirsi di articoli propedeutici l’uno all’altro ed aggiornato con i nuovi, in caso di evoluzione della distribuzione DEBIAN.
Purtroppo non posso trattare tutto lo scibile dell’informatica per due fondamentali motivi, il primo è che non ne sono capace, il secondo è che non ne avrei il tempo materiale.
Veniamo a noi, dopo aver scelto i servizi di storage, aver montato in locale i vari device remoti, creiamo all’ interno di ogni device remoto il nostro contenitore, questa volta i contenitori dovranno essere necessariamente di grandezza, TUTTI UGUALI.
La nostra catena lavorerà bene SOLO se i contenitori saranno tutti della stessa grandezza, uno solo di grandezza differente rispetto agli altri, compromette il corretto funzionamento della catena. In questa pagina si può calcolare la grandezza della nostra catena, questa pagina prevede degli hard disk (obsoleti), ma io sto talmente avanti che se mi volto a guardare in dietro, vedo il futuro (sono anche molto modesto).
Adesso è necessario mappare sulle loop i vari contenitori remoti, quindi impartiamo il comando:
# losetup loop0 /work/images/disk0/primocontenitore.img
# losetup loop1 /work/images/disk1/secondocontenitore.img
e così via per tutti i contenitori, nel mio esempio monto 10 contenitori di cui: 8 in in raid6 e 2 come hot spare.
Nell’immagine si può notare la presenza, in ogni disco, di un quadratino arancione, un quadratino blu ed i quadratini verdi, i quadratini verdi, nel raid 6, rappresenta la distribuzione dei file, i quadretti blu e quelli arancione rappresentano i dati necessari alla parità dei dischi.
Con il raid 6 possiamo lavorare con un indice di fallimento pari a 2 dischi, infatti la capacità totale del raid è pari alla capacità del singolo disco moltiplicato il numero di dischi -2 dischi.
Nel mio caso, essendo soltanto una dimostrazione, ho creato 10 contenitori da 1Gb l’uno, otto li ho destinati alla catena raid 6 e due li ho destinati alla hot spare della catena raid 6, questo significa che, qualora un contenitore dovesse essersi rovinato o revocato, la catena raid 6 va ad attingere da uno dei 2 contenitori di spare.
Poiché io voglio stare tranquillo, ho deciso di permettere al massimo 2 fallimenti su 8 dischi, la possibilità che due gestori differenti mi revochino il servizio simultaneamente è davvero remota, tuttavia possibile, pertanto lo spare mi offre una certa tranquillità.
Una volta mappati i contenitori nelle opportune loop creiamo la nostra catena RAID 6.
# mdadm –create –verbose /dev/md0 –level=6 –raid-devices=8 /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4 /dev/loop5 /dev/loop6 /dev/loop7 –spare-devices=2 /dev/loop8 /dev/loop9
Andiamo a goderci l’assemblaggio della nostra catena raid 6
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop9[9](S) loop8[8](S) loop7[7] loop6[6] loop5[5] loop4[4] loop3[3] loop2[2] loop1[1] loop0[0]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/8] [UUUUUUUU]
[==========>……….] resync = 50.3% (528060/1047552) finish=0.1min speed=66007K/sec

unused devices:
Guardiamo la nostra catena raid 6 prendere forma
Mentre la catena raid 6 prende forma rifletto sul fatto che i miei dati saranno davvero al sicuro, quando avrò terminato l’intero processo.
Anche in presenza di un attacco man in the middle, nessuno riuscirà ad avere i miei dati senza possedere l’opportuna chiave per decifrare il disco. La chiave non viaggerà MAI su internet, neppure la prima volta, non verrà MAI digitata dal sottoscritto perché si tratta di un file e neppure la CIA con l’aiuto del KGB e del FBI, con tutti i soldi del mondo riusciranno a forzare questo sistema, fino a che non si troverà una vulnerabilità nell’algoritmo di cifratura, quindi fino a d allora non regalerò le mie informazioni a El.Goog (questo termine me lo ha regalato un amico di vecchia data, ritrovato qualche giorno fa).
La mia catena raid 6 sarà pronta?
Controlliamo:
cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop9[9](S) loop8[8](S) loop7[7] loop6[6] loop5[5] loop4[4] loop3[3] loop2[2] loop1[1] loop0[0]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/8] [UUUUUUUU]

unused devices:
…… e comincio a godere come un riccio 🙂
Per terminare il godimento voglio dare un fdisk -l, vediamo
# fdisk -l
……
Disk /dev/loop0: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop1: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop2: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop3: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop4: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop5: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop6: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop7: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop8: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop9: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/md0: 6 GiB, 6436159488 bytes, 12570624 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 3145728 bytes
…..
Alla fine trovo il mio md0 da 6Gb, ovvero la risultante della mia catena raid 6.
A questo punto, penetriamo la catena md0 e ci costruiiamo una partition table dell’intera capacità delnostro raid 6
# fdisk /dev/md0
e gli diciamo che è una partizione 8E ovvero una LVM2
Adesso abbiamo dato vita ala partizione /dev/md0p1
Quindi andiamo ad istruire il sistema dicendogli che la catena raid6 md0 con partizione p1 appartiene ad un volume fisico
# pvcreate /dev/md0p1
Physical volume “/dev/md0p1” successfully created
Perfetto
Adesso dobbiamo creare il gruppo logico, che come sempre si chiamerà Pinocchio.
# vgcreate Pinocchio /dev/md0p1
Volume group “Pinocchio” successfully created
Ok, adesso possiamo scegliere cosa fare, più volumi logici piccoli o un unico volume logico grande?
Abbiamo 6 Gb ctotali di catena raid 6, che vogliamo fare pure i volumi piccoli?
Allora creiamo un unico volume grande dell’intera capacità della catena raid 6.
# lvcreate -n kirk -l100%FREE Pinocchio
Logical volume “kirk” created
Perfetto, creato il volume kirk nel gruppo Pinocchio, adesso andiamo a formattare il nostro volume con la chiave che non viaggerà.
Io consiglio di copiare la chiave in un posto sicuro perché se la perdiamo, nessuno potrà aiutarci. Qualcuno ha resuscitato Lazzaro, ma non è stato in grado di aprire questo disco.
A questo punto formattiamo il tutto con la chiave già costruita in passato, io ho una chiave da 7Mbite ben rincoglionita, questo è un nuovo metodo per incasinare le chiavi di decifratura
# truncate -s 7M /root/unwrapped.key
# shred -n 300 -v /root/unwrapped.key
In pratica sovrascriviamo con dati urandom 300 volte il file che risulterà davvero rimbecillito di dati
…….
shred: /root/unwrapped.key: passo 296/300 (db6db6)…
shred: /root/unwrapped.key: passo 297/300 (a22222)…
shred: /root/unwrapped.key: passo 298/300 (777777)…
shred: /root/unwrapped.key: passo 299/300 (800000)…
shred: /root/unwrapped.key: passo 300/300 (random)…
#
A questo punto formatiamo
#cryptsetup -h sha256 -c aes-cbc-essiv:sha256 -s 256 luksFormat –key-file=/root/unwrapped.key /dev/mapper/Pinocchio-kirk
Rispondiamo YES (tutto maiuscolo)
ed attendiamo, al termine, apriamo la posizione mappandola in /dev/mapper/DISK0
Quindi:
# cryptsetup -h sha256 -c aes-cbc-essiv:sha256 -s 256 luksOpen –key-file=/root/unwrapped.key /dev/mapper/Pinocchio-kirk DISK0
adesso possiamo formattare il dostro disco cifrato posizionato nella catena raid 6, orami io formatto solo in xfs, quindi procedo
# mkfs.xfs /dev/mapper/DISK0
Il risultato quasi istantaneo è:

log stripe unit (524288 bytes) is too large (maximum is 256KiB)
log stripe unit adjusted to 32KiB
meta-data=/dev/mapper/DISK0 isize=256 agcount=8, agsize=196224 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=1569024, imaxpct=25
= sunit=128 swidth=768 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

#
Adesso posso godermi il disco cifrato con dati distribuiti lungo una catena raid 6.

Al reboot della macchina, chiaramente tutto sarà svanito, cosa devo fare per rendere persistente il tutto?
Nulla, non posso fare nulla, posso solo creare uno script che mi esegua i comandi necessari ad assemblare il mio raid 6, ad aprire il mio disco cifrato e me lo monti nella giusta posizione.
Quindi comincio con il creare uno script nella posizione /script
# vi /script/riassembla.sh
#!/bin/bash
………….. TUTTI I COMANDI NECESSARI A POSIZIONARE I FILE CONTENITORE AL LORO POSTO
………….. TUTTI I COMANDI NECESSARI A MAPPARE I CONTENITORI NELLE APPOSITE LOOP
# assemblo l’array del raid 6
mdadm –assemble –verbose /dev/md0 /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4 /dev/loop5 /dev/loop6 /dev/loop7
# Aggiungo i dischi di spare
mdadm –add /dev/md0 /dev/loop8 /dev/loop9
# Abilito tutti i volumi logici
lvchange -a y /dev/Pinocchio
# Apro la catena rid6 decifrata e la mapo in DISK0
cryptsetup -h sha256 -c aes-cbc-essiv:sha256 -s 256 luksOpen –key-file=/root/unwrapped.key /dev/mapper/Pinocchio-kirk DISK0
# monto la mappa DISK0 in /disk0
mount /dev/mapper/DISK0 /disk0/
# salvo ed esco
ESC : wq
# chmod 700 /script/riassembla.sh
Lancio lo script e mi godo il mio disco remoto
# /script/riassembla.sh
Per essere davvero sicuro do un occhio a /proc/mdstat
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop9[9](S) loop8[8](S) loop0[0] loop7[7] loop6[6] loop5[5] loop4[4] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/8] [UUUUUUUU]

unused devices:

NIENTE MALE
Nella prossima puntata faccio le prove di egrado e distruggerò volontariamente 2 contenitori.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

Torna in alto