107 lines
2.3 KiB
Bash
107 lines
2.3 KiB
Bash
|
#!/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=bootfloppy/loop 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
|
||
|
|