mirror of
				https://github.com/xcat2/xNBA.git
				synced 2025-10-31 03:12:32 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			166 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 |