From 5f3d5dda81c31485b0991cc1a17fa8b762c81d87 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Thu, 29 Jun 2006 06:36:25 +0000 Subject: [PATCH] generate-boot-medium.sh: Add file --- scripts/generate-boot-medium.sh | 127 ++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 scripts/generate-boot-medium.sh diff --git a/scripts/generate-boot-medium.sh b/scripts/generate-boot-medium.sh new file mode 100644 index 00000000..5d129bec --- /dev/null +++ b/scripts/generate-boot-medium.sh @@ -0,0 +1,127 @@ +#!/bin/sh + +myname=`basename $0` +cwd=`pwd` +boot_dir=`mktemp -d "/tmp/$myname""_XXXXXX"` + +make_initrd() +{ + template=$1 + modules_dir=$2 + uname_r=$3 + target=$4 + + dir=`mktemp -d "/tmp/$myname""_XXXXXX"` + + mkdir $dir/source + + cat $1 | (cd $dir/source; gunzip | cpio -i) + cp -rp $dir/source $dir/target + rm -rf $dir/target/lib/modules/* + + ( + cd $dir/source + find . -name '*.ko' + ) | while read tmpl_relpath; do + + mod_name=`basename $tmpl_relpath` + source_mod=`cd $modules_dir; find . -name $mod_name` + + if [ ! "$source_mod" ]; then + echo "warning: module $mod_name not found in $modules_dir" >&2 + # exit 1 + else + mod_relpath=`dirname $source_mod` + target_path=$dir/target/lib/modules/$uname_r/$mod_relpath + echo "copying $mod_name from $mod_relpath to $target_path" + mkdir -p $target_path + cp $modules_dir/$source_mod $target_path + + fi + done + + (cd $dir/target; find . | cpio -co) | gzip -9 > $target + + rm -rf $dir +} + +config_section() +{ + output_file= + add_boot_dir= + add_modules_basedir= + root_dev= + initrd_template= + sed -n "/\[$2\]/,/\[/ p" $1 | sed '/]/ d; s/#.*//; /./ !d; s/ *= */=/; s/=\(.*\)/="\1"/' +} + +boot_sections() +{ + sed '/\[boot\..*\]/ !d; s/\[boot\.//; s/\].*//' $1 +} + + +name_filter() +{ + echo $1 | tr [A-Z] [a-z] | sed 's/\.tar\.gz/.tgz/; s/-/_/g; s/\([^.]*\)\.\([^.]*\)$$/\1@\2/; s/\./_/g; s/@/./' +} + +#make_initrd $template $modules_dir + +set -- `getopt 'f:o:' $*` + +while [ "$1" != -- ]; do + case $1 in + -f) + opt_config_file="$2" + shift + ;; + -o) + opt_output_file="$2" + shift + ;; + *) + usage; + esac + shift +done +shift + +eval `config_section $opt_config_file global` + +echo DEFAULT menu.c32 > $boot_dir/isolinux.cfg +echo PROMPT 0 >> $boot_dir/isolinux.cfg + +for sec in `boot_sections $opt_config_file`; do + echo "+ processing section boot.$sec" + eval `config_section $opt_config_file boot.$sec` + if [ "$add_boot_dir" ]; then + echo "+ adding boot directory $add_boot_dir" + kernels=`file $add_boot_dir/* | grep -ie 'linux.*kernel' | sed 's/:.*//'` + for kernel in $kernels; do + kernel_version=`basename $kernel | sed 's/vmlinuz-//'` + echo "+ processing kernel $kernel (version $kernel_version)" + + # create initrd + if [ "$initrd_template" ]; then + echo "+ creating initial ram disk from template $initrd_template" + make_initrd $initrd_template $add_modules_basedir/$kernel_version $kernel_version $boot_dir/initrd-$kernel_version + fi + + # create isolinux.cfg + kernel_version_iso=`name_filter $kernel_version` + echo "LABEL $kernel_version" >> $boot_dir/isolinux.cfg + echo "KERNEL vmlinuz-$kernel_version_iso" >> $boot_dir/isolinux.cfg + echo "APPEND initrd=initrd_$kernel_version_iso root=$root_dev" >> $boot_dir/isolinux.cfg + done + fi +done + +cp $* $boot_dir + +mkisofs -l --iso-level 2 -o $opt_output_file \ + -b isolinux.bin -c boot.cat \ + -no-emul-boot -boot-load-size 4 -boot-info-table \ + $boot_dir + +rm -rf $boot_dir