Creare RAID crittografati
2025-02-01
Concetti di base
In informatica il RAID
, acronimo di Redundant Array of Independent Disks ovvero insieme ridondante di dischi indipendenti, è una tecnica di raggruppamento di diversi dischi rigidi, che fa sì che gli stessi nel sistema appaiano e siano utilizzabili come se fossero un unico volume di memorizzazione.
Alcuni concetti:
-
Mirroring
: se questa caratteristica è abilitata, una copia degli stessi dati sarà salvata anche in un altro disco -
Parità
: questo è il metodo di rigenerare i dati persi dalle informazioni di parità salvate.
Un dispositivo RAID, a seconda della configurazione, può essere classificato in dieci diversi livelli. Di seguito, alcuni tra i principali.
RAID 0
RAID 0 divide i dati equamente tra due o più dischi, ma senza mantenere alcuna informazione di parità o ridondanza che aumenti l’affidabilità (la dicitura RAID, ancorché diffusa, è pertanto impropria). Qualsiasi guasto di un singolo disco dall’array risulterà in una perdita totale dei dati. RAID 0 è usato generalmente per aumentare le prestazioni di un sistema. Questo livello richiede almeno due dischi.
RAID 1
Detto anche mirror
, scrive tutti i dati su due dischi. Se un disco è guasto o rimosso, tutti i dati sono ancora presenti sull’altro disco. Il primo disco rigido memorizza i dati originali mentre l’altro disco memorizza la copia esatta del primo disco. Poiché i dati vengono scritti due volte, le prestazioni saranno ridotte. Richiede almeno due dischi.
RAID 5
Un sistema RAID 5 distribuisce i dati di parità uniformemente tra tutti i dischi che lo compongono. Se un disco è guasto, i dati possono essere ricostruiti dai dati di parità disponibili sui dischi rimanenti. Richiede almeno tre dischi.
Per una spiegazione piú dettagliata, é utile vedere il video di Morrolinux:
Creazione RAID 1: mdadm e Btrfs
Il nostro obbiettivo é quello di creare un RAID 1 con due dischi.
Creazione delle partizioni
fdisk -l /dev/sda
Disk /dev/sda: 447.13 GiB, 480103981056 bytes, 937703088 sectors
Disk model: KINGSTON SA400S3
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 0A4B2ABC-FA51-4660-AB5D-084E316A2F23
Device Start End Sectors Size Type
/dev/sda1 2048 937701375 937699328 447.1G Linux filesystem
sudo fdisk -l /dev/sdb
Disk /dev/sdb: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: CT500BX500SSD1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 665B6D40-46EB-408D-9DA2-08D2F24A2855
Device Start End Sectors Size Type
/dev/sdb1 2048 937701375 937699328 447.1G Linux filesystem
Possiamo vedere che i due dischi hanno una dimensione leggermente differente. Quindi dovremmo porre attenzione durante la creazione delle partizioni, che dovranno avere esattamente lo stesso numero di settori su entrambi i dischi. Nello specifico, tramite fsdisk
, impostiamo 2048 (il default) come settore iniziale e esattamente 937701375
come settore finale della partizione (questo numero non é scelto a caso, ma é il settore finale di default del disco piú piccolo). In questo modo, possiamo vedere che le partizioni /dev/sda1
e /dev/sdb1
hanno entrambe 937699328
settori e una dimensione di 447.1G.
Ecco i comandi:
fdisk /dev/sda
Command (m for help): g
Created a new GPT disklabel (GUID: 3FB58B39-3A55-4D49-9C92-6C8FEE334C4D).
Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-937703054, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-937703054, default 937701375): 937701375
Created a new partition 1 of type 'Linux filesystem' and of size 447.1 GiB.
Command (m for help): w
Crittografare le partizioni
Per prima cosa, dobbiamo creare un file contenente la passphrase, in modo che il device si sblocchi in automatico all’avvio del pc. Quindi possiamo procedere a crittografare le partizioni:
mkdir ~/keyfile
touch ~/keyfile/.keyfile1 ~/keyfile/.keyfile2
sudo cryptsetup luksFormat /dev/sda1 ~/.keyfile1
sudo cryptsetup luksFormat /dev/sdb1 ~/.keyfile2
Ora che la partizione è stata crittografata, è possibile aprirla e montarla coi seguenti comandi:
sudo cryptsetup open /dev/sda1 member1 --key-file ~/.keyfile1
udisksctl mount -b /dev/mapper/member1
sudo cryptsetup open /dev/sdb1 member2 --key-file ~/.keyfile2
udisksctl mount -b /dev/mapper/member2
dove member1
e member1
indicano il nome arbitrario associato al device.
Possiamo smontare le partizioni, in modo da poter procedere coi comandi udisksctl unmount -b /dev/mapper/member1 && udisksctl unmount -b /dev/mapper/member2
. Infine, se si volesse chiudere la partizione, ovvero ri-crittografarla:
sudo cryptsetup close member1
sudo cryptsetup close member2
Sblocco automatico
Per far sì che le partizioni vengano sbloccate in automatico all’avvio del sistema, bisogna configurare correttamente il file /etc/crypttab
. Innanzitutto, tramite il comando lsblk -f
veniamo a conoscenza degli UUID delle partizioni /dev/sda1
e /dev/sdb1
:
lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
└─sda1 crypto_LUKS 2 23ace39f-62aa-4744-ae79-bb484877ec9d
└─member1 btrfs raid1 2858f3c1-995f-46ca-8164-76836b7860d2 /media/user/raid1
sdb
└─sdb1 crypto_LUKS 2 86b458f0-6886-41f3-b6c5-7444c205a424
└─member2 btrfs raid1 2858f3c1-995f-46ca-8164-76836b7860d2
Questi devono essere inseriti nel file /etc/crypttab
nel seguente modo:
cat /etc/crypttab
#volume-name UUID key-file options
member1 UUID=23ace39f-62aa-4744-ae79-bb484877ec9d /home/user/keyfile/.keyfile1 luks
member2 UUID=86b458f0-6886-41f3-b6c5-7444c205a424 /home/user/keyfile/.keyfile2 luks
mdadm
Un primo strumento per la creazione e configurazione di un RAID é mdadm
. Si tratta di uno strumento utilizzato per creare, gestire e monitorare array RAID software.
sudo apt install mdadm
Creazione RAID 1 con mdadm
Nel caso di device crittografati, dobbiamo prima aprire le partizioni crittografate, quindi creare l’array:
sudo cryptsetup open /dev/sda1 member1 --key-file ~/.keyfile1
sudo cryptsetup open /dev/sdb1 member2 --key-file ~/.keyfile2
sudo mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/mapper/member1 /dev/mapper/member2
Creazione del file system
Infine, possiamo procedere con la creazione del filesystem:
sudo mkfs.ext4 -v -L "RAID1" /dev/md1
Nel caso si volessero ottenere dettagli sul RAID, dare il comando sudo mdadm -D /dev/md1
.
Btrfs
Btrfs
è un filesystem avanzato per GNU/Linux progettato per offrire funzionalità moderne e una gestione efficiente dei dati. È stato sviluppato per superare alcune delle limitazioni dei filesystem tradizionali come ext4 e offre una serie di caratteristiche uniche, come il supporto a diverse configurazioni RAID. Questo significa che non occorre utilizzare strumenti esterni come mdadm.
Dal momento che sul mio pc utilizzo Btrfs, come illustrato qui, prediligo questa strada.
Creazione RAID 1 con Btrfs
Nel caso di device crittografati, dobbiamo prima aprire le partizioni crittografate, quindi creare l’array e il filesystem:
sudo cryptsetup open /dev/sda1 member1 --key-file ~/.keyfile1
sudo cryptsetup open /dev/sdb1 member2 --key-file ~/.keyfile2
sudo mkfs.btrfs -m raid1 -d raid1 -L raid1 /dev/mapper/member1 /dev/mapper/member2
In particolare:
-m raid1
: questa opzione specifica il livello di RAID da utilizzare per i metadati. In questo caso, una copia dei metadati sarà mantenuta su ciascun disco, fornendo ridondanza e protezione contro il guasto di un disco-d raid1
: questa opzione specifica il livello di RAID da utilizzare per i dati. Anche in questo caso, i dati saranno copiati su entrambi i dispositivi-L raid1
: imposta l’etichetta del filesystem
Gestione filesystem Btrfs
Per la manutenzione di un filesystem Btrfs un tool interessante é Btrfs Assistant.
Alcuni comandi utili:
# Mostra i filesystem Btrfs attivi
sudo btrfs filesystem show
# Mostra informazioni dettagliate sul filesystem montato in /media/user/raid1/
sudo btrfs filesystem df /media/user/raid1/
# Controlla lo stato dei dispositivi e eventuali errori
sudo btrfs device stats /media/user/raid1/
# Controlla lo stato di un'operazione di scrub
sudo btrfs scrub status /media/user/raid1/
Auto mount
Ora che abbiamo creato l’array, questo si sblocca in automatico all’avvio, rimane da impostare l’auto-mount al boot del sistema. Nel caso di un raid gestito tramite mdadm
, basta aggiungere la riga seguente al file /etc/fstab
:
/dev/md1 /media/user/raid1 ext4 defaults,nofail,x-systemd.device-timeout=15 0 2
Nel caso di un raid gestito con Btrfs, dobbiamo inserire la riga:
UUID=2858f3c1-995f-46ca-8164-76836b7860d2 /media/user/raid1 btrfs defaults,nofail,x-systemd.device-timeout=15,noatime,space_cache=v2,compress=zstd:1,ssd,discard=async 0 2
NOTA: in questo caso il UUID NON É quello della partizione, ma quello del raid1, visibile sempre col comando
lsblk -f
Le opzioni nofail
e x-systemd.device-timeout=15
sono utilizzate per controllare il comportamento del montaggio dei filesystem in un sistema GNU/Linux che utilizza systemd. Sono fondamentali per evitare che il sistema non si avvii in caso di configurazioni errate.
nofail
: indica al sistema di non considerare un errore di montaggio come un problema critico durante l’avvio. Se il dispositivo specificato non è disponibile (ad esempio, se è stato rimosso o non è stato ancora inizializzato), il sistema continuerà l’avvio senza interrompersi o bloccarsi.x-systemd.device-timeout=15
: questa opzione specifica un timeout per il montaggio del dispositivo. Se il montaggio non avviene entro questo intervallo di tempo, il sistema procederà senza montare il dispositivo.
Ora non rimane che smontare e chiudere le partizioni, se montate e sbloccate in precedenza, quindi dare i comandi:
sudo mkdir /media/user/raid1 -p
sudo systemctl daemon-reload
sudo mount -a
Se abbiamo fatto tutto correttamente, dovremmo avere il nostro array montato correttamente.