Ethernet boot prom code. This is code that can be burned into an eprom and installed in an ethernet card. It uses the extension facilities of the bios to to boot a kernel via the network. Netboot uses bootp or rarp to determine its ip address and tftps a designated kernel from a server. You should be running a daemon for either bootp or rarp to service requests from this client. If you are using bootp, the boot file name and the gateway (if necessary) will also be transmitted to the client. If you use rarpd, the boot file name is synthesized by this boot code from the eight hexadecimal digits that comprise the IP address of the client and an extension of "386bsd". If you use rarp, the rarp server must also be the tftp server. If you have configured both bootp and rarpd into the boot prom, the response from the first host to respond via either protocol will be used. This code was developed using GNU as 2.1 and GNU cc version 2.3.3, running under 386bsd. Pre 2.0 versions of GNU as might have trouble with some syntax. Testing was done with a SMC Elite16 and 16k eproms. Installation instructions: Check the configurable parameters in Makefile. Check the configurable parameters in the ethernet driver source for the card you are using: - in wd80x3.c: WD_BASEREG, WD_BASEMEM (irqs not used) Make. If you wish, you can test the binary (boot.bin) by copying it to a floppy with the dosload.exe program and execute the boot code from the floppy. Burn the resultant binary (boot.bin) into an eprom and install it in the ethernet card. Decide which protocol (bootp or rarp) to use on a server; set up that server. Setting up a bootp server entails creating a bootpd client configuration file. The format is similar to that of printcap. An entry looks something like: sams-1:\ :bf=diskless_kernel.386bsd:\ :gw=139.88.30.4:\ :ht=ethernet:\ :ha=0000c025e35b:\ :ip=139.88.30.39:\ :sm=255.255.255.0:\ :to=18000: Setting up a rarpd server entails creating an ethernet/ip address resolution file '/etc/ethers' with a line for each netboot client in the form: 00:00:c0:25:e3:5b sams-1.lerc.nasa.gov If you don't know the ethernet address, boot the client with the eprom installed; the ethernet address of the card will be displayed. Set up tftpd on a server. Check '/etc/inetd.conf'; there should be a line that starts something like: tftp dgram udp wait root ... perhaps commented out. Build a kernel that is capable of operating via NFS. Martin Renters released some patches and a kernel configuration program that work nicely (comp.os.386bsd.development around March 22, 1993); they should be around somewhere. If you can't find them, I can email you a copy. Make the kernel available via tftp under one of the names which this code will use to look for the kernel. If you are using bootp, you can specify the name as a bootp client configuration parameter. If you don't specify the name, or if you are using rarp the this code will synthesize the name using its client's IP address. The hexadecimal version of the client's IP address with the extension '.386bsd' is the default choice. Create the exportable nfs mount points for which this kernel will use and load them with necessary files (the base distribution, ...). Export them so they can be mounted by this kernel when it boots from the client IP address. Usage instructions: At any time the escape key can be struck to gain entrance to the interactive monitor. There is a menu of monitor commands that can be invoked to customize a boot operation. Notes: When Martin Renter's patches are applied to netbsd 0.8, there will be one failure (pmap.c). Ignore it, the relevant code has already been fixed. I had some small problems with getfh(2) as used in the nfs configuring program - I suspect the problem is a bug in SunOS 4.1.1 - if you have similar problems, I can email you my gross hack workaround. As noted by Mr. Renters, advisory flock()ing is not supported - this breaks some programs. The first broken utility you will likely encounter is vipw(1). The others: passwd, dump, ar, mail, tip, lpr, sendmail. You should examine your rc script and make appropriate changes to the boot up sequence. Here are the steps I took to bring netbsd 0.8 up for the client sams-1 using the host dinah in the domain lerc.nasa.gov. - Create the /dev/vga device. - Create some ptys. - Create /etc/fstab to contain: dinah:/home/386bsd-root / nfs rw dinah:/home/386bsd-swap none swap rw in it for the root and swap. - Edit /etc/rc; the line 'mount -a -t nonfs' is changed to: mount -a -t nonfs,swap - Edit /etc/myname to contain sams-1 - Edit /etc/hosts to contain: 127.0.0.1 localhost loghost 139.88.30.39 sams-1 and delete the other stuff in it. - Create /etc/resolv.conf to contain: domain lerc.nasa.gov nameserver 128.156.1.43 nameserver 139.88.76.3 where the two addresses are those of some name servers in my domain. There are, of course, the two alternatives of using just the /etc/hosts file, or using named. - Create /etc/mygate to contain: 139.88.30.4 which is the IP address of my gateway. - Re-symlink /etc/localtime to the correct zone. TBD: -linux -ne2100 -handle small memory configuration -USE_BIOS version -return to bios correctly -remove old Phys... stuff; relics of real mode prom version -accept bootd extension items & pass as args, modify kernel to init nfs_diskless from args. Need: myif [local] [bootp] mygateway [bootp] swap_args [local] swap_fh [bootp] swap_saddr [local] [bootp] swap_hostname [bootp] root_args [local] root_fh [bootp] root_saddr [local] [bootp] root_hostnam [bootp] A tight squeeze, passing all necessary info in one bootp packet. Please send me any improvements you make to this code. It will be appreciated. Jim McKim (mckim@lerc.nasa.gov)