Siccome ho ancora un vecchio intel centrino che, nonstante tutta la sua età, non accenna a morire ma ha il lettore dvd andato e non supporta il boot da usb, ho deciso di documentarmi per capire meglio come fare per installare il sistema operativo su quell'affare senza avere assolutamente nulla in mano.
Fin dai tempi remoti, il bios ha una opzione di boot che si chiama "PXE", in pratica fa il boot del computer via rete locale, è necessario configurare un server dns e dhcp opportunamente per ottenere qualcosa.
La cosa mi ha solleticato, per Debian GNU/Linux ho trovato un programma che si chiama DNSMasq che include sia il server DNS che il server DHCP, ma io li ho entrambi sul router, e quindi la cosa si complica per via di interferenze.
Quel programmino consente di basarsi, se opportunamente programmato sui server DNS e DHCP esistenti e fornire solo la funzionalità di PXE.
Ho scopiazzato la configurazione del programma da internet e l'ho avviato.
Fio a qui tutto bene, però è necessario saper scriptare, perché i file di boot non sono subito pronti, ma si può far un menù e dire al programma quale scegliere.
C'è anche un altro aspetto da considerare: se i file vengono presi dalla rete locale, è necessario metterli da qualche parte (presumibilmente sul server che ospita DNSMasq, ma non solo), e come gestire la situazione.
Sono venuto a scoprire un protocollo che si chiama TFTP: "Trivial" ftp, in patica un ftp grezzo, che dnsmasq gestisce alla perfezione, quindi è possibile usare questo tftp per gestire sia i file di script che i file di installazione, basta solo amalgamare il tutto per ottenere qualcosa di funzionante.
Il punto adesso diventa: se volessi configurare qualcosa anche per le macchine a 64 bit?
Il gioco è semplice: in pratica il protocollo PXE prevede che la macchina annunci il tipo di architettura che monta, e quindi è sufficiente istruire DNSMasq per dire "se la macchina è a 32 bit invia i files a 32 bit", "se la macchina è a 64 bit invia i file a 64 bit".
E' relativamente semplice da gestire, un semplice scambio di messaggi.
Ed ovviamente alla macchina a 64 bit bisogna inviare grubx64.efi, tuttavia ho notato con mia profonda insoddisfazione che il package già pronto di debian per grub netboot soffre di un bug, in pratica grub il file di configurazione lo va a cercare da qualche parte (non si sa bene dove) ma non sulla rete locale, che ovviamente non risponde e quindi imputtana tutto il boot.
Per ovviare al problema, quindi, è necessario ricompilarsi il grubx64.efi con l'ip locale della macchina, il comando è il seguente:
grub-mkimage -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi -o /mnt/bootx64.efi -p '(tftp,<ip della macchina>)/grub' efinet tftp
E fino a qua ci siamo, ancora una volta bisogna costruire il file di configurazione di grub, passando kernel e initrd per tutte le distro linux che si vuole inserire, che verranno scaricate da TFTP e il gioco è fatto.
Adesso la domanda diventa: in caso di una installazione di windows come si deve procedere?
I file di configurazione del boot loader di windows sono al massimo per il boot da usb, per la rete, che io sappia, non è stato (ancora) pubblicato nulla, quindi il semplice "chainload" dà errore.
Quasi tutte le fonti su internet riportano di mettere come kernel il programma binario "ramdisk" e come initrd il file iso, ma in questo modo anche se la macchina è a 64 bit il sistema viene avviato come se fosse a 32 bit e quindi il boot loader di windows non si installa sulla partizione efi, e gub richiede la partizione di compatibilità.
Per ovviare al problema ho trovato un progetto che si chiama wimboot, in pratica patcha al volo i files di configurazione esistenti per adattarli al boot via rete.
E' sufficiente impostare come kernel il wimboot e come initrd il file wim che si desidera "avviare".
Però con grub non funziona, per problemi di compatibilità.
Ho trovato un progetto che sapevo già da qualche tempo, che non avevo mai approfondito, che si chiama IPXE, in pratica un firmware uefi (e x86) programmato per bootare dalla rete. Tutto quello che bisogna fare è trovare il modo di far caricare all'avvio (tramite netboot, o tramite efi) il file ipxe.efi per avere una console preimpostata per bootare da rete, a cui è sufficiente passare come kernel il wimboot e come initrd il file wim per poter bootare windows.
In generale questo sistema a 64 bit è compatibile con tutti i winpe, ad eccezione di quelli generati da microsoft per eseguire le installazioni di windows. Per ovviare a questo problema bisogna crearsi un winpe apposito da cui far partire l'installazione di windows in maniera manuale.
Ci tengo a precisare che attualmente l'ipxe supporta solo il tftp e l'http, nfs e samba sono in fase di approvvigionamento, per cui se in giro leggete che con ipxe bisogna PER FORZA usare http, quella documentazione non è aggiornata.
E qui c'è un problema grosso quanto la casa: il winpe non supporta il tftp, quindi i file di installazione di windows vanno messi su una condivisione samba, ma abbiamo fatto anche questo.
Il wimboot per x86 non funziona tanto bene, tuttavia per x86 si può sempre usare il memdisk che è universale.
In queste giornate di sperimentazione, come potete vedere, molte cose sono andate storte, ma si è sempre trovato una soluzione a tutto.
