Zeroshell as TFTP server to SmartOS

Hi,

queste due righe per introdurre come Zeroshell può fornire un ambiente di “net boot” attraverso la nuova BF22 (30 Giugno, 2013)

Il mio uso è specifico per  SmartOS

 

Premessa cosa è necessario leggere:

1) Alain O’Dea “ipxe-smartos
2) Ben  Rockwood “PXE+Booting+SmartOS
3) www.ipxe.org “doc
4)  Tftp “protocol”
5)  How to patch dhcp on zeroshell to add “dhcpd option”  into “Global Scope” so you can add special settings to dhcpd.conf
6) SmartCore

Dopo aver applicato la patch BF22  per aggiungere il tftpd-hpa  avremo in ascolto il deamon in.tftpd  su UDP:69

 

root@labtest root> netstat -an | grep 69 udp        0      0 0.0.0.0:69              0.0.0.0:*
root@labtest root> ps -ef | grep in.tftp root      8829     1  0 15:24 ?        00:00:00 /Database/opt/x.x/packages/sbin/in.tftpd --listen --user apache --secure /Database/tftpboot --verbose

 

Se avete regole firewall nella CHAIN INPUT ricordate di abilitare il protocollo .

La directory che ospiterà i file di net boot  è /Database/tftpboot  e i file saranno dell’utente apache.

In fase di deploy ho aggiunto anche il parametro –verbose per avere un logging esteso attraverso  da visualizzare attraverso il  LogViewer:

Logviewer

Per poter aggiungere il parametro –verbose, ho modificato il contenuto del file tar all’interno della nuova directory /Database/opt/x.x/tars,  creata a seguito del update BF22.  In particolare il file etc/rc.d/init.d/tftp contenuto all’interno del file tar BF22-files.tar.gz.

root@labtest tars> pwd
/Database/opt/x.x/tars
root@labtest tars> ls
BF22-files.tar.gz
root@labtest tars> ll
total 4
-rw-r--r--    1 root     root          526 Aug  8 16:54 BF22-files.tar.gz
root@labtest tars> tar tvf BF22-files.tar.gz
drwxr-xr-x root/root         0 2013-06-30 21:12 etc/
drwxr-xr-x root/root         0 2013-06-30 21:12 etc/rc.d/
drwxr-xr-x root/root         0 2013-08-08 16:53 etc/rc.d/init.d/
-rwxr-xr-x root/root       592 2013-08-08 16:53 etc/rc.d/init.d/tftp
root@labtest tars> tar xvf BF22-files.tar.gz etc/rc.d/init.d/tftp
etc/rc.d/init.d/tftp
root@labtest tars> cat etc/rc.d/init.d/tftp
#!/bin/bash
source /etc/sysconfig/rc
source $rc_functions
. /etc/kerbynet.conf
case "$1" in
start)
if [ "`cat $REGISTER/system/tftp/Enabled 2>/dev/null`" = yes ] ; then
echo "Starting TFTP service ..."
ln -sf /Database/tftpboot /
loadproc /Database/opt/x.x/packages/sbin/in.tftpd --listen --user apache --secure /Database/tftpboot --verbose >/dev/null
fi
;;

stop)
echo "Stopping TFTP service ..."
killproc in.tftpd >/dev/null
;;

restart)
$0 stop
sleep 1
$0 start
;;

*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac

Per completezza ho aggiunto al file updater anche il riferimento per il MANPATH

root@labtest opt> vi   updater .....
.....
echo 'MANPATH /Database/opt/x.x/packages/share/man' >>/etc/man.conf

 

Ora tutto è attivo.  Possiamo aggiungere nella directory /Database/tftpboot  i file che verranno richesti dai client per eseguire il boot  da rete.
Il iPXE può essere utilizzato sia come firmware direttamente sulla scheda ethernet sia attraverso il ChainLoading  ( pxe_chainloading )

Il chainloading è sicuramente la via migliore, immaginate di flash”are” tutti i server di un datacenter ;-(

La procedura di chainloading ha la  necesstita di inserire dei parametri nella sezione  “Global Scope” del file definizione  del server DHCP ( esattamente dhcpd.conf). In termini semplici le opzioni NON devono essere associate alla definizione della subnet.

Questa possibilità ci è preclusa dalla GUI di Zeroshell a meno di non modificare  il codice come suggerito nella patch del punto 5) da  Z.C.

A seguito della patch aggiunta come preboot script, mi ha permesso di aggiungere in dhcpd.conf le definizioni mancanti.

preboot scriptsdove /Database/patch/dhcp/Add_Global_Parameters.sh contiene:

 

root@labtest root> cat /Database/patch/dhcp/Add_Global_Parameters.sh
# Patch DHCP config scripts to include a Global_Parameters section, and pass config testing
touch /Database/var/register/system/dhcp/Global_Parameters
sed -i 's/^EOF$/EOF\ncat \$REGISTER\/system\/dhcp\/Global_Parameters/g' /root/kerbynet.cgi/scripts/dhcp_configfile
sed -i 's/echo \"ignore client-updates;\" >>\$FILE/echo \"ignore client-updates;\" >>\$FILE\ncat \$REGISTER\/system\/dhcp\/Global_Parameters >>\$FILE/g' /root/kerbynet.cgi/scripts/dhcp_checkopt

Per completezza sono state aggiunte ( tramite Vim ) nel file /var/register/system/dhcp/Global_Parameters  tutti  i parametri suggerti da  iPXE.ORG :

 

option space ipxe;
  option ipxe-encap-opts code 175 = encapsulate ipxe;
  option ipxe.priority code 1 = signed integer 8;
  option ipxe.keep-san code 8 = unsigned integer 8;
  option ipxe.skip-san-boot code 9 = unsigned integer 8;
  option ipxe.syslogs code 85 = string;
  option ipxe.cert code 91 = string;
  option ipxe.privkey code 92 = string;
  option ipxe.crosscert code 93 = string;
  option ipxe.no-pxedhcp code 176 = unsigned integer 8;
  option ipxe.bus-id code 177 = string;
  option ipxe.bios-drive code 189 = unsigned integer 8;
  option ipxe.username code 190 = string;
  option ipxe.password code 191 = string;
  option ipxe.reverse-username code 192 = string;
  option ipxe.reverse-password code 193 = string;
  option ipxe.version code 235 = string;
  option iscsi-initiator-iqn code 203 = string;
  # Feature indicators
  option ipxe.pxeext code 16 = unsigned integer 8;
  option ipxe.iscsi code 17 = unsigned integer 8;
  option ipxe.aoe code 18 = unsigned integer 8;
  option ipxe.http code 19 = unsigned integer 8;
  option ipxe.https code 20 = unsigned integer 8;
  option ipxe.tftp code 21 = unsigned integer 8;
  option ipxe.ftp code 22 = unsigned integer 8;
  option ipxe.dns code 23 = unsigned integer 8;
  option ipxe.bzimage code 24 = unsigned integer 8;
  option ipxe.multiboot code 25 = unsigned integer 8;
  option ipxe.slam code 26 = unsigned integer 8;
  option ipxe.srp code 27 = unsigned integer 8;
  option ipxe.nbi code 32 = unsigned integer 8;
  option ipxe.pxe code 33 = unsigned integer 8;
  option ipxe.elf code 34 = unsigned integer 8;
  option ipxe.comboot code 35 = unsigned integer 8;
  option ipxe.efi code 36 = unsigned integer 8;
  option ipxe.fcoe code 37 = unsigned integer 8;

 

 

Ora non resta che aggiungere i file come suggerito da Alain O’Dea/Ben Rockwood  nella dir /Database/tftpdboot e aggiungere tramite “DHCP Advanced Options”  le opzioni necessarie ad indirizzare il boot di SmartOS

NewAdvancedCapture
che si differenzia da quella di Alain :

 pool {
    range 192.168.2.100 192.168.2.200;
    next-server 192.168.2.34;
    if exists user-class and option user-class = "iPXE" {
      filename = "smartos.ipxe";
    } else {
      filename = "undionly.kpxe";
    }
  }

 

per la mancanza della definizione pool e range,  questo perchè rientrano  nella sezione “Dynamic IP Configuration”

next-server ( la più importante ) che definisce il TFTP server, non è altro che Zeroshell;

– infine per la sezione if exists … , riporto le parole di Ben Rockwood: “The conditional here is to ensure that the client first boots iPXE. Once iPXE is running it will DHCP again and this time the user-class will be set as “iPXE”, in which case we instead set our filename to an IPXE script which will take over”

 

Chainloadin_sequence

 

A me funziona perfettamente 🙂  e non mi resta che augurarvi  “buon net booting”

 

ps .

Infine il file dhcpd.conf risulta:

root@labtest tmp> cat dhcpd.conf
authoritative;
 ddns-update-style interim;
 ignore client-updates;
 option space ipxe;
 option ipxe-encap-opts code 175 = encapsulate ipxe;
 option ipxe.priority code 1 = signed integer 8;
 option ipxe.keep-san code 8 = unsigned integer 8;
 option ipxe.skip-san-boot code 9 = unsigned integer 8;
 option ipxe.syslogs code 85 = string;
 option ipxe.cert code 91 = string;
 option ipxe.privkey code 92 = string;
 option ipxe.crosscert code 93 = string;
 option ipxe.no-pxedhcp code 176 = unsigned integer 8;
 option ipxe.bus-id code 177 = string;
 option ipxe.bios-drive code 189 = unsigned integer 8;
 option ipxe.username code 190 = string;
 option ipxe.password code 191 = string;
 option ipxe.reverse-username code 192 = string;
 option ipxe.reverse-password code 193 = string;
 option ipxe.version code 235 = string;
 option iscsi-initiator-iqn code 203 = string;
# Feature indicators
 option ipxe.pxeext code 16 = unsigned integer 8;
 option ipxe.iscsi code 17 = unsigned integer 8;
 option ipxe.aoe code 18 = unsigned integer 8;
 option ipxe.http code 19 = unsigned integer 8;
 option ipxe.https code 20 = unsigned integer 8;
 option ipxe.tftp code 21 = unsigned integer 8; 
 option ipxe.ftp code 22 = unsigned integer 8;
 option ipxe.dns code 23 = unsigned integer 8;
 option ipxe.bzimage code 24 = unsigned integer 8;
 option ipxe.multiboot code 25 = unsigned integer 8;
 option ipxe.slam code 26 = unsigned integer 8;
 option ipxe.srp code 27 = unsigned integer 8;
 option ipxe.nbi code 32 = unsigned integer 8;
 option ipxe.pxe code 33 = unsigned integer 8;
 option ipxe.elf code 34 = unsigned integer 8;
 option ipxe.comboot code 35 = unsigned integer 8;
 option ipxe.efi code 36 = unsigned integer 8;
 option ipxe.fcoe code 37 = unsigned integer 8;
#
 subnet 192.168.4.0 netmask 255.255.255.0 {
 option routers 192.168.4.75;
 option subnet-mask 255.255.255.0;
 option domain-name-servers 192.168.4.75, 8.8.8.8, 8.8.4.4;
 next-server 192.168.4.75;
   if exists user-class and option user-class = "iPXE" {
      filename = "smartos.ipxe";
      } else {
      filename = "undionly.kpxe";
   }

 default-lease-time 28800;
 max-lease-time 28800;
 range 192.168.4.20 192.168.4.30;
 host 3232236554_00237DFDB8F1 {
 hardware ethernet 00:23:7D:FD:B8:F1;
 fixed-address 192.168.4.10;
 }
 host 3232236566_00237DFDB936 {
 hardware ethernet 00:23:7D:FD:B9:36;
 fixed-address 192.168.4.22;
 }
}

 

p.p.s

Con questa configurazione ogni client carica al  boot una istanza di SmartOS su tutta la sottorete 192.168.x.x   ma se volessimo differenziare per host cosa far partire  ?

Rimuoviamo quello inserito nelle Advanced Options e inseriamo per intero la configurazione nelle Global Options Parameters

root@labtest dhcp> ls
Enabled  Global_Parameters  SelectedSubnet  dhcpd.conf  dhcpd.leases  dhcpd.leases~  subnets
root@labtest dhcp> cat Global_Parameters
option space ipxe;
option ipxe-encap-opts code 175 = encapsulate ipxe;
option ipxe.priority code 1 = signed integer 8;
option ipxe.keep-san code 8 = unsigned integer 8;
option ipxe.skip-san-boot code 9 = unsigned integer 8;
option ipxe.syslogs code 85 = string;
option ipxe.cert code 91 = string;
option ipxe.privkey code 92 = string;
option ipxe.crosscert code 93 = string;
option ipxe.no-pxedhcp code 176 = unsigned integer 8;
option ipxe.bus-id code 177 = string;
option ipxe.bios-drive code 189 = unsigned integer 8;
option ipxe.username code 190 = string;
option ipxe.password code 191 = string;
option ipxe.reverse-username code 192 = string;
option ipxe.reverse-password code 193 = string;
option ipxe.version code 235 = string;
option iscsi-initiator-iqn code 203 = string;
# Feature indicators
option ipxe.pxeext code 16 = unsigned integer 8;
option ipxe.iscsi code 17 = unsigned integer 8;
option ipxe.aoe code 18 = unsigned integer 8;
option ipxe.http code 19 = unsigned integer 8;
option ipxe.https code 20 = unsigned integer 8;
option ipxe.tftp code 21 = unsigned integer 8;
option ipxe.ftp code 22 = unsigned integer 8;
option ipxe.dns code 23 = unsigned integer 8;
option ipxe.bzimage code 24 = unsigned integer 8;
option ipxe.multiboot code 25 = unsigned integer 8;
option ipxe.slam code 26 = unsigned integer 8;
option ipxe.srp code 27 = unsigned integer 8;
option ipxe.nbi code 32 = unsigned integer 8;
option ipxe.pxe code 33 = unsigned integer 8;
option ipxe.elf code 34 = unsigned integer 8;
option ipxe.comboot code 35 = unsigned integer 8;
option ipxe.efi code 36 = unsigned integer 8;
option ipxe.fcoe code 37 = unsigned integer 8;

host SmartOS {
     hardware ethernet 00:e0:81:5d:c2:5e;
     fixed-address 192.168.4.40;
     next-server 192.168.4.75;
     if exists user-class and option user-class = "iPXE" {
     filename = "smartos.ipxe";
     } else {
     filename = "undionly.kpxe";
     }
}

Concludo:

Avendo la possibilità di aggiungere  come Global Scope  nella configurazione del DHCP questi parametri e magari via GUI di Zeroshell sarebbe un gran vantaggio e aggiungerebbe una grande versalità di configurazioni.

 

Last but not least , work also inside VirtualBox …

 

Also_inside_VBox2

Also_inside_VBox

 

At the end:

If you need just boot a single host and you know his MAC, you can add all in    Static IP Entries    like show below:

host 3232236645_080027D558D2 {
hardware ethernet 08:00:27:D5:58:D2;
fixed-address 192.168.4.101;
next-server 192.168.4.75;
if exists user-class and option user-class = "iPXE" {
filename = "smartos.ipxe"; }
else {
filename = "undionly.kpxe";
     }
}

but as always can be done with GUI:

 

iPXE_Static_Ip

 

 

Comments are closed.