summaryrefslogtreecommitdiffstats
path: root/contrib/mkffwnb
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/mkffwnb')
-rwxr-xr-xcontrib/mkffwnb/2.0.10/linuxrc76
-rw-r--r--contrib/mkffwnb/Extendinitrd.pm43
-rw-r--r--contrib/mkffwnb/README69
-rwxr-xr-xcontrib/mkffwnb/mkffwnb.pl226
4 files changed, 414 insertions, 0 deletions
diff --git a/contrib/mkffwnb/2.0.10/linuxrc b/contrib/mkffwnb/2.0.10/linuxrc
new file mode 100755
index 00000000..351679c7
--- /dev/null
+++ b/contrib/mkffwnb/2.0.10/linuxrc
@@ -0,0 +1,76 @@
+#!/bin/sh
+#
+# floppyfw initfile
+#
+# nicked from:
+# hal91's initfile (/linuxrc), the bootup script of the system
+#
+
+VERSION=2.1.6
+
+load_fsmod () {
+ case $1 in
+ /dev/hd*)
+ insmod ide-cd
+ insmod cdrom
+ ;;
+ esac
+ case $2 in
+ vfat)
+ echo vfat support is builtin
+ ;;
+ iso9660)
+ insmod isofs
+ ;;
+ esac
+}
+
+#
+/bin/busybox echo "Booting floppyfw"
+
+PATH="/bin:/sbin:/usr/bin:/usr/sbin"
+#PATH="/bin"
+TERM=linux
+ignoreeof=10
+no_exit_on_failed_exec=yes
+export PATH TERM ignoreeof
+umask 022
+
+/bin/busybox echo "mounting: proc"
+/bin/busybox mount -t proc /proc /proc
+
+/bin/busybox echo "Generating links. (Thanks to busybox.lineo.com)"
+/bin/busybox --install -s
+
+echo "Generated"
+
+# Modified by Gem, based on coyote distro, changes by Ken Yap
+ROOTDEV=`sed -e 's/$/ /' -e 's/.*root=\([^ ]*\) .*/\1/' -e 's/,/ /g' -e 's:/dev/nfs:/dev/fd0:' /proc/cmdline`
+set -- $ROOTDEV
+# Backward compatibility with a single device argument
+if [ $# -eq 1 ]
+then
+ set -- $1 vfat
+fi
+while [ "$1" -a "$2" ]
+do
+ echo "attempting to mount $1 ($2)"
+ load_fsmod $1 $2
+ if mount -t $2 $1 /mnt/tmp
+ then
+ echo "mounted $1 on /mnt/tmp"
+ break
+ fi
+ shift; shift
+done
+
+[ -f /mnt/tmp/floppyfw/floppyfw.ini ] && cat /mnt/tmp/floppyfw/floppyfw.ini \
+| tr -d '\015' >/floppyfw.ini
+
+[ -f /floppyfw.ini ] && chmod 777 /floppyfw.ini
+[ -f /floppyfw.ini ] && exec /floppyfw.ini
+
+echo
+echo "** floppyfw.ini failed.. starting a shell"
+echo
+exec sh
diff --git a/contrib/mkffwnb/Extendinitrd.pm b/contrib/mkffwnb/Extendinitrd.pm
new file mode 100644
index 00000000..3b919ad1
--- /dev/null
+++ b/contrib/mkffwnb/Extendinitrd.pm
@@ -0,0 +1,43 @@
+#!/usr/bin/perl -w
+
+sub status_system ($$) {
+ my ($command, $message) = @_;
+
+ $status = system($command);
+ $status <<= 8;
+ if ($status < 0) {
+ print STDERR "$!\n";
+ }
+ if ($status != 0) {
+ print STDERR "$message\n";
+ }
+}
+
+sub extendinitrd ($$) {
+ my ($initrd, $nblocks) = @_;
+
+ if ($nblocks <= 1440) {
+ print STDERR "nblocks must be >= 1440\n";
+ return (1);
+ }
+ (undef, $type, undef, $fnlen, undef) = split(' ', `file $initrd`, 5);
+ print "$type $fnlen\n";
+ if ($type ne 'Minix' || $fnlen != 30) {
+ die "Can only handle Minix initrds with 30 char filenames\n";
+ return (1);
+ }
+ status_system("dd if=/dev/zero of=newinitrd bs=1k count=$nblocks", "Cannot create new initrd\n");
+ status_system("mkfs.minix -n 30 newinitrd $nblocks", "Cannot mkfs.minix new initrd\n");
+ mkdir("initrd.from") || print STDERR "Cannot make temp mount point initrd.from\n";
+ mkdir("initrd.to") || print STDERR "Cannot make temp mount point initrd.to\n";
+ status_system("mount -o ro,loop $initrd initrd.from", "Cannot mount $initrd on initrd.from");
+ status_system("mount -o loop newinitrd initrd.to", "Cannot mount newinitrd on initrd.to");
+ status_system("cp -a initrd.from/* initrd.to/", "Cannot copy initrd to newinitrd");
+ status_system("umount initrd.from", "Cannot umount initrd.from");
+ status_system("umount initrd.to", "Cannot umount initrd.to");
+ rmdir("initrd.from") || print STDERR "Cannot remove temp mount point initrd.from\n";
+ rmdir("initrd.to") || print STDERR "Cannot remove temp mount point initrd.to\n";
+ return (0);
+}
+
+1;
diff --git a/contrib/mkffwnb/README b/contrib/mkffwnb/README
new file mode 100644
index 00000000..38df4769
--- /dev/null
+++ b/contrib/mkffwnb/README
@@ -0,0 +1,69 @@
+This is a quick and dirty script to convert a floppyfw floppy
+(http://www.zelow.no/floppyfw/) to a tagged image for booting with
+Etherboot (http://etherboot.sourceforge.net/). The advantages of network
+booting include: it's much faster loading from the network than from a
+floppy disk, you can boot from any size floppy, and you are not limited
+to the maximum of 1.44 MB of the physical floppy. If you have enough RAM
+and use a virtual floppy to build the initial boot image, you can put as
+much on it as will fit the ramdisk.
+
+See further down under -nonet if you want to boot from HD or CDROM.
+
+This program requires mtools, tar, bzip2, loopback mount in the kernel,
+and root privileges to execute. Hope you have them.
+
+This script works for any of the releases for which a subdirectory of
+that name is provided, but it should not be too hard to make it work for
+other releases, all that is done here is to substitute some scripts for
+the distributed ones.
+
+First of all you should make the floppy work the way you want before
+converting it to a tagged image. This involves editing the various
+config files on the floppy. Instructions on this are distributed from
+the floppyfw web page mentioned above.
+
+Edit the $tftpdir assignment for the directory where you put your tagged
+images. Edit the $libdir assignment and the use lib directive near the
+top if you decide to put this package somewhere other than
+/usr/local/lib/mkffwnb/. Adjust the instructions below as necessary.
+
+Copy everything to $libdir.
+
+ mkdir -p /usr/local/lib/mkffwnb/
+ cp -a . /usr/local/lib/mkffwnb/
+
+Make a link from /usr/local/lib/mkffwnb/mkffwnb.pl to
+/usr/local/bin/mkffwnb so that it's in your path.
+
+ ln -s /usr/local/lib/mkffwnb/mkffwnb.pl /usr/local/bin/mkffwnb
+
+Then run it as:
+
+ mkffwnb
+
+You can also provide a floppy drive as an argument, e.g.
+
+ mkffwnb x:
+
+where x: could be mapped to a disk file. This allows you to build an
+image without a real floppy drive. Remember that for virtual drives root
+must have the mapping for the drive in question in ~root/.mtoolsrc.
+
+You can use the option --localtime=/etc/localtime to specify that the
+file /etc/localtime is to be copied to /etc/localtime on the initrd.
+Instead of /etc/localtime, you can use any of the timezone files under
+/usr/share/zoneinfo/, it's just that /etc/localtime will usually be the
+correct one for your timezone.
+
+If you use the option -nonet, it leaves the intermediate files in
+$tempdir, /tmp/mkffwnb by default. This is useful if you want the
+vmlinuz and initrd.gz files for use with LILO or isolinux to boot from
+HD or CDROM. Actually you can also use these with a floppy, it loads
+faster if you fold all the scripts and modules into the initrd ahead
+of time.
+
+mkffwnb has to be run as root because it uses loopback mounts and also
+because the files inside the initrd are owned by root.
+
+Ken Yap
+2003-04-20
diff --git a/contrib/mkffwnb/mkffwnb.pl b/contrib/mkffwnb/mkffwnb.pl
new file mode 100755
index 00000000..555ec3ca
--- /dev/null
+++ b/contrib/mkffwnb/mkffwnb.pl
@@ -0,0 +1,226 @@
+#!/usr/bin/perl -w
+#
+# Perl script to make a bootable image from a floppyfw floppy
+# The basic idea is to unpack and replace or convert all
+# the necessary config files into the initrd
+# and then make a bootable image out of it
+#
+# The --format= option overrides the default of nbi or elf hardcoded
+# in the source. Valid arguments are nbi or elf.
+#
+# The --output= options specifies an output file instead of stdout
+# The --nonet option specifies that a netbootable image is not to
+# be built but the vmlinuz and initrd.gz files left behind in $tempdir
+# The --localtime=f option specifies a timezone file that's to be
+# copied to /etc/localtime in the initrd, allowing a different timezone.
+# The --ffw29 option is intended for 2.9.x and above and extends
+# the size of the initrd by making a bigger one and copying the original over.
+#
+# The first non-option argument is taken to be the letter of a floppy to
+# convert, e.g. a:, b: or even x: where x: is mapped to a file using
+# mtools mapping in $HOME/.mtoolsrc. See the mtools documentation.
+# Thus you can work on a floppy image in a disk file and only write
+# to a floppy with dd or cp when you need to test the image.
+
+use Getopt::Long;
+
+use lib '/usr/local/lib/mkffwnb/';
+use Extendinitrd;
+
+use strict;
+
+use vars qw($testing $verbose $localtime $nonet $format $ffw29 $imagefile
+ $floppy $libdir $tftpdir $output $tempdir $tempmount);
+
+sub findversion () {
+ my ($version) = grep(/FloppyFW/, `mtype $imagefile ${floppy}floppyfw.msg`);
+ return '' unless defined($version) and $version ne '';
+ chomp($version);
+ $version =~ s/.*FloppyFW (\d+\.\d+\.\d+(\.\d+)?).*/$1/;
+ return ($version);
+}
+
+sub getappendargs () {
+ my ($append) = join(' ', grep(/^\s*(append\s|console=)/, `mtype $imagefile ${floppy}syslinux.cfg`));
+ chomp ($append);
+ my @args = split(/\s+/, $append);
+ my @result = ();
+ foreach $_ (@args) {
+ next if (/^$/ or /^append/ or /^initrd=/);
+ next if (!$ffw29 and /^root=/);
+ push (@result, $_);
+ }
+ return (join(' ', @result));
+}
+
+# Copy whole floppy to the current directory
+# m preserves timestamps, n overwrites without warning and / means recursive
+sub mcopy ($) {
+ my ($tempdir) = @_;
+
+ print "mcopy $imagefile -mn/ ${floppy}* $tempdir\n";
+ my $status = system("mcopy -mn/ $imagefile ${floppy}* $tempdir");
+ return ($status / 256);
+}
+
+# Gunzip file, -f forces overwriting of uncompressed file
+sub gunzip ($) {
+ my ($file) = @_;
+
+ print "Gunzipping $file\n" if ($verbose);
+ my $status = system('gunzip', '-f', $file);
+ return ($status / 256);
+}
+
+# Gzip file, -f forces overwriting of compressed file
+sub gzip ($) {
+ my ($file) = @_;
+
+ print "Gzipping $file\n" if ($verbose);
+ my $status = system('gzip', '-9', '-f', $file);
+ return ($status / 256);
+}
+
+sub loopbackmount ($$) {
+ my ($file, $point) = @_;
+
+ print "Mounting $file on $point loopback\n" if ($verbose);
+ my $status = system('mount', '-o', 'loop', $file, $point);
+ return ($testing ? 0 : $status / 256);
+}
+
+sub loopbackumount ($) {
+ my ($point) = @_;
+
+ print "Umounting $point\n" if ($verbose);
+ my $status = system('umount', $point);
+ return ($testing ? 0 : $status / 256);
+}
+
+# Convert DOS CR-NL to Unix NL. $dst has implied prefix of $tempmount
+# Use @output for temporary storage in case we write back to the same file
+sub dostounix ($$) {
+ my ($src, $dst) = @_;
+ my @output = ();
+
+ $dst = "$tempmount/$dst";
+ print "Converting $src to $dst\n" if ($verbose);
+ unless (open(S, $src)) {
+ print "$src: $!\n";
+ return (0);
+ }
+ while (<S>) {
+ chomp;
+ tr /\015//d;
+ push(@output, $_);
+ }
+ close(S);
+ open(D, ">$dst") or return;
+ for $_ (@output) {
+ print D "$_\n";
+ }
+ close(D);
+ chmod(0755, $dst);
+ return (1);
+}
+
+sub bunzip2untar ($$) {
+ my ($file, $dir) = @_;
+
+ print "Unpacking $file into $dir\n" if ($verbose);
+ system("bunzip2 < $file | (cd $dir; tar xf -)");
+}
+
+$testing = $< != 0;
+$verbose = 1;
+$format = '';
+$imagefile = '';
+GetOptions('output=s' => \$output,
+ 'nonet!' => \$nonet,
+ 'localtime=s' => \$localtime,
+ 'format=s' => \$format,
+ 'ffw29!' => \$ffw29,
+ 'ffw30!' => \$ffw29,
+ 'i=s' => \$imagefile);
+if (defined($output) and $output !~ m(^/)) {
+ my $d = `pwd`;
+ chomp($d);
+ $output = "$d/$output";
+}
+if ($imagefile) {
+ $imagefile = "-i $imagefile";
+}
+$libdir = '/usr/local/lib/mkffwnb';
+$tftpdir = '/usr/local/var/tftpboot';
+# default can also be 'elf'
+$format = 'nbi' if ($format ne 'elf' and $format ne 'nbi');
+$floppy = $#ARGV >= 0 ? $ARGV[0] : 'a:';
+print <<EOF;
+This program requires mtools, tar, bzip2, loopback mount in the kernel,
+and root privileges to execute. Hope you have them.
+EOF
+my $version = &findversion();
+$version ne '' or die "Cannot determine version\n";
+print "Version $version\n";
+my $append = &getappendargs();
+$append = "--append='$append'" if $append ne '';
+print "$append\n";
+$libdir .= '/' . $version;
+-d $libdir or die "Cannot find files for $version\n";
+$tempdir = $nonet ? '/tmp/mkffwnb' : "/tmp/mkffwnb$$";
+$tempmount = 'tmpmount';
+mkdir($tempdir, 0755);
+print "Copying files off floppy, please be patient...\n";
+&mcopy($tempdir) == 0 or die "Mcopy failed, diskette problem?\n";
+chdir($tempdir);
+&gunzip('initrd.gz') == 0 or die "Gunzip of initrd.gz failed\n";
+if ($ffw29) {
+ extendinitrd("initrd", 5760);
+ system("mv newinitrd initrd");
+}
+mkdir($tempmount, 0755);
+&loopbackmount('initrd', $tempmount) == 0 or die "Loopback mount failed\n";
+&dostounix("$libdir/linuxrc", "linuxrc") if (-r "$libdir/linuxrc");
+unless (&dostounix("$libdir/floppyfw.ini", "floppyfw.ini")) {
+ &dostounix("floppyfw/floppyfw.ini", $ffw29 ? "etc/floppyfw.ini" : "floppyfw.ini");
+}
+&dostounix("config", $ffw29 ? "etc/config.prelogin" : "etc/config");
+for my $i (glob('*.bz2 floppyfw/add.bz2 modules/*.bz2 packages/*.bz2')) {
+ &bunzip2untar($i, $tempmount);
+}
+for my $i (glob('packages/*.ini')) {
+ my $file = $i;
+ $file =~ s:packages/::;
+ &dostounix($i, "etc/$file");
+}
+&dostounix("hosts", "etc/hosts");
+&dostounix("modules.lst", "etc/modules.lst");
+&dostounix("network.ini", "etc/network.init");
+&dostounix("firewall.ini", "etc/firewall.init");
+&dostounix("syslog.cfg", "etc/syslog.conf");
+&dostounix("packages/timeinfo", "etc/localtime");
+system("cp -p licenses/* $tempmount/licenses/");
+# This conditional code is for 1.1.2 and below
+unless (glob('modules/*.bz2')) {
+ print "Copying additional modules\n" if ($verbose);
+ system("cp -p modules/* $tempmount/lib/modules/");
+}
+# If a timezone file has been specified, copy that onto initrd
+if (defined($localtime)) {
+ if (-r $localtime) {
+ print "Copying $localtime to $tempmount/etc/localtime\n";
+ system("cp -p $localtime $tempmount/etc/localtime");
+ } else {
+ print "$localtime: $!\n";
+ }
+}
+&loopbackumount($tempmount) == 0 or die "Loopback umount failed\n";
+&gzip('initrd') == 0 or die "Gzip of initrd failed\n";
+if ($nonet) {
+ print "Floppyfw directory in $tempdir\n";
+} else {
+ print "Calling mk$format-linux to make the netbootable image\n" if ($verbose);
+ $output = "$tftpdir/floppyfw-$version.nb" if (!defined($output));
+ system("mk$format-linux $append --output=$output vmlinuz initrd.gz");
+ system("rm -fr $tempdir");
+}