PXE boot – DHCP & TFTP

Published by Lello on

Mi capita spesso di fare delle installazioni, spesso ripetitive, e vorrei che alcune funzionalità che mi servono fossero sempre a disposizione. Ad esempio, vorrei avere sempre sottomano il SystemRescueCD oppure poter fare installazioni ripetitive di server VMware vSphere Hypervisor 5.5 o di CentOS 6.5; il tutto senza alcun dvd o penne USB.

Per potere fare ciò, è possibile ricorrere all’accoppiata DHCP e TFTP; il primo servizio fornisce al PC/Server che ne fa richiesta un indirizzo ip valido da utilizzare e fornisce anche l’indirizzo IP del server TFTP da cui scaricare il sistema.

Installiamo i due servizi in un server linux CentOS 6.5; cominciamo dal server DHCP:

# yum -y install syslinux syslinux-tftpboot mtools dhcp
# chkconfig dhcpd on

Editiamo il file di configurazione del servizio dhcpd, in maniera tale da inserire le istruzioni minimali per il boot (modificate il file in base alla vostra rete):

  • il range di IP assegnati dal dhcpd va dal 192.168.66.26 al 192.168.66.30, cioè al massimo 5 indirizzi IP;
  • tali indirizzi IP verrano assegnati solo a quelle macchine il cui MAC Address è inserito nella lista “my_servers”;
  • l’indirizzo IP del tftp server è quello indicato nella stringa next-server;
# vi /etc/dhcp/dhcpd.conf
ddns-update-style ad-hoc;
allow booting;
allow bootp;

class "my_servers" {
        match hardware;
}
subclass "my_servers" 1:0C:AA:D9:47:F4:45; #Server_001
subclass "my_servers" 1:0C:AA:D9:47:F4:46; #Server_002

subnet 192.168.66.0 netmask 255.255.255.0 {
        pool {
                range 192.168.66.26 192.168.66.30;
                allow members of "my_servers";
                next-server 192.168.66.19;
                filename = "pxelinux.0";
        }

}

Una volta configurato il dhcpd server, facciamo partire il servizio e procediamo alla configurazione del tftp server:

# service dhcpd start
# yum -y install tftp-server xinetd

Editiamo la configurazione del tftp server :

# vi /etc/xinetd.d/tftp
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -v -s /tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

e riavviamo xinetd per avviare il servizio tftpd:

# service xinetd restart

Cominciamo a creare la struttura per il nostro tftp server:

# cd /tftpboot
# mkdir -p images/VMWare_5.5
# mkdir -p images/SystemRescueCD_4.0.1
# mkdir -p images/CentOS_6.5
# mkdir pxelinux.cfg
# umount /mnt/tmp

Editiamo il file che creerà il menù per il nostro Server_001 con mac address 0C:AA:D9:47:F4:45:

# vi pxelinux.cfg/01-0C-AA-D9-47-F4-45
default menu.c32
prompt 0
timeout 300

MENU TITLE Main Menu

LABEL local
        MENU LABEL Boot local hard drive
        LOCALBOOT 0

LABEL SystemRescueCD
        MENU LABEL SystemRescueCD
        KERNEL images/SystemRescueCD_4.0.1/rescue64
        APPEND initrd=images/SystemRescueCD_4.0.1/initram.igz boottftp=tftp://192.168.66.19/images/SystemRescueCD_4.0.1/sysrcd.dat

LABEL VMWare 5.5 Install
        MENU LABEL VMWare 5.5
        KERNEL images/VMWare_5.5/mboot.c32
        APPEND -c images/VMWare_5.5/boot.cfg
LABEL CentOS 6.5 64-bit
        MENU CentOS 6.5 64-bit
        KERNEL images/CentOS_6.5/vmlinuz
        APPEND initrd=images/CentOS_6.5/initrd.img ramdisk_size=100000

SystemRescueCD
Scarichiamo il file iso di SystemRescueCD dal sito http://www.sysresccd.org/Download; al momento in cui scrivo, la versione è la 4.0.1; montiamo il file appena scaricato in una directory temporanea e copiamo i file che ci interessano nella cartella images/SystemRescueCD:

# cd /usr/src
# wget http://prdownloads.sourceforge.net/systemrescuecd/sysresccd-x86/systemrescuecd-x86-4.0.1.iso
# mkdir /mnt/tmp
# mount -o loop /usr/src/systemrescuecd-x86-4.0.1.iso /mnt/tmp
# cp /mnt/tmp/isolinux/rescue64 /mnt/tmp/isolinux/initram.igz /mnt/tmp/sysrcd.* /tftpboot/images/SystemRescueCD_4.0.1
# umount /mnt/tmp

VMware vSphere Hypervisor 5.5
Prepariamo anche la directory per il vmware ESXi 5.5; scarichiamolo dal sito della VMWare (previa registrazione) nella directory /usr/src:

# cd /usr/src
# mount -o loop /usr/src/VMware-VMvisor-Installer-5.5.0-1331820.x86_64.iso /mnt/tmp
# rsync -a /mnt/tmp/ /tftpboot/images/VMWare_5.5/
# chmod +w /tftpboot/images/VMWare_5.5
# umount /mnt/tmp

VMWare vorrebbe che tutti i files fossero nella root del servizio tftp; per modificare tale tipo di configurazione (e dunque usare il path relativo che abbiamo configurato), dobbiamo:

1. editare il file di configurazione di boot del vmware e rimuovere tutti gli “/”; per fare questo:
2. aggiungere la direttiva “prefix” al file, in maniera tale da specificare la directory dal quale fare il boot;

Eseguiamo il seguente comando per adempiere ai punti precedenti:

# sed -e "s#/##g" -e "3s#^#prefix=/images/`basename $PWD`/n#" -i.bak /tftpboot/images/VMWare_5.5/boot.cfg

CentOS 6.5
Passiamo infine alla configurazione per la CentOS; scarichiamo il file .iso della CentOS per un’installazione minimal nella cartella /usr/src; successivamente copiamo i file che servono al boot della CentOS nella cartella del tftp server:

# mount -o loop /usr/src/CentOS-6.5-x86_64-minimal.iso /mnt/tmp
# cp /mnt/tmp/images/pxeboot/* /tftpboot/images/CentOS_6.5
# umount /mnt/tmp

La configurazione per la CentOS è praticamente finita.

Conclusioni
La nostra accoppiata DHCP/TFTP è pronta; non ci resta che completare le configurazioni per gli altri server in maniera tale da abilitare il PXE boot per tutti i server che ci interessano; successivamente andiamo nel nostro server “Server_001”, entriamo nella configurazione del bios e configuriamo il boot in maniera tale che faccia il boot tramite interfaccia lan/PXE; se è tutto corretto (soprattutto il mac address del nostro server è uno di quelli per cui abbiamo creato il menu), ci comparirà un menù con cui potremo scegliere cosa installare/eseguire sul nostro server (SystemRescueCD, VMWare, CentOS).