Dual boot con Windows

Ogni distribuzione Linux, per quanto possa essere anche abbastanza conosciuta e utilizzata (come Ubuntu o Debian), ha un difetto: non può competere con la popolarità di Windows. In un mondo ideale, non dovrebbe sussistere alcun problema riguardo ciò, ma per nostra grande fortuna viviamo in un mondo che non è affatto quello ideale e dobbiamo sorbirci l’annoso problema della disponibilità dei software per Linux e, nello specifico, per NixOS.

Molti programmatori, ma in particolare molte grandi aziende produttrici di software, sono poco inclini al rendere disponibili i propri software per i sistemi operativi Linux, favorendo così l’egemonia di Windows e rendendo vano ogni tentativo di potersene liberare.

Morale della favola: sì, ti consiglio vivamente di usare NixOS nella tua vita quotidiana, ma in dual boot con Windows, cosicché quest’ultimo sia sempre a portata di mano e utilizzabile nel caso in cui ci dovesse essere il bisogno di utilizzare un software non disponibile per Linux (o per NixOS).

Un’altra alternativa possibile è quella delle virtual machine, ma mi sento di sconsigliarla in quanto è molto meno performante eseguire Windows in una VM rispetto che proprio come sistema operativo a se stante.

2 - Installazione in dual boot di Windows e NixOS

L’installazione in dual boot di Windows e NixOS non è un’operazione particolarmente complicata. Ti consiglio di seguire la guida How to dualboot Windows and NixOS di Drake Rossman che, a parer mio, è fatta molto bene ed è scritta in modo molto chiaro.

Anche io ho seguito questa guida ma, dato che credo si sia capito quanto mi piace smanettare, ovviamente non l’ho seguita pedissequamente. A differenza sua, infatti:

  1. Ho usato l’installazione manuale di NixOS (anziché quella grafica) per ragioni che spiegherò più avanti.
  2. A causa di questo, la configurazione delle partizioni l’ho fatta con GParted Live.
  3. NixOS non riesce a trovare l’ISO all’interno dell’unità USB avviabile con Ventoy se si effettua l’installazione manuale, ragion per cui non ho usato Ventoy.

In questa guida, quindi, spiegherò come installare in dual boot Windows (10 o 11, fa lo stesso) e NixOS tramite installazione manuale. Andremo a installare prima Windows e, dopo aver espanso la partizione di sistema EFI tramite GParted Live per fare spazio al firmware di NixOS, installeremo quest’ultimo.

Seguiremo questo ordine perché, durante l’installazione, Windows assume di essere l’unico sistema operativo presente sulla macchina e rischierebbe di sovrascrivere qualsiasi altra azione precedente.

Io installerò sia Windows che NixOS in inglese, quindi i programmi e/o i comandi che citerò saranno scritti in inglese (credo sia facilmente intuibile quale possa essere il loro corrispettivo in italiano).

Consiglio: porta pazienza

Lavorare con i sistemi operativi non è semplice e spesso questo processo può risultare lento e stancante. L’unico consiglio che mi sento di darti è di portare pazienza e aspettare che il computer faccia il proprio lavoro.

Ci sono alcune operazioni in cui ti ritroverai a dover necessariamente aspettare anche diversi minuti (come il flashing delle unità USB avviabili o l’avvio degli installer dei sistemi operativi). Anche se il computer possa sembrare fermo, in realtà in quei momenti potrebbe star lavorando. Non lo toccare e lascialo lavorare, attendi anche una buona mezz’ora e, solo se continua a non dare segni di vita, forza lo spegnimento.

La pazienza è la virtù dei forti, non dimenticarlo.

[!tutorial] Tutorial: installazione in dual boot di Windows e NixOS

Questo è il tutorial per installare in dual boot Windows e NixOS.

Prima di partire con l’installazione vera e propria, ci sono un po’ di preparativi da fare.

Preparazione e consigli

Innanzitutto, andando a cambiare il sistema operativo, sarà necessario ovviamente fare una formattazione del disco fisso, quindi prima di procedere ti consiglio vivamente di salvarti TUTTO ciò che non vuoi perdere su spazi di archiviazione esterni come chiavette, HDD esterni o anche sul cloud con Google Drive o Dropbox.

Se hai un po’ di pazienza e preferite fare le cose in sicurezza per evitare di avere in futuro rimpianti su dati che avrai permanentemente perso, ti consiglio di continuare a usare il tuo computer per almeno una settimana, esattamente come hai fatto finora e, nel frattempo, salvarti tutto quello di cui ti ricordi (io consiglio una settimana di “attesa” perché credo che in una settimana ci si riesca a ricordare di tutto ciò che può essere utile salvarsi, ma ovviamente più si “temporeggia” e meglio è). Questo è il mio consiglio, sentiti libero di non seguirlo a tuo rischio e pericolo (ma ricordati, meglio “perdere” una settimana di tempo che perdere qualcosa che potenzialmente non potresti recuperare mai più).

Bene, una volta terminato il trasferimento di tutti i dati utili, si può procedere con l’installazione vera e propria. L’occorrente per questo processo è il seguente:

  • Una chiavetta USB da almeno  che sarà formattata (per diventare un’unità USB avviabile) e, di conseguenza, perderà ogni dato salvato su di essa (anche in questo caso bisogna trasferire da qualche altra parte tutto il contenuto della chiavetta, altrimenti si rischia di perderlo per sempre).
  • Una connessione a Internet che ci sarà utile durante l’installazione di NixOS e che può essere effettuata in uno dei seguenti modi:
    • Tramite Ethernet, cioè tramite cavo LAN collegato al computer.
    • Tramite tethering, cioè collegando il telefono al computer tramite un cavo USB e attivando l’impostazione del tethering sul telefono stesso.
    • Tramite Wi-Fi, ma rispetto ai primi due metodi (che richiedono solamente l’azione di collegare il computer al cavo LAN o al cavo USB) è un metodo un po’ più macchinoso perché necessita di un po’ di configurazione (per fortuna, però, sulla guida ufficiale è spiegato tutto).
  • Ovviamente, un dispositivo da cui seguire queste istruzioni diverso da quello su cui si installerà il sistema operativo (va bene anche il telefono stesso da cui si fa tethering oppure un altro computer).
  • Almeno  di memoria non allocata sul disco fisso da destinare a NixOS.
Installazione e configurazione di Windows

Come già detto, per comodità, ci conviene in primis avere già installato Windows (10 o 11) e solo in seguito sarà possibile procedere con l’installazione di NixOS.

Se non hai ancora installato Windows, innanzitutto controlla se il tuo computer rispetta i requisiti di sistema per l’installazione di Windows 11, altrimenti in alternativa puoi procedere con l’installazione di Windows 10 senza problemi. Io in questa guida userò Windows 10 perché il mio PC non supporta Windows 11.

Scarica l’immagine ISO della versione di Windows che desideri da questi link:

Per installare Windows, procedi in questo modo:

  1. Rendi la chiavetta USB un’unità USB avviabile con l’ISO di Windows (io ho usato WoeUSB e non ho avuto problemi).
  2. Inseriscila nel computer su cui installare Windows, accendi il computer e accedi al menu di avvio del sistema operativo (boot menu).
  3. Seleziona l’unità USB avviabile.

Aneddoto personale: viva la pazienza!

Dopo aver selezionato l’unità USB avviabile con Windows, mi è capitato di ritrovarmi davanti a una schermata nera con un cursore lampeggiante che non ha dato segni di vita per diversi minuti.

Se è successo anche a te, quel che posso consigliarti è di portare pazienza come ho fatto io: dopo una decina di minuti, è partito l’installer di Windows.

Se, invece, dell’installer di Windows non ne hai visto neanche l’ombra, prova a rifare il flashing dell’unità USB avviabile, magari si è corrotto l’installer.

  1. Procedi con l’installazione di Windows.
  2. Alla schermata di scelta del tipo di installazione, seleziona Custom: Install Windows only (advanced).
  3. Cancella tutte le partizioni. Non preoccuparti, Windows si occuperà di ricreare tutte le partizioni necessarie durante l’installazione.
  4. Procedi con l’installazione di Windows (possibilmente evitando di installare qualsiasi altra puttanata ti propina Windows).
  5. Terminata l’installazione di Windows, apri Disk management (Gestione disco in italiano). Dovresti trovarti in una situazione simile a questa: Tralasciando le partizioni dell’unità USB avviabile (nel mio caso è Windows USB (D:)), abbiamo tre partizioni:
    1. (C:): la partizione NTFS primaria contenente Windows.
    2. (Disk 0 partition 1): la partizione di sistema EFI contenente il firmware per avviare Windows.
    3. (Disk 0 partition 4): la partizione di ripristino di Windows 10.
  6. Fai clic col tasto destro sulla partizione (C:) e seleziona Shrink Volume…. Inserisci il numero di che vorrai sottrarre a Windows per assegnarli a NixOS (io ne ho scelti ). Ci ritroveremo quindi in questa situazione: Tralasciando il fatto che Windows si rifiuta di puntualizzare che quelli che ci sta mostrando sono e e non e , ora puoi notare come abbiamo (che sono equivalenti a circa ) di spazio non allocato.
  7. Per il momento abbiamo finito con Windows, ora puoi passare all’installazione di NixOS!
Configurazione delle partizioni con GParted Live
  1. Rendere la chiavetta USB avviabile anche con dd

  2. Tra le opzioni di avvio, scegliere GParted Live (Default settings)

  3. Premi invio per selezionare Don't touch keymap

  4. Scegli la lingua che preferisci inserendo il relativo numero

  5. Premi invio per avviare GParted automaticamente (opzione 0)

  6. Se ti si pianta, prova con Other modes of GParted Live e GParted Live (Safe graphic settings, vga=normal) (fonte: https://unix.stackexchange.com/questions/753765/gparted-live-hangs-on-debian-info-screen) e riprova i passi 3 e 4

  7. All’avvio di GParted Live, ci ritroviamo in una situazione simile a questa:

    Queste partizioni rappresentano:

    • /dev/sda1: partizione di sistema EFI da ,
    • /dev/sda2: partizione MSR di Windows da ,
    • /dev/sda3: partizione primaria di Windows (ossia la partizione (C:)),
    • /dev/sda4: partizione di ripristino di Windows da . Quel che ci interessa fare è espandere la partizione di sistema EFI (/dev/sda1) per portarla a in modo che possa contenere i bootloader sia di Windows che di NixOS ma, per farlo, dobbiamo creare spazio davanti alla partizione MSR di Windows (/dev/sda2). Ciò implica il dover spostare la partizione MSR di Windows (/dev/sda2) e la partizione primaria di Windows (/dev/sda3) in avanti di .

Osservazione sui della partizione di sistema EFI

Per quel che riguarda la partizione di sistema EFI, nella pratica abbiamo che:

  • il bootloader di Windows, il Windows Boot Manager, usa circa e
  • il bootloader di NixOS, systemd-boot oppure GRUB, funzionano comodamente con .

Considerando che anche configurazioni molto pesanti raramente superano , allora potrebbero sembrare un po’ eccessivi, ma io personalmente preferisco partire prevenuto anziché rischiare di ritrovarmi poi in futuro nella situazione in cui la partizione di sistema EFI non avrà più spazio libero (melius abundare quam deficere).

  1. Clicchiamo col tasto destro sulla partizione primaria di Windows (/dev/sda3) e selezioniamo Resize/Move. Inseriamo in Free space preceding (MiB) la quantità di che vogliamo aggiungere alla partizione di sistema EFI: il nostro obiettivo è portarla a , quindi ci mancano

    Scriviamo nella casella di testo 4046 e premiamo Invio, così GParted in automatico sottrarrà questo quantitativo di memoria

    • o da questa partizione, quindi il valore di New size (MiB) di sarà diminuito di e ciò implica che la partizione di Windows sarà più piccola di circa
    • o da eventuale spazio libero dopo di questa, quindi il valore di Free space following (MiB) sarà diminuito di e ciò implica che la partizione di NixOS sarà più piccola di circa (e nel mio caso è successo questo). Che avvenga l’uno o l’altro caso poco ci importa, non saranno a fare la differenza. Premiamo su Resize/Move per confermare le nostre scelte e, nel pop-up successivo, su Ok per confermare che sappiamo quel che stiamo facendo.
  2. Ora ci ritroviamo in questa situazione:

    Tra la partizione MSR di Windows (/dev/sda2) e quella primaria (/dev/sda3) abbiamo poco meno di non allocati.

  3. Questo spazio non allocato va spostato tra la partizione di sistema EFI (/dev/sda1) e la partizione MSR di Windows (/dev/sda2). Quel che dobbiamo fare quindi è spostare in avanti di proprio quest’ultima partizione. Per farlo, clicchiamo col tasto destro sulla partizione MSR di Windows (/dev/sda2) e selezioniamo Resize/Move. In Free space preceding (MiB) scriviamo 3996 e premiamo Invio, così GParted in automatico azzererà il valore di Free space following (MiB). Clicchiamo quindi su Resize/Move per confermare le nostre scelte.

  4. Ora che abbiamo lo spazio non allocato direttamente attaccato alla partizione di sistema EFI (/dev/sda1), possiamo espanderla. Clicchiamo col tasto destro su di essa e selezioniamo Resize/Move. In New size (MiB) scriviamo 4096 e premiamo su Resize/Move per confermare le nostre scelte.

  5. La situazione finale in cui dovremo ritrovarci sarà questa:

    La partizione di sistema EFI (/dev/sda1) dovrà essere di .

  6. Ora possiamo confermare le operazioni da effettuare e cliccare sulla spunta verde per eseguirle. GParted ci metterà un bel po’ per fare tutto ciò (circa 10-20 minuti).

  7. Al termine delle operazioni sbucherà fuori un errore riguardante l’espansione della partizione di sistema EFI, ma nessuna paura: molto semplicemente, GParted non è in grado di ridimensionare le partizioni FAT32 (e da parte degli sviluppatori, giustamente, non c’è la volontà di voler risolvere questo problema, essendo GParted uno strumento non mirato a essere usato su Windows). Clicchiamo su Close.

  8. Ora l’unica cosa che possiamo fare è ricreare da zero la partizione di sistema EFI (/dev/sda1) esattamente come vogliamo noi. Prima di fare ciò, dobbiamo fare un backup dei file su questa partizione in una cartella temporanea: apriamo il terminale di GParted Live e creiamola con

    mkdir /tmp/backed-up-boot

Attenzione: usa sudo

Per alcuni di questi comandi ci sarà bisogno di usare la modalità superutente per eseguirli, quindi se alla loro esecuzione il terminale restituisce errore, usa sudo (non c’è bisogno di una password per usarlo).

  1. Dal momento che stiamo lavorando su un live USB, dobbiamo montare questa partizione in una cartella: creiamola con

    mkdir /mnt/actual-boot

    e montiamola con

    mount /dev/sda1 /mnt/actual-boot

    In effetti, se ora proviamo a visualizzare tutti i file nella cartella con

    ls -R /mnt/actual-boot

    notiamo che ci sono proprio i file di avvio di Windows.

  2. Dobbiamo copiare i file da questa cartella contenente il boot alla cartella di backup: eseguiamo

    cp -r /mnt/actual-boot /tmp/backed-up-boot

    Nuovamente, se proviamo a visualizzare tutti i file nella cartella di backup con

    ls -R /tmp/backed-up-boot

    notiamo che abbiamo anche qui i file di avvio di Windows.

  3. Possiamo smontare la partizione:

    umount /mnt/actual-boot
  4. Ora possiamo eliminare e ricreare la partizione: chiudiamo il terminale e, sulla schermata di GParted, selezioniamo la partizione di sistema EFI (/dev/sda1) e selezioniamo Delete.

  5. Clicca col destro sullo spazio non allocato che abbiamo appena ottenuto e seleziona New per creare una nuova partizione. Lasciando stare quell’eventuale paio di di spazio che precederà questa partizione, assicurati di impostare questa partizione come Primary Partition, con dimensione di , con il nome di EFI System Partition e con il file system FAT32.

  6. Ci ritroviamo ora in una situazione del genere:

    Clicca sulla spunta verde per eseguire queste operazioni.

  7. Ricordiamoci di impostare le flag corrette per la partizione di sistema EFI (/dev/sda1): clicca col destro su di essa, seleziona Manage Flags e metti la spunta solo a boot, esp e no_automount.

  8. Ultima operazione che ci rimane da fare: ripristinare il backup fatto prima. Riapriamo il terminale ed eseguiamo

    mount /dev/sda1 /mnt/actual-boot

    per montare la partizione,

    cp -r /tmp/backed-up-boot /mnt/actual-boot

    per copiare i file dalla cartella di backup a quella di boot e

    umount /mnt/actual-boot

    per smontare.

Installazione di NixOS

Terminata l’installazione e configurazione di Windows, puoi finalmente procedere con il download dell’immagine ISO di NixOS. Sulla pagina di download del sito ufficiale di NixOS trovi 2 ISO:

Consiglio: scegli l'installazione manuale di NixOS

Per l’installazione di NixOS io consiglio vivamente di procedere con l’installazione manuale anziché con quella grafica perché:

  1. Ai tempi, quando ebbi il mio primo approccio a questo favoloso sistema operativo, pur seguendo la guida ufficiale di NixOS sull’installazione, la graphical ISO image della versione 24.05 di NixOS che provai a usare non mi salvava correttamente in memoria le vecchie generazioni, mentre con quella minimal non ho avuto problemi.
  2. L’installazione manuale ti permette di avere piena padronanza e conoscenza delle modifiche che verranno apportate al tuo sistema, evitandoti così di ritrovarti alcune cose che potresti non desiderare. Insomma, se fai tutto tu sai esattamente quel che otterrai.

Per i motivi appena descritti, io userò la minimal ISO image tramite cui effettuerò l’installazione manuale.

Per installare NixOS, procedi in questo modo:

  1. Rendi la chiavetta USB un’unità USB avviabile con la minimal ISO image di NixOS (ho provato a farlo tramite dd ma mi dava problemi, però con USBImager è andato tutto liscio).

  2. Inseriscila nel computer su cui installare NixOS accendi il computer e accedi al menu di avvio del sistema operativo (boot menu).

  3. Seleziona l’unità USB avviabile.

  4. Seleziona l’installer con la versione di Linux che preferisci (io preferisco sempre la LTS, così posso dormire sonni tranquilli sapendo che questa versione del kernel sarà supportata per un bel po’).

  5. Nella CLI che si è aperta, esegui il comando sudo -i per passare alla modalità privilegiata (non c’è bisogno di alcuna password perché l’utente nixos creato di default non ne ha una).

  6. Se vuoi impostare il layout italiano per la tastiera, esegui il comando

    loadkeys it
  7. Con

    parted -l /dev/sda

    possiamo vedere la lista delle partizioni che abbiamo creato prima con GParted. Dovremmo avere qualcosa del genere:

    Number  Start   End     Size    File system  Name                          Flags
     1      1049kB  4296MB  4295MB  fat32        EFI System Partition          boot, esp, no_automount
     2      4296MB  4313MB  16.8MB               Microsoft reserved partition  msftres, no_automount
     3      4313MB  254GB   249GB   ntfs         Basic data partition          msftdata
     4      512GB   512GB   556MB   ntfs                                       hidden, diag, no_automount
    

    Tra la partizione 3, ossia la partizione primaria di Windows (/dev/sda3), e la partizione 4, ossia partizione di ripristino di Windows (/dev/sda4), creeremo due partizioni per NixOS:

    • una partizione root e
    • una partizione swap.
  8. Creiamo la partizione root dalla fine della partizione primaria di Windows (/dev/sda3), cioè a , fino a prima della partizione di ripristino di Windows (/dev/sda4), cioè a :

    parted /dev/sda -- mkpart root ext4 254GB 504GB
  9. Creiamo la partizione swap dalla fine della partizione root all’inizio della partizione di ripristino di Windows (/dev/sda4):

    parted /dev/sda -- mkpart swap linux-swap 504GB 512GB
    
  10. Eseguiamo nuovamente

    parted -l /dev/sda

    per vedere la lista delle partizioni. Ora dovremmo avere qualcosa del genere:

    Number  Start   End     Size    File system  Name                          Flags
     1      1049kB  4296MB  4295MB  fat32        EFI System Partition          boot, esp, no_automount
     2      4296MB  4313MB  16.8MB               Microsoft reserved partition  msftres, no_automount
     3      4313MB  254GB   249GB   ntfs         Basic data partition          msftdata
     5      254GB   504GB   250GB                root
     6      504GB   512GB   7553MB               swap                          swap
     4      512GB   512GB   556MB   ntfs                                       hidden, diag, no_automount
    
  11. Nella partizione root (che rinomineremo nixos), che nel mio caso è la numero 5, creiamo un file system di tipo ext4:

    mkfs.ext4 -L nixos /dev/sda5
  12. Nella partizione swap creiamo la swap partition:

    mkswap -L swap /dev/sda6
  13. Ora procediamo con l’installazione vera e propria di NixOS: montiamo prima il file system con

    mount /dev/sda5 /mnt
  14. Montiamo la partizione di avvio con

    mkdir -p /mnt/boot
    mount -o umask=077 /dev/sda1 /mnt/boot
  15. If your machine has a limited amount of memory, you may want to activate swap devices now (swapon device). The installer (or rather, the build actions that it may spawn) may need quite a bit of RAM, depending on your configuration.

    swapon /dev/sda6
  16. You now need to create a file /mnt/etc/nixos/configuration.nix that specifies the intended configuration of the system. This is because NixOS has a declarative configuration model: you create or edit a description of the desired configuration of your system, and then NixOS takes care of making it happen. The syntax of the NixOS configuration file is described in Configuration Syntax, while a list of available configuration options appears in Appendix A. A minimal example is shown in Example: NixOS Configuration. This command accepts an optional --flake option, to also generate a flake.nix file, if you want to set up a flake-based configuration. The command nixos-generate-config can generate an initial configuration file for you:

    nixos-generate-config --root /mnt --flake
  17. You should then edit /mnt/etc/nixos/configuration.nix to suit your needs:

nano /mnt/etc/nixos/configuration.nix
  1. Sul mio computer, ho come bootloader GRUB, quindi mi assicuro che sia presente (e sia de-commentata) l’opzione
    boot.loader.grub.enable = true;
  2. Il device per GRUB, essendo in UEFI, deve essere "nodev":
    boot.loader.grub.device = "nodev";
    e
    boot.loader.grub.efiSupport = true;
  3. De-commenta e cambia il nome del tuo dispositivo:
    networking.hostName = "manuel-laptop"
    
  4. De-commenta e imposta il fuso orario (quello di Amsterdam corrisponde a quello nostro italiano):
    time.timeZone = "Europe/Amsterdam"
  5. Settiamo il locale corretto:
    i18n.defaultLocale = "it_IT.UTF-8";
  6. Impostiamo lo user account:
users.users.manuel = {
  isNormalUser = true;
  home = "/home/manuel";
  initialPassword = "PASSWORD";
  extraGroups = [ "wheel" ];
};
  1. Salviamo con Ctrl+X e scriviamo Y per confermare le modifiche.
  2. Collega il telefono col tethering per assicurare che ci sia connessione a internet.
  3. Installiamo finalmente NixOS con:
    nixos-install --flake 'path/to/flake.nix#nixos'
  4. A fine installazione, ci chiederà di impostare una password per il root.
  5. Se tutto è andato come dovrebbe, fai
    reboot