Dopo aver letto il titolo di quest'articolo, qualcuno potrebbe pensare "Perché fare un cosa simile quando posso utilizzare Ubuntu dentro Windows??". Il primo motivo è per dimostrare che è possibile, il secondo perché è divertente e il terzo è in preparazione del passo successivo: eliminare Windows. Scherzi a parte, chi ha provato le potenzialità di Linux tramite Windows Subsystem for Linux ed è rimasto positivamente colpito, dovrebbe proprio provare come "gira" direttamente su hardware anziché virtualizzato tramite Windows inoltre, questo è un ottimo modo anche per conoscere meglio il sistema con il pinguino, dato che andremo a fare un'installazione manuale, "vecchia scuola", senza configurazione guidata.
Prerequisiti
Per poter effettuare questa operazione è necessario, oltre ovviamente ad aver configurato l'ultima versione di WSL, un secondo disco dove andremo ad installare Linux e che dovremo "esporre" a WSL.
Dato che dovremo creare e formattare la/le partizione/partizioni necessarie per l'installazione di Linux, non è possibile "montare" solo una partizione ma è necessario che WSL sia in grado di accedere direttamente al disco; poiché non si può utilizzare il disco dove è installato Windows (anche se ci fosse spazio sufficiente) per comprensibili ragioni, è quindi necessario avere un secondo disco disponibile ma questo non dovrà necessariamente essere occupato totalmente da Linux, potremo installare il nuovo sistema anche in una porzione sufficientemente grande.
Per questa guida farò riferimento alla popolare distribuzione Ubuntu ma, in maniera analoga, è possibile installare qualunque altra distro disponibile per WSL. Con un po' di lavoro aggiuntivo è possibile fare anche un installazione di una diversa distribuzione rispetto a quella utilizzata nel WSL!
» Leggi: Anatomia di una distro Linux
Passo 1: esporre il disco al WSL
Eseguiremo la maggior parte delle operazioni tramite WSL ma prima di avviarlo, dobbiamo esporre il discodove andremo ad installare Ubuntu al sottosistema e per farlo occorre agire da Powershell
eseguito come Amministratore
. Controlliamo i dischi disponibili sul nostro sistema con il comando
wmic diskdrive list brief
Una volta identificato il disco corretto (tramite la grandezza o il numero di partizioni, ad esempio), prendiamo nota del DeviceID
in modo da poterlo esporre a WSL proprio come se fosse collegato direttamente alla versione di Ubuntu in uso. Per farlo basterà digitare
wsl --mount \\.\PHYSICALDRIVE1 --bare
Se abbiamo solo due dischi non dovremo preoccuparci troppo di sbagliare, dato che se indichiamo per errore quello contenente Windows, il secondo comando restituirà un errore.
A questo punto possiamo avviare WSL e controllare se il disco viene visto correttamente con il comando lsblk
: nel mio caso risulta essere /dev/sdc
Passo 2: partizionamento e formattazione
Iniziamo adesso l'installazione di Ubuntu!! Creiamo le partizioni necessarie e formattiamole; per questa guida creerò solo 3 partizioni ma potete aggiungerne altre (ad esempio per separate /home da /): la prima servirà per ospitare /boot/efi
, la seconda sarà SWAP
e l'ultima ovviamente servirà per /
. Per farlo utilizzerò gdisk
da invocare con sudo
per poter accedere direttamente a /dev/sdc
sudo gdisk /dev/sdc
Ricordo che io utilizzerò un intero disco da dedicare all'installazione; se volte utilizzare solo parte del disco, dovrete aggiustare i comandi di conseguenza! Dato che è un disco nuovo, devo prima creare una tabella delle partizioni in GPT, premendo o
. Poi creerò le 3 partizioni premendo ogni volta n
, cambiando il numero della partizione, indicando il settore di inizio e di fine (oppure semplicemente la grandezza in MB o GB) e infine il codice per il tipo di partizione, che saranno: ef00
(EFI System Partition) per la partizione che ospiterà /boot/efi, 8200
per SWAP e 8300
per la partizione che ospiterà /. Termino comandando la scrittura delle modifiche con w
e confermando con Y
Al termine controllerò se le 3 partizioni sono state correttamente create con il solito comando lsblk
e passerò alla formattazione. La EFI System Partition (che ospiterà /boot/efi) necessità del filesystem FAT
, mentre per ospitare / scelgo btrfs
; swap
ovviamente ha il suo filesystem dedicato. I comandi da impartire saranno
sudo mkfs.fat -F 32 /dev/sdc1
sudo mkfs.btrfs /dev/sdc3
sudo mkswap /dev/sdc2
Passo 3: montaggio delle partizioni e installazione sistema di base
Adesso che le nostre partizioni sono pronte possiamo montarle per poterci installare il sistema. Creiamo prima i punti di mount e poi montiamo le partizioni: per / io ho scelto /mnt/ubuntu
e poi creiamo il percorso per /boot/efi
all'interno.
ATTENZIONE all'ordine dei comandi da impartire!!
sudo mkdir /mnt/ubuntu
sudo mount /dev/sdc3 /mnt/ubuntu
sudo mkdir -p /mnt/ubuntu/boot/efi
sudo mount /dev/sdc1 /mnt/ubuntu/boot/efi
Le nostre partizioni sono montate e possiamo quindi procedere a installare la base del sistema di Ubuntu (anche se ancora non possiamo proprio chiamarlo Ubuntu, siamo comunque in tempo per installare una sua diretta derivata!) con lo strumento debootstrap
. Installiamolo e, dato che ci siamo, possiamo installare anche arch-install-scripts
che ci servirà più avanti.
» Leggi: Come si installa un programma su Linux?
Una volta pronto tutto il necessario, dobbiamo solo indicare a debootstrap quale versione del sistema vogliamo (con il nome di versione: focal, groovy, hirsute, impish, jammy
, ...) e dove vogliamo che sia installato (nella nostra / montata in /mnt/ubuntu
) e attendere la fine dell'installazione.
sudo apt install debootstrap arch-install-scripts
sudo debootstrap jammy /mnt/ubuntu
Passo 4: configurazione e installazione completa
A breve "entreremo" nel nuovo sistema per configurarlo e terminare l'installazione ma non avvieremo ancora il nuovo sistema, andremo a configurarlo tramite chroot. Per prima cosa però generiamo, con genfstab
, la tabella dei filesystem /etc/fstab
che terrà conto di come sono montate le partizioni nel nostro sistema durante ogni avvio.
sudo genfstab -U /mnt/ubuntu | sudo tee /mnt/ubuntu/etc/fstab
Notiamo che, anche se abbiamo specificato a genfstab di utilizzare l'UUID (opzione -U
) dei dischi, il file generato non contiene questo identificativo bensì il percorso del disco così come visto dal sistema in uso (che è virtualizzato!) e questo è un problema perché non è detto che sia visto allo stesso modo dalla nostra installazione "fisica" di Ubuntu!! Al momento che entreremo nel nuovo sistema sarà meglio correggere subito questo difetto altrimenti rischieremo che Ubuntu non sia in grado di avviarsi!!
Attenzione: quando entreremo nel sistema agiremo sempre come root! Controlliamo bene quello che abbiamo digitato prima di premere Invio, altrimenti rischiamo di dover ricominciare tutto daccapo!!
Utilizzeremo una particolare versione di chroot messa appunto dagli sviluppatori di ArchLinux, arch-chroot che si occuperà di gestire alcuni filesystem virtuali per noi, basterà indicare quale percorso dovrà considerare come nuova /
sudo arch-chroot /mnt/ubuntu
Andiamo subito a correggere /etc/fstab! Per vedere gli UUID dei dischi che dovremo sostituire al percorso, possiamo utilizzare blkid
. Possiamo fare questa operazione "a mano", modificando una voce per volta oppure possiamo utilizzare uno script che faccia tutto in una volta. Se avete partizionato il disco in maniera semplice come ho fatto io, potete utilizzare lo script allegato (di cui potete vedere uno screenshot qua sotto); se avete configurato un sistema più complesso sarà meglio ricontrollarlo prima di eseguirlo e, se necessario, modificarlo
Al termine meglio controllare che il file /etc/fstab sia esattamente come lo vogliamo!!
Passiamo adesso a configurare la posizione geografica approssimativa (in modo da regolare automaticamente l'ora), la lingua di sistema e il tipo di tastiera utilizzata. Possiamo effettuare queste modifiche anche in seguito ma dato che richiedono solo 3 comandi e qualche click, meglio toglierci subito il pensiero
dpkg-reconfigure tzdata
dpkg-reconfigure locales
dpkg-reconfigure keyboard-configuration
Infine completiamo l'installazione aggiungendo tutti i componenti della versione Desktop che desideriamo, non dobbiamo specificare ogni pacchetto che vogliamo, possiamo avvalerci dei metapacchetti che contengono la lista di tutti i pacchetti necessari; io ad esempio ho scelto di installare ubuntu-desktop-minimal
che si compone comunque di più di 1200 pacchetti!! A questi aggiungiamo poi altri fondamentali pacchetti come linux-image-generic
, linux-headers-generic
e linux-firmware
.
Ricordo che è sempre possibile cambiare "flavors" in seguito se abbiamo sbagliato scelta o semplicemente se vogliamo provare qualcosa di nuovo
Creiamo un nuovo utente e assicuriamoci di aggiungerlo al gruppo dei sudoers oltre agli altri gruppi solitamente attivi per questa distro
adduser cub3
usermod -a -G sudo,adm,cdrom,dip,plugdev,lpadmin cub3
Passo 5: configuriamo il doppio avvio
Il nostro Ubuntu è ormai installato nel secondo disco, dobbiamo "solo" configurare l'avvio in modo da avere la scelta dei sistemi da avviare.
Installiamo il pacchetto grub-efi
(dato che si tratta di un sistema con UEFI) e poi installeremo GRUB nel percorso dedicato che abbiamo appositamente creato (/boot/efi/
). Se abbiamo un sistema con Secure Boot attivo e non vogliamo disattivarlo, dovremo installare anche il pacchetto shim-signed
(che è firmato da Microsoft).
apt install grub-efi
Installiamo poi GRUB con il seguente comando. Con Secure Boot attivo dovremo aggiungere un altra opzione --uefi-secure-boot
.
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
Noteremo che il comando sopra restituisce un avviso relativo alle variabili EFI che non si possono impostare in questo sistema (grub-install: warning: EFI variables cannot be set on this system.
) e che dovremo completare l'installazione di GRUB manualmente (grub-install: warning You will have to complete the GRUB setup manually.
). Diciamo subito che è normale e che non è un grosso problema ma richiede un minimo di lavoro aggiuntivo che vedremo in seguito.
Per adesso abbiamo terminato con WSL; usciamo quindi dall'ambiente chroot con exit e smontiamo tutte le partizioni montate prima di chiudere tutto
exit
sudo umount /mnt/ubuntu/boot/efi /ubuntu/
sudo swapoff -a
exit
Chiudiamo WSL, torniamo a Powershell, arrestiamo WSL e smontiamo il disco da questo con i comandi
wsl --shutdown
wsl --unmount \\.\PHYSICALDRIVE1
Passo 6: avviamo la nuova installazione di Ubuntu!
Per correggere il problema riguardante GRUB ci possono essere varie soluzioni possibili ma la più pratica che sono riuscito a trovare comporta la sostituzione del bootloader di windows con GRUB tramite l'installazione di GRUB2win
.
Scarichiamo l'ultima versione disponibile dal sito ufficiale, scompattiamo il file zip dove ci rimane più comodo e avviamo il file setup.exe
.
Grub2win rileverà il metodo di boot e il sistema operativo in uso e, una volta cliccato su OK
, scaricherà i necessari moduli compatibili dopodiché sarà possibile iniziare la configurazione cliccando su Setup
GRUB2win cercherà tutte le partizioni, troverà il posto giusto dove installarsi e creerà una prima bozza della configurazione; a noi non rimarrà altro da fare che cliccare su Return to Setup Menu
e successivamente su Close the Setup Program
.
A questo punto si aprirà una l'interfaccia di gestione di GRUB2win che potremo utilizzare anche per personalizzarne l'aspetto ma adesso ci concentreremo su quello che ci interessa: attivare il dual boot.
È possibile che nonostante il precedente setup abbia rilevato la partizione con Ubuntu, questo non sia stato inserito nel menù di avvio di GRUB: dovremo quindi inserirla manualmente cliccando su Manage Boot Menu
e in seguito su Add A New Entry
.
Nella nuova finestra sarà sufficiente selezionare Type: ubuntu
e Root Partition
la partizione dove abbiamo installato il sistema (quella che abbiamo montato in /mnt/ubuntu); salvo casi particolari, non è necessario aggiungere ulteriori parametri all'avvio, possiamo quindi cliccare su Apply
e infine su OK
per vedere la nuova voce appena creata aggiunta in fondo alla lista. A questo punto possiamo cliccare di nuovo su Apply
per tornare alla schermata iniziale, dove dovremo assicurarci che GRUB2win sia impostato come predefinito, cliccando (se presente!) su Set GRUB2win As The Default
e infine concludere l'operazione con OK
.
ATTENZIONE: aggiornamenti di Windows possono sovrascrivere il nuovo bootloader, ripristinando quello di default. È opportuno quindi lasciare installato GRUB2win, aggiornarlo se necessario e lanciarlo al bisogno.
Non ci rimane, infine, che riavviare il computer e selezionare Ubuntu nel menù di GRUB per trovarci sul nuovo sistema che potremo continuare a configurare come più ci piace