Come creare un drive USB di installazione di windows 8 da linux - qualche riflessione

Non ricordo l'ultima volta in cui ho inserito un cd/dvd nell'apposito lettore, sicuramente sono passati anni. Gestisco invece regolarmente le varie immagini iso di programmi e sistemi operativi e mi son trovato spesso a reinstallare macchine windows tramite drive usb.

Ci sono mille modi e mille guide online sul come crearsi una chievetta usb di installazione di windows a partire dall'immagine iso: si può fare manualmente da windows (con diskpart e un un bel copia-incolla) , si può usare un programma chiamato rufus che farà tutto il lavoro sporco per noi, etc.
Non disponendo di una macchina windows funzionante e avendo solo il mio fedele centos 7 e le varie iso di windows, si può ottenere lo stesso risultato usando linux: anche per questa modalità le guide abbondano. Mi sono però scontrato (più volte) con dei risultati non sempre funzionanti e allora vi riporta la mia esperienza a riguardo.

Questa procedura, riportata già in molti altri siti, funziona correttamente


 Creazione chiavetta usb di win 8.1 per installazioni su macchine con bios/mbr

1) Inserisco la mia chiavetta usb e utilizzo gparted per eliminare la partition table della stessa. Andrò a crearla di tipo msdos

1

2) Terminata la rapidissima operazione mi ritrovo la chiavetta vuota con lo spazio non allocato

2

3) Vado a creare una nuova partizione primaria che occupi tutto lo spazio disponibile, formattandola NTFS (molto importante questo passo, vedremo dopo) e dandogli un label che voglio (nel mio caso, con molta originalità, win8)

3

4) Applico le operazioni e tutto va a buon fine

4

 

5) Mi ritrovo quindi in questa situazione (il fatto di aver lasciato 10MB liberi in testa non ha alcun senso, si può pure evitare, era solo una prova)

5

6) Clicco col destro sulla partizione appena creata, e assegno il flag "boot" (che su windows corrisponde a "active").

6

7) Clicco col destro sulla medesima partizione e guardo le info. Mi segno l'uuid che mi servirà dopo (volendo anche no)

7

8) Esco da gparted, monto in /root/mnt la chiavetta appena preparata e vado a copiarmi tutto il contenuto della iso di windows 8.1 (ho montato la iso come loop) nel punto di montaggio

9) Ora c'è la fase in cui dobbiamo andare a installre il boot-loader/boot-manager grub2 nell'mbr della chiavetta. Per farlo uso il comando

Dove il parametro
--force fa si che grub proceda anche in caso di errori (e ce ne sono)
--boot-directory=/root/mnt/boot è la directory in cui vado a installare grub (già presente coi file di windows, non li sovrascrive ovviamente)
/dev/sdc è il device (la chiavetta usb, miraccomando puntare al device, non alla partizione sdc1)
--target=i386-pc si può anche omettere visto che è il default, indica l'architettura
--no-floppy gli dico che non c'è il floppy disk...vabbè

10) Vado nella directory in cui ho installato grub, in questo caso /root/mnt/boot/grub2 e creo il file di configurazione (in realtà ne creo 2, grub.cfg e grub2.cfg identici visto che non so quale dei 2 andrà a leggere, credo grub2.cfg)

volendo evitare il menù si può benissimo scrivere una cosa del tipo

chiaramente al posto di <drive UUID> andrò a mettere l'uuid della partizione che mi ero segnato precedentemente (punto 7)

nota)
Se il menù di grub compare ma poi non parte l'installazione,al posto di panicare, si può aprire la shell di grub2 e provare a digirare a mano

se non ci si ricorda il nome del file system basta tabbare ripetutamente dopo aver scritto set root=(

11) Smonto la chievatta, la porto sul computer che voglio installare e *incredibilmente* funziona.


 

CONSIDERAZIONI

A)

Ho investito un bel po' di tempo nel cercare di capire come mai un'operazione del genere vada a buon fine. Il mio primo dubbio è stato riguardo alla differenza rispetto alla stessa operazione eseguita su una macchina windows. C'è un punto chiave in molte guide che dice di lanciare il comando

dove x: è la PARTIZIONE in cui abbiamo copiato i file di installazione di windows. Chiaramente io con linux questo comando non l'ho potuto dare, però la chiavetta effettua comunque il boot, perchè?
La, la risposta più banale sarebbe "be, in linux abbiamo installato grub2, vedi il punto 9".
Noto che però grub2 è stato installato nell'mbr della chiavetta.
Leggo il manuale di bootsect


 

Bootsect.exe updates the master boot code for hard disk partitions to switch between BOOTMGR and NTLDR. You can use this tool to restore the boot sector on your computer.
/nt52
Applies the master boot code that is compatible with NTLDR to SYS, ALL, or <DriveLetter>. The operating system installed on SYS, ALL, or <DriveLetter> must be a previous version of Windows Vista.
/nt60
Applies the master boot code that is compatible with BOOTMGR to SYS, ALL, or <DriveLetter>. The operating system installed on SYS, ALL, or <DriveLetter> must be Windows Vista.


 

(nota: il vecchio loader NTLDR usa come file di configrazione boot.ini, BOOTMGR invece lavora con bcd, che è un file di registro editabile si, ma non con un editor di testo)

Tralasciando la differenza fra nt60 e nt52 il punto è che bootsect non agisce sull'mbr ma solo sul boot sector della partizione, che da microsoft viene chiamato volume boot sector.

Per capire costa sta succedente vediamo cosa abbiamo detto a grub2 di fare, una volta partito.

insmod xxxx
aggiunge dei moduli che ci servono per effettuare il boot

search --no-floppy --fs-uuid <drive_UUID> --set root
questo comando configura la root di grub come la partizione della chiavetta che ha uuid quello specificato. Nel mio caso sarebbe equivalente a dire
set root=(hd0,msdos1)
visto che la partizione è l'hd0, partizione 1.

chainloader +1
vuol dire, parti dalla root (ovvero hd0,msdos1) e leggi il primo blocco (il boot sector) del primo settore della partizione.

Allora la domanda è: "cosa c'è nel boot sector di una partizione formattata ntfs con gparted da linux che permette all'installer di windows di bootare, dopo che grub gli ha passato il controllo?"
Evidentemtente c'è qualcosa che permette di effettuare il boot, ma perchè? Io ho beceramente copiato i file di windows nella partizione, non dovrebbe esserci niente nel boot sector (mia ignoranza). A meno che...quando ho formattato la chiavetta come ntfs e flaggata come boot lui non abbia messo qualcosa in questo settore.
Il boot-flag (active) però non c'entra nulla in tutto questo, vedi wikipedia


A boot flag is a 1-byte value in a non-extended partition record, within a master boot record. It appears at the beginning of a partition record, as the value 0x80. A value of 0x00 indicates the partition does not have the boot flag set.[1] Any other value is invalid.
Its primary function is to indicate to a MS-DOS/MS Windows-type boot loader which partition to boot. In some cases it is used by Windows XP/2000 to assign the active partition the letter "C:".[2] The active partition is the partition where the boot flag is set. DOS and Windows allow only one boot partition to be set with the boot flag.[3]


 

L'unica spiegazione è che, automaticamente quando vai a formattare una partizione con ntfs lui metta nel boot sector un piccolo programma che istruisce il sistema sul come caricare il sistema operativo, e, visto che ntfs è di microsoft, gli insegnerà a caricare windows.
E' proprio così, basta andarsi a vedere il contenuto del boot sector di una partizione ntfs
http://ntfs.com/ntfs-partition-boot-sector.htm

Allora, a cosa serve in windows dare il comando bootsect /nt60 x: se già in automatico nel bootsector di una partizione formattata ntfs c'è il codice per effettaure il boot di windows? In effetti pare non serva a nulla: il manuale di bootsect infatti parla sempre di "update the master boot code", quindi "aggiornare" il boot sector, in caso di problemi o nel caso in cui si voglia passare da nt52 a nt60.

Formattando la chiavetta con gparted e ntfs son riuscito a far partire win8, quindi "automaticamente" immagino metta il boot sector di tipo nt60.

 

B)
Quando si installa grub da un errore:
grub2-install: warning: Embedding is not possible.  GRUB can only be installed in this setup by using blocklists.  However, blocklists are UNRELIABLE and their use is discouraged..
senza il paramentro --force in grub2-install questo errore bloccherebbe la procedura.

Dal manuale di grub2 apprendo che:


 

A block list is used for specifying a file that doesn’t appear in the filesystem, like a chainloader. The syntax is [offset]+length[,[offset]+length]…. Here is an example:
0+100,200+1,300+300
This represents that GRUB should read blocks 0 through 99, block 200, and blocks 300 through 599. If you omit an offset, then GRUB assumes the offset is zero.
Like the file name syntax (see File name syntax), if a blocklist does not contain a device name, then GRUB uses GRUB’s root device. So (hd0,2)+1 is the same as +1 when the root device is ‘(hd0,2)’


 

Dalla command line di grub ci si può anche divertire a dare il comando
blocklist nome_file
per vedere quale posizione occupa un file (offset + lenght).

Sempre dal manuale di grub2 apprendo che le blocklist vengono usate per installare grub2 (e non grub legacy) sul boot sector di una partizione o su un disco in cui non ci sono partizioni in generale (e quindi NON nell'mbr, dove di solita fa l'embedding).
Nel caso di una chiavetta usb però, pur installando grub2 nell'mbr da questo errore. Potrebbe voler dire che c'è troppo poco spazio fra l'inizio del disco e la prima partizione (dove grub prova a mettere core.img). Non è così perchè ho provato a lasciare 10MB (molto più dei pochi kb che occupa core.img).
In ogni caso il problema non è embedding o meno ma il fatto che dica che le blocklist sono inaffidabili. Il motivo penso sia dovuto al fatto che, se usa le blocklist per localizzare il file /boot/grub2/i386-pc/core.img (che sta su un file-system), nel caso di un update del sistema  operativo che va per qualsiasi motivo a toccare quel file, la posizione dello stesso varierà e quindi grub2 nell'mbr (che ha fissata la posizione tramite blocklist di core.img) punterà a un qualcosa di errato. A noi comunque non importa perchè sulla chievatta usb non ci lavoriamo....

 

C)

Ora ci si potrebbe chiedere: "visto che funziona formattando la chievatta in ntfs, funzionerà anche se la formatto in fat32?"
La risposta è NI.
Cerco di capire con un po' di ricerche in rete cosa contenga il bootsector di una partizione formattata in fat32. Scopro che anche in questo caso viene installato del codice per effettuare il bootstrap di windows. Confortato da questa notizia allora ripeto tutta la procedura di cui sopra formattando con gparted la chiavetta fat32.
Metto la chiavetta usb nel pc che voglio installare, dico di partire dal drive usb, parte grub, vado in chainloading e
"This is not a bootable disk, please insert a bootable floppy and press any key to try again..."

Ripeto un paio di volte l'intera procedura ma ottengo sempre lo stesso errore. Allora, visto che la frase è abbastanza chiara, penso qualcosa non vada con il boot sector della formattazione in fat32. Provo a usare il comando bootsect che non mi tocca grub ma sistema il settore di boot della partizione. Da una macchina con win8 già installato provo con

rimetto la chievetta usb e riprovo a fare il boot. Questa volta niente più errore (e la cosa mi porta a pensare che allora la semplice formattazione di gparted in fat32 non metta nel boot sector il codice per effettaure il bootstrap) ma non parte l'installazione.
In modo ignorante provo con

Sta volta cambia il messaggio di errore con un laconico "disk error, press any key to restart".

In teoria, se tutto quello che ho scritto qui sopra non è una cavolata (e potrebbe esserlo ma non credo), questa procedura avrebbe dovuto funzionare.
Provo allora in un altro modo ancora. Preparo la chiavetta manualmente direttamente da windows con questa procedura

10_winformat

Ovvero elimino le partizioni presenti, ne creo una primaria, la rendo attiva (flag boot) la formatto fat32 e ci assegno una lettera. (nota che NON uso bootsect)

Stacco la chiavetta e la attacco al mio client centos7: questo quello che vedo da gparted, IDENTICO a quello che lo stesso gparted avrebbe creato (all'apparenza)

11

mi segno l'uuid e procedo coi punti 8, 9 e 10 (ovvero copio windows e installo grub e metto i file di configurazione).

Sposto la chiavetta sul pc da installare e, magicamente, ora il boot viene effettuato...

Ne concludo quindi che la formattazione fat32 di gparted non va a mettere nel bootsector il codice per bootstrappare windows, mentre invece quando formatto la chiavetta con windows mette nel bootsector tutto l'occorrente per effettuare il boot.

D)

Nei sistemi con uefi/gpt, a patto di riuscire a configurare correttamente le impostazioni sulla motherboard (compatibility support mode,secure boot, formattazione fat32 perchè alcuni firmware uefi non leggono ntfs etc), tutto è molto più semplice perchè non si fa più affidamento sull'mbr o sui boot sector, ma il firmware efi va a leggere direttamente sulla chiavetta (o sull'hd in generale) il file che contiene il programma per effettuare il boot(o un altro boot manager che poi effettua il boot).

Print Friendly, PDF & Email