1. Preparazione del disco

Identificare il disco (esempio: /dev/sdb):

bash
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,TRAN,MODEL

Attenzione: tutti i dati sul disco verranno cancellati. Verificare di aver selezionato il disco corretto.

Per trovare il disco anche tramite ID univoco:

bash
ls -la /dev/disk/by-id/ | grep sdb

2. Creare la partizione GPT

Cancellare la tabella partizioni esistente e crearne una nuova:

bash
sudo fdisk /dev/sdb

Comandi interattivi dentro fdisk:

g        # crea una nuova tabella partizioni GPT
n        # crea una nuova partizione
         # premi Invio per accettare i default (partizione 1, primo e ultimo settore)
w        # scrivi le modifiche ed esci

Impostare il tipo di partizione corretto (Linux LUKS):

bash
# Su NixOS: nix-shell -p gptfdisk --run "sudo sgdisk ..."
sudo sgdisk -t 1:CA7D7CCB-63ED-4C53-861C-1742536059CC /dev/sdb

Verificare:

bash
sudo sgdisk -p /dev/sdb
# Il Code dovrebbe essere 8309 (Linux LUKS)

3. Criptare la partizione con LUKS

LUKS2 (default, consigliato)

bash
sudo cryptsetup luksFormat /dev/sdb1

Ti verrà chiesto di:

  • Confermare con YES (in maiuscolo)
  • Inserire la password (scegline una robusta)
  • Confermare la password

Opzioni avanzate

Per specificare cifrario e dimensione chiave:

bash
sudo cryptsetup luksFormat \
  --type luks2 \
  --cipher aes-xts-plain64 \
  --key-size 512 \
  --hash sha512 \
  --iter-time 5000 \
  /dev/sdb1
  • --type luks2: formato LUKS versione 2
  • --cipher aes-xts-plain64: cifrario AES-XTS (standard e veloce)
  • --key-size 512: 512 bit per AES-XTS (equivale a AES-256)
  • --hash sha512: algoritmo hash per la derivazione della chiave
  • --iter-time 5000: millisecondi per la derivazione (più alto = più sicuro ma più lento all’apertura)

4. Creare il filesystem

Aprire il volume criptato:

bash
sudo cryptsetup luksOpen /dev/sdb1 ssd_esterno

Creare il filesystem ext4:

bash
sudo mkfs.ext4 -L "SSD_Personal" /dev/mapper/ssd_esterno
  • -L "SSD_Personal": etichetta del filesystem (opzionale, utile per identificarlo)

Per un filesystem diverso:

bash
# Btrfs (supporta snapshot, compressione)
sudo mkfs.btrfs -L "SSD_Personal" /dev/mapper/ssd_esterno

# XFS (buone performance con file grandi)
sudo mkfs.xfs -L "SSD_Personal" /dev/mapper/ssd_esterno

5. Aprire, montare e smontare

Processo completo di apertura

bash
# 1. Apri il volume LUKS (ti chiede la password)
sudo cryptsetup luksOpen /dev/sdb1 ssd_esterno

# 2. Crea il mount point (solo la prima volta)
sudo mkdir -p /mnt/usb_ssd_personal

# 3. Monta il filesystem
sudo mount /dev/mapper/ssd_esterno /mnt/usb_ssd_personal

# 4. (Opzionale) Dai i permessi al tuo utente
sudo chown $USER:$USER /mnt/usb_ssd_personal

Processo completo di chiusura

bash
# 1. Assicurati di non essere dentro la directory montata
cd ~

# 2. Smonta il filesystem
sudo umount /mnt/usb_ssd_personal

# 3. Chiudi il volume LUKS
sudo cryptsetup luksClose ssd_esterno

Se il disco risulta occupato:

bash
# Vedi cosa lo sta usando
sudo lsof +f -- /mnt/usb_ssd_personal

# Oppure forza lo smontaggio (lazy umount)
sudo umount -l /mnt/usb_ssd_personal

Usare il percorso by-id (più affidabile)

Il nome /dev/sdb1 può cambiare ad ogni collegamento. Meglio usare il percorso stabile:

bash
sudo cryptsetup luksOpen /dev/disk/by-id/usb-ATA_CT1000BX500SSD1_0123456789ABCDE-0:0-part1 ssd_esterno

Per trovare il tuo percorso:

bash
ls -la /dev/disk/by-id/ | grep part1

6. Aggiungere un keyfile per il mount automatico

Un keyfile permette di aprire il volume LUKS senza digitare la password. La password resta comunque funzionante come metodo alternativo.

Creare il keyfile

bash
# Crea la directory
sudo mkdir -p /etc/secrets

# Genera 4096 byte casuali
sudo dd if=/dev/urandom of=/etc/secrets/ssd-luks.key bs=4096 count=1

# Permessi restrittivi (solo root può leggerlo)
sudo chmod 400 /etc/secrets/ssd-luks.key
sudo chown root:root /etc/secrets/ssd-luks.key

Aggiungere il keyfile al volume LUKS

bash
sudo cryptsetup luksAddKey /dev/sdb1 /etc/secrets/ssd-luks.key

Ti chiederà una password esistente per autorizzare l’aggiunta.

Verificare che funzioni

bash
# Chiudi il volume se è aperto
sudo umount /mnt/usb_ssd_personal
sudo cryptsetup luksClose ssd_esterno

# Riapri usando il keyfile (nessuna password richiesta)
sudo cryptsetup luksOpen --key-file /etc/secrets/ssd-luks.key /dev/sdb1 ssd_esterno

Aprire con keyfile manualmente

bash
sudo cryptsetup luksOpen --key-file /etc/secrets/ssd-luks.key /dev/sdb1 ssd_esterno
sudo mount /dev/mapper/ssd_esterno /mnt/usb_ssd_personal

7. Gestione delle chiavi LUKS

LUKS supporta fino a 8 slot per chiavi (0-7). Ogni slot può contenere una password o un keyfile.

Vedere gli slot in uso

bash
sudo cryptsetup luksDump /dev/sdb1 | grep -A 1 "Keyslot"

Aggiungere una nuova password

bash
sudo cryptsetup luksAddKey /dev/sdb1
# Ti chiede: password esistente, poi nuova password (2 volte)

Rimuovere una password specifica

bash
# Rimuovi per slot number
sudo cryptsetup luksKillSlot /dev/sdb1 1

# Oppure rimuovi chiedendo quale password eliminare
sudo cryptsetup luksRemoveKey /dev/sdb1

Cambiare una password

bash
sudo cryptsetup luksChangeKey /dev/sdb1
# Ti chiede: password attuale, poi nuova password (2 volte)

8. Backup dell’header LUKS

L’header LUKS contiene le chiavi di criptazione. Se si corrompe, tutti i dati sono persi. Fai sempre un backup.

Creare il backup

bash
sudo cryptsetup luksHeaderBackup /dev/sdb1 \
  --header-backup-file ~/luks-header-backup.bin

Conserva questo file in un luogo sicuro (chiavetta USB separata, cloud criptato, ecc.).

Ripristinare l’header

bash
sudo cryptsetup luksHeaderRestore /dev/sdb1 \
  --header-backup-file ~/luks-header-backup.bin

9. Troubleshooting

“Device is busy” durante lo smontaggio

bash
# Controlla cosa usa il disco
sudo lsof +f -- /mnt/usb_ssd_personal

# Controlla di non essere dentro la directory
cd ~

# Se necessario, lazy umount
sudo umount -l /mnt/usb_ssd_personal

La partizione viene vista come “unknown”

Il tipo di partizione GPT non è impostato correttamente:

bash
sudo sgdisk -t 1:CA7D7CCB-63ED-4C53-861C-1742536059CC /dev/sdb

Verificare lo stato SMART del disco

bash
sudo smartctl -a /dev/sdb

Valori importanti da controllare:

  • Reallocate_NAND_Blk_Cnt: deve essere 0
  • Percent_Lifetime_Remain: percentuale di vita consumata
  • UDMA_CRC_Error_Count: errori interfaccia (cavetto/porta USB)
  • Reported_Uncorrect: errori non correggibili (se > 0, il disco potrebbe essere in cattivo stato)

Il disco non viene riconosciuto su altre macchine

Controllare:

  1. Il tipo di partizione GPT sia corretto (vedi sopra)
  2. Che la macchina abbia cryptsetup installato
  3. Che il kernel supporti il cifrario usato (normalmente aes-xts-plain64 è supportato ovunque)
bash
# Verifica che il modulo kernel sia caricato
lsmod | grep dm_crypt
# Se non lo è:
sudo modprobe dm_crypt

Controllare l’integrità del filesystem

bash
# Il volume deve essere aperto ma NON montato
sudo cryptsetup luksOpen /dev/sdb1 ssd_esterno
sudo fsck /dev/mapper/ssd_esterno