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