-function mkInitrd
-{
- TMP_DIR_=`mktemp -td terminalserver_initrd.XXXXXX`
- local i=''
- local tmp_loopname=''
-
- # copying original initrd into $INITRD
- execute "rm -r $INITRD_" 2>/dev/null
- execute "cp $ORIGINAL_INITRD_ $TMP_DIR_/minirt26.gz" warn || return 1
- execute "mkdir -p $INITRD_" warn || return 1
- execute "mkdir -p $PATH_/mini-root.orig" warn || return 1
- execute "gunzip $TMP_DIR_/minirt26.gz" warn || return 1
- tmp_loopname=`findNextFreeLoop die`
- execute "mount -o loop=$tmp_loopname $TMP_DIR_/minirt26 $PATH_/mini-root.orig " warn || return 1
- execute "cp -a $PATH_/mini-root.orig/* $INITRD_" warn || return 1
- execute "umount $PATH_/mini-root.orig" warn || return 1
- losetup -d $tmp_loopname &>/dev/null
- tmp_loopname=''
- execute "rmdir $PATH_/mini-root.orig" warn || return 1
- execute "rm $TMP_DIR_/minirt26" warn || return 1
-
- # implanting my initrd changes into the original initrd
-
- # copy programs, check if there are already links with this name to busybox
- for i in $USR_SHARE_/timeout $USR_SHARE_/discover* $USR_SHARE_/udhcpc $USR_SHARE_/udhcp-config.sh $USR_SHARE_/cdir $USR_SHARE_/rdir /usr/bin/ldd ;do
- tmp_name_="${i##*/}"
- isNotExistent "$INITRD_/static/$tmp_name_" eprint || execute "rm $INITRD_/static/$tmp_name_"
- cp $i "$INITRD_/static/$tmp_name_"
- done
- cp $USR_SHARE_/linuxrc $INITRD_/
- mkdir -p $INITRD_/mylib
- mkdir -p $INITRD_/myusr/i386-uclibc-linux/lib
- for i in libdl libc libuClibc ld-uClibc; do
- cp -a $UCLIBC_PATH_/$i*.so* $INITRD_/myusr/i386-uclibc-linux/lib
- done
-
- # copy data files for discover (discover-data)
- mkdir -p $INITRD_/mylib/discover
- cp /lib/discover/list.xml /lib/discover/pci-*.xml $INITRD_/mylib/discover/
-
- #
- # which modules should i put into the ramdisk
- #
-
- # get cards detected by discover
- if [ -f /lib/discover/pci.lst ] ; then
- isNotExistent $CARDS_DETECTED_BY_DISCOVER && awk '/ethernet/{print $3}' /lib/discover/pci.lst |sort |uniq > $CARDS_DETECTED_BY_DISCOVER
- else # newer discover does not provide /lib/discover/pci.lst, get a list of all network drivers therefore
- isNotExistent $CARDS_DETECTED_BY_DISCOVER && \
- # find *all* network drivers, but do not include wlan/pcmcia/... related ones
- # blacklist: proteon and depca as they seem to cause problems with udevsettle
- find /lib/modules/`uname -r`/kernel/drivers/net/ -name \*.ko | grep -v 'wireless\|wan\|hamradio\|wlan\|ppp\|irda\|pcmcia\|depca\|proteon' | \
- sed 's#.*./## ; s#\.ko##' | sort | uniq > $CARDS_DETECTED_BY_DISCOVER
- # find the ones supported by discover
- # for mod in `grep "name'>.*</data>" /lib/discover/pci-device.xml | sed "s#.*name'>## ; s#</data>##" | sort -u`; do
- # find /lib/modules/${KERNEL_VERSION_}/kernel/drivers/net -name ${mod}.ko | sed 's#.*./## ; s#\.ko##' >> $CARDS_DETECTED_BY_DISCOVER
- # done
- fi
-
- local modules="`cat $CARDS_DETECTED_BY_DISCOVER |xargs` af_packet"
- local modules_dep=""
-
- # get paths of modules + paths of all dependent modules
- echo -n "" >"$TMP_"
- for i in $modules; do
- tmp_=`awk -F: '{if($1~/'"$i".ko'/) {print $0}}' $MODULES_PATH_/$KERNEL_VERSION_/modules.dep`
- echo "${tmp_%%:*}"
- # FIXME ugly sed hack :(
- echo "${tmp_#*:}" | xargs -n1 echo | sed 's/://'
- done \
- | sort | uniq | while read module relax; do
- if [ -n "$module" ]; then
- echo "$module" >> $TMP_
- fi
- done
-
- # copy modules + dependend modules into ramdisk
- local mod_path_="$INITRD_/mylib/modules/$KERNEL_VERSION_"
- local tmp_dst_path_="$mod_path_/kernel"
- mkdir -p $tmp_dst_path_
- cat $TMP_ |sort |uniq |while read module; do
- local tmp_path=${module#*/kernel/}
- tmp_path=$tmp_dst_path_/${tmp_path%/*.ko}
- local module_path=$tmp_path/${module##/*/}
-
- isNotExistent "$tmp_path" dprint && mkdir -p "$tmp_path"
- isNotExistent "$module_path" dprint && cp "$MODULES_PATH_ROOT_DIFF_/$module" "$module_path"
- done
-
- # copying additional modules
- for i in fs/nfs/nfs.ko net/sunrpc/sunrpc.ko fs/lockd/lockd.ko net/packet/af_packet.ko; do
- local tmp_path="$tmp_dst_path_/${i%/*}"
- mkdir -p $tmp_path
- cp $MODULES_PATH_/$KERNEL_VERSION_/kernel/$i "$tmp_path"
- done
-
- # generate modules.dep
- cp $MODULES_PATH_/$KERNEL_VERSION_/modules.dep $mod_path_
- #grep "^\/lib\/modules\/$KERNEL_VERSION_\/kernel\/" $MODULES_PATH_/$KERNEL_VERSION_/modules.dep |\
- # sed "s/\/lib\/modules\/$KERNEL_VERSION_\/kernel\//\/modules\//g" > $mod_path_/modules.dep
-
- # put everything into the new initrd
- local tmp_size=`du -s $INITRD_ |awk '{print $1}'` # in kB
- let tmp_size=$tmp_size+1000
- if (( $tmp_size >= 16000 )); then
- warn "Your initrd is $tmp_size kByte large => TOO BIG (should be <= 16000kB)"
- warn "Please remove a few modules from $CARDS_DETECTED_BY_DISCOVER or edit $INITRD_ manually"
- return 1
- fi
-
- execute "dd if=/dev/zero of=$TMP_DIR_/minirt26 bs=${tmp_size}k count=1 &>/dev/null" warn || \
- warn "could not create filesystem image"
-
- tmp_loopname=`findNextFreeLoop die`
- execute "losetup $tmp_loopname $TMP_DIR_/minirt26" die
- execute "mke2fs -L \"GRML NETINIT\" -b 1024 -N 8192 -O none -F -q -m 0 $tmp_loopname" warn
-
- execute "mkdir $PATH_/minirt26_mountp" warn
- execute "mount $tmp_loopname $PATH_/minirt26_mountp" warn
- execute "cp -a $INITRD_/* $PATH_/minirt26_mountp" warn
- execute "umount $PATH_/minirt26_mountp" warn
- execute "losetup -d $tmp_loopname &>/dev/null" warn
- execute "rmdir $PATH_/minirt26_mountp" warn
- execute "gzip -9 $TMP_DIR_/minirt26" warn
- execute "rm -r $INITRD_" warn
- execute "mv $TMP_DIR_/minirt26.gz $PATH_"
- execute "rm -fr $TMP_DIR_"
-}