Initial public busybox upstream commit
[busybox4maemo] / examples / bootfloppy / mkrootfs.sh
1 #!/bin/bash
2 #
3 # mkrootfs.sh - creates a root file system
4 #
5
6 # TODO: need to add checks here to verify that busybox, uClibc and bzImage
7 # exist
8
9
10 # command-line settable variables
11 BUSYBOX_DIR=..
12 UCLIBC_DIR=../../uClibc
13 TARGET_DIR=./loop
14 FSSIZE=4000
15 CLEANUP=1
16 MKFS='mkfs.ext2 -F'
17
18 # don't-touch variables
19 BASE_DIR=`pwd`
20
21
22 while getopts 'b:u:s:t:Cm' opt
23 do
24         case $opt in
25                 b) BUSYBOX_DIR=$OPTARG ;;
26                 u) UCLIBC_DIR=$OPTARG ;;
27                 t) TARGET_DIR=$OPTARG ;;
28                 s) FSSIZE=$OPTARG ;;
29                 C) CLEANUP=0 ;;
30                 m) MKFS='mkfs.minix' ;;
31                 *)
32                         echo "usage: `basename $0` [-bu]"
33                         echo "  -b DIR  path to busybox direcory (default ..)"
34                         echo "  -u DIR  path to uClibc direcory (default ../../uClibc)"
35                         echo "  -t DIR  path to target direcory (default ./loop)"
36                         echo "  -s SIZE size of root filesystem in Kbytes (default 4000)"
37                         echo "  -C      don't perform cleanup (umount target dir, gzip rootfs, etc.)"
38                         echo "          (this allows you to 'chroot loop/ /bin/sh' to test it)"
39                         echo "  -m      use minix filesystem (default is ext2)"
40                         exit 1
41                         ;;
42         esac
43 done
44
45
46
47
48 # clean up from any previous work
49 mount | grep -q loop
50 [ $? -eq 0 ] && umount $TARGET_DIR
51 [ -d $TARGET_DIR ] && rm -rf $TARGET_DIR/
52 [ -f rootfs ] && rm -f rootfs
53 [ -f rootfs.gz ] && rm -f rootfs.gz
54
55
56 # prepare root file system and mount as loopback
57 dd if=/dev/zero of=rootfs bs=1k count=$FSSIZE
58 $MKFS -i 2000 rootfs
59 mkdir $TARGET_DIR
60 mount -o loop,exec rootfs $TARGET_DIR # must be root
61
62
63 # install uClibc
64 mkdir -p $TARGET_DIR/lib
65 cd $UCLIBC_DIR
66 make INSTALL_DIR=
67 cp -a libc.so* $BASE_DIR/$TARGET_DIR/lib
68 cp -a uClibc*.so $BASE_DIR/$TARGET_DIR/lib
69 cp -a ld.so-1/d-link/ld-linux-uclibc.so* $BASE_DIR/$TARGET_DIR/lib
70 cp -a ld.so-1/libdl/libdl.so* $BASE_DIR/$TARGET_DIR/lib
71 cp -a crypt/libcrypt.so* $BASE_DIR/$TARGET_DIR/lib
72 cd $BASE_DIR
73
74
75 # install busybox and components
76 cd $BUSYBOX_DIR
77 make distclean
78 make CC=$BASE_DIR/$UCLIBC_DIR/extra/gcc-uClibc/i386-uclibc-gcc
79 make CONFIG_PREFIX=$BASE_DIR/$TARGET_DIR install
80 cd $BASE_DIR
81
82
83 # make files in /dev
84 mkdir $TARGET_DIR/dev
85 ./mkdevs.sh $TARGET_DIR/dev
86
87
88 # make files in /etc
89 cp -a etc $TARGET_DIR
90 ln -s /proc/mounts $TARGET_DIR/etc/mtab
91
92
93 # other miscellaneous setup
94 mkdir $TARGET_DIR/initrd
95 mkdir $TARGET_DIR/proc
96
97
98 # Done. Maybe do cleanup.
99 if [ $CLEANUP -eq 1 ]
100 then
101         umount $TARGET_DIR
102         rmdir $TARGET_DIR
103         gzip -9 rootfs
104 fi
105