[syslinux] Chainloading pxe boot loaders and dhcp root-path option

Andrzej Tobola ato at iem.pw.edu.pl
Mon May 16 10:14:17 PDT 2011


On Sun, May 15, 2011 at 12:14:29AM -0400, Matt Fioravante wrote:
> Is there anyway to set dynamically set dhcp options when chain loading
> another pxe boot loader?
> 
> I'm setting up a pxelinux network install server and one operating system I
> want to support is freebsd.
> 
> Freebsd has its own pxe loader called pxeboot that you can use. You just
> have to boot it from tftp and set the root-path dhcp option (option 17) to
> the location of your nfs server with the kernel and network filesystem.
> 
> I want to support multiple versions of freebsd (i386 and amd64) along with
> Linux distros and others. The are hackish ways to accomplish this using
> memdisk, but thats not a great idea if you want to have a 280MB live cd
> image. The most elegant way I can see to do this is to chain load freebsd's
> pxeboot loader from pxelinux. The problem is when you do this, the dhcp
> root-path option is not set and defaults to /.
> 
> I need to be able to dynamically change this dhcp option before chain
> loading into the next pxe boot loader. Essentiallly, I'd like to be able to
> do something like this:
> 
> LABEL fbsd32
> pxe pxeboot.0 dhcp-root-path=/nfsserv/freebsd/i386/root
> 
> LABEL fbsd64
> pxe pxeboot.0 dhcp-root-path=/nfsserv/freebsd/amd64/root
> 
> Is this at all possible with pxelinux?
> 
> Thanks!

If you just want do auto-select 32/64 bit /ROOT version you can do it in dhcpd.conf

# FreeBSD       sys/nfs/bootp_subr.c bootpc_init()
option space FreeBSD;
option FreeBSD.root-opts        code 130 = string;  # root mount options "rsize=8192,wsize=8192,intr,soft,noconn,tcp"
option FreeBSD.cookie           code 134 = string;  # sysctl kern.bootp_cookie
# root-path and swap-path are expanded using:  %H -> hostname   %I -> IP address
# Kernel request:
# Vendor-Class Option 60
# "FreeBSD:amd64:8.0-CURRENT"
# "FreeBSD:i386:5.2-CURRENT"
#  012345678901234567890
# ostype:MACHINE:osrelease

class "FreeBSD" {
    match if substring (option vendor-class-identifier,0,7) = "FreeBSD";

    log(info,concat("FreeBSD kernel: ",option vendor-class-identifier));        # fatal/error/info/debug
    site-option-space "FreeBSD";
    option FreeBSD.root-opts "nolockd";         # RO root. Równoważne boot.nfsroot.options="nolockd" ?

    if substring (option vendor-class-identifier,8,4) = "i386" { # 32bit
        option root-path "194.29.146.3:/R";     # volt:/nfs/freebsd/i386/8.x
    } elsif substring (option vendor-class-identifier,8,5) = "amd64" { # 64bit
        option root-path "194.29.146.3:/";      # volt  - OK
    } else {
        log (info, "unknown arch?");
        option root-path "194.29.146.3:/JAKA-ARCH?";
    }
}

and select proper  kernel (32/64) in loader.conf

(I am booting FreeBSD 32/64 without pxelinux)

-a




More information about the Syslinux mailing list