[Installando linux] Windows 8 ripristina automaticamente ordine boot UEFI

Ho acquistato un pc HP ultimamente, con windows 8 preinstallato e il bios UEFI. Dopo l’installazione di linux ho avuto problemi con il Windows Boot Manager, sostanzialmente ad ogni avvio di windows l’ordine di boot di UEFI cambiava, settando Windows Boot Manager in cima e spedendo il GRUB in coda. Era inconcepibile dover cambiare l’ordine dal firmware UEFI ad ogni avvio di windows. Googlando, ho trovato una mezza soluzione sul forum di supporto di HP, ho preso questa soluzione, l’ho tradotta, completata, semplificata e la presento in questo articolo.

Problema: dopo installazione linux, ad ogni avvio windows 8 ripristina automaticamente ordine boot UEFI settando in cima Windows Boot Manager

La causa del problema è una sorta di funzionalità di ripristino automatica, che modifica l’ordine di boot mettendo al primo posto Windows Boot Manager spedendo il nostro GRUB all’ultimo. Armiamoci di un po’ di pazienza e seguiamo questi passi per impostare il GRUB come primo in modo permanente. È opportuno fare queste operazioni alla lettera e un passo per volta in modo cauto, le operazioni che andremo a fare se fatte nel modo sbagliato diventano pericolose.
Quindi iniziamo:

  1. Da windows: apriamo un prompt di comandi con privilegi da superutente (in windows si dice “elevate”), è sufficiente cliccare col tasto destro e scegliere “apri come amministratore” (o qualcosa del genere), una volta nel terminale (cmd.exe) facciamo queste operazioni:
    • montiamo la partizione UEFI con il comando dos:
      mountvol S: /S
    • entriamo in questa partizione digitando
      S:
    • facciamo una copia del file \EFI\Microsoft\Boot\bootmgfw.efi chiamandolo per esempio \EFI\Microsoft\Boot\bootmgfw2.efi con il comando
      copy \EFI\Microsoft\Boot\bootmgfw.efi \EFI\Microsoft\Boot\bootmgfw2.efi
    • aggiorniamo la entry UEFI di windows in modo che punti al nuovo file, con il comando
      bcdedit /set {bootmgr} path \EFI\Microsoft\Boot\bootmgfw2.efi
    • [Facoltativo] cambiamo il nome della entry point di windows (nome che vedremo nel firmware UEFI) con il comando
      bcdedit /set {bootmgr} description "Nuovo nome"
  2. Ora passiamo alla distribuzione linux che abbiamo installato, apriamo un terminale con privilegi da super utente e :
    • rimuoviamo i file /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi e /boot/efi/EFI/Boot/bootx64.efi
    • rimuoviamo con efibootmgr il Windows Boot Manager in questo modo:
      • eseguiamo il comando
        efibootmgr -v
      • localizziamo il Windows Boot Manager e ricordiamoci la sua label (considero che sia Boot0000)
      • eseguiamo il comando
        efibootmgr -b 0000 -B"

        (dove 0000 perchè ho considerato la label Boot0000)

    • settiamo l’ordine di boot impostando Linux come primo (considero sia Boot0003), con il comando
      efibootmgr -o 0003,0001,0002

      perchè nel mio caso la situazione era questa:
      Boot0001* USB Floppy/CD
      Boot0002* USB Hard Drive
      Boot0003* ubuntu
      Boot0004* UEFI: IPv4 Realtek PCIe GBE Family Controller
      Boot0005* UEFI: IPv6 Realtek PCIe GBE Family Controller
      quindi l’ordine 0003,0001,0002 setta ubuntu primo, poi USB Floppy/CD e USB Hard Drive

  3. Aggiorniamo il GRUB in questo modo, sempre dalla distro linux e da un terminale con privilegi da super utente:
    • eseguiamo il comando
      /usr/sbin/grub2-probe --target=hints_string /boot/efi/EFI/Microsoft/Boot/bootmgfw2.efi

      e ricordiamoci l’output (1)

    • eseguiamo il comando
      /usr/sbin/grub2-probe --target=fs_uuid /boot/efi/EFI/Microsoft/Boot/bootmgfw2.efi

      e ricordiamoci l’output (2)

    • apriamo il file di testo /etc/grub.d/40_custom e alla fine del file aggiungiamo (ricordandoci di sostituire quello che sta tra parentesi quadre):
      menuentry "Microsoft Windows 8" {
      	insmod part_gpt
      	insmod fat
      	insmod search_fs_uuid
      	insmod chain
      	search --fs-uuid --set=root [output del primo comando (1)] [output del secondo comando (2)]
      	chainloader /EFI/Microsoft/Boot/bootmgfw2.efi)
      }
      
    • infine aggiorniamo il GRUB con
      /usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg

Ed ecco qui, ora se i passi sono stati eseguiti nel modo corretto, UEFI avvierà il GRUB di default in modo permanente, evitando così che windows 8 ripristina automaticamente ordine boot uefi. Dal GRUB potremmo sempre scegliere windows 8.

  • Tiziano

    pure io ho questo identico problema – possiedo una mobo ASRock – per di più quando avvio windows 8.1 da GRUB2 (senza tua modifica sopra) al boot s’impianta (i pallini che girano si bloccano) e mi tocca fare un reset. altre soluzioni alternative non esistono? perché accade questo problema?
    grazie

    • http://pierprogramm.altervista.org/wordpress pierprogramm

      Non sono sicuro al 100% che la soluzione sia applicabile nel tuo caso, ma io proverei lo stesso ad eseguire tutti i passi alla lettera cautamente e facendo i backup

      • Tiziano

        infatti anche modificando quella sequenza il problema persiste… mi sa che torno a win7… con win7 non c’è questo problema, vero? anche perché così mi tolgo la rottura del freeze al boot… grazie cmq per la guida 😉

  • Tiziano

    aggiornamento: ho letto di utenti che hanno risolto semplicemente cambiando ordine boot EFI con il comando “efibootmgr -o”, senza eliminare la voce EFI di Windows come indichi tu, in quanto secondo loro quella sequenza lì non è modificabile da Windows

    • http://pierprogramm.altervista.org/wordpress pierprogramm

      Ciao, la modifica da windows nel mio caso era necessaria, ho provato anch’io a lavorare solo da linux, non conoscendo i comandi dos, ma senza risolvere. La copia del file bootmgfw.efi è necessaria come workaround sul modo in cui win punta al file.
      Comunque nel mio caso, se modificavo semplicemente l’ordine boot EFI non era in modo permanente, windows lo ripristinava al riavvio.

  • Tiziano

    ho risolto trovando una soluzione in un forum con il comando:

    bcdedit /set {bootmgr} path EFIrefindrefind_x64.efi
    (dove refind_x64.efi è il loader indicato, ma si può mettere gurb2, ecc)

    non so di preciso cosa fa ma funziona, però sinceramente non so se la sequenza del boot nel UEFI è cambiata o c’è sempre il boot loader di windows in cima.

    spero ti sia utile.