====== Booting Voyage from Network using PXE ====== PXE (Preboot eXecution Environment) is a protocol (defined by Intel) that enable devices to download an operating system from a network, thus booting without a local disk. Setting up and using PXE is simple and easy, once you know how. \\ (Getting the "know how" on the other hand, is like trying to persuade your girlfriend to come with you to the local SciFi convention: you know you'll succeed at the end, but until you do - it's gonna be hard and long and painfull ;-) ). ====== What is it good for? ====== Once you have a configured PXE server, you can simply connect a PXE-enabled device (like every [[http://www.soekris.com/|Soekris]] or [[http://www.pcengines.ch|PCEngines]] boards) to your network, \\ turn it on, and voila! a working Voyage device, without messy a installation (not that Voyage installation is messy, of course). This is also useful for embedded systems like the Soekris 4826, which have an on-board flash chip, and not a removable CF card, so they MUST be booted from the network (atleast once, and then they can be 'flashed'). ====== What's in this guide ? ====== In here you'll find: * A step-by-step description of a PXE boot process, from machine startup to a "login" prompt. * A list of software and hardware requirements to make such a PXE setup from a voyage distribution. * A step-by-step guide of making the necessary files and configuring the necessary daemons. * Kernel re-compilation instructions. * Some troubleshooting tips. ====== A Reference PXE boot process ====== This is what SHOULD happen when you boot a PXE device from the network (assuming everything is configured correctly). \\ Please understand that there could be many variations (YMMV, as the jargon goes). Notes about the network captures and other log shown here: * [[http://www.ethereal.com/|ethereal]] is used to capture the traffic between the PXE device and the PXE server. * For privacy reasons, I've changed the MAC addresses \\ (so every time you see AA:BB:CC:DD:EE:FF, assume it is the MAC of the PXE device) * Many embedded devices (like the soekris and PCEngine boards) don't have VGA output, instead they use a serial port as the main console. * ''/dev/ttyS0'' (or simply ''ttyS0'') is the first serial port on linux (called ''COM1'' on some //other// operating systems). \\ If you use a USB-to-Serial convertor (like a Prolific 2303), the device will be called "/dev/ttyUSB0". * To see the BIOS messages from the device and the linux boot messages, I've connected a [[http://www.nullmodem.com/NullModem.htm|NULL cable]] from the RS232 port on the device to the serial port on my computer, and used the "minicom" terminal program to open ''ttyS0''. * The PXE Server's IP address is 10.0.0.1. \\ ("PXE Server" is simply a PC configured to run some daemons, and have some special data files.) * The PXE Device's IP address is 10.0.0.30 (assigned using DHCP). * Only relevant information is shown here. \\ Many ARPs,PINGs,TFTP Data packets,TFTP ACKs aren't listed.\\ Likewise many kernel messages are skipped. ---- **Here we go:**((My appologies for the horrific Wiki Formatting, I couldn't get DokuWiki's numbered lists to behave...)) **1.** The PXE-enabled device is connected to the network, and is turned on. **1.a** If you have a used Soekris net4526 (probably not the only one) you might want to hit Ctrl-P and then "> boot f0" to boot from network! **2.** The device will boot using the BIOS code, scan its devices, and detect a PXE capable network device. **3.** When the BIOS's PXE code is executed, it first sends a "DHCP request" to the network.\\ on 'minicom', you'll see: NSC DP83815/DP83816 Fast Ethernet UNDI, v1.03 Copyright (C) 2002, 2003 National Semiconductor Corporation All rights reserved. Pre-boot eXecution Environment PXE-2.0 (build 082) Copyright (C) 1997-2000 Intel Corporation CLIENT MAC ADDR: AA BB CC DD EE FF. DHCP.................. on 'ethereal' you'll see: 1 0.000000 0.0.0.0 -> 255.255.255.255 DHCP DHCP Discover - Transaction ID 0xCCDDEEFF **4.** The PXE server (Usually a PC on your network) contains a DHCP server, and will respond with a DHCP Offer. \\ on 'minicom', you'll see: CLIENT IP: 10.0.0.30 MASK: 255.0.0.0 DHCP IP: 10.0.0.1 on 'tethereal', you'll see: 3 0.655410 10.0.0.1 -> 255.255.255.255 DHCP DHCP Offer - Transaction ID 0xCCDDEEFF **5.** The DHCP offer contains two additional data fields (called "options" in DHCP-speak): * ''Filename'' - the initial boot file to execute (in this example: ''pxelinux.0'', from the [[http://syslinux.zytor.com/|syslinux]] pacakge). * ''Server'' - the TFTP (Trivial FTP) server from which to download the boot file (in this example: ''10.0.0.1''); **6.** The PXE device will now connect to the ''Server'', and will download ''Filename'' \\ on 'thethereal', you'll see: 11 2.379748 10.0.0.30 -> 10.0.0.1 TFTP Read Request, File: pxelinux.0, Transfer type: octet 12 2.381603 10.0.0.1 -> 10.0.0.30 TFTP Option Acknowledgement followed by some back-and-forth TFTP Data packets. **7.** Once the boot file is downloaded, it is executed. \\ on 'minicom', you'll see: PXELINUX 3.11 2005-09-02 Copyright (C) 1994-2005 H. Peter Anvin UNDI datasegment at: 0009B730 UNDI data segment size: 2F10 UNDI code segment at: 0009E640 UNDI code segment size: 1396 PXE entry point found (we hope) at 9E64:00F6 My IP address seems to be 0A00001E 10.0.0.30 ip=10.0.0.30:10.0.0.1:0.0.0.0:255.0.0.0 TFTP prefix: Trying to load: pxelinux.cfg/01-AA-BB-CC-DD-EE-FF **8.** PXELINUX will try to download a suitible configuration file (file name is based on the MAC address). \\ on 'tethereal', you'll see: 40 13.597953 10.0.0.30 -> 10.0.0.1 TFTP Read Request, File: pxelinux.cfg/01-AA-BB-CC-DD-EE-FF, Transfer type: octet **9.** The configuration file ''01-AA-BB-CC-DD-EE-FF'' contains the kernel image and the initrd image to download, and pxelinux will download them.\\ In addition, the configuration file contains the boot command line parameters, passed to the linux kernel.\\ on 'minicom', you'll see: Hello World XELINUX 3.11 2005-09-02 Copyright (C) 1994-2005 H. Peter Anvin Loading linux...................... Loading rootfs.gz.................................................................................... Ready. (The "Hello World" part will be explained later). on 'tethreal', you'll see: 47 14.048531 10.0.0.30 -> 10.0.0.1 TFTP Read Request, File: linux, Transfer type: octet 1712 14.543593 10.0.0.30 -> 10.0.0.1 TFTP Read Request, File: rootfs.gz, Transfer type: octet **10.** When the linux kernel image is downloaded, PXELINUX will execute it. \\ on 'minicom', you'll see: Linux version 2.6.15 (root@localhost) (gcc version 3.3.5 (Debian 1:3.3.5-13)) <...LINES SKIPPED...> Kernel command line: initrd=rootfs.gz console=ttyS0,9600n8 root=/dev/ram0 ramdisk_size=25000 BOOT_IMAGE=linux auto <...LINES SKIPPED...> **11.** If everything is OK, the kernel will try to mount the root filesystem. \\ on 'minicom', you'll see: checking if image is initramfs...it isn't (bad gzip magic numbers); looks like an initrd <...LINES SKIPPED...> RAMDISK: cramfs filesystem found at block 0 RAMDISK: Loading 22240KiB [1 disk] into ram disk..............done. <...LINES SKIPPED...> VFS: Mounted root (cramfs filesystem) readonly. Freeing unused kernel memory: 140k freed **12.** If the root filesystem was mounted successfuly, "init" will start with runlevel 'S'. \\ on 'minicom', you'll see: INIT: version 2.86 booting Activating swap. <...LINES SKIPPED...> Loading modules... natsemi dp8381x driver, version 1.07+LK1.0.17, Sep 27, 2002 <...LINES SKIPPED...> scx200: NatSemi SCx200 Driver SC1200: IDE controller at PCI slot 0000:00:12.2 <...LINES SKIPPED...> **13.** Followed by runlevel 2: INIT: Entering runlevel: 2 Starting kernel log daemon: klogd. Starting DNS forwarder and DHCP server: dnsmasq. Starting advanced IEEE 802.11 management: disabled via /etc/default/hostapd Starting OpenBSD Secure Shell server: sshd. wpasupplicant: disabled, see /etc/default/wpasupplicant <...LINES SKIPPED...> **14.** And finally, the "Login" Prompt will appear: Debian GNU/Linux 3.1 voyage ttyS0 voyage login: **15.** Done! ====== Hardware Requirements for PXE booting (and debugging) ====== - PXE-capable device. \\ Soekris, PCengines boards, but also many modern PCs come with PXE capabale BIOSes. - Ethernet network, either hub/switch or a Crossed Cable to connect the PXE device to the PXE Server. - NULL modem cable. \\ DO NOT try to debug a PXE setup without one. \\ (unless you use a PC as the PXE device, in which case you have a monitor and a keyboard). - Set the device default baud rate to 9600 (in your device's BIOS). \\ This will help you debug (because both the kernel and the login program will use 9600). \\ If you don't, you may have to switch baud rates in the ''minicom'' program while working, and this is quite annoying. ====== Software Requirements for a PXE Server ====== ===== Software for running a PXE server ===== - a DHCP server, capable of the ''filename'' + ''server'' options (Debian's **dhcp3-server** is good). - a TFTP server, capable of the ''tsize'' TFTP option (required by PXELINUX. Debian's **atftpd** is good). - The file "pxelinux.0" from the [[http://syslinux.zytor.com/|syslinux]] package. \\ The file is pre-compiled, you just need to download the tarball and extract it. ===== Software for creating the PXE data files ===== - A Recent kernel source, and the ability to compile it.\\ The current voyage kernel is not suitible for PXE booting. (I hope this will be fixed soon). - The mkcramfs utility (from Debian's **cramfsprogs** package). - voyage file system ([[http://voyage.hk/download/voyage/voyage-0.2pre3.tar.gz|voyage-2pre3.tar.gz]]). ===== Software Configurations Overview ===== At the end of this guide, you should have the following on your PXE server: - A running DHCP server - A running TFTPD server - A ''/tftpboot'' directory, containing: * ''pxelinux.0'' - the PXE boot file. * ''linux'' - the linux kernel ("''bzImage''" file). * ''rootfs.gz'' - the compressed root filesystem. * ''pxelinux.cfg'' - the configuration files directory. * ''pxelinux.cfg/01-AA-BB-CC-DD-EE-FF'' - the PXE configuration file, specific to the mac address AA:BB:CC:DD:EE:FF. ====== Configurations ====== ===== DHCP server ===== Note: this configuration assumes your network addresses are 10.0.0.X. \\ If you use different network addresses, adjust the DHCP configuration accordingly. - Install a dhcp server. (''apt-get install dhcp3-server'' on debian). - Edit the configuration file (''/etc/dhcp3/dhcpd.conf''), add the following lines: subnet 10.0.0.0 netmask 255.0.0.0 { range 10.0.0.10 10.0.0.30; option broadcast-address 10.255.255.255; default-lease-time 600; max-lease-time 7200; } host ap { hardware ethernet AA:BB:CC:DD:EE:FF; filename "pxelinux.0"; server-name "10.0.0.1"; } The first section (''subnet'') configures the DHCP sub-network. \\ The second section (''host'') configures a specific DHCP response to a host named "ap". \\ (The name isn't important. just make sure the MAC address is correct). \\ The second section tells the DHCP server to add the two data fields ('filename','server-name') when a DHCP offer is given to the specific device. \\ Read the DHCP3 manual for more options. ===== TFTP Server ===== TFTP (Trivial FTP) is file server daemon using UDP. - install a tftp server (''apt-get install atftpd''). - While installing (on debian), you will be asked if you want to server to run stand alone (as daemon) or as part of the "inetd" daemon. \\ It doesn't really matter, as long as you can make sure the server is running... - Unless otherwise configured, the server will read files from the directory ''/tftpboot'' \\ (yes, it is in the root directory). \\ You must create this directory, and make it world-readable (meaning everybody should have a read-access to the directory and all the files in it.). \\ Do this using ''chmod -R a+r /tftpboot'' **after putting the data files in it**. ===== PXELINUX ===== Note: if running Debian Lenny or Syslinux >= 3.31 read menu.txt.gz in /usr/share/doc/syslinux. In addition to pxelinux.0, you must also copy "menu.c32" from /usr/lib/syslinux into "/var/lib/tftpboot" and add "DEFAULT menu.c32" to top of menu. - Download the [[http://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-3.11.tar.gz|syslinux]] package, and open it. - Take the file "pxelinux.0" and put it in "/tftpboot". - In "/tftpboot", create a sub-directory called "pxelinux.cfg". - Inside, create a file called ''01-AA-BB-CC-DD-EE-FF'' (use the real MAC address of the PXE device), with the following lines: say Hello World serial 0 9600 console 0 label linux KERNEL linux APPEND initrd=rootfs.gz console=ttyS0,9600n8 root=/dev/ram0 ramdisk_size=25000 - This configuration file will be specific to the PXE device with that MAC address. \\ If you want to use a single file for a class of devices, use a part of the MAC as the file name. \\ If you want to use a single file for all devices, use the file name "default". \\ See the files "pxelinux.doc", "syslinux.doc", "isolinux.doc" in the "syslinux" package for more details. - Explanations for the config file: * ''say Hello World'' - this tells PXELINUX to display a short message. \\ VERY useful for debugging. If you see the ''Hello World'' on the 'minicom' screen, you know that ''pxelinux.0'' was executed, that it downloaded the config file and parsed it. * ''serial 0 9600'' - set the first serial port (ttyS0) to baud rate 9600. * ''console 0'' - turn of video console output (see "pxelinux.doc" for details).\\ without this option I didn't see anything on 'minicom' once the kernel booted, but YMMV. * ''label linux'' - The label of the kernel we want (this is similar to LILO). * ''KERNEL linux'' - The file name of the kernel image.\\ PXELINUX will try to download this file and execute it. * ''APPEND'' - Options passed to the linux kernel: * ''initrd=rootfs.gz'' - The initrd image containing the root filesystem. \\ Note: PXELINUX will ALSO parse this option, and will download the file BEFORE booting the kernel. * ''console=ttyS0,9600n8'' - Tells the kernel to use the serial port as the default console. * ''root=/dev/ram0'' - Tells the kernel that the rootfs is on a ramdisk (as opposed to on an IDE disk) * ''ramdisk_size=25000'' - Tells the kernel to pre-allocate a big ramdisk (Voyage rootfs is BIG!) ===== Kernel Configurations ===== (Wiki users: please don't remove this section, even if the voyage kernel image is fixed. This will help other people who might not use that kernel. Thanks). The current Voyage kernel ([[http://www.voyage.hk/dists/unstable/kernel/kernel-source-2.6.15-voyage_2.0-8_all.deb|2.6.15-voyage_2.0-8]] is not suitible for PXE booting. \\ For PXE booting, a kernel needs to following options compiled in (**not** as modules): * ''Device Drivers'' => ''Block Devices'' => ''RAM Disk Support'' (**''CONFIG_BLK_DEV_RAM=y''**) * ''Device Drivers'' => ''Block Devices'' => ''RAM Disk Support'' => ''Initial RAM Disk (initrd) Support'' (**''CONFIG_BLK_DEV_INITRD=y''**) * ''File Systems'' => ''Misc. File Systems'' => ''Compressed ROM Filesystem (cramfs)'' (**''CONFIG_CRAMFS=y''**) To make a suitible kernel, follow these steps: * Download the current voyage kernel, and unpack it: wget http://www.voyage.hk/dists/unstable/kernel/kernel-source-2.6.15-voyage_2.0-8_all.deb dpkg -i kernel-source-2.6.15-voyage_2.0-8_all.deb cd /usr/src tar -jxf kernel-source-2.6.15-voyage.tar.bz2 * Download the current config file: wget http://www.voyage.hk/download/kernel_config/config-2.6.15-486-voyage_2.0-8 cp config-2.6.15-486-voyage_2.0-8 .config * Run ''make menuconfig'' and add the above three kernel options. * Build the kernel and the kernel's modules (simply run ''make''). The resulting kernel image is ''arch/i386/boot/bzImage''. \\ Copy this file to the ''/tftpboot'' directory, and rename it to ''linux'' \\ (or change the ''"KERNEL linux"'' directive in the pxelinux configuration file). Besides the ''bzImage'' file, you'll need the ''/lib/modules'' directory. The easiest way to create it is to run ''make modules_install''. **BUT** this will actually install these modules on your host computer. ''make help'' is our friend. It tells us to use ''INSTALL_MOD_PATH'' to override the destination directory. ''INSTALL_MOD_PATH=/your/full/target/path/to/nfsroot make modules_install'' will do the job. When a new voyage kernel is released with these options included, this won't be needed at all. ===== Creating the ROOT filesystem ===== Explainations and instructions about creating ROOT filesystems can be found in [[http://www.tldp.org/HOWTO/Bootdisk-HOWTO/|The Bootdisk HOWTO]]. You can create extra small, extra tight root filesystems with [[http://www.busybox.net/|BusyBox]]. Usually, one wants to create a minimal root file system, enough to load some drivers and then pass the control to the locally installed filesystem. \\ Small root file systems can also be fitted in one diskette, or a small USB disk. However, I chose the opposite: I want the ENTIRE voyage file system inside my root filesystem.\\ This allows me to completely boot the device without any other installations, or any other configurations (other than the PXEs configurations). The voyage file systems compresses into 21MB, and when used as a root file systems, uses 33MB of RAM (when fully running all daemons). Since most Soekris and PCengine boards have 64MB or 128MB or RAM, this is easily possible. To create the root file system, follow these steps: * Download the latest [[http://voyage.hk/download/voyage/voyage-0.2pre3.tar.gz|voyage-2pre3.tar.gz]] file system. \\ Note: if you use a older version (before "0.2pre3"), you must remember to set the root password using ''chroot'' (see [[temp_customization|Manual Customizations]]). * Unpack the file system (as ''root''): tar -xzvf voyage-0.2pre3.tar.gz * Remove the ''modules'' directory: \\ (This will not be needed when the voyage kernel is updated) rm -rf voyage-0.2pre3/lib/modules/2.6.15-voyage * Copy the new ''modules'' directory from whereever you installed it \\ (see the **Kernel Configurations** section) cp -r /lib/modules/2.6.15 voyage-0.2pre3/lib/modules * (Optional) Remove the ''voyage-util'' init script, because it currently doesn't work well with a truely read-only file system: rm voyage-0.2pre3/etc/init.d/voyage-util * Change the ''inittab'' file, to make the login/getty programs use the serial console: sed -i 's/38400 tty1/-L 9600 ttyS0/' voyage-0.2pre3/etc/inittab * Finally, create the compresed file system (CRAMFS file): mkcramfs voyage-0.2pre3 /tftpboot/rootfs.gz ===== That's all folks !===== Boot your device, and watch the magic... (No magic? Good thing there's a "troubleshooting" section) ====== Troubleshooting ====== There are so many participants in the PXE party, it is crucial to isolate the problem correctly. * Use a NULL cable and the ''minicom'' (or any other terminal program, like ''gtkterm'') to constantly monitor the device's console. * Use ''tethereal'' or ''ethereal'' to monitor network activity. * Use system logs to monitor the DHCP and the TFTP daemons. * Compare what happens on your setup with the **reference PXE boot process**. \\ Try to isolate the exact step that doesn't work. Here are some problems I run into while trying to get PXE to work: ^ Symptom ^ Possible Solution ^ | PXE Code fails to get an IP address | Make sure the network cable is connected (don't laugh... sh*t happens). \\ Make sure you DHCP server is running and offering IP addresses | | PXE Code gets IP address, but doesn't do anything else | Make sure the "filename" options is defined in the DHCP configuration. \\ Use ethereal to ensure it is send to the device. | | PXE tries to download ''pxelinux.0'' file and fails. | Check the ''tftpd'' logs, and the ''ethereal'' capture, make sure the file exists in the ''/tftpboot'' directory, and that it is readable by everyone (''chmod a+r pxelinux.0'') | | ''pxelinux.0'' is loaded, but fails to find aconfiguration file. | use ''ethereal'' to find out which file is requested, make sure this file exists. | | all PXE files are downloaded, including the ''linux'' and ''rootfs.gz'', but when the download is completed ("Ready." appears), the device hangs. | Make sure ''linux'' is actually a ''bzImage'' file, and not some junk. \\ If funny characters appear on the console (even just one character, especially "y" with two dots above it), it may be a baud rate problem. \\ Make sure the baud rate in the pxe config file, and in the device's bios, and on the kernel command line are all the same. | | PXE files are downloaded (''linux'' and ''rootfs.gz''), but you get the following message: \\ ''invalid or corrupt kernel image'' | This happens if the ''linux'' file is not a real kernel image. \\ Make sure you copied the ''arch/i386/boot/**bzImage**'' (and not ''vmlinuz'' or some other file). \\ Open a console on your PXE server and type: \\ ''$ file /tftpboot/linux'' \\ The answer should be: ''/tftpboot/linux: x86 boot sector''. \\ Any other response means you trying to boot using a bad kernel image | | Yippi! the kernel boots! But later on it panics with: || | ''kernel panic: VFS: unable to mount rootfs on unknown-block(3,65)'' | Either (3,65) or any numbers other than (1,0) mean you are not passing the corrent boot parameters to the kernel. \\ (1,0) means **major** device number 1 (which is RAMDISK) and **minor** device number 0 (which is the first ramdisk, ram0) \\ Make sure the ''root=/dev/ram0'' parameter is in the pxe configuration file).| | ''kernel panic: VFS: unable to mount rootfs on unknown-block(1,0)'' | Now the ''root=/dev/ram0'' IS passed to the kernel, but for some other reason the kernel can't read the rootfs on that device. \\ Most likely, you forgot to add one of the three needed kernel options (see **kernel configurations** above)| | The kernel boots, ''init'' starts, some daemons are loaded, the device hangs for a semi-long time, and then this message appears: \\ ''ID 1 respawning too fast: disabled for 5 minutes'' | You really should not see this message if you use the voyage rootfs, but you ARE likely to see it if you try to build your own rootfs and for some reason the 'getty' or 'login' programs fail to start. See the Troubleshooting section in [[http://www.tldp.org/HOWTO/Bootdisk-HOWTO/|The Bootdisk HOWTO]]. | | The kernel boots, everything goes well, but device seems to hang forever (really forever, not displaying the "respawning too fast" message). | Try to ''ping'' to device from your host (it has an IP address...). \\ If you get a response, it means the device isn't hanged, just not displaying a "login" prompt on the console. \\ This usually means you forgot to set the "getty" paramters in the ''inittab'' file (see **Creating the CRAMFS** section).| ====== Final Words ====== * This was written by Assaf Gordon (agordon88 [at] gmail-please-no-spam [dot] com ), after a long, tedious journey to get voyage working with PXE. I hope this will help future PXE'ers... * If you find any mistakes, correct them (this is a Wiki, after all) \\ But please send me a note so I'll know what went wrong. * This is free documentation. It is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. * Most of the commands in the guide should be executed as ''root'' - **this might damage you system!** \\ Use at your own risk. ====== Soekris specific ====== //added by tran//: To boot from network you have to stop booting by hitting Ctrl-P, and then type "> boot f0" to start PXE-boot! and i found another great howto mount / over nfs (from Mike Machado who installed plain Debian on soekris here: http://www.cheapnet.net/~mike/soekris/) and use that one as alternative "installer" for voyage. ====== Remaining Issue on WRAP ====== This remark is written by Leon Woestenberg: I have found that the WRAP.2C BIOS 1.09 and 1.11 cannot automatically boot from the network, at least when the serial console is enabled. It still needs you to enter 'n' during the BIOS boot. This is annoying. I am trying to find out if this behaviour can be changed. An alternative (but expensive) way to boot over PXE is to start Etherboot from CF disk: http://mac.tuxfinder.com/blosxom/2005/11/23 The solution describes there prepares a CF disk as follows: 1. apt-get install mknbi etherboot dosfstools syslinux 2. mkdosfs /dev/sdb 3. mount -t msdos /dev/sdb /mnt/test/ 4. zcat /usr/share/etherboot/natsemi.zlilo.gz > /mnt/test/ethboot 5. cat > /mnt/test/syslinux.cfg < You can now test with qemu : qemu -hda /dev/sdb The following solution was contributed by Uli Raich: Another, albeit more dangerous solution, consists in curing the problem at its source, namely re-programming the Wraps BIOS flash. If you follow my desciption and you end up with a corrupted BIOS and your board is completely dead, then this is exclusively your problem! You have been warned! This said, let's describe the method: I found a wiki page named: "WRAP BIOS upgrade howto added to wiki" which had a pointer to http://www.pcengines.ch/wbios111.zip a page where you can find an upgrade to TinyBios-1.11. Since 1.11 is the version I have, this did not look very promissing. However I learned there, that the flash image consists of 4 32kByte blocks. The first one is PC Engines' TinyBios, the second and third are empty (0xff) and the last one is a copy of Etherboot. You also find the options selected in Etherboot to produce the Etherboot flash image. Analysing these options you see that the problem stems from a badly selected boot media sequence. If instead of selecting "BOOT_NOTHING" as the first boot device (this will in fact select the cf card) you select BOOT_NIC (which is the default in rom-o-matic) then Wrap will boot from the cf card if there is one inserted but immediately go to the network if no cf card is there. You can use http://rom-o-matic.net to produce the Etherboot rom image very easily. Then you must create a bootable msdos cf card (this is rather tricky and I succeeded only with a cf card to IDE adapter and declaring the cf card the main msdos disk c:). Onto this card I put the content of wbios111.zip. You have to rename the output of rom-o-matic to pxe.bin and concatenate the 4 blocks using cat.bat found in wbios111. I booted the Wrap with this msdos cf card and finally I used setbios, also found on wbios111 to re-flash the BIOS. For more info have a look in the README of wbios111. Now my wrap board behaves as expected.