Network Boot tramite TFTP / PXE

Dunque, mi trovo con la seguente situazione:

  • Portatile con Hard-Disk (IDE, nuovo, da 160Gb) completamente andato.
  • Cd-Rom non funzionante.

Ho una missione: fare in modo che questo portatile – che appartiene ad un mio amico – sia in grado di far girare un gioco per Windows (PokerStar.it) collegandosi ad internet tramite una chiavetta USB Olicard 100 TIM.

In un altro articolo ho spiegato, a grandi linee, come sistemare una GNU/Linux Debian 5.0 per funzionare con suddetta chiavetta. Dato che il gioco in questione funziona perfettamente – tramite Wine – su Linux, che la chiavetta in questione è supportata da Debian (è sufficiente fare il downgrade del Kernel di una versione, poco male …) e che non saprei come installare Windows senza CD-Rom (in giro c’è qualche guida che spiega come farlo con una chiavetta USB, ma la cosa non mi “intriga” quindi non ho indagato oltre), ho deciso di cimentarmi nell’installazione della Debian 5.0 facendo il boot tramite LAN, in altri termini: fare in modo che il portatile faccia il boot di installazione della Debian sfruttando il mio PC Desktop (che è poi un mezzo Server, se considero tutti i servizi installati e funzionanti, che fa girare una bella Gentoo, installata nel 2005 e mantenuta “perfettamente” aggiornata).

Non avendo mai realizzato il boot di una macchina tramite rete ed essendo un argomento a me piuttosto ignoto, ho dovuto cimentarmi nella lettura di parecchie guide/howto/ecc…, nonchè parecchie ore di “smanettamento”, prima di saltarci fuori ma ce l’ho fatta !

Ecco, scrivo qui la mia esperienza, così che anche altri possano farsi un’idea – pur non prendendo il tutto come oro colato, mi raccomando – di come operare.

La prima cosa è il Server che deve consentire il BOOT via rete (da ora lo chiamo boot_server). Nel mio caso si tratta di una Gentoo. E’ necessario fare in modo che la macchina esegua il servizio di Server DHCP; io ho installato net-misc/dhcp ( emerge net-misc/dhcp ) e l’ho configurato come segue (/etc/dhcp/dhcpd.conf):

ddns-update-style ad-hoc;
option domain-name "udasoftware.net";
default-lease-time 600;
max-lease-time 7200;
allow booting;
allow bootp;
subnet 192.168.96.0 netmask 255.255.255.0 {
}

subnet 192.168.243.0 netmask 255.255.255.0 {
}

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.200 192.168.0.250;
  option broadcast-address 192.168.0.255;
# the gateway address which can be different
# (access to the internet for instance)
  option routers 192.168.0.2;
# indicate the dns you want to use
  option domain-name-servers 208.67.222.222;
}

group {
 next-server 192.168.0.1;
 filename "/tftproot/pxelinux.0";

 host tftpclient {
  hardware ethernet 00:0e:7f:7a:af:c6;
  fixed-address 192.168.0.253;
 }
}

Più o meno dovrebbe andare bene così, sarà giusto da “personalizzare” (cambiando indirizzi/nomi) ma credo sia una buona base di partenza; in particolare abbiamo da personalizzare:

  • “udasoftware.net” è il nome che ho dato alla mia LAN
  • 192.168.96.0 e 192.168.243.0 che sono delle reti installate da VMWare (il software di virtualizzazione). Ho aggiunto quelle righe perchè altrimenti DHCP rompeva ….
  • 192.168.0.0 è l’indirizzo della LAN reale (della quale fa parte anche il router ethernet D-Link)
  • Dato che il router DHCP già ha un suo DHCP (con un “range” che va da 192.168.0.1 a 192.168.0.100) ho deciso che in questo caso davo da .200 a .250, giusto per non avere “conflitti”.
  • 192.168.0.255 è l’indirizzo di broadcast.
  • 192.168.0.2 è l’indirizzo del router Ethernet ADSL.
  • 208.67.222.222 è un server DNS (open); è fondamentale mettere un DNS affinchè poi sia possibile installare la distro tramite Internet.
  • Il percorso “/tftproot/pxelinux.0” è laddove il client che dovrà fare il boot (da ora lo chiamerò boot_client) andrà a cercare l’immagine del boot loader PXE.
  • 00:0e:7f:7a:af:c6 è l’indirizzo MAC della scheda di rete del boot_client. Se non avete modo di individuarlo a priori, comunque lo riuscirete a vedere in /var/log/syslog nel momento in cui il boot_client contatterà il Server DHCP del boot_server.
  • 192.168.0.253 è l’indirizzo IP che verrà assegnato al boot_client che ha l’indirizzo MAC specificato; se inizialmente non si conosce quest’ultimo (e quindi non si è configurato l’hardware ethernet) è probabile che sarà assegnato il 192.168.0.200 (vedi la riga dei range).

Per verificare che la configurazione non contenga errori di sintassi usare /etc/init.d/dhcpd configtest .

Se non da errori, avviare il servizio con /etc/init.d/dhcpd start . Già ora può essere una buona idea verificare che il boot_client riesca a fare il boot via rete, o meglio, che almeno riesca ad intercettare il Server DHCP e, successivamente, interrogare il TFTP Server (che ancora non abbiamo attibato). In questo modo, se non è ancora stato fatto, si può configurare opportunamente il MAC Address nel file di configurazione dhcp.conf e riavviare il server con /etc/init.d/dhcpd restart .

Ora che il Server DHCP è sistemato, dobbiamo passare al Server TFTP. Io ho usato net-ftp/atftp ( emerge atftp ). Una volta che lo si è installato è necessario procedere in questo modo:

  1. Creare la cartella che dovrà contenere i files di Boot ( /tftproot ) e impostare come user e group rispettivamente nobodye nobody .
  2. All’interno di questa cartella va collocato il file pxelinux.0 (io l’ho trovato, installando sys-boot/syslinux nella cartella /usr/share/syslinux/ ).
  3. Il file pxelinux.0 è il Boot Loader che viene trasmesso al boot_client tramite protocollo TFTP; quando il boot_client lo riceve ed esegue, si ricollega – sempre tramite TFTP – al boot_server e va a cercare nella cartella /tftproot/pxelinux.cfg/ (non è il nome di un file è proprio una cartella !) un file che ha “un nome particolare”. Purtroppo non è possibile predire il nome del file di configurazione che il boot_client andrà a cercare perchè dipende dal suo MAC Address (in prima istanza) o dal suo Indirizzo IP (in seconda istanza). Tuttavia uno dovrebbe riuscire a capire “cosa cerca” semplicemente provando. Una volta individuato (ad esempio, nel mio caso, il file di configurazione l’ho dovuto chiamare 00f1ff4d-751c-d811-95fb-000e7f7aafc6 ) bisogna crearlo e scrivere delle righe come le seguenti:
    1. default install
    2. label install
    3. menu label ^Install
    4. menu default
    5. kernel debian-installer/i386/linux
    6. append vga=normal initrd=debian-installer/i386/initrd.gz — quiet
    • NB: Nel mio caso, dovendo installare debian, ho creato delle sotto-cartelle ( /tftproot/debian-installer/i386/ ) dove sono andato a collocare i files di boot prelevati dal sito Debian, nella sezione NetInst (vedere: netboot Debian ). Alla fine, quello che importa, è procurarsi un kernel linux (in genere, sui CD di installazione, si chiama vmlinuz) e un’immagine con la base per il boot (generalmente initrd.gz ), collocarli nella directory del Server TFTP e, nel file di configurazione sopra, specificare il percorso completo per il kernel (omonimo comando) e l’immagine ( append initrd=… ).
  4. Procurarsi i files che il boot loader dovrà caricare e collocarli opportunamente, secondo quanto scritto nel file di configurazione del punto precedente.
  5. Avviare il servizio con /etc/init.d/atftpd start . Controllare syslog per verificare che tutto sia ok. Per avere un “monitor” durante il boot del boot_client, si può usare questo comando: tail -f /var/log/syslog

NB: Se sul boot_server è presente un Firewall (ad esempio shorewall) ricordarsi di configurare una regola per aprire la porta 69/UDP .
A questo punto il boot_server dovrebbe essere pronto e non resta che avviare il boot_client specificando di eseguire il boot tramite LAN (in genere va configurato il BIOS o si deve premere F12).

Autore: BuDuS

Disegnatore Meccanico, con la passione per l'Informatica. Come hobby, produco piccoli software di (in)utilità.