| #!/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 CONFIG_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 |