#!/bin/bash # # mkrootfs.sh - creates a root file system # # TODO: need to add checks here to verify that busybox, uClibc and bzImage # exist # command-line settable variables BUSYBOX_DIR=.. UCLIBC_DIR=../../uClibc TARGET_DIR=./loop FSSIZE=4000 CLEANUP=1 MKFS='mkfs.ext2 -F' # don't-touch variables BASE_DIR=`pwd` while getopts 'b:u:s:t:Cm' opt do case $opt in b) BUSYBOX_DIR=$OPTARG ;; u) UCLIBC_DIR=$OPTARG ;; t) TARGET_DIR=$OPTARG ;; s) FSSIZE=$OPTARG ;; C) CLEANUP=0 ;; m) MKFS='mkfs.minix' ;; *) echo "usage: `basename $0` [-bu]" echo " -b DIR path to busybox direcory (default ..)" echo " -u DIR path to uClibc direcory (default ../../uClibc)" echo " -t DIR path to target direcory (default ./loop)" echo " -s SIZE size of root filesystem in Kbytes (default 4000)" echo " -C don't perform cleanup (umount target dir, gzip rootfs, etc.)" echo " (this allows you to 'chroot loop/ /bin/sh' to test it)" echo " -m use minix filesystem (default is ext2)" exit 1 ;; esac done # clean up from any previous work mount | grep -q loop [ $? -eq 0 ] && umount $TARGET_DIR [ -d $TARGET_DIR ] && rm -rf $TARGET_DIR/ [ -f rootfs ] && rm -f rootfs [ -f rootfs.gz ] && rm -f rootfs.gz # prepare root file system and mount as loopback dd if=/dev/zero of=rootfs bs=1k count=$FSSIZE $MKFS -i 2000 rootfs mkdir $TARGET_DIR mount -o loop,exec rootfs $TARGET_DIR # must be root # install uClibc mkdir -p $TARGET_DIR/lib cd $UCLIBC_DIR make INSTALL_DIR= cp -a libc.so* $BASE_DIR/$TARGET_DIR/lib cp -a uClibc*.so $BASE_DIR/$TARGET_DIR/lib cp -a ld.so-1/d-link/ld-linux-uclibc.so* $BASE_DIR/$TARGET_DIR/lib cp -a ld.so-1/libdl/libdl.so* $BASE_DIR/$TARGET_DIR/lib cp -a crypt/libcrypt.so* $BASE_DIR/$TARGET_DIR/lib cd $BASE_DIR # install busybox and components cd $BUSYBOX_DIR make distclean make CC=$BASE_DIR/$UCLIBC_DIR/extra/gcc-uClibc/i386-uclibc-gcc make PREFIX=$BASE_DIR/$TARGET_DIR install cd $BASE_DIR # make files in /dev mkdir $TARGET_DIR/dev ./mkdevs.sh $TARGET_DIR/dev # make files in /etc cp -a etc $TARGET_DIR ln -s /proc/mounts $TARGET_DIR/etc/mtab # other miscellaneous setup mkdir $TARGET_DIR/initrd mkdir $TARGET_DIR/proc # Done. Maybe do cleanup. if [ $CLEANUP -eq 1 ] then umount $TARGET_DIR rmdir $TARGET_DIR gzip -9 rootfs fi