busybox/examples/bootfloppy/mkrootfs.sh
<<
>>
Prefs
   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
  11BUSYBOX_DIR=..
  12UCLIBC_DIR=../../uClibc
  13TARGET_DIR=./loop
  14FSSIZE=4000
  15CLEANUP=1
  16MKFS='mkfs.ext2 -F'
  17
  18# don't-touch variables
  19BASE_DIR=`pwd`
  20
  21
  22while getopts 'b:u:s:t:Cm' opt
  23do
  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
  43done
  44
  45
  46
  47
  48# clean up from any previous work
  49mount | 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
  57dd if=/dev/zero of=rootfs bs=1k count=$FSSIZE
  58$MKFS -i 2000 rootfs
  59mkdir $TARGET_DIR
  60mount -o loop,exec rootfs $TARGET_DIR # must be root
  61
  62
  63# install uClibc
  64mkdir -p $TARGET_DIR/lib
  65cd $UCLIBC_DIR
  66make INSTALL_DIR=
  67cp -a libc.so* $BASE_DIR/$TARGET_DIR/lib
  68cp -a uClibc*.so $BASE_DIR/$TARGET_DIR/lib
  69cp -a ld.so-1/d-link/ld-linux-uclibc.so* $BASE_DIR/$TARGET_DIR/lib
  70cp -a ld.so-1/libdl/libdl.so* $BASE_DIR/$TARGET_DIR/lib
  71cp -a crypt/libcrypt.so* $BASE_DIR/$TARGET_DIR/lib
  72cd $BASE_DIR
  73
  74
  75# install busybox and components
  76cd $BUSYBOX_DIR
  77make distclean
  78make CC=$BASE_DIR/$UCLIBC_DIR/extra/gcc-uClibc/i386-uclibc-gcc
  79make CONFIG_PREFIX=$BASE_DIR/$TARGET_DIR install
  80cd $BASE_DIR
  81
  82
  83# make files in /dev
  84mkdir $TARGET_DIR/dev
  85./mkdevs.sh $TARGET_DIR/dev
  86
  87
  88# make files in /etc
  89cp -a etc $TARGET_DIR
  90ln -s /proc/mounts $TARGET_DIR/etc/mtab
  91
  92
  93# other miscellaneous setup
  94mkdir $TARGET_DIR/initrd
  95mkdir $TARGET_DIR/proc
  96
  97
  98# Done. Maybe do cleanup.
  99if [ $CLEANUP -eq 1 ]
 100then
 101        umount $TARGET_DIR
 102        rmdir $TARGET_DIR
 103        gzip -9 rootfs
 104fi
 105