| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 | 
							- #!/bin/sh
 - #
 - # $Id$
 - # initrd builder for network booting
 - 
 - # Utility function to determine whether or not a filesystem is usable for
 - # loopback mounts.  Lifted verbatim from Erik Troan's mkinitrd script.
 - #
 - is_good_fs() {
 -     local parttype= tmpname=
 -     local dir=$1
 -     [[ -d $dir ]] || return 1
 -     [[ -w $dir ]] || return 1
 -     [[ $dir == */ ]] && dir=${dir%/}
 -     parttype=$(awk "{if (\$2 == \""$dir"\") print \$3 }" /proc/mounts)
 -  
 -     while tmpname=${dir%/*} && [[ -z $parttype ]];do
 -         [[ -z $tmpname ]] && tmpname=/
 -         parttype=$(awk "{if (\$2 == \""$tmpname"\") print \$3 }" /proc/mounts)
 -         dir=$tmpname
 -     done
 -  
 -     case $parttype in
 -         nfs|tmpfs) return 1;;
 -         *) return 0;
 -     esac
 - }
 - 
 - # Find a suitable temporary directory (i.e. not tmpfs or nfs)
 - if is_good_fs $TMPDIR; then
 -   tmpdir=$TMPDIR
 - elif is_good_fs /tmp; then
 -   tmpdir=/tmp
 - elif is_good_fs /var/tmp; then
 -   tmpdir=/var/tmp
 - elif is_good_fs /root/tmp; then
 -   tmpdir=/root/tmp
 - else
 -   echo "Cannot use a tmp directory" >&2
 -   exit 1
 - fi
 - 
 - # Default settings (some can be overridden by command-line options)
 - include_modules=include-modules
 - initrd_skel=/usr/lib/mkinitrd-net/initrd-skel
 - kernel_ver=`uname -r`
 - use_sudo=y
 - keep=n
 - output_dir=/var/lib/tftpboot
 - make_link=y
 - quiet=
 - 
 - # No need to use sudo if we are root
 - if [ $UID -eq 0 ]; then
 -   use_sudo=n
 - fi
 - 
 - USAGE="Usage: $0 [-k|--kernel <kernel_ver>] [-n|--nolink] [-q|--quiet] [-l|--local] [--nosudo] [--keep] [--help] module_list ..."
 - 
 - # Parse command-line options
 - while [ $# -gt 0 ]; do
 -   case "$1" in
 -     -l|--local)
 - 		shift
 - 		use_local=y ;;
 -     -k|--kernel)
 - 		shift
 - 		kernel_ver=$1
 - 		shift ;;
 -     --nosudo)   shift ; use_sudo=n ;;
 -     --keep)     shift ; keep=y ;;
 -     --n|--nolink)
 - 		shift ; make_link=n ;;
 -     -q|--quiet) shift ; quiet=-q ;;
 -     --help)	shift ; do_help=y ;;
 -     --)		shift ; break ;;
 -     -*)		echo "${0}: ${1}: invalid option" >&2
 - 		echo $USAGE >& 2
 - 		exit 2 ;;
 -     *)		break ;;
 -   esac
 - done
 - 
 - # Build list of requested modules
 - modules="$*"
 - requested_modules="$modules"
 - modules="$modules nfs" # Always require nfs for nfs mount
 - modules="$modules af_packet" # Always require af_packet for udhcpc
 - 
 - # --help => Print help message
 - if [ "$do_help" == "y" ]; then
 -   echo $USAGE
 -   echo "  -k, --kernel   Specify kernel version"
 -   echo "  -n, --nolink   Do not create a matching symbolic link"
 -   echo "  -l, --local    Run locally from CVS (for developers only)"
 -   echo "  --nosudo       Do not use sudo (i.e. must run as root instead)"
 -   echo "  --keep         Keep temporary files instead of deleting them"
 -   exit 0;
 - fi
 - 
 - # --local => we are running directly from CVS, rather than
 - # from an installed copy, so use local files and directories
 - if [ "$use_local" == "y" ]; then
 -   include_modules=./include-modules
 -   initrd_skel=initrd-skel
 -   output_dir=tftpboot
 - fi
 - 
 - # If use_sudo is set, check that sudo exists
 - sudo=/usr/bin/sudo
 - if [ "$use_sudo" == "y" ]; then
 -   if [ ! -x $sudo ]; then
 -     use_sudo=n
 -     echo "WARNING: --nosudo not specified but $sudo not found"
 -   fi
 - fi
 - if [ "$use_sudo" == "n" ]; then
 -   sudo=
 - fi
 - 
 - # Create temporary working files
 - initrd=`mktemp -d ${tmpdir}/initrd.XXXXXX`
 - initrdimg=`mktemp ${tmpdir}/initrd.img.XXXXXX`
 - initrdmnt=`mktemp -d ${tmpdir}/initrd.mnt.XXXXXX`
 - 
 - # Copy skeleton into temporary area
 - cp -a $initrd_skel/* $initrd/
 - mkdir -p $initrd/lib/modules/$kernel_ver
 - $include_modules $quiet -k $kernel_ver -d $initrd/lib/modules/$kernel_ver $modules > $initrd/bin/insert-modules || exit 1
 - chmod 755 $initrd/bin/insert-modules
 - 
 - # Create empty ext2fs image file
 - dd if=/dev/zero bs=1k of=$initrdimg count=$((`du -sk $initrd | cut -f1` * 7 / 6)) 2> /dev/null
 - /sbin/mke2fs -q -F $initrdimg 2> /dev/null
 - 
 - # Mount image file, copy files on, create /dev entries, display free space, umount
 - $sudo mount -o loop $initrdimg $initrdmnt
 - cp -a $initrd/* $initrdmnt/
 - $sudo mknod $initrdmnt/dev/console c 5 1
 - $sudo mknod $initrdmnt/dev/null c 1 3
 - $sudo mknod $initrdmnt/dev/ram b 1 1
 - $sudo mknod $initrdmnt/dev/systty c 4 0
 - for i in 1 2 3 4; do $sudo mknod $initrdmnt/dev/tty$i c 4 $i; done
 - if [ "$quiet" == "n" ]; then
 -   df -h $initrdmnt
 - fi
 - $sudo umount $initrdmnt
 - 
 - # Create output file
 - initrd_suffix=`echo $requested_modules | tr " " .`
 - gzip -9 -n -c $initrdimg > $output_dir/initrd-$initrd_suffix.$kernel_ver.img
 - 
 - # Create symlink
 - if [ "$make_link" == "y" ]; then
 -   link=$output_dir/initrd-$initrd_suffix.img
 -   [ -L $link ] && rm -f $link
 -   ln -s initrd-$initrd_suffix.$kernel_ver.img $link
 - fi
 - 
 - # Remove temporary files
 - if [ "$keep" == "n" ]; then
 -   rm -rf $initrd
 -   rm -f $initrdimg
 -   rmdir $initrdmnt
 - fi
 
 
  |