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

Questo articolo è una bozza.

Aggiornato a nuove release Ubuntu 14.04.1 e Webmin 1.700 mercoledì 10/09/2014

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.1 LTS (i386) “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):

Comandi:
pxe@pxeserver:~$ sudo -i

Terminata l’installazione mi sono assicurato che il nostro server abbia un IP fisso nella sottorete, nel mio caso 192.168.0.222. 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.222
netmask 255.255.255.0
gateway 192.168.0.254
dns-nameservers 192.168.0.254 8.8.8.8

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.

Comandi:
root@pxeserver:~# wget http://prdownloads.sourceforge.net/webadmin/webmin_1.700_all.deb
root@pxeserver:~# dpkg -i webmin_1.700_all.deb
root@pxeserver:~# apt-get -f install

L’interfaccia sarà ora disponibile all’indirizzo:

Indirizzo:
https://192.168.0.222:10000/

Creazione struttura delle cartelle

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

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

Comandi:
root@pxeserver:~# mkdir /srv/pxeboot
root@pxeserver:~# mkdir /srv/www
root@pxeserver:~# mkdir /srv/install
root@pxeserver:~# mkdir /srv/iso

La cartella pxeboot che conterrà i file di avvio; la cartella www sarà la radice del server web e conterrà i file da passare con protocollo http; la cartella install i file che verranno passati con protocollo nfs; la cartella iso conterrà le immagini iso dei sistemi.

pxeboot: 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: https://www.danielelolli.it/2014/07/howto-boot-linux-from-network-using-pxe-and-dnsmasq-proxy-ubuntu-14-04/

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

Comandi:
root@pxeserver:~# apt-get install syslinux root@pxeserver:~# cp /usr/lib/syslinux/pxelinux.0 /srv/pxeboot
root@pxeserver:~# cp /usr/lib/syslinux/menu.c32 /srv/pxeboot
root@pxeserver:~# mkdir /srv/pxeboot/pxelinux.cfg

Ora predisponiamo il nostro menu di base: ci occuperemo dei sottomenu mano a mano che procederemo nelle sezioni.
Fonte menu: https://help.ubuntu.com/community/PXEInstallMultiDistro

/srv/pxeboot/pxelinux.cfg/default
DEFAULT menu.c32
TIMEOUT 600
ONTIMEOUT BootLocal
MENU TITLE PXE MULTIBOOT SERVER
NOESCAPE 1
ALLOWOPTIONS 1
PROMPT 0
LABEL BootLocal
localboot 0
TEXT HELP
Boot to local hard disk
ENDTEXT
MENU BEGIN Ubuntu Install
MENU TITLE Ubuntu Install
LABEL Previous
MENU LABEL Previous Menu
TEXT HELP
Return to previous menu
ENDTEXT
MENU EXIT
MENU SEPARATOR
MENU INCLUDE 1-ubuntu-install.menu
MENU END
MENU BEGIN Ubuntu Live CD
MENU TITLE Ubuntu Live CD
LABEL Previous
MENU LABEL Previous Menu
TEXT HELP
Return to previous menu
ENDTEXT
MENU EXIT
MENU SEPARATOR
MENU INCLUDE 2-ubuntu-live-cd.menu
MENU END
MENU BEGIN CentOS
MENU TITLE CentOS
LABEL Previous
MENU LABEL Previous Menu
TEXT HELP
Return to previous menu
ENDTEXT
MENU EXIT
MENU SEPARATOR
MENU INCLUDE 3-centos.menu
MENU END
MENU BEGIN DOS Based
MENU TITLE DOS Based
LABEL Previous
MENU LABEL Previous Menu
TEXT HELP
Return to previous menu
ENDTEXT
MENU EXIT
MENU SEPARATOR
MENU INCLUDE 4-dos-based.menu
MENU END
MENU BEGIN Tools and Utilities
MENU TITLE Tools and Utilities
LABEL Previous
MENU LABEL Previous Menu
TEXT HELP
Return to previous menu
ENDTEXT
MENU EXIT
MENU SEPARATOR
MENU INCLUDE 5-tools-and-utilities.menu
MENU END

Installiamo dnsmasq:

Comandi:
root@pxeserver:~# apt-get install dnsmasq

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

/etc/dnsmasq.d/pxe.conf
tftp-root=/srv/pxeboot
enable-tftp
dhcp-boot=pxelinux.0
dhcp-option=vendor:PXEClient,6,2b
dhcp-no-override
pxe-prompt=”Press F8 for boot menu”, 3
pxe-service=X86PC, “Boot from network”, pxelinux
pxe-service=X86PC, “Boot from local hard disk”, 0
dhcp-range=192.168.0.222,proxy

Ed assicuriamoci che nel file di configurazione /etc/dnsmasq.conf sia attiva la linea:

/etc/dnsmasq.conf
[…]
conf-dir=/etc/dnsmasq.d
[…]

Riavviamo il servizio dnsmasq:

Comandi:
sudo service dnsmasq restart

www: configurare lightppd

Liberamente tratto da: http://blogging.dragon.org.uk/howto-setup-a-pxeserver-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 (che fisicamente risiedono in /srv/install/) dovranno essere accessibili all’indirizzo:

Indirizzo:
https://192.168.0.222/srv/install/

Ho scelto questa codifica in modo che il percorso relativo dei file da passare sia srv/install/nomefile indipendentemente dal fatto che li passiamo con protocollo nfs (per le immagini un po’ più “vecchio stile” e per gli installatori) oppure http (per quelle più recenti e quasi i tutti i live CD).

Installiamo il server:
Comandi:
root@pxeserver:~# apt-get install lighttpd

E apportiamo due modifiche al file di configurazione (in grassetto):

/etc/lighttpd/lighttpd.conf
[…]
server.document-root = “/srv/www”
server.upload-dirs = ( “/var/cache/lighttpd/uploads” )
server.errorlog = “/var/log/lighttpd/error.log”
server.pid-file = “/var/run/lighttpd.pid”
server.username = “www-data”
server.groupname = “www-data”
server.port = 80

dir-listing.activate = “enable”
[…]

La prima modifica sposta la radice del server web, la seconda consente il directory listing se non è presente un file index.hml. Questa seconda modifica non è indispensabile, ma mi consentirà di usare il server per il anche download delle iso ed eventualmente per monitorare il contenuto delle varie cartelle.
Riavviamo il server web:

Comandi:
root@pxeserver:~# service lighttpd restart

Ora rendiamo simile la struttura del file system a quella locale:

Comandi:
root@pxeserver:~# mkdir /srv/www/srv
root@pxeserver:~# ln -s /srv/pxeboot /srv/www/srv/pxeboot
root@pxeserver:~# ln -s /srv/install /srv/www/srv/install
root@pxeserver:~# ln -s /srv/iso /srv/www/srv/iso

Ora creiamo un file di prova:

Comandi:
root@pxeserver:~# echo “installation files go here!”>/srv/install/test.txt

E proviamo a visualizzarlo con un browser e, cosa ancora più importante, a recuperarlo con wget:

Comandi:
root@pxeserver:~# wget http://192.168.0.222/srv/install/test.txt

Il risultato dovrebbe essere qualcosa del genere:

Output:
–2014-09-09 16:55:32–  http://192.168.0.222/srv/install/test.txt
Connessione a 192.168.0.222:80… connesso.
Richiesta HTTP inviata, in attesa di risposta… 200 OK
Lunghezza: 28 [text/plain]
Salvataggio in: “test.txt”

100%[===========================================>] 28          –.-K/s   in 0s

2014-09-09 16:55:32 (7,72 MB/s) – “test.txt” salvato [28/28]

Se tutto è ok, cancelliamo il file di prova:

Comandi:
root@pxeserver:~# rm /srv/install/test.txt

Infine creo per comodità un file che mi rimandi a webmin direttamente dalla cartella principale.

Comandi:
root@pxeserver:~# mkdir /srv/www/webmin

/srv/www/webmin/index.html
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>Login to Webmin</title>
<meta http-equiv=”refresh” content=”0;URL=’https://192.168.0.222:10000′” />
</head>
<body>
<p>You can find the Login to Webmin<br>
at <a href=”https://192.168.0.222:10000″>https://192.168.0.222:10000</a>.</p>
</body>
</html>

install: configurare nfs-kernel-server

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

Installiamo ora il server snf che ci servità principalmente per i live CD.

Comandi:
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.

/etc/exports
/srv/install      192.168.0.0/24(ro,async,no_root_squash,no_subtree_check)

Ed esportiamo il filesystem.

Comandi:
exportfs -a

Predisposizione dei sorgenti per installazioni Linux e altre utility

Ispirato da: http://posix.in-egypt.net/content/how-mount-iso-fstab

Ora predisporremo i file necessari alle installazioni vere e proprie.
Per quanto riguarda i sorgenti delle installazioni, avevo in un primo tempo pensato di caricare le immagini iso sul server, montarle e copiarne il contenuto nella cartella install per poi cancellarli. Riflettendo un attimo mi sono però reso conto che potevo montare le iso come file system in modo da averle sia per le installazioni PXE che per download per altri usi!
Per comodità seguiremo l’ordine del menu che abbiamo preimpostato.

1-Ubuntu (Install)

1-1-Ubuntu Server 14.04.1 LTS (i386)

Utilizzerò l’immagione ubuntu-14.04.1-server-i386.iso che scaricherò direttamente in /srv/iso per comodità.

Comandi:
root@pxeserver:~# cd /srv/iso
root@pxeserver:~# wget http://mirrors.mit.edu/ubuntu-releases/trusty/ubuntu-14.04.1-server-i386.iso

Anche copiare direttamente il file in tale posizione darà lo stesso risultato. Dalla release 14.04 Ubuntu, Kubuntu e molti altri “parenti” non rilasciano la versione alternate del supporto di installazione, ma solo i Lice CD. Lo stesso procedimento sarebbe applicabile a qualunque immagine di tipo alternate: ad esempio Lubuntu mantiene la versione alternate. Per le versioni a 64 bit basta sostituire i386 con amd64 in queste istruzioni.
Quando il file si trova nella giusta posizione dovremo editare il file /etc/fstab aggiungendo la riga sottostante e assicurandoci che ci sia una riga vuota alla fine del file (con molta attenzione, altrimenti si rischia che il sistema non si avvii più!).

/etc/fstab
[…]
/srv/iso/ubuntu-14.04.1-server-i386.iso /srv/install/ubuntu-14.04.1-server-i386/ iso9660 loop,ro,auto 0 0

Ora con questi due comandi:

Comandi:
root@pxeserver:~# mkdir /srv/install/ubuntu-14.04.1-server-i386
root@pxeserver:~# mount -a

avremo la iso visibile sia spacchettata (per il nostro boot PXE) all’indirizzo:

Indirizzo:
http://192.168.0.222/srv/install/ubuntu-14.04.1-server-i386/

che intera all’indirizzo:

Indirizzo:
http://192.168.0.222/iso/ubuntu-14.04-server-i386.iso

Ora creiamo link simbolici al kernel e all’immagine di avvio:

Comandi:
root@pxeserver:~# mkdir /srv/pxeboot/ubuntu-14.04.1-server-i386
root@pxeserver:~# ln -s /srv/install/ubuntu-14.04.1-server-i386/install/netboot/ubuntu-installer/i386/linux /srv/pxeboot/ubuntu-14.04.1-server-i386/linux
root@pxeserver:~# ln -s /srv/install/ubuntu-14.04.1-server-i386/install/netboot/ubuntu-installer/i386/initrd.gz /srv/pxeboot/ubuntu-14.04.1-server-i386/initrd.gz

Infine è il turno del file di menu.

Fonte PXE Ubuntu 14.04: http://www.unixmen.com/install-configure-pxe-server-ubuntu-14-04-lts/
/srv/pxeboot/1-ubuntu-install.menu
LABEL 1
MENU LABEL Ubuntu Server 14.04.1 (32-bit)
KERNEL ubuntu-14.04.1-server-i386/linux
APPEND initrd=ubuntu-14.04.1-server-i386/initrd.gz
TEXT HELP
Boot the Ubuntu Server 14.04.1 (32-bit) Installation Media
ENDTEXT

Ubuntu (Live CD)

(seguirà…)

DOS Based

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.

Comandi:
root@pxeserver:~# cp /usr/lib/syslinux/memdisk /srv/pxeboot
root@pxeserver:~# mkdir /srv/pxeboot/4-dos-based
root@pxeserver:~# cd /srv/pxeboot/4-dos-based
root@pxeserver:~# wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/fdboot.img

Ora creiamo il sottomenu:

/srv/pxeboot/4-dos-based.menu
LABEL 1
MENU LABEL FreeDOS Floppy Disk
KERNEL memdisk
APPEND initrd=4-dos-based/fdboot.img
TEXT HELP
Boot FreeDOS 1.0
ENDTEXT

Tools and Utilities

(seguirà…)

Share on FacebookTweet about this on TwitterShare on LinkedInGoogle+Email to someonePrint this page

10 thoughts on “Come creare un server PXE per tutte le esigenze (Ubuntu 14.04.1)

  1. Ciao…scusa ma tu in pratica non avvii le vere e proprie iso…..ma le monti solo
    Ma poi tra l’altro il memdisk non va installato??? Bisogna copiare il binario dentro la cartella di tftp???

  2. Ok, grazie.

    Ho seguito passo passo la tua procedura su un ubuntu-14.04.3-server-amd64.
    Se faccio il boot da rete con un altro pc, compare il menu in /etc/dnsmasq.d/pxe.conf. Quando scelgo “Boot from network” mi aspetterei la visualizzazione del menu in pxelinux.cgf/default, invece non trova più nulla.
    Da cosa può dipendere?

  3. Daniele, ho risolto. Impostando nel pxe.conf questo range:
    dhcp-range=172.16.0.1,proxy (dove 172.16.0.1 è l’indirizzo del server pxe),
    alle macchine veniva assegnato l’indirizzo 192.168.200.5 gw 192.168.200.1 (mi sarei aspettato un indirizzo della rete 172.16.0.0/16), per cui poi i client non vedevano più il pxe server.
    Allora ho modificato quella riga in:
    dhcp-range=172.16.0.101,172.16.0.121,12h
    Adesso viene assegnato un ip in questo range e tutto funziona correttamente.

    Hai idea del perché di questo comportamento? La parola “proxy” a che serve?

  4. La modifica che hai fatto va bene solo se utilizzi questa macchina come DHCP principale. La scritta “proxy” vuole dire infatti che la macchina si comporta come DHCP solo per quanto riguarda il boot via pxe, mentre lascia al DHCP principale (che solitamente è il router e che non sempre ha le opzioni per gestire il boot) il compito di assegnare gli indirizzi. Quindi in buona sostanza impostando proxy la macchina entra in gioco solo se è richiesto un boot da rete, altrimenti lascia tutto in mano al DHCP principale: se tu non hai un DHCP principale o ce l’hai in un’altra sottorete ecco che i client “perdono di vista” il server di boot.

  5. Ciao Daniele complimenti alla guida è fatta molto bene .
    Volevo chiederti , come faccio ad avviare altre iso tipo hirens oppure DLC (sistemi di diagnosi e tool vari), una volta inseito il file .iso nella cartella /srv/iso come lo richiamo dal menù ? va scompattato ? mi potresti aiutare … un altra domanda è , posso far partire sistemi WINPE ? grazie

  6. Ciao Antonio. Purtroppo non ho mai approfondito lo studio e, anche se è vero che si può avviare virtualmente qualunque cosa, è anche vero che spesso il metodo è diverso da immagine a immagine. Per vedere il contenuto puoi usare due metodi: o lo monti loop (occupa meno spazio, ma puoi mettere un numero limitato di immagini), oppure la scompatti. WinPE sicuramente si può avviare ma non ho mai approfondito i dettagli. Un’idea di partenza potrebbe essere questo articolo: https://wiki.archlinux.org/index.php/Windows_PE#From_Network

Leave a Comment

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *