venerdì 26 aprile 2013

Fix boot windows 8

Salve ragazzi !

 Come molti di voi già sapranno negli ultimi tempi si è diffuso il tanto temuto UEFI (in concomitanza con il Secure Boot) che ha preso il posto del vecchio Bios nei computer più recenti. All'inizio i problemi sono stati molti in quanto questo sistema non si presta bene ad ospitare sistemi operativi che non siano autorizzati da una giusta chiave( come invece lo è windows 8), ergo, molti utenti che usavano le più disparate distro Linux si sono ritrovati  con un pc che non permetteva loro di installare il loro SO preferito. 
Con il passare del tempo gli sviluppatori dell'esercito del pinguino si sono mobilitati e si sono preparati alla guerra contro il nemico UEFI.
Questo articolo non vuole essere una guida su come installare un sistema Linux su una macchina con sistema UEFI attivo, ma vuole descrivere alcuni semplici passaggi che spesso sono necessari subito dopo l'installazione in dualboot di una distro linux con windows 8.
Infatti accade spesso che al termine dell'installazione della distribuzione linux , win 8 non parta più. 
Niente paura, bastano pochi ingredienti per recuperare il nostro win8, ovvero:
  1. Iso di win 8 (anche la versione di prova scaricabile gratuitamente)
  2. Un cd per masterizzare la iso
  3. Un po di pazienza ( si dovrà lavorare con il prompt dei comandi di win)
Nel mio caso la distro linux installata è Arch Linux. Al termine dell'installazione mi sono ritrovato davanti alla schermata di grub2 nella quale erano presenti oltre al kernel di Arch anche due voci relative a windows 8, che però non riuscivano a fare il boot del sistema riportando il seguente errore:
error: impossibile trovare il comando "drivemap"
error: invalid EFI file path
 Solitamente le macchine con sistema UEFI permettono di scegliere dalla schermata del "bios" quale bootloader far partire, così sono entrato in questa schermata ed ho selezionato il bootloader di windows ( il mio portatile ha un tasto fisico laterale per accedere al "bios", su molti portatili basta premere il tasto giusto da tastiera mentre il pc si sta accendendo, solitamente F2 o Esc o Canc). Ho settato il bootloader di windows, ho salvato e riavviato. Mi è apparsa una schermata d'errore che riportava:
The Boot Configuration Data File is missing some required information
File: \BCD<
Error Code: 0x 0000034 
 A questo punto bisogna inserire il cd di windows 8 e fare il boot da cd. Alla schermata di installazione di windows cliccare su Avanti. Ora scegliamo Ripara PC (in basso a sinistra) anziché scegliere Installa. Bisognerà aprire il prompt dei comandi che si trova sotto le voci: 
Risoluzione dei problemi -> Opzioni Avanzate -> Prompt dei comandi

Nella finestra del prompt digitiamo:
diskpart
 Diskpart è un interprete di comandi in modalità testo, che ci consente di apportare modifiche a dischi e/o volumi. Digitiamo:
list disk
Verrà mostrato l'elenco dei dischi presenti nel computer. Solitamente il disco è uno ed è denominato disk 0, bisogna selezionare il disco sul quale sono installati sia Windows sia la partizione efi che contiene il bootloader (se avete installato una distro linux sapete di cosa parlo). Nell'esempio seguente supponiamo di voler lavorare con il disco 0, dunque digitiamo:
sel disk 0
In questo modo il disco 0 viene selezionato. Ora per avere un idea delle partizioni presenti su tale disco digitiamo:
list vol
Dalla lista che verrà visualizzata dovremo prendere nota della partizione (volume) dove è installato windows 8 ( nel mio caso è il volume E ) e della partizione che contiene il bootloader. Solitamente quest'ultima partizione ha dimensioni piccole (nel mio caso 260MB) ed è di tipo FAT32. Inoltre dovrebbe esser l'unica a non avere una lettera assegnata (nel mio caso è il volume numero 8). Dobbiamo selezionare questo volume con il seguente comando:
sel vol 8
 Ora gli assegnamo una lettera (va bene qualsiasi lettera purché non sia già utilizzata da altri volumi). In questo esempio utilizzarò la lettera Z:
asign letter=Z
A questo punto dobbiamo uscire dalla "modalità" diskpart. Per farlo digitiamo:
exit
Ora spostiamoci nella partizione efi (quella alla quale abbiamo assegnato la lettera Z) con il seguente comando:
cd /d Z:\EFI\Microsoft\Boot
Nei comandi DOS le opzioni si passano tramite "/". In questo caso l'opzione " /d " serve a cambiare oltre che directory anche drive (infatti ci spostiamo su un altra partizione). Ora lanciamo il seguente comando:
bootrec /fixboot
Adesso dobbiamo rinominare il file BCD presente nella directory (potremmo anche eliminarlo ma preferisco tenerlo perché non si sa mai :) ) Dunque digitiamo:
ren BCD BCD.bak
Questo file contiene informazioni che riguardano la configurazione di boot infatti è un acronimo di Boot Configuration Data. Ora dobbiamo utilizzare lo strumento bcdboot che ci permette di riconfigurare l'ambiente di avvio. Digitiamo:
bcdboot E:\Windows /l it-IT /s Z: /f ALL
 Il primo parametro che il comando riceve è la partizione sulla quale windows 8 è installato, lo sappiamo dal comando list vol dato in precedenza (in questo caso E). 
  • " /l " è un parametro facoltativo che specifica le impostazioni locali, di default è settato la lingua inglese(Stati Uniti, il parametro esplicito sarebbe /l en-us). Io ho scoperto che potevo settare it-IT perchè all'interno della directory in cui stiamo lavorando era presente questo file, insieme a quelli di altre lingue. 
  • " /s " specifica la partizione di sistema, in questo caso la partizione efi dove è presente il bootloader e dove scrivere il file BCD. 
  • " /f " specifica il tipo di firmware che puo essere: UEFI, BIOS, oppure ALL. (Avrei potuto usare l'opzione UEFI, ma mi sono voluto mettere al sicuro, con windows non si sa mai :) ).
A questo punto avremmo finito, ma prima di riavviare bisogna aggiustare due parametri che sono stati modificati dal comando precedente, quindi digitiamo:
bcdedit /set {default} hypervisorlaunchtype Auto
e poi:
bcdedit /set {default} nx OptIn
Ora possiamo chiudere il prompt dei comandi e riavviare il sistema. Se nelle impostazioni del bios è settato come prima scelta il bootloader di windows ora partirà senza problemi ! !  
In questo modo saremo in grado di scegliere il sistema operativo da avviare solo tramite il bios, e questo non è di certo molto comodo. Perciò vorrei aggiungere altre due righe per gli utenti di Arch Linux che hanno installato grub2 come me per poter aggiungere una voce a grub2 che avvii correttamente windows, ovvero come effettuare il chainload di windows sui sistemi UEFI.
Allora dal bios lasciamo come prima opzione di avvio grub2 di Arch. Accediamo in Arch ed apriamo un terminale. Individuiamo l'UUID del filesystem FAT32 nella partizione UEFI di sistema, dove i files del Bootloader UEFI di Windows risiedono(dovremmo trovare un file chiamato bootmgfw.efi).
Per fare ciò lanciamo il comando:
grub-probe --target=fs_uuid /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi
Otterremo in outuput l'UUID, è un codice del tipo: 1ce5-7f28 .
Adesso aggiungiamo al file /etc/grub.d/40_custom il seguente codice:
menuentry "Microsoft Windows x86_64 UEFI-GPT" {
    insmod part_gpt
    insmod fat
    insmod search_fs_uuid
    insmod chain
    search --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1 1ce5-7f28
    chainloader (${root})/efi/Microsoft/Boot/bootmgfw.efi
}
 Ora basta rigenerare il file grub.cfg con il seguente comando:
grub-mkconfig -o /boot/grub/grub.cfg
Ora riavviamo. Finalmente abbiamo all'avvio la schermata di grub2 che ci permette di avviare correttamente sia Arch che Windows 8.
Spero di essere stato utile ;)

1 commento:

  1. grazie della procedura! è servita a far avviare un Windows 10 clonato da un disco ad un altro con acronis, il quale non si avviava.

    RispondiElimina