martedì 28 settembre 2010

Eliminare il doppio Windows in Grub 2

Ho già ampiamente parlato di come rimuovere alcune delle entry dal menu di Grub2, ma recentemente mi si è presentato un problema più specifico, eliminare una delle due voci (quella del ripristino) di Windows seven dal menu di Grub. Prima di iniziare, voglio precisare che la soluzione che descriverò qui di seguito, è stata da me testata su un laptop Toshiba Satellite A660-11M con preinstallato Windows 7, in cui è stata poi installata in dual boot, la distro Ubuntu 10.04 Lucid Lynx; tuttavia, poiché è noto che lo stesso problema si verifica anche con la maggior parte dei computer che abbiano, oltre a Linux, anche Windows Vista/7, la seguente soluzione è applicabile, con le dovute accortezze, a tutti i sistemi che abbiano le caratteristiche appena menzionate.

Insomma, perché Grub 2 inserisce nel menu di avvio due voci relative a Windows? Semplicemente perché ci sono due partizioni di Windows; infatti negli ultimi tempi ha preso sempre più piede la tendenza, da parte dei produttori, di non fornire il disco di ripristino del sistema, sostituendolo "egregiamente" con una partizione di ripristino, la quale viene, giustamente vista come un device contenente un sistema di avvio di Windows; che poi si tratti dell'avvio di una procedura che riporterebbe il computer allo stato iniziale, poco importa, anzi, mi vien da pensare che l'abbiano fatto apposta. Oltretutto poi, una soluzione del genere comporta anche dei rischi: infatti se dovesse malauguratamente rompersi il disco fisso, vorrei vedere quanti di voi avranno provveduto a fare un backup della partizione di recovery... insomma un motivo in più per abbandonare Winzozz, casomai ce ne fosse bisogno ;-)

Ora passiamo alla pratica, questa è la situazione:
nel mio caso il computer ha, di fabbrica, due partizioni: la prima contenente il sistema di ripristino, mentre nella seconda c'è il sistema operativo vero e proprio. Quando installiamo Linux, prima dobbiamo creare lo spazio necessario al nuovo ospite, ridimensionando la seconda partizione, per intenderci, quella in cui risiede Windows 7; dopodiché, installiamo nell'MBR il boot loader, che in questo caso è Grub 2, il quale vedrà tre partizioni da avviare: la prima sarà quella per il ripristino Windows, la seconda quella di Windows 7 e infine la terza sarà quella contenete Ubuntu Linux. Nel caso il computer in questione sia usato solo da noi, poco male, ma cosa succederebbe se nostra moglie o i nostri figli premessero involontariamente la voce sbagliata? Il risultato sarebbe funesto: verrebbe distrutta la partizione dedicata a Linux e noi perderemmo (quasi sicuramente) tutti i dati contenuti in quella parte dell'hard disk.

E questa è la soluzione:
bisogna nascondere il sistema di ripristino di Windows dal menu di Grub e, per farlo, dobbiamo sporcarci le mani con gli script di Grub 2.

1) apriamo un terminale da Applicazioni -> Accessori -> Terminale

2) acquisiamo i permessi per poter operare da root:
$ sudo -s [invio]
password [invio]

3) apriamo, con Gedit, il file /boot/grub/grub.cfg:

# gedit /boot/grub/grub.cfg [invio]

4) cerchiamo in fondo al file il riferimento a Windows, lo troveremo tra le righe:

### BEGIN /etc/grub.d/30_os-prober ###

e

### END /etc/grub.d/30_os-prober ###


e si presenterà all'incirca in questo modo:

menuentry "Windows 7 (loader) (on /dev/sda1)" {
insmod ntfs
set root='(hd0,1)'
search --no-floppy --fs-uuid --set ac4e7aea4e7aad28
chainloader +1
}
menuentry "Windows 7 (loader) (on /dev/sda2)" {
insmod ntfs
set root='(hd0,2)'
search --no-floppy --fs-uuid --set 48caa0edcaa0d888
chainloader +1
}
anche se apparentemente le due entry sono simili, noi sappiamo benissimo che nella prima partizione risiede il sistema di ripristino, mentre nella seconda partizione c'è il sistema operativo vero e proprio, cioè, quello che serve a noi. Quindi selezioniamo con il mouse tutta la parte di nostro interesse, cioè, quella che vogliamo compaia nel menu di Grub:

menuentry "Windows 7 (loader) (on /dev/sda2)" {
insmod ntfs
set root='(hd0,2)'
search --no-floppy --fs-uuid --set 48caa0edcaa0d888
chainloader +1
}

e copiamolo con la combianzione [CTRL] + [C]

chiudiamo Gedit e dal solito terminale apriamo il file /etc/grub.d/40_custom:

# gedit /etc/grub.d/40_custom [invio]

posizionamoci in fondo al file, incolliamo con la combinazione [CTRL] + [V]
e se non già presente, aggiungiamo EOF (end of file) in modo che il tutto assomigli a qualcosa del genere:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.

Adding Windows 7 to GRUB 2 menu
menuentry "Windows 7 (loader) (on /dev/sda2)" {
insmod ntfs
set root='(hd0,2)'
search --no-floppy --fs-uuid --set 48caa0edcaa0d888
chainloader +1
}
EOF

a questo punto non ci resta che salvare e chiudere Gedit.

Ora dobbiamo istruire Grub perché prenda in considerazione la voce contenuta nel nostro 40_custom, piuttosto che quelle generate attualmente dallo script 30_os-prober. Per fare ciò è sufficiente cambiare i permessi agli script interessati, in questo modo:


# chmod -x /etc/grub.d/30_os-prober [invio]

# chmod +x /etc/grub.d/40_custom [invio]

infine dobbiamo ricordarci di aggiornare Grub 2 in modo da rendere effettive le modifiche da noi richieste:
# update-grub2 [invio]

e con questo abbiam finito.

Ovviamente, nel caso che per qualche motivo, foste interessati a far riapparire la voce relativa al ripristino di Windows, non dovrete far altro che invertire i permessi di esecuzione ai due file appena visti e far rileggere a Grub le nuove impostazioni:

# chmod +x /etc/grub.d/30_os-prober [invio]
# chmod -x /etc/grub.d/40_custom [invio]
# update-grub2 [invio]

Facile no?