L'installazione di una distribuzione Linux al giorno d'oggi è piuttosto semplice grazie all'utilizzo di appositi installer (spesso grafici) che, con pochi passaggi, permettono di far trovare all'utente tutto il software necessario già pronto all'uso.
Ciò anche in caso di condivisione del disco fisso tra più sistemi operativi (es.: dual-boot tra Linux e Windows), dove il software di installazione si occuperà opportunamente del partizionamento del disco e dell'installazione di un boot-loader per permettere all'utente, al momento dell'accensione o del riavvio del computer, di scegliere quale sistema operativo utilizzare.
Non fa eccezione Ubuntu, distribuzione fra le più utilizzate su desktop e notebook, il cui installer lascia decidere se mantenere la possibilità di fare il dual-boot oppure se eliminare completamente gli altri sistemi operativi ed installare solo ed unicamente sé stesso.
L'installer permette anche, opzionalmente, di crittografare in automatico le partizioni di destinazione, in modo tale da garantire la massima sicurezza (dati illeggibili ad uno sconosciuto) in caso di furto o smarrimento del notebook. Va da sé quindi che questa installazione in modalità full-encrypted (solo la piccola partizione di /boot rimane in chiaro in questi casi, ma essa non contiene tipicamente dati sensibili) rappresenta un notevole passo avanti in termini di sicurezza.
Questa opzione però è disponibile solo in caso di installazione con utilizzo totale del disco; quindi eliminando preventivamente qualunque altra partizione e, di fatto, escludendo la possibilità di dual-boot o di partizioni di dati "terze".
E ciò che è peggio è che nemmeno gli installer di Ubuntu cosiddetti alternative, a differenza di quanto accadeva fino a pochi anni fa, mettono più a disposizione questa possibilità in automatico.
In questo documento vediamo dunque i passaggi da seguire manualmente per raggiungere comunque il nostro scopo.
Premetto che quanto sotto riportato si basa su Ubuntu 18.04 (ma potrebbe essere valido anche per versioni future e/o per altre distribuzioni), che per i miei test ho utilizzato una macchina virtuale VirtualBox, e soprattutto che mi è stata di grande aiuto questa guida scritta per Ubuntu 14.04-15.10 ma ancora in gran parte valida (di fatto questo documento ne è quasi una traduzione, ma con alcuni bugfix e correzioni applicate).
Come da mia abitudine, ho lasciato l'ambiente configurato in lingua Inglese per semplificare eventuali ricerche online (è più facile infatti trovare documentazione tramite un termine tecnico originale rispetto ad una sua traduzione).
Effettuiamo anzitutto il boot tramite il live-cd di Ubuntu e selezioniamo Try Ubuntu.
Patch per l'installer
L'installer ufficiale di Ubuntu 18.04, Ubiquity, ha un bug tale per cui, in talune circostanze (in particolare quando il computer è piuttosto "lento", oppure l'installazione avviene in una macchina virtuale), al momento di iniziare la copia dei file il software può andare in crash; per maggiori informazioni, v. bug report e soluzione.
In concreto, il problema si risolve attendendo le prossime release oppure, più semplicemente, applicando - prima di proseguire con l'installazione - la patch già disponibile secondo i seguenti passaggi.
- Apriamo il terminale (CTRL + ALT + T).
- Scarichiamo la patch ed applichiamola all'installer.
$ cd ~/Downloads
$ wget https://code.launchpad.net/~azzar1/ubiquity/+git/ubiquity/+merge/345056/+preview-diff/831305/+files/preview.diff --output-document ubiquity.patch
$ sudo cp /usr/lib/ubiquity/ubiquity/misc.py /usr/lib/ubiquity/ubiquity/misc.py.original
$ sudo patch /usr/lib/ubiquity/ubiquity/misc.py ubiquity.patch
Naturalmente in caso di riavvio del computer bisogna ripetere la procedura soprastante, dato che la patch viene applicata solo temporaneamente (stiamo infatti facendo il boot da un live-cd).
Installazione passo-passo
- Lanciamo
gparted
e creiamo due partizioni per la nostra installazione, una per /boot da formattare in ext4 e l'altra per il resto del sistema e la swap, da gestire nei passaggi seguenti.
Nel mio esempio,/dev/sda1
rappresenta un altro sistema operativo (o anche una semplice partizione di dati non interessata dalla presente installazione),/dev/sda2
è riservata a /boot e/dev/sda3
è la partizione da gestire meglio in seguito. - Creiamo un contenitore LUKS.
$ sudo cryptsetup luksFormat /dev/sda3
$ sudo cryptsetup luksOpen /dev/sda3 RootAndSwap
- Nel contenitore LUKS, creiamo un volume LVM fisico, un gruppo e due volumi LVM logici: la partizione di swap e quella di sistema /.
Nel mio esempio, la partizione di swap occupa 1 GB e quella di sistema tutto lo spazio residuo.$ sudo pvcreate /dev/mapper/RootAndSwap
$ sudo vgcreate lvm-vg /dev/mapper/RootAndSwap
$ sudo lvcreate -n swap -L 1g lvm-vg
$ sudo lvcreate -n systemroot -l 100%free lvm-vg
- Facciamo partire l'installazione assegnando opportunamente le partizioni.
Nel mio esempio,/dev/sda2
diventa /boot (da formattare in ext4),/dev/mapper/lvm--vg-systemroot
diventa / (da formattare in ext4) e/dev/mapper/lvm--vg-swap
diventa la partizione di swap. - Attendiamo la copia dei file e la configurazione di base, dopodiché premiamo Continue testing ed apriamo un terminale (CTRL + ALT + T).
- Recuperiamo lo UUID della partizione fisica dove è stato creato il contenitore LUKS.
Nel mio esempio, si tratta di/dev/sda3
.$ sudo blkid /dev/sda3
- Montiamo opportunamente le nuove partizioni ed effettuiamo un chroot nel nuovo ambiente.
$ sudo mkdir /mnt/ubuntu
$ sudo mount /dev/mapper/lvm--vg-systemroot /mnt/ubuntu
$ sudo mount /dev/sda2 /mnt/ubuntu/boot
$ sudo mount --bind /dev /mnt/ubuntu/dev
$ sudo chroot /mnt/ubuntu
# mount -t proc proc /proc
# mount -t sysfs sys /sys
# mount -t devpts devpts /dev/pts
- Creiamo, nell'ambiente chroot, un file
/etc/crypttab
con il seguente contenuto (naturalmente inserendo il valoreUUID
recuperato in precedenza):RootAndSwap UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx none luks,retry=1,lvm=lvm--vg
- Creiamo, nell'ambiente chroot, un file
/etc/initramfs-tools/conf.d/cryptroot
con il seguente contenuto (naturalmente inserendo il valoreUUID
recuperato in precedenza):CRYPTROOT=target=RootAndSwap,source=/dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
- Eseguiamo, nell'ambiente chroot, l'aggiornamento dell'immagine di sistema.
# update-initramfs -k all -c
- Modifichiamo, nell'ambiente chroot, il file
/etc/default/grub
ed impostiamo il valoreGRUB_CMDLINE_LINUX
(come meglio specificato in questa pagina per gestire l'ibernazione ed in questa pagina per evitare l'errore cryptsetup: lvm fs found but no lvm configured):GRUB_CMDLINE_LINUX="resume=/dev/mapper/lvm--vg-swap cryptopts=target=RootAndSwap,source=/dev/sda3,lvm=/dev/mapper/lvm--vg-systemroot"
- Lanciamo, nell'ambiente chroot, il comando per aggiornare il boot-loader.
# update-grub
L'installazione è terminata.
Test
Per vedere se il tutto funziona correttamente, è sufficiente riavviare il computer: dovrebbe essere chiesta la chiave di sblocco della partizione crittografata e, una volta digitata, il sistema dovrebbe eseguire il boot di Ubuntu senza problemi ed arrivare alla schermata di login.
Per ulteriore scrupolo, è possibile eseguire il comando
$ mount
ed osservare che la partizione di sistema / è mappata su /dev/mapper/lvm--vg-systemroot
, mentre il comando
$ swapon -s
ci conferma che la swap è mappata su /dev/mapper/lvm--vg-swap
.
Considerazioni finali
Si tratta certamente di un tipo di installazione che comporta una discreta complicazione ma, considerato che in cambio si ottiene una maggior sicurezza dei propri dati (a fronte di un degrado delle prestazioni accettabile), mi sento senz'altro di raccomandarla a chiunque abbia un minimo di esperienza.