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.

raid0

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.

raid1

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.

raid5

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.

Riferimenti

RAID

crypttab

mdadm

Btrfs

Inserisci l'indirizzo della tua istanza


Altri post come questo

Debian SID con btrfs e snapper per una maggiore stabilità

2024-11-10 | #btrfs #debian #distro #linux #snapper #snapshot

Debian SID è la scelta ideale per gli utenti che desiderano immergersi nel cuore dello sviluppo di Debian, ma la sua natura instabile richiede un approccio proattivo alla gestione del sistema. In questo articolo, scopriremo come Btrfs e Snapper possano trasformare l'esperienza con Debian SID, offrendo funzionalità avanzate di snapshot e ripristino, e come GRUB-BTRFS possa facilitare la navigazione tra le diverse versioni del sistema.

Continua a leggere 