utility to create rootfs to fit on a floppy this filesystem contains busybox based Linux commands and a basic shell. use this floppy to boot the machine.
diff --git a/tools/mkrootfs/mkrootfs b/tools/mkrootfs/mkrootfs
new file mode 100755
index 0000000..1d3d3fc
--- /dev/null
+++ b/tools/mkrootfs/mkrootfs
@@ -0,0 +1,535 @@
+#! /bin/sh
+################################################################################
+## ##
+## Copyright (c) International Business Machines Corp., 2001 ##
+## ##
+## This program is free software; you can redistribute it and#or modify ##
+## it under the terms of the GNU General Public License as published by ##
+## the Free Software Foundation; either version 2 of the License, or ##
+## (at your option) any later version. ##
+## ##
+## This program 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. See the GNU General Public License ##
+## for more details. ##
+## ##
+## You should have received a copy of the GNU General Public License ##
+## along with this program; if not, write to the Free Software ##
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ##
+## ##
+################################################################################
+# File: mkrootfs
+#
+# Description: script to create rootfs that will fit on a floppy. This
+# filesystem contains a staticly linked busybox that provides
+# basic commands and a shell.
+#
+# Author: Manoj Iyer - manjo@mail.utexas.edu
+#
+# History: June 17 2003 - Created.
+#
+
+
+TWDIR=/tmp/mkrootfs.$$ # temporary working directory
+
+clean()
+{
+ echo "INFO: Cleaning and exiting program"
+
+ mount | grep "$TWDIR/mnt" 2>&1 >/dev/null && \
+ {
+ echo "INFO: unmounting $TWDIR/mnt"
+ umount $TWDIR/mnt 2>&1 >/dev/null || \
+ {
+ echo "WARNING: failed unmounting temporary device."
+ echo "WARNING: clean up temporary devices manually"
+ }
+ }
+
+ rm -fr $TWDIR 2>&1 >/dev/null || \
+ {
+ echo "WARNING: failed to remove temporary working directory"
+ echo "WARNING: clean up temporary files and directories manually"
+ }
+
+ [ -a ./busybox-0.60.5.tar.gz ] && \
+ {
+ rm ./busybox-0.60.5.tar.gz 2>&1 >/dev/null || \
+ {
+ echo "WARNING: unable to remove busybox tarball"
+ echo "WARNING: clean up temporary files and directories manually"
+ }
+ }
+}
+
+
+usage()
+{
+ echo "Usage: `basename $0` [-b] -c -d <HDDTYPE> -f <fSTYPE> -h"
+ echo " "
+ echo " "
+ echo " -b location of the staticly linked busybox binary."
+ echo " (if you dont provide one, this script will build one)"
+ echo " -c creates rootfs on floppy."
+ echo " (if this option is not provided rootfs.gz will be "
+ echo " created in the current working directory.)"
+ echo " -d <HDDTYPE> options available are scsi or ide"
+ echo " -f <FSTYPE> options available are ext2, ext3, reiserfs, xfs"
+ echo " -h help"
+ echo " "
+ echo "Example: `basename $0` -b /tmp/busybox-dir/ -c -d ide -f ext2"
+ exit 0
+}
+
+
+help()
+{
+ echo "This program will create a root file system with busybox commads."
+ echo "Follow these steps to boot your machine with this file system"
+ echo "1. create a boot floppy."
+ echo " - dd if=<path>/bzImage of=/dev/fd0h1440 bs=1k"
+ echo "2. create a root floppy "
+ echo " - using this program eg: $0 -c -d scsi -f ext2 "
+ echo "3. boot machine with kernel in boot floppy"
+ echo " - provide boot options root=/dev/fd0h1440 (floppy device)"
+ echo "4. insert root floppy when prompted by the kernel."
+ echo " "
+ echo " "
+ usage
+}
+
+
+main()
+{
+ local SYS_DIR=" " # names of various system directory
+ local SYS_DEV=" " # names of various system devices
+ local RC=0 # return value from commands.
+ local FORCEREI=" " # force mkfs.reiserfs to be quite
+ local CREATEFD=0 # flag to create floppy or just image
+ local FSTYPE=ext2 # file system type default is ext2
+ local HDDTYPE=ide # HDD type SCSI or IDE default: ide
+ local BBLOC="NONE" # location of static busybox binary.
+
+ # parse input arguments
+ while getopts b:cd:f:h arg
+ do case $arg in
+ b) BBLOC=$OPTARG;;
+ c) CREATEFD=1;;
+ d) HDDTYPE=$OPTARG;;
+ f) FSTYPE=$OPTARG;;
+ h) help;;
+ \?) usage;;
+ esac
+ done
+
+ # on exit clean up all temporary files and directories.
+ trap "clean" 0
+
+ # create temporary working directory
+ mkdir -p $TWDIR 2>&1 || \
+ {
+ echo "FAILED: creating temporary working directory"
+ exit 1
+ }
+
+ # make block or character special files called ramdisk_fs
+ mknod $TWDIR/ramdisk_fs b 1 0 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: creating block file $TWDIR/ramdisk_fs"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1;
+ }
+
+ # create a file system of required size, zeroing is important because
+ # the filesystem will be compressed before its put on a floppy, zeroing
+ # achives maximum compression. Creating a block file of size 8K.
+
+ dd if=/dev/zero of=$TWDIR/ramdisk_fs bs=1k count=8 \
+ 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: unable create filesystem of 8K size"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+
+ # create the filesystem, EXT2 file system will be default.
+ if [ $FSTYPE == "ext2" ]; then
+ mke2fs -v -m 0 -N 2000 $TWDIR/ramdisk_fs 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: unable to create EXT2 filesystem on block file."
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+ else
+ [ "$FSTYPE" == "reiserfs" ] && \
+ {
+ FORCEREI="-f -f";
+ }
+ mkfs.$FSTYPE $FORCEREI $TWDIR/ramdisk_fs 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: unable to create $FSTYPE filesystem on block file."
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+ fi
+
+ # mount this filesystem so that it can be populated with system files and
+ # commands.
+
+ # create a temporary mount directory.
+
+ mkdir -p $TWDIR/mnt 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: creating temporary mount directory"
+ exit 1
+ }
+
+ mount -o loop $TWDIR/ramdisk_fs $TWDIR/mnt 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: unable to mount block file TWDIR/ramdisk_fs on $TWDIR/mnt"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+
+ # remove lost+found directory from the rootfs file system, this is not
+ # required.
+
+ rm -fr $TWDIR/mnt/lost+found 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "WARNING: unable to remove lost+found from $TWDIR/mnt/ directory"
+ echo "WARNING: `cat $TWDIR/crfs.out`"
+ }
+
+ # create system directories.
+
+ for SYS_DIR in bin boot dev etc etc/init.d etc/rc.d lib mnt opt proc \
+ root sbin tmp usr usr/bin usr/sbin usr/lib usr/share \
+ var var/lock var/log var/run var/lib/rpm
+ do
+ mkdir -p $TWDIR/mnt/$SYS_DIR 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: creating $SYS_DIR"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+ done
+
+ # initialize RPM database, just in case any RPMs will be installed to this
+ # root filesystem.
+ rpm --initdb --root=$TWDIR/mnt 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "WARNING: initializing RPM database."
+ echo "WARNING: cat `$TWDIR/crfs.out`"
+ }
+
+ # setting up the /etc directory, the three main files that will
+ # be created are fstab, rc.sysinit and inittab.
+
+ # create the inittab file.
+ cat > $TWDIR/mnt/etc/inittab <<-EOF || RC=$?
+ ::sysinit:/etc/rc.d/rc.sysinit
+ ::askfirst:/bin/sh
+ EOF
+
+ [ $RC -ne 0 ] && \
+ {
+ echo "FAILED: creating inittab file"
+ exit 1
+ }
+
+ # changing perissions if inittab file to 644
+ chmod 644 $TWDIR/mnt/etc/inittab 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: changing permissions of $TWDIR/mnt/etc/inittab"
+ exit 1
+ }
+
+ # create a /etc/rc.d/rc.sysinit file.
+ cat > $TWDIR/mnt/etc/rc.d/rc.sysinit <<-EOF || RC=$?
+ #!/bin/sh
+
+ mount -a -n
+ EOF
+
+ [ $RC -ne 0 ] && \
+ {
+ echo "FAILED: creating rc.sysinit file"
+ exit 1
+ }
+
+ # changing perissions of rc.sysinit file to 755
+ chmod 755 $TWDIR/mnt/etc/rc.d/rc.sysinit 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: changing permissions of $TWDIR/mnt/etc/rc.d/rc.sysinit"
+ exit 1
+ }
+
+
+ # creating etc/fstab file.
+ cat > $TWDIR/mnt/etc/fstab <<-EOF || RC=$?
+ /dev/ram0 / ext2 defaults 0 0
+ dev/fd0 / ext2 defaults 0 0
+ /proc /proc proc defaults 0 0
+ none /tmp tmpfs defaults 0 0
+ EOF
+
+ [ $RC -ne 0 ] && \
+ {
+ echo "FAILED: creating etc/fstab file"
+ exit 1
+ }
+
+ # changing perissions of rc.sysinit file to 644
+ chmod 644 $TWDIR/mnt/etc/fstab 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: changing permissions of $TWDIR/mnt/etc/fstab"
+ exit 1
+ }
+
+ # setting up /dev directory. Assuming that this script is
+ # executed on a linux system, contents of /dev directory of the
+ # host system will simply be copied to the rootfs file. Alternatively
+ # the mknod command may be used to create
+ # each device file. But the former is quick and easy.
+
+ # set up floppy drives. /dev/null and /dev/console
+ for SYS_DEV in /dev/fd[01]* /dev/null /dev/console /dev/zero
+ do
+ cp -dpR $SYS_DEV $TWDIR/mnt/dev 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: creating $SYS_DEV on $TWDIR/mnt/dev"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+ done
+
+ # set up scsi or ide devices.
+
+ if [ "$HDDTYPE" == "scsi" ] || [ "$HDDTYPE" == "SCSI" ]
+ then
+ # set up SCSI cdrom drives.
+ cp -dpR /dev/sr0 $TWDIR/mnt/dev 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: creating SCSI cdrom device on $TWDIR/mnt/dev"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+
+ # set up SCSI hard drives.
+ cp -dpR /dev/sd* $TWDIR/mnt/dev 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: creating SCSI cdrom device on $TWDIR/mnt/dev"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+ elif [ "$HDDTYPE" == "ide" ] || [ "$HDDTYPE" == "IDE" ] ; then
+ # set up IDE cdrom drive.
+ cp -dpR /dev/cdrom $TWDIR/mnt/dev 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: creating SCSI cdrom device on $TWDIR/mnt/dev"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+
+ # set up IDE hard drives.
+ cp -dpR /dev/hd* $TWDIR/mnt/dev 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: creating SCSI cdrom device on $TWDIR/mnt/dev"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+ else
+ echo "FAILED: unknown hardware type:"
+ usage
+ fi
+
+
+ # setting up busybox.
+
+ if [ "$BBLOC" == "NONE" ]
+ then
+ echo "ÏNFO: downloading busybox from www.busybox.net"
+ wget -q -c http://www.busybox.net/downloads/busybox-0.60.5.tar.gz \
+ 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: fetching busybox from www.busybox.net"
+ exit 1
+ }
+
+ tar zxf ./busybox-0.60.5.tar.gz 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: uncompressing busybox tar ball"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+
+
+ mv ./busybox-0.60.5 $TWDIR/ 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: moving busybox dir to temporary working dir"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+
+ echo "INFO: Compiling static busybox... this will take few minutes"
+
+ make -C $TWDIR/busybox-0.60.5 clean 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: compiling static busybox."
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+
+ make -C $TWDIR/busybox-0.60.5 DOSTATIC=true 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: compiling static busybox."
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+
+ cp $TWDIR/busybox-0.60.5/busybox $TWDIR/mnt/bin/ 2>&1 \
+ >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: copying busybox binary to $TWDIR/mnt/bin/"
+ exit 1
+ }
+ elif [ -z $BBLOC ]; then
+ echo "FAILED: bad path for static busybox"
+ usage
+ else
+ cp $BBLOC/busybox $TWDIR/mnt/bin/ 2>&1 \
+ >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: copying busybox binary to $TWDIR/mnt/bin/"
+ exit 1
+ }
+ fi
+
+ echo "INFO: installing busybox"
+ # set up / directory
+ ln -f $TWDIR/mnt/bin/busybox $TWDIR/mnt/linuxrc 2>&1 \
+ >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: linking busybox to linuxrc"
+ exit 1
+ }
+
+ # set up /usr/sbin directory
+ ln -f $TWDIR/mnt/bin/busybox $TWDIR/mnt/usr/sbin/chroot 2>&1 \
+ >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: linking busybox to chroot"
+ exit 1
+ }
+
+ # set up /bin directory
+ for SYS_CMD in ash chmod dd false kill mknod pidof rmdir sync umount \
+ chown df grep ln more ps sed tar uname cat cp dmesg \
+ gunzip ls mount pwd sh touch zcat chgrp date echo gzip \
+ mkdir mv rm sleep true
+ do
+ ln -f $TWDIR/mnt/bin/busybox $TWDIR/mnt/bin/$SYS_CMD 2>&1 \
+ >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: linking busybox to $SYS_CMD"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+ done
+
+ # set up /sbin directory
+ for SYS_CMD in halt klogd mkswap poweroff swapoff syslogd \
+ init lsmod modprobe reboot swapon
+ do
+ ln -f $TWDIR/mnt/bin/busybox $TWDIR/mnt/sbin/$SYS_CMD 2>&1 \
+ >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: linking busybox to $SYS_CMD"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+ done
+
+ # set up /usr/bin directory
+ for SYS_CMD in clear du free killall sort \
+ tty wc xargs basename cut env head \
+ logger tail uniq which yes chvt dirname \
+ find id reset test uptime whoami
+ do
+ ln -f $TWDIR/mnt/bin/busybox $TWDIR/mnt/usr/bin/$SYS_CMD 2>&1 \
+ >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: linking busybox to $SYS_CMD"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+ done
+
+ # sync'ing changes to disk.
+
+ sync; sync; sync; sync; sync; sync;
+
+ echo "INFO: creating compressed file system"
+ # creating compressed file system.
+ dd if=$TWDIR/ramdisk_fs bs=1k | gzip -v9 > $TWDIR/rootfs.gz || \
+ {
+ echo "FAILED: creating compressed file system."
+ exit 1
+ }
+
+ # create a copy of the rootfs.gz on PWD.
+ cp $TWDIR/rootfs.gz ./ 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: coping rootfs.gz from temp directory to $PWD"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ exit 1
+ }
+
+ if [ $CREATEFD -ne 0 ]
+ then
+ # creating filesystem on floppy
+ if [ $FSTYPE == "ext2" ]; then
+ mke2fs -v -m 0 -N 24 /dev/fd0h1440 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: unable to create EXT2 filesystem on floppy"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ echo "INFO: mke2fs -m 0 -N 24 /dev/fd0h1440"
+ echo "INFO: and dd rootfs.gz to this floppy"
+ exit 1
+ }
+ else
+ [ "$FSTYPE" == "reiserfs" ] && \
+ {
+ FORCEREI="-f -f";
+ }
+ mkfs.$FSTYPE $FORCEREI /dev/fd0h1440 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: unable to create $FSTYPE on floppy"
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ echo "INFO: mke2fs -m 0 -N 24 /dev/fd0h1440"
+ echo "INFO: and dd rootfs.gz to this floppy"
+ exit 1
+ }
+ fi
+
+ sync; sync; sync; sync
+ # dd the rootfs on to floppy, if the rootfs.gz is greater than
+ # dd will fail so no pre-check is done on size of rootfs.gz
+ dd if=$TWDIR/rootfs.gz of=/dev/fd0h1440 bs=1k 2>&1 >$TWDIR/crfs.out || \
+ {
+ echo "FAILED: dd'ing the rootfs.gz onto floppy."
+ echo "FAILED: `cat $TWDIR/crfs.out`"
+ echo "INFO: please try it manually"
+ echo "INFO: dd if=./rootfs.gz of=/dev/fd0 bs=1k"
+ exit 1
+ }
+ exit 0
+ else
+ echo "INFO: create floppy manually"
+ echo "INFO: rootfs.gz in in $PWD directory"
+ echo "INFO: dd if=./rootfs.gz of=/dev/fd0 bs=1k"
+ exit 0
+ fi
+}
+
+main "$@"