#!/bin/sh myname=`basename $0` cwd=`pwd` 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 -p $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:d:' $*` while [ "$1" != -- ]; do case $1 in -f) opt_config_file="$2" shift ;; -o) opt_output_file="$2" shift ;; -d) opt_build_dir="$2" boot_dir="$2" shift ;; *) usage; esac shift done shift if [ ! "$opt_build_dir" ]; then boot_dir=`mktemp -d "/tmp/$myname""_XXXXXX"` fi 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" for f in $add_boot_dir/*; do b=`basename $f` n=`name_filter $b` echo "+ copying $f -> $n" cp -p $f $boot_dir/$n done kernels=`file $add_boot_dir/* | grep -ie 'linux.*kernel' | sed 's/:.*//'` for kernel in $kernels; do kernel_version=`basename $kernel | sed 's/vmlinuz-//'` kernel_version_iso=`name_filter $kernel_version | cut -b1-21` 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_iso fi # create isolinux.cfg 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 if [ ! "$opt_build_dir" ]; then rm -rf $boot_dir fi