More, more and more.
In fact we want a simple setup, maintainable, clever, and that can do all what we want (and if possible all what we will want). :p
For the lazy, the static config is enough, but for the other the http will be handy.
There a some magic words, like include( i use it very much).
First, the defaults parameters.
default.include
# Default boot option to useDEFAULT menu.c32# Prompt user for selectionPROMPT 0# Menu ConfigurationMENU WIDTH 80MENU MARGIN 10MENU PASSWORDMARGIN 3MENU ROWS 12MENU TABMSGROW 18MENU CMDLINEROW 18MENU ENDROW 24MENU PASSWORDROW 11MENU TIMEOUTROW 20# Return to Main MenuLABEL Main MENU DEFAULT MENU LABEL ^Main Menu KERNEL menu.c32 APPEND defaultAnd after, the defaults menus.
default
MENU TITLE Main Menu## Menus## gPXELABEL Linux MENU LABEL ^1 - Linux KERNEL menu.c32 APPEND http://bootserver.my.zone.tld/pxelinux.cfg/linux.conf#LABEL Windows MENU LABEL ^2 - Windows KERNEL menu.c32 APPEND http://bootserver.my.zone.tld/pxelinux.cfg/windows.conf#LABEL Net Booting MENU LABEL ^3 - Net Booting KERNEL menu.c32 APPEND http://bootserver.my.zone.tld/pxelinux.cfg/netboot.conf#LABEL Support MENU LABEL ^0 - Support MENU PASSWD passwd KERNEL menu.c32 APPEND http://bootserver.my.zone.tld/pxelinux.cfg/support.conf#And in every section Linux, Windows, net booting and Support we include the terminal setup. i give the support config, because this is a stand syslinux config setup, and i will explain the other in another part (see below).
support.conf
INCLUDE default.includeMENU TITLE Boot gPXE {again}##LABEL Hardware Dectection Tool MENU LABEL ^Hardware Dectection Tool KERNEL http://bootserver.my.zone.tld/pxelinux.cfg/bin/hdt.c32 APPEND modules=bin/modules.pcimap pciids=bin/pci.ids#LABEL Memtest MENU LABEL Memory tester KERNEL http://bootserver.my.zone.tld/pxelinux.cfg/bin/memtest#LABEL Freedos MENU LABEL Freedos KERNEL http://bootserver.my.zone.tld/pxelinux.cfg/bin/memdisk APPEND harddisk=1 initrd=kernels/freedos.img.gz#LABEL Gpxe MENU LABEL gPXE KERNEL http://bootserver.my.zone.tld/pxelinux.cfg/bin/gpxelinux.0#So in this part, i will describe how to create a setup for booting from the gPXE boot, the gPXE script load a boot file from the web server. This web page is dynamic and forge the syslinux boot file. this boot file can depend on the network addrress, the mac address, or a database.
split config
This is an exemple og a split config.
2 networks( 10.0.0.0/24 and 10.0.1.0/24), and we want a classic config on the first network and serial config on the other
boot.php
<?php header ( "Content-type: text/plain" ); $Net0 = "10.0.0" ; $Net1 = "10.0.1" ; // which Subnet list($A,$B,$C,$D) = explode(".",$_SERVER["REMOTE_ADDR"]); $subnet = $A .".". $B .".". $C; if ( $subnet == $Net1 ) { include("default.serialinclude"); } else { include("default.include"); } include("default");?>And the default.include is the one above, and default.serialinclude is below.
default.serialinclude
SERIAL 0 19200CONSOLE 1INCLUDE default.includeSo it s exactly the same config but if the internet device is on the 10.0.1.0/24 network, we boot on the serial console, very usefull if we haven t any display on this computer.
What we want
Now i want to talk about dynamic syslinux bootfile generator. Actualy i use php, but you can also use perl, ruby, python or more. It s juste a web service for serving a syslinux bootfile.
We can generate a syslinux with menu, or an autoboot syslinux with only 1 boot choice.
What we have
gPXE can send some information when we use it for booting.
with the mac address or the uuid we have a uniq id of the system, and we can use it for setting the boot file. i choose the mac address because we already have it for the dhcp server parameters, but it s not too difficulte top create a database with uuid as a primary key.
We can store the data in sql database like ldap, postgres, mysql or just a txt file. How we store the config is not very important.
I will show how we can use it with very few informations, we now hostaname (given by dhcp server), mac address (send by gPXE) and uuid (not very usefull here). you must have in mind the files of the previous configuration(default.include, default, support.conf, linux.conf, windows.conf, netboot.conf).
This an exemple of a tree with bootfiles.
boot file tree
.|-- bin| |-- gpxelinux.0| |-- hdt.c32| |-- memdisk| `-- memtest|-- boot.php|-- knownhosts| |-- 00:02:e3:14:48:ef| |-- 00:1c:23:2d:91:88| |-- 52:54:00:34:d8:0c| `-- 52:54:00:54:73:e4`-- pxelinux.cfg |-- default |-- default.include |-- linux.conf |-- netboot.conf |-- support.conf `-- windows.confThe dhcp server server boot.php as boot filename (remember the dhcp.conf config file)
filename "http://bootserver.my.zone.tld/pxelinux.cfg/boot.php";The boot.php file is a not like the other files, it s a chain loading boot file sequence.
boot.php
<?phpheader ( "Content-type: text/plain" );echo "#!gpxe\n";echo "imgfree\n";echo "chain "."http://".$_SERVER["SERVER_NAME"].dirname( $_SERVER["REQUEST_URI"] )."/gpxe.php?mac=\${net0/mac}\n";?>And now with the gpxe.php we can choose the right config file.
We store specific config file with the mac address as filename, so if we have one of this mac address, we boot with this file. It s very simple and clever.
gpxe.php
<?phpheader ( "Content-type: text/plain" );$macaddress = $_REQUEST["mac"];if ( is_file("knownhosts/".$macaddress)) { include("knownhosts/".$macaddress);} else { include("pxelinux.cfg/default.include"); include("pxelinux.cfg/default");}?>In the macaddress filen we have the complete syslinux boot config file, we send a "static" boot config.
As we can see above, we can use symlinks in the knowhost sub tree.
Advanced boot tree
.|-- bin| |-- gpxelinux.0| |-- hdt.c32| |-- memdisk| `-- memtest|-- boot.php|-- knownhost| |-- 00:02:e3:14:48:ef| |-- 00:12:b3:41:18:ef -> Boot_From_Disk| |-- 00:1c:23:2d:91:88 -> Install_Windows_Server_2008R2_From_Scratch| |-- 52:54:00:34:d8:0c -> Install_Linux_From_Scratch| |-- 52:54:00:54:73:e4 -> Install_Windows7_From_Scratch| |-- Boot_From_Disk| |-- Install_Linux_From_Scratch| |-- Install_Windows7_From_Scratch| `-- Install_Windows_Server_2008R2_From_Scratch`-- pxelinux.cfg |-- default |-- default.include |-- linux.conf |-- netboot.conf |-- support.conf `-- windows.confThe symlinks can share config for many mac addresses, and for cloning a boot config, we create a new symlinks. After booting the computer and setting up, we can send a request to the server for removing this symlink and targeting to boot from hard drive(it s a security if we boot from pxe).
I have 2 words:
We must use a versioning system. If we use database or ldap, we must have backup.