Ubuntu: Installiamo Linux tramite Network Boot (DHCP + PXE + TFTP + NFS)

E’ già stato trattato in un altro articolo di questo Blog l’installazione di una Debian usando una distribuzione Gentoo come server di boot.

Avendo un PC o Laptop (o comunque similare) che non possiede CD-Rom (o che non funziona, come nel mio caso) e non avendo possibilità di fare il boot direttamente da USB (ad esempio, nel mio caso, il BIOS è bloccato da password e – per il momento – non la conosco), probabilmente – se supportata – l’unica soluzione che rimane è quella di eseguire il boot della macchina tramite rete LAN (Ethernet).

Nel mio caso ho usato una distribuzione Debian/Lenny per fare da boot server.

Sommariamente i passaggi da fare sono i seguenti:

  1. Procurarsi la ISO della distribuzione (nel mio caso “ubuntu-11.04-desktop-i386.iso“)
  2. Installare il Server DHCP (io ho usato udhcpd) e configurarlo
  3. Installare il Server TFTP (io ho usato atftpd)
  4. Preparare la directory che deve contenere i files di configurazione e i dati per il boot (boot-manager, configurazione, kernel linux, ecc…): tftpboot
  5. Installare il pacchetto per il bootloader Syslinux
  6. Montare la ISO e condividerla con NFS via rete
  7. Eseguire il BOOT di rete con il computer su cui si vuole installare Linux (in genere, appena lo si accende, bisogna premere F12 per effettuare il Network Boot).

Alla fine, nel mio caso, è stato un totale fallimento perché Ubuntu sparava valanghe di errori – che non ho ben capito a cosa erano dovuti – ma sono arrivato – anche se per poco, perché poi è crashato – alla schermata desktop dove c’era “Installa Ubuntu”.

Sintenticamente, elenco le cose salienti nel dettaglio.

Installato il Server udhcpd (il classico: apt-get install udhcpd ) bisogna creare un file di configurazione ( /etc/udhcpd.conf ) simile al seguente:

start      192.168.0.201
end        192.168.0.254
interface  eth0
max_leases 54
siaddr     192.168.0.200
boot_file  pxelinux.0
option     subnet               255.255.255.0
option     dns                  208.67.222.222

Dove:

  • “start” ed “end” indicano il range di indirizzi IP che il Server DHCP potrà assegnare alla macchina che deve eseguire il boot. Nel mio caso ho dato da .201 a .254 (compresi) per evitare che non fossero in conflitto con il Server DHCP del Router ADSL (che si ferma a .199, nel mio caso).
  • “interface” è la scheda di rete da usare, solitamente “eth0”.
  • “max_leases” è il numero di IP massimo assegnabile.
  • “siaddr” è l’IP del Server Boot (nel mio caso la Debian che sta all’IP 192.168.0.200)
  • “boot_file” è il file di boot che poi vedremo in seguito.
  • “option subnet” è la maschera di rete
  • “option dns” è importante e rappresenta il Server DNS affinché sia possibile poi navigare su Internet; qui andrebbe personalizzato, anche se quello sopra dovrebbe funzionare perfettamente.

Il servizio si avvia con:

/etc/init.d/udhcpd start

Installare atftpd ( apt-get install atftpd ) e verificare che nel file “/etc/inetd.conf” sia presente questa riga (cambiarla, se necessario, e ri-avviare il servizio inetd ):

tftp            dgram   udp4    wait    nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 --logfile /var/log/atftpd.log /tftpboot

In particolare bisogna fare attenzione a dove il server tftp prevede sia la directory radice (spesso è “/var/lib/tftpboot” e ciò non funziona con i files di configurazione che fornisco).

Da utente root, creare la cartella “/tftpboot” con:

mkdir /tftpboot
mkdir /tftpboot/pxelinux.cfg
mkdir /tftpboot/ubuntu-installer
mkdir /tftpboot/ubuntu-installer/iso

Se, come nel mio caso, avete problemi con Ubuntu, potete prevedere anche la possibilità di usare Debian con le seguenti directory aggiuntive:

mkdir /tftpboot/debian-installer
mkdir /tftpboot/debian-installer/i386

Ora andiamo a riempire queste cartelle; per prima cosa andiamo a creare i files di configurazione.

E’ il passaggio più complicato perché: il nome del file di configurazione dipende dal MAC address della macchina che deve eseguire il boot.

In altri termini: la macchina sulla quale dobbiamo installare Ubuntu ha un indirizzo fisico di rete fisso che va utilizzato per determinare il nome del file di configurazione.

Ad esempio, nel mio caso, l’indirizzo è “00f1ff4d-751c-d811-95fb-000e7f7aafc6“; è un qualcosa che si dovrebbe leggere sulla macchina che esegue il boot – durante lo stesso – o anche in un qualche file di LOG su Linux (vedere pure l’altra guida per questo aspetto).

Io ho creato 2 file (uno per Ubuntu e uno per Debian); quello per Ubuntu l’ho chiamato “00f1ff4d-751c-d811-95fb-000e7f7aafc6.ubuntu” e il suo contenuto è il seguente:

default install
label install
menu label ^Install
menu default
kernel ubuntu-installer/linux
append root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.0.200:/tftpboot/ubuntu-installer/iso initrd=/tftpboot/ubuntu-installer/iso/casper/initrd.lz quiet splash --

mentre, quello di Debian, l’ho chiamato “00f1ff4d-751c-d811-95fb-000e7f7aafc6.debian” e contiene:

default install
label install
menu label ^Install
menu default
kernel debian-installer/i386/linux
append vga=normal initrd=debian-installer/i386/initrd.gz — quiet

Per stabilire quale dei due files di configurazione utilizzare per il boot, si rende necessario creare un link simbolico di questo tipo:

ln -s 00f1ff4d-751c-d811-95fb-000e7f7aafc6.ubuntu 00f1ff4d-751c-d811-95fb-000e7f7aafc6

Per chi è interessato a Debian è necessario prelevare dal sito i files per il boot e collocarli in “/tftpboot/debian-installer/i386“; ottenendo:

# ls -l /tftpboot/debian-installer/i386
totale 7360
drwxrwxrwx 2 nobody nogroup    1024 2011-07-31 16:50 boot-screens
-rwxrwxrwx 1 nobody nogroup 6014747 2010-11-24 22:09 initrd.gz
-rwxrwxrwx 1 nobody nogroup 1469808 2010-11-24 22:13 linux
-rwxrwxrwx 1 nobody nogroup   15820 2010-11-24 22:15 pxelinux.0
drwxrwxrwx 2 nobody nogroup    1024 2011-07-31 16:50 pxelinux.cfg

Ora installiamo syslinux ( apt-get install syslinux ) e copiamo il bootloader:

cp /usr/lib/syslinux/pxelinux.0 /tftpboot/

Se non si trova dove previsto, cercarlo con:

find /usr -iname pxelinux.0

Dobbiamo quindi impostare correttamente i permessi e gli utenti delle cartelle e files creati con:

chown -R nobody:nogroup /tftpboot
chmod -R 777 /tftpboot

Per quanto riguarda Ubuntu bisogna prendere la iso e copiarla dentro “/tftpboot/ubuntu-installer“, quindi, montarla con questo comando:

mount -t iso9660 /tftpboot/ubuntu-installer/ubuntu-11.04-desktop-i386.iso /tftpboot/ubuntu-installer/iso/ -o loop=/dev/loop1,ro

quindi configurare il Server NFS (per installarlo: apt-get install nfs-kernel-server ) aggiungendo questa riga al file “/etc/exports“:

/tftpboot *(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure,subtree_check)

e riavviare il Server NFS con:

/etc/init.d/nfs-kernel-server restart

Per completare la sistemazione della cartella di boot, dobbiamo creare un link simbolico al kernel linux per Ubuntu:

ln -s /tftpboot/ubuntu-installer/iso/casper/vmlinuz /tftpboot/ubuntu-installer/linux

Bene, ora è giunto il momento di eseguire il boot della macchina e incrociare le dita (più giri, fino a quando non si staccano …) e pregare.

Non per “tirarla” ma è quasi impossibile vada al primo colpo. Bisogna armarsi di pazienza e capire cosa non funziona come previsto. Spesso è un problema di percorso o di permesso. Nel mio caso sono “abbastanza attrezzato” perché ho un router, uno switch, ecc…, ma qualcuno potrebbe essere in situazioni più critiche “computer -> computer” e, in questo caso, magari servono cavi di rete incrociati, ecc…