PXE using etherboot: HOWTO

9/12/2001

This HOWTO addresses using PXE to boot an LTSP workstation. It was written by Marty Connor. I enjoyed reading it, so I've kept it pretty much unchanged. I use a RH 7.1 workstation, so the examples are relevant to that platform, but applying them to any distro is easy .


Introduction

Write a driver or play with the PXE stuff... Write a driver or play with the PXE stuff...

I was deciding what to do this weekend when in came a message about someone trying to use the Etherboot/PXE feature, so I decided I'd look at that.

What follows is a description of that process.

Note that all tftpd file paths omit the leading /tftpboot on account of the chroot flags in RedHat's 7.1 distribution. See /etc/xinet.d/tftp server flags

Executive Summary

I got it to work. Two PXE cards (a 3COM and an Intel) with PXE built in were able to boot by loading Etherboot and the letting Etherboot do the kernel load. Sweet.

If you want to hear the tale, read on. You're probably used to my messages by now ;-)

Background:

Etherboot and PXE are two pieces of software that allow one to boot a workstation over a network. Some other ways exist like Netboot and RPL. I mostly understand Etherboot because I like to work with Free Software.

I've got two pristine, fancy, expensive ethernet cards that I use for testing:

  - 3COM 3C905C-TXM
  - Intel EEPRO100+
  

These cards have flash memory on them, with code that will boot the workstation connected to them. They both have PXE as a boot method.

Now, a while back, we in the Etherboot project had developed the technology to reprogram the flash memory on the cards with Etherboot.

  For the 3COM card, see:  http://www.rom-o-matic.net/5.0.2/contrib/3c90xutil/

  and for the Intel EEPRO100 see:  http://www.rom-o-matic.net/5.0.2/contrib/eepro100notes/
  

There are also motherboards that have PXE flashed in them, like the ThinkNIC computer. Perhaps someday they will have Etherboot as well.

Reflashing cards and BIOSes is not possible sometimes, either for technical reasons, or because people want to be able to the original PXE code. It also requires some work inside the case of the computer, and we don't have tools to reflash all BIOSes.

So, to create a way to use PXE cards and BIOSes without reprogramming them, Peter Lister and Vasil Vasilev recently asked the question "Why can't PXE code load Etherboot and let Etherboot take over?". They then wrote the code to make it happen, and so now you can build a ".lzpxe" image and when your PXE ROM or BIOS loads the file, it will actually be starting Etherboot, and you can use your Etherboot environment.

Peter and Vasil rock.

The Goal:

I wanted to boot both cards (3C905C-TXM and EEPRO100) using PXE to load Etherboot, and have Etherboot load the kernel and start it. From there, it is up to LTSP or whatever software is handling the session. Once the kernel loads and starts, Etherboot has done its job.

"DHCP for people of reasonable intelligence...

who can't read the documentation" ;-) :

When PXE and Etherboot start running, they are both looking for the same thing: A DHCP server. They need some information, like their IP address, a name server, the server where they should load a boot file, and the path to that file, and various other things.

The thing is, that the DHCP server needs to be able to know if it is PXE asking for information, or if it is Etherboot asking.

If it is PXE calling, we should hand it a file name to a ".lzpxe" file, which is an Etherboot image wrapped in a form PXE can load. If however it is Etherboot calling, we want to hand it a ".nbi" or network bootable image, a linux kernel that has been wrapped using mknbi-linux, or a DOS image made with mknbi-dos. mknbi is available for download on the Etherboot download page at:

http://etherboot.sourceforge.net/distribution.html

Alright, so let's look at the parts we need:

   - DHCP Server
   - TFTP Server
   - PXE Ethernet cards
   - mknbi package
   - Tagged kernel (prepared with mknbi-linux)
   - .lzpxe image (from rom-o-matic.net or made with Etherboot v5.0.2 + Patches)
  

The DHCP Server needs to be able to differentiate between PXE Clients and Etherboot Clients. I want to keep things simple. I want to be able to say:


  host ws137 {
      hardware ethernet     00:02:B3:25:45:56;
      fixed-address         192.168.2.137;
      if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
          filename "/eepro100.lzpxe"; 
      } else if substring (option vendor-class-identifier, 0, 9) = "Etherboot" {
          filename "/lts/vmlinuz-test.nbi"; 
          option vendor-encapsulated-options 3c:09:45:74:68:65:72:62:6f:6f:74:ff;
      }
  }
  

It turns out that ISC DHCPD version 3 http://www.isc.org/products/DHCP/dhcp-v3.html can do this. Version 2, which is what I had on my Progeny Debian machine cannot (at least not this way. If someone knows how to do something like this in v2.x, please let us know).

So I had to upgrade my DHCPD to v3.0. I downloaded the package from: ftp://ftp.isc.org/isc/dhcp/dhcp-latest.tar.gz

I then enabled root privs and moved the file to /usr/src/local and did:

   mv dhcp-latest.tar.gz dhcp-3.0rc10.tar.gz
   tar -zxvf dhcp-3.0rc10.tar.gz
   

to unpack it. This gave me a directory called dhcp-3.0rc10 so I did:

   cd dhcp-3.0rc10
   more README
   ./configure
   make

   Editors Note:
   I saved /etc/rc.d/init.d/dhcpd then removed the existing rpms for dhcp

       for i in `rpm -q -a |grep dhcp`; do
       rpm -e $i
       done

   Then I restored the /etc/rc.d/init.d/dhcpd, edited it to check for the
   correct leases path
   /var/state/dhcp/dhcp.leases
   and as root ...

   make install
   

This gave me new version of /usr/sbin/dhcpd. I then did

   touch /var/state/dhcp/dhcpd.leases

   /etc/rc.d/init.d/dhcpd restart
   

to start up my new DHCP daemon. I checked

  /var/log/daemon.log
  

to make sure everything was alright with the DHCP startup:

Jul  8 15:05:42 ll dhcpd: Internet Software Consortium DHCP Server 
V3.0rc10
Jul  8 15:05:42 ll dhcpd: Copyright 1995-2001 Internet Software 
Consortium.
Jul  8 15:05:42 ll dhcpd: All rights reserved.
Jul  8 15:05:42 ll dhcpd: For info, please visit 
http://www.isc.org/products/DHCP
Jul  8 15:05:42 ll dhcpd: Wrote 0 deleted host decls to leases file.
Jul  8 15:05:42 ll dhcpd: Wrote 0 new dynamic host decls to leases file.
Jul  8 15:05:42 ll dhcpd: Wrote 0 leases to leases file.
Jul  8 15:05:42 ll dhcpd: Listening on 
LPF/eth0/00:50:ba:77:1d:9f/testingnet
Jul  8 15:05:42 ll dhcpd: Sending on   
LPF/eth0/00:50:ba:77:1d:9f/testingnet
Jul  8 15:05:42 ll dhcpd: Sending on   Socket/fallback/fallback-net
  

Now I needed a new /etc/dhcpd.conf file. I wanted to make the simplest file I could, and not use all the whizzy new features of v3.0. If I could have used v2.x I would have, but I couldn't figure out how to cleanly do the conditional (the "if" statement) that I wanted to use. So I made a very simple /etc/dhcpd.conf file. Heck, I don't even claim to know very much about DHCP. (why are you reading this? :-)

Here is what my /etc/dhcpd.conf file looks like:


# Configuration file for ISC dhcpd v3.0

not authoritative;
ddns-update-style             none;             # required for ISC v3.0

shared-network testingnet {
    subnet 192.168.2.0 netmask 255.255.255.0 {
    }
}

group   {

    default-lease-time            21600;
    max-lease-time                21600;
    use-host-decl-names           on;

    option domain-name            "thinguin.net";
    option subnet-mask            255.255.255.0;
    option broadcast-address      192.168.2.255;
    option routers                192.168.2.1;
    option domain-name-servers    192.168.2.56;
    option log-servers            192.168.2.56;
    option root-path              "/tftpboot/lts/ltsroot";

    host ws121 {
        hardware ethernet     00:80:C6:F8:AB:2A;
        fixed-address         192.168.2.121;
        filename              "/lts/vmlinuz.all";
    }
    host ws136 {
        hardware ethernet     00:01:02:c1:79:c7;
        fixed-address         192.168.2.136;
        if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
            filename "/eb-5.0.2-mc1-3c905c-tpo.lzpxe"; 
        } else if substring (option vendor-class-identifier, 0, 9) = "Etherboot" {
            filename "/lts/vmlinuz-test.nbi"; 
            option vendor-encapsulated-options 3c:09:45:74:68:65:72:62:6f:6f:74:ff;
        }
    }
    host ws137 {
        hardware ethernet     00:02:B3:25:45:56;
        fixed-address         192.168.2.137;
        if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
            filename "/eepro100.lzpxe"; 
        } else if substring (option vendor-class-identifier, 0, 9) = "Etherboot" {
            filename "/lts/vmlinuz-test.nbi"; 
            option vendor-encapsulated-options 3c:09:45:74:68:65:72:62:6f:6f:74:ff;
        }
    }

} # group
  

Let's walk through this, a piece at a time. This is all explained in the DHCP documentation, but I'll try to break it down even more for people who can't hack that.

  # Configuration file for ISC dhcpd v3.0
  not authoritative;
  

The "not authoritative;" line is there because I don't want my DHCP server to be giving out information to hosts on my network that it doesn't have information for. Some DHCP clients get confused when a DHCP server NAKs (say NO!). If you're setting up a server to serve Etherboot clients, and you don't want to interfere with another DHCP server, you need to say "not authoritative;" (even with version 2.x of ISC DHCPD). You'll be glad you did.

  ddns-update-style             none;             # required for ISC v3.0
  

This is required for ISC DHCPD v3.0. It has to do with dynamic DNS updates. If you really care, you can read the documentation. ddns lets you tell your DNS server what a host's address is or what host is at an address. Since my hosts have fixed addresses, I don't worry about this. You have to say something, however.

  shared-network testingnet {
      subnet 192.168.2.0 netmask 255.255.255.0 {
      }
  }
  

  

This defines the subnet that I'm interested in serving information about.

  group   {
  

The "group" tag just says that I'm going to be talking about some hosts who are related in some way.

    default-lease-time            21600;
    max-lease-time                21600;
  

These two lines set some parameters for DHCP leases.

    use-host-decl-names           on;
  

This says to send to the client the name defined by the "host" statement as the host's name. If I didn't include it, I'd have to explicitly put a statement naming each host in its "host" entry.

    option domain-name            "thinguin.net";
    option subnet-mask            255.255.255.0;
    option broadcast-address      192.168.2.255;
    option routers                192.168.2.1;
    option domain-name-servers    192.168.2.56;
    option log-servers            192.168.2.56;
    option root-path              "/tftpboot/lts/ltsroot";
  

These are pretty self-explanatory, or you can check the DHCPD doc. Now the good stuff:

    host ws135 {
        hardware ethernet     00:a0:cc:a0:e6:5b;
        fixed-address         192.168.2.135;
        filename              "/lts/vmlinuz.all";
    }
  

This is for a normal ethernet card. It's a Netgear FA312. It has no PXE, and Etherboot is the only thing that would be asking the DHCP server about it. Since everything else it needs to know has been defined above just under the "group" tag, we just add the three things it needs and away it goes.

    host ws136 {
        hardware ethernet     00:01:02:c1:79:c7;
        fixed-address         192.168.2.136;
        if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
            filename "/eb-5.0.2-mc1-3c905c-tpo.lzpxe"; 
        } else if substring (option vendor-class-identifier, 0, 9) = "Etherboot" {
            filename "/lts/vmlinuz-test.nbi"; 
            option vendor-encapsulated-options 3c:09:45:74:68:65:72:62:6f:6f:74:ff;
        }
    }
  

OK, this is what you've been waiting for. This is for the 3C905C-TXM card. It's like the card above, except that it starts up with PXE. So, what we do is to check to see who is calling from this hardware address (00:01:02:c1:79:c7). You see, when PXE starts up, it sends "PXEClient" in its DHCP message. So if we see that, we send back a file name of "/tftpboot/eb-5.0.2-mc1-3c905c-tpo.lzpxe", which is an Etherboot image that PXE can load. PXE loads it, and it promptly unloads PXE and gives control to Etherboot. (so much of life is bootstrapping, after all :-).

Now, Etherboot starts up, and the first thing it does is to send a DHCP request. In this case, the "else if" part of the conditional gets run, and we hand back (among other things):

       filename "/lts/vmlinuz-test.nbi"; 
       option vendor-encapsulated-options 3c:09:45:74:68:65:72:62:6f:6f:74:ff;
  

The "filename" part is obvious. That's a Linux kernel. The next part:

      option vendor-encapsulated-options 3c:09:45:74:68:65:72:62:6f:6f:74:ff;
  

is not so obvious.

Here's the problem. What if you have two DHCP servers on the network, and you want to make sure that your server is the one that your Etherboot clients choose. How do you guarantee that it will reject replies from the other DHCP server?

Well, you first set the option: REQUIRE_VCI_ETHERBOOT when you make your ".lzpxe" image (or Configure it at rom-o-matic.net). This tells Etherboot to ignore any reply that doesn't contain the VCI (vendor class identifier) "Etherboot". Then you add the line:

      option vendor-encapsulated-options 3c:09:45:74:68:65:72:62:6f:6f:74:ff;
  

  

to your "host" entry. This says "send the VCI 'Etherboot' back to the requesting client". So now you can be pretty sure your client will be talking to the right DHCP server.

Put it all together and you get:

    host ws136 {
        hardware ethernet     00:01:02:c1:79:c7;
        fixed-address         192.168.2.136;
        if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
            filename "/eb-5.0.2-mc1-3c905c-tpo.lzpxe"; 
        } else if substring (option vendor-class-identifier, 0, 9) = "Etherboot" {
            filename "/lts/vmlinuz-test.nbi"; 
            option vendor-encapsulated-options 3c:09:45:74:68:65:72:62:6f:6f:74:ff;
        }
    }
  

Smoke test:

I put in the 3COM card, set it to do PXE. Did "/etc/init.d/dhcp restart" to restart my DHCPD. and rebooted my workstation.

Here's what I get [fake screen shot, yes i typed it all in by hand]:

Managed PC Boot Agent (MBA) v4.00
(C) Copyright 1999 Lanworks Technologies Co. a subsidiary of 3Com 
Corporation
All rights reserved.

Pre-boot eXecution Environment (PXE) v2.00
(C) Copyright 1999 Intel Corporation.
(C) Copyright 1999 Lanworks Technologies Co. a subsidiary of 3Com 
Corporation
All rights reserved.

DHCP MAC ADDR: 00 01 02 C1 79 C7
DHCP....
CLIENT IP: 192.168.2.136  MASK: 255.255.255.0  DHCP IP: 192.168.2.56
GATEWAY IP: 192.168.2.1
PXE loader for etherboot(with ZLOADER)
PXENV+ unloaded
ROM segment 0x07C0 length 0x3000 reloc 0x9400
Etherboot 5.0.2 (GPL) Tagged ELF for [3C90X]
Boot from (N)etwork or from (L)ocal? N
Found 3Com905C-TXM at 0xDC00, ROM address 0xE300
Probing...[3C90X]

3C90X Driver 2.00 Copyright 1999 LightSys Technology Services, Inc.
Portions Copyright 1999 Steve Smith
Provided with ABSOLUTELY NO WARRANTY.
---------------------------------------------------------------------------
-------
MAC Address - 00:01:02:C1:79:C7
Connectors present: 10Base-T / 100Base-TX.
Searching for server (DHCP)...
Me: 192.168.2.136, Server: 192.168.2.56, Gateway 192.168.2.1
Loading 192.168.2.56:/tftpboot/lts/vmlinuz-test.nbi (NBI)... done

Linux Net Boot Image Loader Version 0.8.1 (netboot)
Copyright (C) 1996,1997 G. Kuhlmann and M. Gutschke
Copyright (C) 1995-1998 G. Kuhlmann

Not enough memory
<abort>
  

Hmmmmmm, now what could be going on here. We were doing so well. PXE had started, loaded Etherboot. Etherboot had taken over. Etherboot had loaded the kernel. And failed to execute.

Whoa. It looks like we've got a tagged-image that was tagged with an old version of mknbi-linux. It's a tagged-kernel I got from the LTSP site. Under normal circumstances Etherboot doesn't seem to care, but apparently after PXE has been in memory life is more complicated...

What would happen if I took a kernel and tagged it with mknbi-1.2? This:

Searching for server (DHCP)...
Me: 192.168.2.136, Server: 192.168.2.56, Gateway 192.168.2.1
Loading 192.168.2.56:/tftpboot/lts/vmlinuz-test.nbi (NBI)... done
mknbi-1.2-2/first32.c (GPL)
129792k total memory
Uncompressing Linux... Ok, booting the kernel
Linux version 2.2.19 (jgoerzen@fritz) (gcc version 2.95.2 20000220 
(Debian GNU/Linux)) #1 Thu Apr 5 15:18:02 EST 2001
BIOS-provided physical RAM map:
 BIOS-e820: 00090000 @ 00000000 (usable)
 BIOS-e820: 07dc0000 @ 00100000 (usable)
Detected 564845 kHz processor.
Console: colour VGA+ 80x25
Calibrating delay loop... 1127.21 BogoMIPS
Memory: 126600k/129792k available (1124 kernel code, 472k reserved, 1524k 
data, 72k init)
........
  

Sweet. The Intel EEPRO100+ card worked similarly, which means their PXE implementation of PXE seems compatible. I hope some other people will try this and let us know how it works for them. The DHCP server and the mknbi-1.2 requirement seem to be the only tricky parts. Maybe someone will come up with a clever way to do this in v2 of the DHCP server.

So there's one way to use PXE to load Etherboot. I hope this helps some people who want to try this. Maybe we should put this message in the contrib directory for people who need some help getting started with this, or maybe we can work it into the documentation for Etherboot.

Marty

Sample .config for 2.2.18 kernel and eepro100 network card

#
# Automatically generated by make menuconfig: don't edit
#

#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y

#
# Processor type and features
#
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
CONFIG_M586TSC=y
# CONFIG_M686 is not set
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y
CONFIG_X86_BSWAP=y
CONFIG_X86_POPAD_OK=y
CONFIG_X86_TSC=y
# CONFIG_MICROCODE is not set
# CONFIG_X86_MSR is not set
# CONFIG_X86_CPUID is not set
CONFIG_1GB=y
# CONFIG_2GB is not set
CONFIG_MATH_EMULATION=y
# CONFIG_MTRR is not set
# CONFIG_SMP is not set

#
# Loadable module support
#
CONFIG_MODULES=y
# CONFIG_MODVERSIONS is not set
# CONFIG_KMOD is not set

#
# General setup
#
CONFIG_NET=y
CONFIG_PCI=y
# CONFIG_PCI_GOBIOS is not set
# CONFIG_PCI_GODIRECT is not set
CONFIG_PCI_GOANY=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_QUIRKS=y
# CONFIG_PCI_OPTIMIZE is not set
CONFIG_PCI_OLD_PROC=y
# CONFIG_MCA is not set
# CONFIG_VISWS is not set
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
# CONFIG_BINFMT_AOUT is not set
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_MISC=y
# CONFIG_BINFMT_JAVA is not set
CONFIG_PARPORT=y
CONFIG_PARPORT_PC=y
# CONFIG_PARPORT_OTHER is not set
# CONFIG_APM is not set
# CONFIG_TOSHIBA is not set

#
# Plug and Play support
#
CONFIG_PNP=y
CONFIG_PNP_PARPORT=y

#
# Block devices
#
CONFIG_BLK_DEV_FD=m
CONFIG_BLK_DEV_IDE=m
# CONFIG_BLK_DEV_HD_IDE is not set
CONFIG_BLK_DEV_IDEDISK=m
CONFIG_BLK_DEV_IDECD=m
# CONFIG_BLK_DEV_IDETAPE is not set
# CONFIG_BLK_DEV_IDEFLOPPY is not set
# CONFIG_BLK_DEV_IDESCSI is not set
# CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_RZ1000 is not set
# CONFIG_BLK_DEV_IDEPCI is not set
# CONFIG_IDE_CHIPSETS is not set
CONFIG_BLK_DEV_LOOP=m
CONFIG_BLK_DEV_NBD=m
# CONFIG_BLK_DEV_MD is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
# CONFIG_BLK_DEV_XD is not set
# CONFIG_BLK_DEV_DAC960 is not set
CONFIG_PARIDE_PARPORT=y
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_HD is not set

#
# Networking options
#
# CONFIG_PACKET is not set
# CONFIG_NETLINK is not set
# CONFIG_FIREWALL is not set
# CONFIG_FILTER is not set
CONFIG_UNIX=y
CONFIG_INET=y
# CONFIG_IP_MULTICAST is not set
# CONFIG_IP_ADVANCED_ROUTER is not set
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
# CONFIG_IP_PNP_RARP is not set
# CONFIG_IP_ROUTER is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_ALIAS is not set
# CONFIG_SYN_COOKIES is not set
# CONFIG_INET_RARP is not set
# CONFIG_SKB_LARGE is not set
# CONFIG_IPV6 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_BRIDGE is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_LLC is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
# CONFIG_NET_HW_FLOWCONTROL is not set
# CONFIG_CPU_IS_SLOW is not set

#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set

#
# Telephony Support
#
# CONFIG_PHONE is not set
# CONFIG_PHONE_IXJ is not set

#
# SCSI support
#
# CONFIG_SCSI is not set

#
# I2O device support
#
# CONFIG_I2O is not set
# CONFIG_I2O_PCI is not set
# CONFIG_I2O_BLOCK is not set
# CONFIG_I2O_SCSI is not set

#
# Network device support
#
CONFIG_NETDEVICES=y

#
# ARCnet devices
#
# CONFIG_ARCNET is not set
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_NET_SB1000 is not set

#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set
# CONFIG_NET_VENDOR_RACAL is not set
# CONFIG_RTL8139 is not set
# CONFIG_RTL8139TOO is not set
# CONFIG_NET_ISA is not set
CONFIG_NET_EISA=y
# CONFIG_PCNET32 is not set
# CONFIG_AC3200 is not set
# CONFIG_APRICOT is not set
# CONFIG_CS89x0 is not set
# CONFIG_DM9102 is not set
# CONFIG_DE4X5 is not set
# CONFIG_DEC_ELCP is not set
# CONFIG_DEC_ELCP_OLD is not set
# CONFIG_DGRS is not set
CONFIG_EEXPRESS_PRO100=y
# CONFIG_LNE390 is not set
# CONFIG_NE3210 is not set
# CONFIG_NE2K_PCI is not set
# CONFIG_TLAN is not set
# CONFIG_VIA_RHINE is not set
# CONFIG_SIS900 is not set
# CONFIG_ES3210 is not set
# CONFIG_EPIC100 is not set
# CONFIG_ZNET is not set
# CONFIG_NET_POCKET is not set

#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_SK98LIN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
# CONFIG_NET_RADIO is not set

#
# Token ring devices
#
# CONFIG_TR is not set
# CONFIG_NET_FC is not set
# CONFIG_RCPCI is not set
# CONFIG_SHAPER is not set

#
# Wan interfaces
#
# CONFIG_HOSTESS_SV11 is not set
# CONFIG_COSA is not set
# CONFIG_SEALEVEL_4021 is not set
# CONFIG_SYNCLINK_SYNCPPP is not set
# CONFIG_LANMEDIA is not set
# CONFIG_COMX is not set
# CONFIG_HDLC is not set
# CONFIG_DLCI is not set
# CONFIG_XPEED is not set
# CONFIG_SBNI is not set

#
# Amateur Radio support
#
# CONFIG_HAMRADIO is not set

#
# IrDA (infrared) support
#
# CONFIG_IRDA is not set

#
# ISDN subsystem
#
# CONFIG_ISDN is not set

#
# Old CD-ROM drivers (not SCSI, not IDE)
#
# CONFIG_CD_NO_IDESCSI is not set

#
# Character devices
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_SERIAL=y
# CONFIG_SERIAL_CONSOLE is not set
# CONFIG_SERIAL_EXTENDED is not set
# CONFIG_SERIAL_NONSTANDARD is not set
# CONFIG_UNIX98_PTYS is not set
CONFIG_PRINTER=y
CONFIG_PRINTER_READBACK=y
CONFIG_MOUSE=y

#
# Mice
#
# CONFIG_ATIXL_BUSMOUSE is not set
# CONFIG_BUSMOUSE is not set
# CONFIG_MS_BUSMOUSE is not set
CONFIG_PSMOUSE=y
# CONFIG_82C710_MOUSE is not set
# CONFIG_PC110_PAD is not set

#
# Joysticks
#
# CONFIG_JOYSTICK is not set
# CONFIG_QIC02_TAPE is not set
# CONFIG_WATCHDOG is not set
# CONFIG_NVRAM is not set
# CONFIG_RTC is not set
CONFIG_INTEL_RNG=y
CONFIG_AGP=y
CONFIG_AGP_INTEL=y
CONFIG_AGP_I810=y
CONFIG_AGP_VIA=y
CONFIG_AGP_AMD=y
CONFIG_AGP_SIS=y
CONFIG_AGP_ALI=y
# CONFIG_DRM is not set

#
# Video For Linux
#
# CONFIG_VIDEO_DEV is not set
# CONFIG_DTLK is not set

#
# Ftape, the floppy tape device driver
#
# CONFIG_FTAPE is not set

#
# USB support
#
CONFIG_USB=m
# CONFIG_USB_DEBUG is not set
# CONFIG_USB_DEVICEFS is not set
# CONFIG_HOTPLUG is not set
# CONFIG_USB_BANDWIDTH is not set
CONFIG_USB_UHCI=m
CONFIG_USB_UHCI_ALT=m
CONFIG_USB_OHCI=m
CONFIG_USB_PRINTER=m
CONFIG_USB_SCANNER=m
# CONFIG_USB_AUDIO is not set
# CONFIG_USB_ACM is not set
CONFIG_USB_SERIAL=m
# CONFIG_USB_SERIAL_GENERIC is not set
CONFIG_USB_SERIAL_VISOR=m
CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
CONFIG_USB_SERIAL_WHITEHEAT=m
CONFIG_USB_SERIAL_FTDI_SIO=m
CONFIG_USB_SERIAL_KEYSPAN_PDA=m
CONFIG_USB_SERIAL_KEYSPAN=m
# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
CONFIG_USB_SERIAL_OMNINET=m
CONFIG_USB_SERIAL_BELKIN=m
# CONFIG_USB_SERIAL_DEBUG is not set
# CONFIG_USB_IBMCAM is not set
# CONFIG_USB_OV511 is not set
CONFIG_USB_DC2XX=m
CONFIG_USB_MDC800=m
# CONFIG_USB_STORAGE is not set
CONFIG_USB_DABUSB=m
CONFIG_USB_PLUSB=m
CONFIG_USB_PEGASUS=m
CONFIG_USB_RIO500=m
# CONFIG_USB_DSBR is not set
CONFIG_USB_BLUETOOTH=m
CONFIG_USB_KAWETH=m
CONFIG_USB_HID=m
CONFIG_USB_KBD=m
CONFIG_USB_MOUSE=m
CONFIG_USB_WACOM=m
CONFIG_USB_WMFORCE=m
CONFIG_INPUT_KEYBDEV=m
CONFIG_INPUT_MOUSEDEV=m
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
CONFIG_INPUT_JOYDEV=m
CONFIG_INPUT_EVDEV=m

#
# Filesystems
#
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
CONFIG_FAT_FS=m
CONFIG_MSDOS_FS=m
# CONFIG_UMSDOS_FS is not set
CONFIG_VFAT_FS=m
CONFIG_ISO9660_FS=m
# CONFIG_JOLIET is not set
# CONFIG_MINIX_FS is not set
# CONFIG_NTFS_FS is not set
# CONFIG_HPFS_FS is not set
CONFIG_PROC_FS=y
# CONFIG_QNX4FS_FS is not set
# CONFIG_ROMFS_FS is not set
CONFIG_EXT2_FS=y
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
# CONFIG_EFS_FS is not set

#
# Network File Systems
#
# CONFIG_CODA_FS is not set
CONFIG_NFS_FS=y
# CONFIG_NFS_V3 is not set
CONFIG_ROOT_NFS=y
# CONFIG_NFSD is not set
CONFIG_SUNRPC=y
CONFIG_LOCKD=y
# CONFIG_SMB_FS is not set
# CONFIG_NCP_FS is not set

#
# Partition Types
#
# CONFIG_BSD_DISKLABEL is not set
# CONFIG_MAC_PARTITION is not set
# CONFIG_SMD_DISKLABEL is not set
# CONFIG_SOLARIS_X86_PARTITION is not set
# CONFIG_UNIXWARE_DISKLABEL is not set
CONFIG_NLS=y

#
# Native Language Support
#
CONFIG_NLS_DEFAULT="cp437"
CONFIG_NLS_CODEPAGE_437=m
CONFIG_NLS_CODEPAGE_737=m
CONFIG_NLS_CODEPAGE_775=m
CONFIG_NLS_CODEPAGE_850=m
CONFIG_NLS_CODEPAGE_852=m
CONFIG_NLS_CODEPAGE_855=m
CONFIG_NLS_CODEPAGE_857=m
CONFIG_NLS_CODEPAGE_860=m
CONFIG_NLS_CODEPAGE_861=m
CONFIG_NLS_CODEPAGE_862=m
CONFIG_NLS_CODEPAGE_863=m
CONFIG_NLS_CODEPAGE_864=m
CONFIG_NLS_CODEPAGE_865=m
CONFIG_NLS_CODEPAGE_866=m
CONFIG_NLS_CODEPAGE_869=m
CONFIG_NLS_CODEPAGE_874=m
CONFIG_NLS_CODEPAGE_932=m
CONFIG_NLS_CODEPAGE_936=m
CONFIG_NLS_CODEPAGE_949=m
CONFIG_NLS_CODEPAGE_950=m
CONFIG_NLS_ISO8859_1=m
CONFIG_NLS_ISO8859_2=m
CONFIG_NLS_ISO8859_3=m
CONFIG_NLS_ISO8859_4=m
CONFIG_NLS_ISO8859_5=m
CONFIG_NLS_ISO8859_6=m
CONFIG_NLS_ISO8859_7=m
CONFIG_NLS_ISO8859_8=m
CONFIG_NLS_ISO8859_9=m
CONFIG_NLS_ISO8859_14=m
CONFIG_NLS_ISO8859_15=m
CONFIG_NLS_KOI8_R=m

#
# Console drivers
#
CONFIG_VGA_CONSOLE=y
# CONFIG_VIDEO_SELECT is not set
# CONFIG_MDA_CONSOLE is not set
# CONFIG_FB is not set

#
# Sound
#
CONFIG_SOUND=m
CONFIG_SOUND_CMPCI=m
CONFIG_SOUND_CMPCI_FM=y
CONFIG_SOUND_CMPCI_MIDI=y
CONFIG_SOUND_CS4281=m
CONFIG_SOUND_FUSION=m
CONFIG_SOUND_EMU10K1=m
CONFIG_SOUND_ES1370=m
CONFIG_SOUND_ES1371=m
CONFIG_SOUND_MAESTRO=m
CONFIG_SOUND_ESSSOLO1=m
CONFIG_SOUND_ICH=m
CONFIG_SOUND_SONICVIBES=m
CONFIG_SOUND_TRIDENT=m
CONFIG_SOUND_MSNDCLAS=m
# CONFIG_MSNDCLAS_HAVE_BOOT is not set
CONFIG_MSNDCLAS_INIT_FILE="/etc/sound/msndinit.bin"
CONFIG_MSNDCLAS_PERM_FILE="/etc/sound/msndperm.bin"
CONFIG_SOUND_MSNDPIN=m
# CONFIG_MSNDPIN_HAVE_BOOT is not set
CONFIG_MSNDPIN_INIT_FILE="/etc/sound/pndspini.bin"
CONFIG_MSNDPIN_PERM_FILE="/etc/sound/pndsperm.bin"
CONFIG_SOUND_VIA82CXXX=m
CONFIG_SOUND_OSS=m
CONFIG_SOUND_PAS=m
CONFIG_SOUND_SB=m
CONFIG_SOUND_GUS=m
# CONFIG_GUS16 is not set
# CONFIG_GUSMAX is not set
CONFIG_SOUND_MPU401=m
CONFIG_SOUND_PSS=m
# CONFIG_PSS_MIXER is not set
CONFIG_SOUND_MSS=m
CONFIG_SOUND_SSCAPE=m
CONFIG_SOUND_TRIX=m
CONFIG_SOUND_MAD16=m
# CONFIG_MAD16_OLDCARD is not set
CONFIG_SOUND_WAVEFRONT=m
CONFIG_SOUND_CS4232=m
CONFIG_SOUND_OPL3SA2=m
CONFIG_SOUND_MAUI=m
CONFIG_SOUND_SGALAXY=m
CONFIG_SOUND_AD1816=m
CONFIG_SOUND_OPL3SA1=m
CONFIG_SOUND_SOFTOSS=m
CONFIG_SOUND_YM3812=m
CONFIG_SOUND_VMIDI=m
CONFIG_SOUND_UART6850=m
CONFIG_SOUND_NM256=m
CONFIG_SOUND_YMPCI=m

#
# Additional low level sound drivers
#
CONFIG_LOWLEVEL_SOUND=y
CONFIG_ACI_MIXER=m
# CONFIG_VIDEO_MSP3400 is not set
CONFIG_AWE32_SYNTH=m
CONFIG_AEDSP16=m
CONFIG_AEDSP16_BASE=220
CONFIG_MPU_BASE=330
# CONFIG_SC6600 is not set
# CONFIG_AEDSP16_SBPRO is not set
# CONFIG_AEDSP16_MSS is not set
# CONFIG_AEDSP16_MPU401 is not set

#
# Kernel hacking
#
CONFIG_MAGIC_SYSRQ=y
  

Tag the kernel with mknbi

#==============================================================================
# Build a tagged image for ether boot
#==============================================================================
if [ $# -ne 1 ] ; then
    echo usage: mknbi name
    to build a vmlinuz.name
    exit
    fi
mknbi-linux --rootdir=/tftpboot/lts/ltsroot --ipaddrs=rom \
    /usr/src/linux/arch/i386/boot/bzImage > /tftpboot/lts/vmlinuz.$1