Come creare un server PXE per tutte le esigenze (Ubuntu 14.04.5)

Aggiornato a nuove release Ubuntu 14.04.5 e Webmin 1.850 lunedì 01/07/2017.
Se vi è mai capitato di avere a che fare con un portatile o qualunque altro dispositivo col lettore CD rotto e che non avvia da USB (!), allora avrete capito l’utilità di un server PXE. Per la definizione esatta vi rimando a Wikipedia o chi per lei: quello che tenterò di aiutarvi a capire è come preparare un server PXE che ci consenta di avviare gli strumenti di diagnostica di base e le installazioni di Linux e/o Windows. Ho scelto una installazione con ProxyDHCP perché molto spesso il DHCP delle nostre reti è all’interno del router e non sempre è possibile inibirlo/configurarlo, specialmente se si tratta del modem in comodato d’uso di qualche ISP italiano (mettete un nome a caso, sono tutti della stessa risma!)
Questo non è un lavoro originale: molte idee sono prese da post letti qua e là googleando. Cercherò di citare tutte le fonti, ma se dimenticassi qualcuno e lo notaste non esitate a segnalarlo. In particolare mi preme ricordare questo articolo: http://ubuntuforums.org/showthread.php?t=1606910. Anche se alla fine ho preso ben poco da esso, è stato fondamentale per avere una visione di insieme di cosa serviva a fare cosa.

Installazione di Ubuntu Server

Per questa mia impresa ho deciso di partire da una distribuzione Ubuntu Server 14.04.5 LTS (amd64) “minimale” (cioè deselezionando tutti i componenti in fase di installazione, tranne OpenSSH server che è indispensabile per gestire la macchina da remoto) per poi aggiungere solo quello che mi serve. Penso che la cosa non differisca molto su qualunque altra distro Debian based, ma intanto siete avvertiti. L’utente principale è stato chiamato pxe. Per velocità, tutti i comandi sono eseguiti dopo essere diventati superuser (in una Debian “pura” basterebbe fare il login come root) con il comando pxe@pxe:~$ sudo -i. Terminata l’installazione mi sono assicurato che il nostro server abbia un IP fisso nella sottorete, nel mio caso 192.168.0.246. Per farlo ho editato il file /etc/network/interfaces in questo modo:

`# /etc/network/inferfaces

This file describes the network interfaces available on your system

and how to activate them. For more information, see interfaces(5).

The loopback network

interface auto lo
iface lo inet loopback

The primary network

interface auto eth0
iface eth0 inet static
address 192.168.0.246
netmask 255.255.255.0
gateway 192.168.0.254
dns-nameservers 8.8.8.8`

Disattiviamo e riattiviamo l’interfaccia di rete per rendere operative le modifiche (se siamo collegati in SSH è consigliabile un reboot per evitare di rimanere tagliati fuori!):

ifdown eth0<br /> ifup eth0

e aggiorniamo tutto:

apt-get clean<br /> apt-get update<br /> apt-get upgrade

Infine riavviamo e passiamo oltre:

reboot

Installazione di webmin per l’amministrazione remota (facoltativo)

Un pacchetto che trovo molto utile per la gestione remota dei server è Webmin: non è presente nei repository ma si installa con pochi comandi.

root@pxe:~# wget http://prdownloads.sourceforge.net/webadmin/webmin_1.850_all.deb<br /> root@pxe:~# dpkg -i webmin_1.850_all.deb<br /> root@pxe:~# apt-get -f install<br /> root@pxe:~# rm webmin_1.850_all.deb

L’interfaccia sarà ora disponibile all’indirizzo https://192.168.0.246:10000.

Creazione struttura delle cartelle

Liberamente tratto da: http://blogging.dragon.org.uk/howto-setup-a-pxe-with-dnsmasq/

Ora creiamo le directory che ospiteranno i nostri file; per mantenere un po’ di organizzazione le metteremo tutte in /pxe:

root@pxe:~# mkdir /pxe

Creiamo anche una sottocartella che conterrà le immagini dei sistemi operativi /iso:

root@pxe:~# mkdir /pxe/iso

PXE Boot: configurare syslinux e dnsmasq

Originale: http://danielboca.blogspot.it/2012/02/boot-linux-from-network-using-pxe-and.html?m=1
Adattamento a Ubuntu di UncleDan: /2014-07-25-howto-boot-linux-from-network-using-pxe-and-dnsmasq-proxy-ubuntu-14-04.html

Installiamo syslinux e copiamo i file necessari in quella che sarà la cartella di boot del server TFTP:

root@pxe:~# apt-get install syslinux<br /> root@pxe:~# cp /usr/lib/syslinux/pxelinux.0 /pxe<br /> root@pxe:~# cp /usr/lib/syslinux/menu.c32 /pxe<br /> root@pxe:~# mkdir /pxe/pxelinux.cfg

Ora predisponiamo il nostro menu di base, con una sola operazione (avvia dal disco locale): ci occuperemo dei sottomenu mano a mano che procederemo nelle sezioni (idea del menu da: https://help.ubuntu.com/community/PXEInstallMultiDistro)

<strong>/pxe/pxelinux.cfg/default</strong><br /> DEFAULT menu.c32<br /> TIMEOUT 600<br /> ONTIMEOUT BootLocal<br /> MENU TITLE PXE MULTIBOOT SERVER<br /> NOESCAPE 1<br /> ALLOWOPTIONS 1<br /> PROMPT 0<br /> LABEL BootToLocalHardDisk<br /> localboot 0<br /> TEXT HELP<br /> Boot to local hard disk<br /> ENDTEXT<br /> MENU END

Installiamo dnsmasq:

root@pxe:~# apt-get install dnsmasq

Creiamo il file di configurazione per il servizio PXE /etc/dnsmasq.d/pxe.conf (l’IP 192.168.0.246 è quello che abbiamo assegnato al nostro server):

<strong>/etc/dnsmasq.d/pxe.conf</strong><br /> tftp-root=/pxe<br /> enable-tftp<br /> dhcp-boot=pxelinux.0<br /> dhcp-option=vendor:PXEClient,6,2b<br /> dhcp-no-override<br /> pxe-prompt="Press F8 for boot menu", 3<br /> pxe-service=X86PC, "Boot from network", pxelinux<br /> pxe-service=X86PC, "Boot from local hard disk", 0<br /> dhcp-range=192.168.0.246,proxy

Ed assicuriamoci che nel file di configurazione /etc/dnsmasq.conf sia attiva la linea (altrimenti inserirla in coda al file):

<strong>/etc/dnsmasq.conf</strong><br /> […]<br /> conf-dir=/etc/dnsmasq.d<br /> […]

Riavviamo il servizio dnsmasq:

root@pxe:~# sudo service dnsmasq restart

Servizio HTTP: configurare lighttpd

Liberamente tratto da: http://blogging.dragon.org.uk/howto-setup-a-pxe-with-dnsmasq/

Ho deciso di utilizzare lighttpd come server web; è un po’ più moderno e performante del tradizionale apache2 che quasi tutti i tutoriali usano. Ma purché ci passi i file in http qualsiasi server andrà bene! Ricordiamoci solo che nel resto della guida supporrò che i file da passare al boot dovranno essere accessibili all’indirizzo:

http://192.168.0.246/

Installiamo il server:

root@pxe:~# apt-get install lighttpd

E apportiamo una piccola modifica al file di configurazione (in grassetto corsivo):

<strong>/etc/lighttpd/lighttpd.conf</strong><br /> […]<br /> <em><strong>dir-listing.activate = "enable"</strong></em>

Riavviamo il server web:

root@pxe:~# service lighttpd restart

La modifica consente il directory listing se non è presente un file index.hml e mi consentirà di usare qualsiasi browser web per monitorare il contenuto delle varie cartelle.
Ora elimino il file index e creo un link alla cartella /pxe che mi consentirà di “vedere” i file anche all’indirizzo http://192.168.0.246/pxe/:
root@pxe:~# rm /var/www/index.lighttpd.html<br /> root@pxe:~# ln -s /pxe /var/www/pxe</p>
Infine creo per comodità un file che mi rimandi a webmin direttamente dalla cartella principale
root@pxe:~# mkdir /var/www/webmin

<strong>/var/www/webmin/index.html</strong><br /> <html xmlns="http://www.w3.org/1999/xhtml"><br /> <head><br /> <title>Login to Webmin</title><br /> <meta http-equiv="refresh" content="0;URL='https://192.168.0.246:10000'" /><br /> </head><br /> <body><br /> <p>You can find the Login to Webmin<br><br /> at <a href="https://192.168.0.246:10000">https://192.168.0.246:10000</a>.</p><br /> </body><br /> </html>

Servizio NFS: configurare nfs-kernel-server

Fonte: http://ubuntuforums.org/showthread.php?t=1606910

Installiamo ora il server NFS che ci servità principalmente per i live CD.
apt-get install nfs-kernel-server
Modifichiamo il file degli export per rendere disponibile la cartella /srv/install anche con protocollo nfs a tutta la nostra sottorete.

<strong>/etc/exports</strong><br /> /pxe 192.168.0.0/24(ro,async,no_root_squash,no_subtree_check)

Ed esportiamo il filesystem.

exportfs -a

Ora inizieremo con qualcosa di molto “basic”, cioè l’avvio di un floppy con FreeDOS

FreeDOS

Fonti: http://possiblelossofprecision.net/?p=491 e https://help.ubuntu.com/community/PXEInstallMultiDistro#DOS

Come esempio dei boot di tipo DOS (i buoni vecchi floppy) prenderemo il floppy di boot di FreeDOS, ma lo stesso procedimento si può applicare a qualunque immagine di floppy da 1,44MB, compresi quelli di programmi non-free (Ghost 2003, Emergency Boot Disk Window 98, ecc). Va da se che per utilizzarli è necessario possedere la relativa licenza. Creiamo la cartella e mettiamoci l’immagine del file.

root@pxe:/pxe# mkdir -p /pxe/dos/freedos-1.0<br /> root@pxe:/pxe# cd /pxe/dos/freedos-1.0<br /> root@pxe:/pxe/dos/freedos-1.0# wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/fdboot.img

Ora creiamo la parte di menu che ci interessa; basterà aggiungerla in coda a /pxe/pxelinux.cfg/default:

<strong>/pxe/pxelinux.cfg/default</strong><br /> LABEL FreeDOS 1.0 Floppy Disk<br /> KERNEL memdisk<br /> APPEND initrd=dos/freedos-1.0/fdboot.img<br /> TEXT HELP<br /> Boot FreeDOS 1.0<br /> ENDTEXT<br />

Predisposizione dei sorgenti per installazioni Linux e altre utility

In questo aggiornamento 2017 utilizzerò un approccio più lineare. Nelle versioni precedenti avevo utilizzato il mount loop per avere le immagini ISO disponibili sia per un eventuale download che per il boot (idea ispirata da http://posix.in-egypt.net/content/how-mount-iso-fstab). Questo metodo, pur avendo l’indiscutibile vantaggio di non duplicare l’occupazione di spazio su disco, comportava una serie di inconvenienti: innanzitutto occorreva mettere le mani di frequente nel file /etc/fstab (col rischio per mani inesperte di creare grossi problemi al sistema); inoltre il numero di filesystem di tipo loop che si possono montare è piuttosto limitato e quindi il metodo non era replicabile a piacimento.

In questa nuova revisione dell’articolo scaricherò le immagini ISO nella cartella /pxe/iso e le estrarrò nella cartella /pxe suddividendole in sottocartelle per tipologia e lasciando poi la possibilità a chi lo desidera di cancellare le immagini originali).

Inoltre userò 7zip per l’estrazione delle immagini iso, quindi prima di procedere oltre, installiamolo:

root@pxe:~# apt-get install p7zip-full p7zip-rar

 Ubuntu (Net Install)

Pereparerò sia la versione a 32-bit che quella a 64-bit perché per alcune limitazioni nel mio hardware di test ho bisogno anche di quella a 32-bit, anche se ormai obsoleta. Per la maggior parte delle persone però è sufficiente la versione a 64-bit. Scaricherò  le immagini nella cartella /pxe/iso e le estrarrò nella cartella /pxe:

root@pxe:~# mkdir -p /pxe/iso/linux<br /> root@pxe:~# cd /pxe/iso/linux<br /> root@pxe:/pxe/iso/linux# wget http://archive.ubuntu.com/ubuntu/dists/trusty/main/installer-i386/current/images/netboot/mini.iso<br /> root@pxe:/pxe/iso/linux# mv mini.iso ubuntu-14.04-mini-i386.iso<br /> root@pxe:/pxe/iso/linux# mkdir -p /pxe/linux/ubuntu-14.04-mini-i386<br /> root@pxe:/pxe/iso/linux# 7z x -ssc ubuntu-14.04-mini-i386.iso -o/pxe/linux/ubuntu-14.04-mini-i386/<br /> root@pxe:/pxe/iso/linux# chmod -R 555 /pxe/linux/ubuntu-14.04-mini-i386/<br /> root@pxe:/pxe/iso/linux# wget http://archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/current/images/netboot/mini.iso<br /> root@pxe:/pxe/iso/linux# mv mini.iso ubuntu-14.04-mini-amd64.iso<br /> root@pxe:/pxe/iso/linux# mkdir -p /pxe/linux/ubuntu-14.04-mini-amd64<br /> root@pxe:/pxe/iso/linux# 7z x -ssc ubuntu-14.04-mini-amd64.iso -o/pxe/linux/ubuntu-14.04-mini-amd64/<br /> root@pxe:/pxe/iso/linux# chmod -R 555 /pxe/linux/ubuntu-14.04-mini-amd64/

Infine è il turno del file di menu: anche in questo caso andiamo in aggiunta al menu di default, seguendo la filosofia keep-it-simple!

Fonte PXE Ubuntu 14.04: http://www.unixmen.com/install-configure-pxe-server-ubuntu-14-04-lts/

<strong>/pxe/pxelinux.cfg/default</strong><br /> LABEL Ubuntu 14.04 LTS Netinstall (64-bit)<br /> KERNEL linux/ubuntu-14.04-mini-amd64/linux<br /> APPEND initrd=linux/ubuntu-14.04-mini-amd64/initrd.gz<br /> TEXT HELP<br /> Boot Ubuntu 14.04 LTS Netinstall (64-bit)<br /> ENDTEXTLABEL Ubuntu 14.04 LTS Netinstall (32-bit)<br /> KERNEL linux/ubuntu-14.04-mini-i386/linux<br /> APPEND initrd=linux/ubuntu-14.04-mini-i386/initrd.gz<br /> TEXT HELP<br /> Boot Ubuntu 14.04 LTS Netinstall (32-bit)<br /> ENDTEXT </div>