jw-pkg/scripts/generate-boot-medium.sh
2006-12-03 20:17:59 +00:00

156 lines
3.2 KiB
Bash

#!/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
/sbin/depmod -a -b $dir/target -v $uname_r
(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