| #!/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 |
| $UCLIBC_DIR/ld.so-1/util/ldconfig -r $TARGET_DIR |
| |
| |
| # Done. Maybe do cleanup. |
| if [ $CLEANUP -eq 1 ] |
| then |
| umount $TARGET_DIR |
| rmdir $TARGET_DIR |
| gzip -9 rootfs |
| fi |
| |