diff options
author | Michael Brown <mcb30@etherboot.org> | 2005-05-17 16:44:57 +0000 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2005-05-17 16:44:57 +0000 |
commit | 1097cf8685cd81f0003bd6f17d050e5174a85b90 (patch) | |
tree | 47a39f2a1e980cca43c28c4d1a6dfdf431b910b2 /contrib/initrd | |
parent | 75a5374d79ee0defc46c306731142faccc6eda60 (diff) | |
download | ipxe-1097cf8685cd81f0003bd6f17d050e5174a85b90.tar.gz |
Initial revision
Diffstat (limited to 'contrib/initrd')
-rw-r--r-- | contrib/initrd/ChangeLog | 46 | ||||
-rw-r--r-- | contrib/initrd/Makefile | 187 | ||||
-rw-r--r-- | contrib/initrd/Manifest | 15 | ||||
-rw-r--r-- | contrib/initrd/README | 37 | ||||
-rw-r--r-- | contrib/initrd/dhcpd.conf.etherboot.include | 207 | ||||
-rwxr-xr-x | contrib/initrd/include-modules | 63 | ||||
-rw-r--r-- | contrib/initrd/linux-wlan.cfg | 7 | ||||
-rw-r--r-- | contrib/initrd/linuxrc | 76 | ||||
-rwxr-xr-x | contrib/initrd/mkinitrd-net | 165 | ||||
-rw-r--r-- | contrib/initrd/mkinitrd-net.spec | 112 | ||||
-rwxr-xr-x | contrib/initrd/mknbi-set | 200 | ||||
-rw-r--r-- | contrib/initrd/mknbi-set.conf | 27 | ||||
-rw-r--r-- | contrib/initrd/script.c.patch | 11 | ||||
-rw-r--r-- | contrib/initrd/udhcpc-post | 25 |
14 files changed, 1178 insertions, 0 deletions
diff --git a/contrib/initrd/ChangeLog b/contrib/initrd/ChangeLog new file mode 100644 index 00000000..94f8f6aa --- /dev/null +++ b/contrib/initrd/ChangeLog @@ -0,0 +1,46 @@ +mkinitrd-net ChangeLog + +Last Modified: Fri Jul 26 23:08:28 2002 + +$Log$ +Revision 1.1 2005/05/17 16:45:02 mcb30 +Initial revision + +Revision 1.1 2002/11/06 06:31:06 ken_yap +Contributed by Michael Brown. + +Revision 1.10 2002/07/26 23:09:13 mcb30 +Support for new binary etherboot.nic-dev-id structure +Added --kernel option patch from Stew Benedict at MandrakeSoft +Only try to use sudo if we are not already root + +Revision 1.9 2002/06/05 13:31:50 mcb30 +Modifications to allow DHCP, TFTP and NFS servers to be separate machines. + +Revision 1.8 2002/05/30 11:41:18 mcb30 +/tftpboot symlinked to /var/lib/tftpboot +Has ability to be quiet if "quiet" specified on kernel cmdline + +Revision 1.7 2002/05/26 11:15:04 mcb30 +PCI-ID auto-mapping via dhcpd.conf.etherboot-pcimap.include + +Revision 1.6 2002/05/24 02:05:11 mcb30 +Bugfixes, migrated /tftpboot to /var/lib/tftpboot + +Revision 1.5 2002/05/23 21:29:58 mcb30 +Now includes dhcpd.conf.etherboot.include +Automatically scans for all network modules in the pcimap file + +Revision 1.4 2002/05/08 09:04:31 mcb30 +Bugfixes: tmpdir selection, linuxrc typos, ifconfig peculiarities + +Revision 1.3 2002/05/04 21:44:13 mcb30 +During %make, LIBDIR must be set for mknbi +Added %post scriptlet since %trigger seems not to be being triggered... + +Revision 1.2 2002/05/04 21:20:32 mcb30 +Added extra sources instead of requiring "make" to download them + +Revision 1.1 2002/05/04 13:19:40 mcb30 +First attempt at an RPM package + diff --git a/contrib/initrd/Makefile b/contrib/initrd/Makefile new file mode 100644 index 00000000..f18b73f6 --- /dev/null +++ b/contrib/initrd/Makefile @@ -0,0 +1,187 @@ +UCLIBC_VERSION = 0.9.11 +UCLIBC = uClibc-$(UCLIBC_VERSION) +$(UCLIBC)_SOURCE = http://www.uclibc.org/downloads/$(UCLIBC).tar.bz2 +UCLIBC_INSTALL = $(CURDIR)/uClibc + +UDHCP_VERSION = 0.9.7 +UDHCP = udhcp-$(UDHCP_VERSION) +$(UDHCP)_SOURCE = http://udhcp.busybox.net/source/$(UDHCP).tar.gz + +BUSYBOX_VERSION = 0.60.3 +BUSYBOX = busybox-$(BUSYBOX_VERSION) +$(BUSYBOX)_SOURCE = http://www.busybox.net/downloads/$(BUSYBOX).tar.bz2 + +LINUX_WLAN_VERSION = 0.1.13 +LINUX_WLAN = linux-wlan-ng-$(LINUX_WLAN_VERSION) +$(LINUX_WLAN)_SOURCE = ftp://ftp.linux-wlan.org/pub/linux-wlan-ng/$(LINUX_WLAN).tar.gz + +MKNBI_VERSION = 1.2 +MKNBI = mknbi-$(MKNBI_VERSION) +$(MKNBI)_SOURCE = http://belnet.dl.sourceforge.net/sourceforge/etherboot/$(MKNBI).tar.gz + +export PATH := $(UCLIBC_INSTALL)/bin:$(PATH) + +all : utils initrd-skel mknbi mknbi-linux + # Run "make tftpboot/initrd-kernel_module.img" to generate a suitable initrd + # Run "make tftpboot/boot-kernel_module.nbi" to generate a suitable NBI + # Run "make all-nbi" to generate a complete set of NBIs + +%.tar.bz2 : + [ -d $* ] || wget $($*_SOURCE) + [ -f $*.t*gz ] && ( gunzip $*.t*gz ; bzip2 -9 $*.tar ) || true + +UTILS = udhcpc busybox wlanctl + +utils : $(UTILS) + +clean : partlyclean + rm -rf uClibc + rm -rf $(UCLIBC) + rm -rf tftpboot/* + +partlyclean : + rm -rf $(UDHCP) + rm -rf $(BUSYBOX) + rm -rf $(LINUX_WLAN) + rm -rf $(MKNBI) + rm -rf initrd-skel + rm -f *.img *.ird *.nbi insert-modules + rm -f $(UTILS) mknbi-linux + rm -f *.uClibc *.busybox *.udhcpc *.wlanctl + +.PHONY : all utils clean partlyclean + +uClibc : $(UCLIBC) + rm -rf $@ + $(MAKE) -C $(UCLIBC) install + +$(UCLIBC) : $(UCLIBC).tar.bz2 + [ -d $@ ] || tar xvjf $< + [ -f $(UCLIBC)/Config ] || perl -pe 's/^(INCLUDE_RPC).*/$$1 = true/ ;' \ + -e 's{^(DEVEL_PREFIX).*}{$$1 = $(UCLIBC_INSTALL)} ;' \ + -e 's{^(SHARED_LIB_LOADER_PATH).*}{$$1 = /lib} ;' \ + $(UCLIBC)/extra/Configs/Config.i386 > $(UCLIBC)/Config + # Stripping out spurious CVS directories (screws up local cvs update) + rm -rf `find $(UCLIBC) -name CVS` + $(MAKE) -C $(UCLIBC) + install -m 644 $(UCLIBC)/COPYING.LIB COPYING.uClibc + +udhcpc : $(UDHCP) + install -m 755 -s $(UDHCP)/$@ $@ + +$(UDHCP) : $(UDHCP).tar.bz2 uClibc + [ -d $@ ] || tar xvjf $< + if [ ! -f $@/.script.c.patch ]; then \ + patch -d $@ -b -z .orig < script.c.patch ; \ + touch $@/.script.c.patch ; \ + fi + $(MAKE) LDFLAGS+=-static -C $(UDHCP) + install -m 644 $(UDHCP)/AUTHORS AUTHORS.udhcpc + install -m 644 $(UDHCP)/COPYING COPYING.udhcpc + +busybox : $(BUSYBOX) + install -m 755 -s $(BUSYBOX)/$@ $@ + +$(BUSYBOX) : $(BUSYBOX).tar.bz2 uClibc + [ -d $@ ] || tar xvjf $< + perl -pi.orig -e \ + 's/^.*(#define BB_(FEATURE_NFSMOUNT|INSMOD|PIVOT_ROOT|IFCONFIG|ROUTE)).*/$$1/' \ + $(BUSYBOX)/Config.h + perl -pi.orig -e \ + 's/^(DOSTATIC).*$$/$$1 = true/' \ + $(BUSYBOX)/Makefile + $(MAKE) -C $(BUSYBOX) + install -m 644 $(BUSYBOX)/AUTHORS AUTHORS.busybox + install -m 644 $(BUSYBOX)/LICENSE LICENSE.busybox + +wlanctl : $(LINUX_WLAN) + install -m 755 -s $(LINUX_WLAN)/src/wlanctl/$@ $@ + +$(LINUX_WLAN) : $(LINUX_WLAN).tar.bz2 uClibc linux-wlan.cfg + [ -d $@ ] || tar xvjf $< + cd $(LINUX_WLAN) ; ./Configure -d ../linux-wlan.cfg + perl -pi.orig -e \ + 's/(-o wlanctl)/-static $$1/' \ + $(LINUX_WLAN)/src/wlanctl/Makefile + $(MAKE) -C $(LINUX_WLAN)/src/wlanctl + install -m 644 $(LINUX_WLAN)/COPYING COPYING.wlanctl + install -m 644 $(LINUX_WLAN)/LICENSE LICENSE.wlanctl + install -m 644 $(LINUX_WLAN)/THANKS THANKS.wlanctl + +mknbi-linux : $(MKNBI) + +mknbi : $(MKNBI) + +$(MKNBI) : $(MKNBI).tar.bz2 + [ -d $@ ] || tar xvjf $< + if [ ! -f $@/.mknbi-encap.patch ]; then \ + patch -d $@ -b -z .orig < mknbi-encap.patch ; \ + touch $@/.mknbi-encap.patch ; \ + fi + make -C $(MKNBI) LIBDIR=`pwd`/$(MKNBI) mknbi + install -m 755 $(MKNBI)/mknbi mknbi-linux + make -C $(MKNBI) clean + make -C $(MKNBI) + +initrd-skel : $(UTILS) linuxrc udhcpc-post include-modules + rm -rf $@ + mkdir -p $@ + mkdir -p $@/dev + mkdir -p $@/etc + mkdir -p $@/bin + mkdir -p $@/lib + mkdir -p $@/lib/modules + mkdir -p $@/proc + mkdir -p $@/sysroot + ln -s bin $@/sbin + install -m 755 busybox $@/bin/ + install -m 755 udhcpc $@/bin/ + install -m 755 wlanctl $@/bin/ + ln -s busybox $@/bin/sh + ln -s busybox $@/bin/echo + ln -s busybox $@/bin/mknod + ln -s busybox $@/bin/chmod + ln -s busybox $@/bin/insmod + ln -s busybox $@/bin/ifconfig + ln -s busybox $@/bin/route + ln -s busybox $@/bin/mount + ln -s busybox $@/bin/pivot_root + ln -s busybox $@/bin/umount + ln -s busybox $@/bin/[ + ln -s busybox $@/bin/sleep + ln -s busybox $@/bin/grep + + install -m 755 linuxrc $@/linuxrc + install -m 755 udhcpc-post $@/bin/udhcpc-post + +tftpboot/initrd-%.img : initrd-skel + ./mkinitrd-net -l `echo $* | tr . " "` + +tftpboot/boot-%.nbi : tftpboot/initrd-%.img mknbi-linux + ./mknbi-linux --format=nbi --target=linux /boot/vmlinuz $< > $@ + sudo cp $@ $(tftpbootdir) + +all-nbi : all + ./mknbi-set -l -v + ls tftpboot + +prefix = /usr +sysconfdir = /etc +bindir = $(prefix)/bin +libdir = $(prefix)/lib +mandir = $(prefix)/share/man +docdir = $(prefix)/share/doc +tftpbootdir = /var/lib/tftpboot +initrdskeldir = $(prefix)/lib/mkinitrd-net/initrd-skel + +install : + mkdir -p $(libdir)/mknbi + mkdir -p $(bindir) + mkdir -p $(sysconfdir) + mkdir -p $(tftpbootdir) + mkdir -p $(initrdskeldir) + install -m 755 mkinitrd-net include-modules mknbi-set $(bindir)/ + cp -a initrd-skel/* $(initrdskeldir)/ + install -m 644 mknbi-set.conf dhcpd.conf.etherboot.include $(sysconfdir) + make -C $(MKNBI) INSTPREFIX=$(prefix) MANDIR=$(mandir)/man1 \ + DOCDIR=$(docdir)/$(MKNBI) install diff --git a/contrib/initrd/Manifest b/contrib/initrd/Manifest new file mode 100644 index 00000000..b41e7255 --- /dev/null +++ b/contrib/initrd/Manifest @@ -0,0 +1,15 @@ +initrd/ChangeLog +initrd/Makefile +initrd/Manifest +initrd/README +initrd/dhcpd.conf.etherboot.include +initrd/include-modules +initrd/linux-wlan.cfg +initrd/linuxrc +initrd/mkinitrd-net +initrd/mkinitrd-net.spec +initrd/mknbi-encap.patch +initrd/mknbi-set +initrd/mknbi-set.conf +initrd/script.c.patch +initrd/udhcpc-post diff --git a/contrib/initrd/README b/contrib/initrd/README new file mode 100644 index 00000000..5152425a --- /dev/null +++ b/contrib/initrd/README @@ -0,0 +1,37 @@ +README for mkinitrd-net + +mkinitrd-net enables you to use your distribution's stock kernel for +diskless workstations, without having to compile in support for the +relevant network card(s). It creates an initial ramdisk image containing +the required network-card kernel modules and bootstrap scripts to load the +module, obtain an IP address via DHCP and mount the root filesystem via +NFS. + +mkinitrd-net also generates a dhcpd.conf file fragment that can be used to +automate the process of mapping NBI files to clients, based on the PCI IDs +of their network cards. Etherboot will send the PCI ID of the network +card to the DHCP server in the etherboot-encapsulated-options field +(Etherboot 5.0.7 and newer) and the DHCP server can use this to identify +the correct NBI to point the client towards. + +The end result is that: + +a) You can avoid the hassle of compiling custom kernels for diskless + workstations. + +b) Diskless workstations will automatically download the correct + kernel+initrd. + +c) You have an easier life! :-) + + + +mkinitrd-net is Copyright Fen Systems Ltd. 2001. mkinitrd-net itself is +licensed under the GNU GPL. It incorporates code from the uClibc, +busybox, udhcpc and Etherboot projects, each of which has its own licence +terms. Standard disclaimers apply. + +The copy of mkinitrd-net in the Etherboot contribs is not the +authoritative copy of mkinitrd-net; please do not make modifications to +this copy. Patches should be sent to Michael Brown +<mbrown@fensystems.co.uk>. diff --git a/contrib/initrd/dhcpd.conf.etherboot.include b/contrib/initrd/dhcpd.conf.etherboot.include new file mode 100644 index 00000000..9cec1dc1 --- /dev/null +++ b/contrib/initrd/dhcpd.conf.etherboot.include @@ -0,0 +1,207 @@ +# dhcpd.conf include file for Etherboot +# +# Include this file from your /etc/dhcpd.conf +# $Id$ + +# Definition of Etherboot options +# (taken from vendortags.html) + +# We use an encapsulated option space to avoid polluting the site-local DHCP option space +# +option space etherboot; +option etherboot-encapsulated-options code 150 = encapsulate etherboot; + +# Definition of option codes within the etherboot-encapsulated-options space +# +option etherboot.extensions-path code 18 = string; +option etherboot.magic code 128 = string; +option etherboot.kernel-cmdline code 129 = string; +option etherboot.menu-opts code 160 = string; +option etherboot.nic-dev-id code 175 = string; +option etherboot.menu-selection code 176 = unsigned integer 8; +option etherboot.motd-1 code 184 = string; +option etherboot.motd-2 code 185 = string; +option etherboot.motd-3 code 186 = string; +option etherboot.motd-4 code 187 = string; +option etherboot.motd-5 code 188 = string; +option etherboot.motd-6 code 189 = string; +option etherboot.motd-7 code 190 = string; +option etherboot.motd-8 code 191 = string; +option etherboot.image-1 code 192 = string; +option etherboot.image-2 code 193 = string; +option etherboot.image-3 code 194 = string; +option etherboot.image-4 code 195 = string; +option etherboot.image-5 code 196 = string; +option etherboot.image-6 code 197 = string; +option etherboot.image-7 code 198 = string; +option etherboot.image-8 code 199 = string; +option etherboot.image-9 code 200 = string; +option etherboot.image-10 code 201 = string; +option etherboot.image-11 code 202 = string; +option etherboot.image-12 code 203 = string; +option etherboot.image-13 code 204 = string; +option etherboot.image-14 code 205 = string; +option etherboot.image-15 code 206 = string; +option etherboot.image-16 code 207 = string; +option etherboot.kmod code 254 = string; + +# Legacy support for Etherboot options as site-local options (i.e. non-encapsulated) +# Note: options defined after the switch to encapsulated options should not be defined here +# +option legacy-etherboot-magic code 128 = string; +option legacy-etherboot-kernel-cmdline code 129 = string; +option legacy-etherboot-menu-opts code 160 = string; +option legacy-etherboot-menu-selection code 176 = unsigned integer 8; +option legacy-etherboot-motd-1 code 184 = string; +option legacy-etherboot-motd-2 code 185 = string; +option legacy-etherboot-motd-3 code 186 = string; +option legacy-etherboot-motd-4 code 187 = string; +option legacy-etherboot-motd-5 code 188 = string; +option legacy-etherboot-motd-6 code 189 = string; +option legacy-etherboot-motd-7 code 190 = string; +option legacy-etherboot-motd-8 code 191 = string; +option legacy-etherboot-image-1 code 192 = string; +option legacy-etherboot-image-2 code 193 = string; +option legacy-etherboot-image-3 code 194 = string; +option legacy-etherboot-image-4 code 195 = string; +option legacy-etherboot-image-5 code 196 = string; +option legacy-etherboot-image-6 code 197 = string; +option legacy-etherboot-image-7 code 198 = string; +option legacy-etherboot-image-8 code 199 = string; +option legacy-etherboot-image-9 code 200 = string; +option legacy-etherboot-image-10 code 201 = string; +option legacy-etherboot-image-11 code 202 = string; +option legacy-etherboot-image-12 code 203 = string; +option legacy-etherboot-image-13 code 204 = string; +option legacy-etherboot-image-14 code 205 = string; +option legacy-etherboot-image-15 code 206 = string; +option legacy-etherboot-image-16 code 207 = string; + +# Apply Etherboot options only for Etherboot clients +# +if substring ( option vendor-class-identifier, 0, 9 ) = "Etherboot" { + + # We must specify this value for etherboot-magic, or Etherboot will + # ignore all other options. + # + option etherboot.magic E4:45:74:68:00:00; + + # Bootfile name: derive from etherboot.kmod (calculated below) + # Use boot.nbi if no NIC_DEV_ID option present + # (i.e. if etherboot.kmod doesn't get set) + # Also pass filename back in filename field + # + option bootfile-name = pick-first-value ( concat ( "boot-", + config-option etherboot.kmod, + ".nbi" ), + "boot.nbi" ) ; + filename = config-option bootfile-name; + + # "Sensible" default values for some options + + # Mount devfs (will probably be needed for a network-boot) + option etherboot.kernel-cmdline " devfs=mount"; + + # Info message (includes client IP address, MAC address, hardware ID string, + # server IP address and name of boot file) + option etherboot.motd-4 = concat ( "Using Etherboot to boot ", + binary-to-ascii ( 10, 8, ".", leased-address ), + " [", + binary-to-ascii ( 16, 8, ":", suffix ( hardware, 6 ) ), + "] [", + pick-first-value ( option etherboot.nic-dev-id, "unknown card" ), + "]", 0d:0a, " from ", + binary-to-ascii ( 10, 8, ".", option dhcp-server-identifier ), + " with file ", + config-option tftp-server-name, + ":", + config-option bootfile-name, + " [", + pick-first-value ( config-option etherboot.kmod, "unknown module" ), + "]", 0d:0a ); + + # Legacy site-local option support + # If client does not include an etherboot-encapsulated-options field in its DHCPREQUEST, then + # it will not understand etherboot-encapsulated-options in the DHCPACK and so we must send + # back the options as site-local options (i.e. not encapsulated). + # Note: we need do this only for options that existed prior to the switch to encapsulation. + # + if not exists etherboot-encapsulated-options { + option legacy-etherboot-magic = config-option etherboot.magic; + option legacy-etherboot-kernel-cmdline = config-option etherboot.kernel-cmdline; + option legacy-etherboot-menu-opts = config-option etherboot.menu-opts; + option legacy-etherboot-menu-selection = config-option etherboot.menu-selection; + option legacy-etherboot-motd-1 = config-option etherboot.motd-1; + option legacy-etherboot-motd-2 = config-option etherboot.motd-2; + option legacy-etherboot-motd-3 = config-option etherboot.motd-3; + option legacy-etherboot-motd-4 = config-option etherboot.motd-4; + option legacy-etherboot-motd-5 = config-option etherboot.motd-5; + option legacy-etherboot-motd-6 = config-option etherboot.motd-6; + option legacy-etherboot-motd-7 = config-option etherboot.motd-7; + option legacy-etherboot-motd-8 = config-option etherboot.motd-8; + option legacy-etherboot-image-1 = config-option etherboot.image-1; + option legacy-etherboot-image-2 = config-option etherboot.image-2; + option legacy-etherboot-image-3 = config-option etherboot.image-3; + option legacy-etherboot-image-4 = config-option etherboot.image-4; + option legacy-etherboot-image-5 = config-option etherboot.image-5; + option legacy-etherboot-image-6 = config-option etherboot.image-6; + option legacy-etherboot-image-7 = config-option etherboot.image-7; + option legacy-etherboot-image-8 = config-option etherboot.image-8; + option legacy-etherboot-image-9 = config-option etherboot.image-9; + option legacy-etherboot-image-10 = config-option etherboot.image-10; + option legacy-etherboot-image-11 = config-option etherboot.image-11; + option legacy-etherboot-image-12 = config-option etherboot.image-12; + option legacy-etherboot-image-13 = config-option etherboot.image-13; + option legacy-etherboot-image-14 = config-option etherboot.image-14; + option legacy-etherboot-image-15 = config-option etherboot.image-15; + option legacy-etherboot-image-16 = config-option etherboot.image-16; + } +} + +# Some options should be set for both Etherboot and the udhcpc client +# +if ( ( substring ( option vendor-class-identifier, 0, 9 ) = "Etherboot" ) + or ( substring ( option vendor-class-identifier, 0, 5 ) = "udhcp" ) ) { + + # TFTP server defaults to DHCP server and is specified in both + # next-server field and tftp-server-name option field + # + option tftp-server-name = binary-to-ascii ( 10, 8, ".", config-option dhcp-server-identifier ); + server-name = config-option tftp-server-name; + next-server = config-option dhcp-server-identifier; + + # Root path defaults to root of TFTP server + option root-path = concat ( config-option tftp-server-name, ":/" ); + + # A fallback hostname, generated from the IP address + option host-name = concat ( "client_", binary-to-ascii ( 10, 8, "_", leased-address ) ); +} + +# Force some items onto parameter request list for udhcp +# +if substring ( option vendor-class-identifier, 0, 5 ) = "udhcp" { + # Forcibly add root-path to list + option dhcp-parameter-request-list = concat ( option dhcp-parameter-request-list, 11 ); +} + +# Etherboot sends a string to identify the NIC in etherboot.nic-dev-id. +# For PCI NICs, this string is of the form "PCI:vvvv:dddd" where vvvv is the +# vendor identifier and dddd the device identifier, in lower-case ASCII hex. +# For ISA NICs, the format of the string is "ISA:..." where ... is not yet +# decided upon. +# +# We use the identifier to select the NBI image that will be specified via +# the "bootfile-name" option. +# +# PCI NICs - use PCI vendor and device IDs +# Listed in file generated by mknbi-set +# +include "/etc/dhcpd.conf.etherboot-pcimap.include"; + +# ISA NICs +# +if substring ( option vendor-class-identifier, 0, 9 ) = "Etherboot" { + if exists etherboot.nic-dev-id { + + } +} diff --git a/contrib/initrd/include-modules b/contrib/initrd/include-modules new file mode 100755 index 00000000..60e76fc6 --- /dev/null +++ b/contrib/initrd/include-modules @@ -0,0 +1,63 @@ +#!/usr/bin/perl -w +# +# Retrieve modules required for an initrd image +# $Id$ + +unless ( @ARGV ) { + die "Syntax: $0 [ -d target_directory ] module_1 module_2 module_3\n" +} + +# Parse command line arguments +my @requested_modules = (); +my $target_dir = ""; +my $kernel_ver; +my $quiet; +chomp ( my $current_kernel_ver = `uname -r` ); +while ( $_ = shift ) { + if ( /-d/ ) { $target_dir = shift } + elsif ( /-k/ ) { $kernel_ver = shift } + elsif ( /-q/ ) { $quiet = 1 } + else { push @requested_modules, $_ }; +} + +# Create target directory if required +if ( $target_dir ) { + print STDERR "Target directory is $target_dir\n" unless $quiet; + system ( "mkdir -p $target_dir" ); + chdir $target_dir; +} + +# Use modprobe -nav to retrieve locations of modules and their dependencies +print STDERR "Requested modules ". join (' ', @requested_modules)."\n" unless $quiet; +my @modules_dups; +foreach my $module ( @requested_modules ) { + my @module_list = map { /^\S+\s+(.*)$/ ; $1 } `/sbin/modprobe -nva $module`; + die "Cannot find any modules matching $module\n" unless @module_list; + push @modules_dups, @module_list; +} + +# Remove duplicates from list +my %module_basenames = (); +my @modules = (); +foreach my $module ( @modules_dups ) { + # Ugly hack : assume that dependencies are independent of kernel version + # This seems to be necessary because we can't run modprobe and specify + # an alternate modules.dep file; it refuses to understand lines of the + # form "depfile=XXX" as documented in modules.conf(5) + $module =~ s/$current_kernel_ver/$kernel_ver/ if $kernel_ver; + push @modules, $module unless $module_basenames{$module}; + ( my $basename ) = ( $module =~ /([^\/]+)\.o/ ); + $module_basenames{$module} = $basename; +} + +# Process module list +print "#!/bin/sh\n"; +foreach my $module ( @modules ) { + my $basename = $module_basenames{$module}; + # Report via stdout + print STDERR "Using module $basename from $module\n" unless $quiet; + # Copy uncompressed module to current directory + system ("gunzip -c $module > $basename.o"); + # Print insmod line to stdout + print "insmod $basename\n"; +} diff --git a/contrib/initrd/linux-wlan.cfg b/contrib/initrd/linux-wlan.cfg new file mode 100644 index 00000000..7df4a059 --- /dev/null +++ b/contrib/initrd/linux-wlan.cfg @@ -0,0 +1,7 @@ +# Dummy config file for building only wlanctl +# $Id$ + +PRISM2_PLX=n +PRISM2_PCMCIA=n +PRISM2_PCI=n +PRISM2_USB=n diff --git a/contrib/initrd/linuxrc b/contrib/initrd/linuxrc new file mode 100644 index 00000000..24bdb0df --- /dev/null +++ b/contrib/initrd/linuxrc @@ -0,0 +1,76 @@ +#!/bin/sh +# $Id$ + +PATH=/sbin:/bin + +echo Busybox /linuxrc starting + +echo Mounting /proc filesystem +mount -t proc none /proc + +echo=echo +if grep '\bquiet\b' /proc/cmdline > /dev/null; then + echo=true + quiet=1 +fi + +$echo Creating root device +mknod /dev/root b 1 0 2>/dev/null +chmod 700 /dev/root +echo 0x100 > /proc/sys/kernel/real-root-dev + +$echo Inserting modules +if [ -z "$quiet" ]; then + /bin/insert-modules +else + /bin/insert-modules >/dev/null +fi + +$echo Bringing up loopback interface +ifconfig lo 127.0.0.1 up +route add -net 127.0.0.0 netmask 255.0.0.0 lo + +# Hack required for prism2 cards +# It is not yet possible to use iwconfig to configure these cards, +# so we need wlanctl. +if ifconfig wlan0 down 2> /dev/null; then + $echo Setting up wireless link + wlanctl wlan0 lnxreq_ifstate ifstate=enable + wlanctl wlan0 lnxreq_autojoin ssid= authtype=opensystem +fi + +$echo Obtaining IP address via DHCP +$echo Trying to obtain IP address via wired link [eth0] +if udhcpc -i eth0 -f -n -q -s /bin/udhcpc-post; then + $echo Successfully obtained IP address via wired link [eth0] +else + $echo Failed to obtain IP address via wired link [eth0] + $echo Trying to obtain IP address via wireless link [wlan0] + udhcpc -i wlan0 -f -n -q -s /bin/udhcpc-post +fi + +if [ -d /sysroot/initrd ]; then + $echo Unmounting /proc prior to pivot_root + umount /proc + + $echo Pivoting root to /sysroot + pivot_root /sysroot /sysroot/initrd + cd / + + $echo Remounting devfs at correct place + mount -t devfs none /dev + + $echo Releasing locks on old devfs + exec 0</dev/null + exec 1>/dev/console + exec 2>/dev/console + + $echo Unmounting old devfs + umount /initrd/dev +else + # Failed to mount root: report error and hang + echo FATAL ERROR: Failed to mount root filesystem + echo Press Alt-SysRq-B or hit the reset switch to reboot + while : ; do sleep 6000 ; done +fi + diff --git a/contrib/initrd/mkinitrd-net b/contrib/initrd/mkinitrd-net new file mode 100755 index 00000000..0c95ebd1 --- /dev/null +++ b/contrib/initrd/mkinitrd-net @@ -0,0 +1,165 @@ +#!/bin/sh +# +# $Id$ +# initrd builder for network booting + +# Utility function to determine whether or not a filesystem is usable for +# loopback mounts. Lifted verbatim from Erik Troan's mkinitrd script. +# +is_good_fs() { + local parttype= tmpname= + local dir=$1 + [[ -d $dir ]] || return 1 + [[ -w $dir ]] || return 1 + [[ $dir == */ ]] && dir=${dir%/} + parttype=$(awk "{if (\$2 == \""$dir"\") print \$3 }" /proc/mounts) + + while tmpname=${dir%/*} && [[ -z $parttype ]];do + [[ -z $tmpname ]] && tmpname=/ + parttype=$(awk "{if (\$2 == \""$tmpname"\") print \$3 }" /proc/mounts) + dir=$tmpname + done + + case $parttype in + nfs|tmpfs) return 1;; + *) return 0; + esac +} + +# Find a suitable temporary directory (i.e. not tmpfs or nfs) +if is_good_fs $TMPDIR; then + tmpdir=$TMPDIR +elif is_good_fs /tmp; then + tmpdir=/tmp +elif is_good_fs /var/tmp; then + tmpdir=/var/tmp +elif is_good_fs /root/tmp; then + tmpdir=/root/tmp +else + echo "Cannot use a tmp directory" >&2 + exit 1 +fi + +# Default settings (some can be overridden by command-line options) +include_modules=include-modules +initrd_skel=/usr/lib/mkinitrd-net/initrd-skel +kernel_ver=`uname -r` +use_sudo=y +keep=n +output_dir=/var/lib/tftpboot +make_link=y +quiet= + +# No need to use sudo if we are root +if [ $UID -eq 0 ]; then + use_sudo=n +fi + +USAGE="Usage: $0 [-k|--kernel <kernel_ver>] [-n|--nolink] [-q|--quiet] [-l|--local] [--nosudo] [--keep] [--help] module_list ..." + +# Parse command-line options +while [ $# -gt 0 ]; do + case "$1" in + -l|--local) + shift + use_local=y ;; + -k|--kernel) + shift + kernel_ver=$1 + shift ;; + --nosudo) shift ; use_sudo=n ;; + --keep) shift ; keep=y ;; + --n|--nolink) + shift ; make_link=n ;; + -q|--quiet) shift ; quiet=-q ;; + --help) shift ; do_help=y ;; + --) shift ; break ;; + -*) echo "${0}: ${1}: invalid option" >&2 + echo $USAGE >& 2 + exit 2 ;; + *) break ;; + esac +done + +# Build list of requested modules +modules="$*" +requested_modules="$modules" +modules="$modules nfs" # Always require nfs for nfs mount +modules="$modules af_packet" # Always require af_packet for udhcpc + +# --help => Print help message +if [ "$do_help" == "y" ]; then + echo $USAGE + echo " -k, --kernel Specify kernel version" + echo " -n, --nolink Do not create a matching symbolic link" + echo " -l, --local Run locally from CVS (for developers only)" + echo " --nosudo Do not use sudo (i.e. must run as root instead)" + echo " --keep Keep temporary files instead of deleting them" + exit 0; +fi + +# --local => we are running directly from CVS, rather than +# from an installed copy, so use local files and directories +if [ "$use_local" == "y" ]; then + include_modules=./include-modules + initrd_skel=initrd-skel + output_dir=tftpboot +fi + +# If use_sudo is set, check that sudo exists +sudo=/usr/bin/sudo +if [ "$use_sudo" == "y" ]; then + if [ ! -x $sudo ]; then + use_sudo=n + echo "WARNING: --nosudo not specified but $sudo not found" + fi +fi +if [ "$use_sudo" == "n" ]; then + sudo= +fi + +# Create temporary working files +initrd=`mktemp -d ${tmpdir}/initrd.XXXXXX` +initrdimg=`mktemp ${tmpdir}/initrd.img.XXXXXX` +initrdmnt=`mktemp -d ${tmpdir}/initrd.mnt.XXXXXX` + +# Copy skeleton into temporary area +cp -a $initrd_skel/* $initrd/ +mkdir -p $initrd/lib/modules/$kernel_ver +$include_modules $quiet -k $kernel_ver -d $initrd/lib/modules/$kernel_ver $modules > $initrd/bin/insert-modules || exit 1 +chmod 755 $initrd/bin/insert-modules + +# Create empty ext2fs image file +dd if=/dev/zero bs=1k of=$initrdimg count=$((`du -sk $initrd | cut -f1` * 7 / 6)) 2> /dev/null +/sbin/mke2fs -q -F $initrdimg 2> /dev/null + +# Mount image file, copy files on, create /dev entries, display free space, umount +$sudo mount -o loop $initrdimg $initrdmnt +cp -a $initrd/* $initrdmnt/ +$sudo mknod $initrdmnt/dev/console c 5 1 +$sudo mknod $initrdmnt/dev/null c 1 3 +$sudo mknod $initrdmnt/dev/ram b 1 1 +$sudo mknod $initrdmnt/dev/systty c 4 0 +for i in 1 2 3 4; do $sudo mknod $initrdmnt/dev/tty$i c 4 $i; done +if [ "$quiet" == "n" ]; then + df -h $initrdmnt +fi +$sudo umount $initrdmnt + +# Create output file +initrd_suffix=`echo $requested_modules | tr " " .` +gzip -9 -n -c $initrdimg > $output_dir/initrd-$initrd_suffix.$kernel_ver.img + +# Create symlink +if [ "$make_link" == "y" ]; then + link=$output_dir/initrd-$initrd_suffix.img + [ -L $link ] && rm -f $link + ln -s initrd-$initrd_suffix.$kernel_ver.img $link +fi + +# Remove temporary files +if [ "$keep" == "n" ]; then + rm -rf $initrd + rm -f $initrdimg + rmdir $initrdmnt +fi diff --git a/contrib/initrd/mkinitrd-net.spec b/contrib/initrd/mkinitrd-net.spec new file mode 100644 index 00000000..94f5d9db --- /dev/null +++ b/contrib/initrd/mkinitrd-net.spec @@ -0,0 +1,112 @@ +%define name mkinitrd-net +%define version 1.10 +%define release 1fs + +Summary: Network-booting initrd builder +Name: %{name} +Version: %{version} +Release: %{release} +Source0: %{name}-%{version}.tar.bz2 +Source1: http://belnet.dl.sourceforge.net/sourceforge/etherboot/mknbi-1.2.tar.bz2 +Source2: http://www.busybox.net/downloads/busybox-0.60.3.tar.bz2 +Source3: http://www.uclibc.org/downloads/uClibc-0.9.11.tar.bz2 +Source4: ftp://ftp.linux-wlan.org/pub/linux-wlan-ng/linux-wlan-ng-0.1.13.tar.bz2 +Source5: http://udhcp.busybox.net/source/udhcp-0.9.7.tar.bz2 +Copyright: GPL/LGPL/MPL +Group: System/Kernel and hardware +BuildRoot: %{_tmppath}/%{name}-buildroot +Prefix: %{_prefix} +Requires: tftp-server + +%description +mkinitrd-net allows you to build initial ramdisk images (initrds) suitable +for use with Etherboot and other network-booting software. This package +contains two main utilities: mkinitrd-net (to build an initrd containing a +specified set of network-card modules) and mknbi (to generate +Etherboot-usable NBI images from a given kernel and initrd). It also +contains a helper script mknbi-set which will maintain sets of initrds to +match all your currently-installed kernels. + +mkinitrd-net uses code from the uClibc, busybox, udhcp and Etherboot +projects. + +%prep +%setup -n initrd -a1 -a2 -a3 -a4 -a5 + +%build +%make LIBDIR=%{_libdir}/mknbi + +%install +rm -rf $RPM_BUILD_ROOT +%makeinstall tftpbootdir=$RPM_BUILD_ROOT%{_localstatedir}/tftpboot +touch $RPM_BUILD_ROOT%{_sysconfdir}/dhcpd.conf.etherboot-pcimap.include +ln -s %{_localstatedir}/tftpboot $RPM_BUILD_ROOT/tftpboot + +%clean +rm -rf $RPM_BUILD_ROOT + +%post +%{_bindir}/mknbi-set + +%triggerin -- kernel kernel-smp kernel-secure kernel-enterprise +%{_bindir}/mknbi-set + +%files +%defattr(-,root,root) +%config(noreplace) %{_sysconfdir}/mknbi-set.conf +%config(noreplace) %{_sysconfdir}/dhcpd.conf.etherboot.include +%ghost %{_sysconfdir}/dhcpd.conf.etherboot-pcimap.include +%{_bindir}/mknbi-* +%{_bindir}/mkelf-* +%{_bindir}/dis* +%{_bindir}/mkinitrd-net +%{_bindir}/include-modules +%{_libdir}/mknbi +%{_libdir}/mkinitrd-net +%{_mandir}/man*/* +/tftpboot +%{_localstatedir}/tftpboot +%doc README +%doc AUTHORS.busybox LICENSE.busybox +%doc AUTHORS.udhcpc COPYING.udhcpc +%doc COPYING.wlanctl LICENSE.wlanctl THANKS.wlanctl +%doc COPYING.uClibc +%docdir %{_docdir}/mknbi* +%{_docdir}/mknbi* + +%changelog +* Fri Jul 26 2002 Michael Brown <mbrown@fensystems.co.uk> 1.10-1fs +- Support for new binary etherboot.nic-dev-id structure +- Added --kernel option patch from Stew Benedict at MandrakeSoft +- Only try to use sudo if we are not already root + +* Wed Jun 05 2002 Michael Brown <mbrown@fensystems.co.uk> 1.9-1fs +- Modifications to allow DHCP, TFTP and NFS servers to be separate machines. + +* Thu May 30 2002 Michael Brown <mbrown@fensystems.co.uk> 1.8-1fs +- /tftpboot symlinked to /var/lib/tftpboot +- Has ability to be quiet if "quiet" specified on kernel cmdline + +* Sun May 26 2002 Michael Brown <mbrown@fensystems.co.uk> 1.7-1fs +- PCI-ID auto-mapping via dhcpd.conf.etherboot-pcimap.include + +* Fri May 24 2002 Michael Brown <mbrown@fensystems.co.uk> 1.6-1fs +- Bugfixes, migrated /tftpboot to /var/lib/tftpboot + +* Thu May 23 2002 Michael Brown <mbrown@fensystems.co.uk> 1.5-1fs +- Now includes dhcpd.conf.etherboot.include +- Automatically scans for all network modules in the pcimap file + +* Wed May 08 2002 Michael Brown <mbrown@fensystems.co.uk> 1.4-1fs +- Bugfixes: tmpdir selection, linuxrc typos, ifconfig peculiarities + +* Sat May 04 2002 Michael Brown <mbrown@fensystems.co.uk> 1.3-1fs +- During %make, LIBDIR must be set for mknbi +- Added %post scriptlet since %trigger seems not to be being triggered... + +* Sat May 04 2002 Michael Brown <mbrown@fensystems.co.uk> 1.2-1fs +- Added extra sources instead of requiring "make" to download them + +* Sat May 04 2002 Michael Brown <mbrown@fensystems.co.uk> 1.1-1fs +- First attempt at an RPM package + diff --git a/contrib/initrd/mknbi-set b/contrib/initrd/mknbi-set new file mode 100755 index 00000000..e61acac9 --- /dev/null +++ b/contrib/initrd/mknbi-set @@ -0,0 +1,200 @@ +#!/usr/bin/perl -w +# +# $Id$ +# Maintains set of NBIs based on currently-installed kernels +# Network card module sets are taken from /etc/mknbi-set.conf + +use strict; +use vars qw($verbosity); + +use constant EB_PCI_DEVICE => 1; + +# Utility function: calculate output id given a kernel file name and +# space-separated list of modules +sub calc_output_id ($$) { + my $kernel = shift; + my $moduleset = shift; + my $kernel_ver = ""; + ( $kernel_ver ) = ( $kernel =~ /vmlinuz-(.*)$/ ); + ( my $output_id = "$moduleset".( $kernel_ver ? ".$kernel_ver" : "" ) ) =~ tr/,/./; + return ( $kernel_ver, $output_id ); +} + +# Utility function: read modules.pcimap-style file +# Add modules to modulesets hash, write out dhcpd.conf fragment +sub read_config_file ($$$$) { + my $configfile = shift; + my $modulesets = shift; + my $dhcpfh = shift; + my $alwaysuse = shift; + + print "Scanning through $configfile for network modules...\n" if $verbosity >= 1; + open CF, $configfile or die "Could not open $configfile: $!\n"; + chomp ( my $tempmodule = `mktemp /tmp/mknbi-set.XXXXXX` ); + chomp ( my $cwd = `pwd` ); chdir '/'; # Modprobe searches the current directory... + print $dhcpfh " \# Generated from $configfile\n"; + while (<CF>) { + chomp; + next if /^[\#;]/ or /^\s*$/; + ( my $module, undef, my $vendor, my $device ) = /^(\S+)(\s+(\S+)\s+(\S+))?/ ; + $modulesets->{$module} = 1 if $alwaysuse; + if ( ! exists $modulesets->{$module} ) { + # Check to see if module is a network module + # Only do this the first time we encounter a module + my @modulepaths = `/sbin/modprobe -l $module.o*` ; + chomp ( my $modulepath = $modulepaths[0] ); + if ( $modulepath ) { + if ( $modulepath =~ /.o.gz$/ ) { + system ( "zcat $modulepath > $tempmodule" ); + } else { + system ( "cp $modulepath $tempmodule" ); + } + $modulesets->{$module} = 0; + foreach ( `nm $tempmodule` ) { + chomp; + $modulesets->{$module} = 1 if /(ether|wlan)/ ; + } + unlink $tempmodule; + } else { + print STDERR "Cannot locate module $module specified in $configfile\n"; + } + } + if ( $modulesets->{$module} ) { + if ( $vendor ) { + print "$module ($vendor,$device) listed in $configfile\n" if $verbosity >= 2; + printf $dhcpfh ( " if option etherboot.nic-dev-id = %02x:%02x:%02x:%02x:%02x { option etherboot.kmod \"%s\"; }\n", + EB_PCI_DEVICE, + ( hex($vendor) >> 8 ) & 0xff, hex($vendor) & 0xff, + ( hex($device) >> 8 ) & 0xff, hex($device) & 0xff, + $module ); + } else { + print "$module (without PCI IDs) listed in $configfile\n" if $verbosity >= 2; + } + } + } + close CF; + print $dhcpfh "\n"; + chdir $cwd; +} + +my $conffile = '/etc/mknbi-set.conf'; +my $mkinitrd_net = 'mkinitrd-net'; +my $mknbi = 'mknbi-linux'; +my $output_dir = '/var/lib/tftpboot'; +my $dhcpfile = '/etc/dhcpd.conf.etherboot-pcimap.include'; +my $use_local; +our $verbosity = 1; +my $modulesets = {}; +my $kernel = ''; +my @kernels = (); + +my $usage="Usage: $0 [-l|--local] [-q] [-v] [-r|--refresh module[,module...]] [--help]"; + +# Parse command-line options +while ( $_ = shift ) { + if ( /-l|--local/ ) { + $conffile = 'mknbi-set.conf'; + $mkinitrd_net = './mkinitrd-net'; + $mknbi = './mknbi-linux --format=nbi --target=linux'; + $output_dir = 'tftpboot'; + $dhcpfile = 'tftpboot/dhcpd.conf.etherboot-pcimap.include'; + $use_local = 1; + } elsif ( /-r|--refresh/ ) { + my $moduleset = shift; + $modulesets->{$moduleset} = 1; + } elsif ( /-k|--kernel/ ) { + $kernel = shift; + } elsif ( /-v|--verbose/ ) { + $verbosity++; + } elsif ( /-q|--quiet/ ) { + $verbosity--; + } elsif ( /--help/ ) { + die "$usage\n". + " -k, --kernel Build NBIs for a particular kernel\n". + " -l, --local Run locally from CVS (for developers only)\n". + " -r, --refresh Refresh NBI for a particular module\n". + " -v, --verbose Be more verbose\n". + " -q, --quiet Be less verbose\n"; + } else { + die "$usage\n"; + } +} + +# Get set of current kernels +if ($kernel) { + @kernels = ( $kernel ); +} else { + @kernels = glob('/boot/vmlinuz*'); +} +die "Could not find any kernels in /boot\n" unless @kernels; + +# If modules have been specified via --refresh, do not scan for modules or rewrite the +# dhcpd.conf fragment file +unless ( %$modulesets ) { + # Write dhcpd.conf fragment file + open my $dhcpfh, ">$dhcpfile" or die "Could not open $dhcpfile for writing: $!\n"; + print $dhcpfh "# Etherboot PCI ID -> Linux kernel module mapping file\n"; + print $dhcpfh "# Generated by mknbi-set on ".(scalar localtime)."\n"; + print $dhcpfh "#\n"; + print $dhcpfh "if substring ( option vendor-class-identifier, 0, 9 ) = \"Etherboot\" {\n"; + print $dhcpfh " if exists etherboot.nic-dev-id {\n"; + print $dhcpfh " \# Legacy nic-dev-id mechanism: there are some DLink DFE538 cards in circulation that\n"; + print $dhcpfh " \# predated the change to the new nic-dev-id binary structure\n"; + print $dhcpfh " if option etherboot.nic-dev-id = \"PCI:1186:1300\" { option etherboot.kmod \"8139too\"; }\n"; + print $dhcpfh "\n"; + + # Get set of network modules to build NBIs for + # Read explicitly-specified module sets from $conffile + read_config_file($conffile, $modulesets, $dhcpfh, 1); + # Obtain list of all network modules from pcimap file + my $pcimap; + foreach ( `/sbin/modprobe -c` ) { + $pcimap = $1 if /^pcimap.*?=(.*)$/; + } + if ( $pcimap ) { + read_config_file($pcimap, $modulesets, $dhcpfh, 0); + } else { + print STDERR "Could not identify pcimap file\n"; + } + # Finish off dhcpd.conf fragment file + print $dhcpfh " }\n}\n"; + close $dhcpfh; +} + +# Build initrd and nbi for each kernel-moduleset combination +foreach my $moduleset ( sort keys %$modulesets ) { + next unless $modulesets->{$moduleset}; # Ignore if value is 0 + print "Building NBIs for module set $moduleset\n" if $verbosity >= 1; + foreach my $kernel ( @kernels ) { + ( my $kernel_ver, my $output_id ) = calc_output_id ( $kernel, $moduleset ); + if ( -l $kernel ) { + # Symbolic link; create matching symlink + my $real_kernel = readlink ( $kernel ); + ( my $real_kernel_ver, my $real_output_id ) = calc_output_id ( $real_kernel, $moduleset ); + print "Symlinking $output_id to $real_output_id\n" if $verbosity >= 2; + my $initrd_file = "$output_dir/initrd-$output_id.img"; + unlink ( $initrd_file ) if -l $initrd_file; + system ( "ln -s initrd-$real_output_id.img $initrd_file" ) == 0 or print STDERR "Could not symlink $initrd_file to initrd-$real_output_id.img: $!\n"; + my $nbi_file = "$output_dir/boot-$output_id.nbi"; + unlink ( $nbi_file ) if -l $nbi_file; + system ( "ln -s boot-$real_output_id.nbi $nbi_file" ) == 0 or print STDERR "Could not symlink $nbi_file to boot-$real_output_id.nbi: $!\n"; + } else { + # Real file: create initrd and nbi + print "Creating initrd and nbi for $output_id\n" if $verbosity >= 2; + ( my $moduleset_spaces = $moduleset ) =~ tr/,/ /; + my $initrd_cmd = "$mkinitrd_net --nolink ". + ( $use_local ? "--local " : "" ). + ( $kernel_ver ? "--kernel $kernel_ver " : "" ). + ( $verbosity >= 2 ? "" : "-q " ). + $moduleset_spaces; + print "$initrd_cmd\n" if $verbosity >= 3; + if ( system ( $initrd_cmd ) == 0 ) { + my $mknbi_cmd = "$mknbi $kernel $output_dir/initrd-$output_id.img > $output_dir/boot-$output_id.nbi"; + print "$mknbi_cmd\n" if $verbosity >= 3; + system ( $mknbi_cmd ) == 0 or print STDERR "mknbi failed: $!\n"; + } else { + print STDERR "$initrd_cmd failed: $!\n"; + } + } + } +} diff --git a/contrib/initrd/mknbi-set.conf b/contrib/initrd/mknbi-set.conf new file mode 100644 index 00000000..f24846ca --- /dev/null +++ b/contrib/initrd/mknbi-set.conf @@ -0,0 +1,27 @@ +# This file specifies the network cards for which NBI images should be built +# Each line contains a list of kernel modules to be used, separated by commas +# You can optionally specify PCI vendor and device IDs that should be automatically +# mapped to this module. +# +# The format is similar to modutils' modules.pcimap file. +# +# Examples: +# RTL8139-based ethernet card +; 8139too +# RTL8139-based ethernet card with PCI IDs vendor=0x1186, device=0x1300 +; 8139too 0x1186 0x1300 +# RTL8139 and Prism2_pci in same image +; 8139too,prism2_pci + +# Some modules do not include the MODULE_DEVICE_TABLE macro, and so end up not +# being listed in the pcimap file. These modules are included here to force +# the creation of corresponding initrds. +prism2_pci 0x1260 0x3873 +prism2_plx 0x1638 0x1100 +prism2_plx 0x16ab 0x1101 +prism2_plx 0x16ab 0x1102 +prism2_plx 0x1385 0x4100 +prism2_plx 0x15e8 0x0130 +prism2_plx 0x16ec 0x3685 +prism2_plx 0x16ab 0x1102 +prism2_plx 0x15e8 0x0131 diff --git a/contrib/initrd/script.c.patch b/contrib/initrd/script.c.patch new file mode 100644 index 00000000..127b881c --- /dev/null +++ b/contrib/initrd/script.c.patch @@ -0,0 +1,11 @@ +--- script.c.orig Tue Apr 2 23:49:33 2002 ++++ script.c Wed Jun 5 14:17:22 2002 +@@ -179,7 +179,7 @@ + } + if (packet->siaddr) { + envp[j] = malloc(sizeof("siaddr=255.255.255.255")); +- sprintip(envp[j++], "siaddr=", (unsigned char *) &packet->yiaddr); ++ sprintip(envp[j++], "siaddr=", (unsigned char *) &packet->siaddr); + } + if (!(over & FILE_FIELD) && packet->file[0]) { + /* watch out for invalid packets */ diff --git a/contrib/initrd/udhcpc-post b/contrib/initrd/udhcpc-post new file mode 100644 index 00000000..395d6c59 --- /dev/null +++ b/contrib/initrd/udhcpc-post @@ -0,0 +1,25 @@ +#!/bin/sh +# $Id$ + +if [ "$1" = "deconfig" ]; then + ifconfig $interface 0.0.0.0 up +else if [ "$1" = "bound" ] ; then + echo UDHCPC: I am $ip [$hostname], booting from $serverid + [ -n "$hostname" ] && echo $hostname > /proc/sys/kernel/hostname + [ -n "$broadcast" ] && BROADCAST="broadcast $broadcast" + [ -n "$subnet" ] && NETMASK="netmask $subnet" + ifconfig $interface $ip $BROADCAST $NETMASK + route add default gw $router dev $interface + echo -n > /etc/resolv.conf + for i in $dns; do + echo nameserver $i >> /etc/resolv.conf + done + [ -n "$siaddr" ] || siaddr=$serverid + [ -n "$rootpath" ] || rootpath=$siaddr:/ + echo Mounting root filesystem $rootpath at /sysroot + echo If this appears to hang, check that the server of $rootpath is able to + echo reverse-map my IP address $ip to obtain my hostname $hostname + mount -t nfs -o nolock,rsize=8192,wsize=8192 $rootpath /sysroot + fi +fi + |