From ce071abbbc30e0f5356d41e8cca8aaf8cc09d66f Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Fri, 3 Apr 2009 16:45:22 +0000 Subject: [PATCH] - refactored marc's kupdate.sh into a new script kvariant.sh - this allows to create a 'variant' stored in /usr/share/bootcd/ from the standard /usr/share/bootcd/build tree but with a different kernel - GetBootMedium has a new option to use a given variant --- build.sh | 31 +++++++++----- kupdate.sh | 3 ++ kvariant.sh | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 10 deletions(-) create mode 100755 kvariant.sh diff --git a/build.sh b/build.sh index 60e7295..cfce5e2 100755 --- a/build.sh +++ b/build.sh @@ -10,6 +10,8 @@ # $Id$ # +COMMAND=$(basename $0) +DIRNAME=$(dirname $0) PATH=/sbin:/bin:/usr/sbin:/usr/bin # defaults @@ -77,22 +79,28 @@ function pop_cleanup() { function init_and_check () { # Change to our source directory - local srcdir=$(cd $(dirname $0) && pwd -P) + local srcdir=$(cd $DIRNAME && pwd -P) pushd $srcdir # Root of the isofs - ISOREF=$PWD/build + ISOREF=$PWD/${VARIANT} # The reference image is expected to have been built by prep.sh (see .spec) # we disable the initial logic that called prep.sh if that was not the case # this is because prep.sh needs to know pldistro if [ ! -f $ISOREF/isofs/bootcd.img -o ! -f $ISOREF/version.txt ] ; then - echo "You have to run prep.sh prior to calling $0 - exiting" + echo "Could not find isofs and version.txt in $ISOREF" + if [ "$VARIANT" == "build" ] ; then + echo "You have to run prep.sh prior to calling $COMMAND" + else + echo "You need to create your variant image, see kvariant.sh" + fi + echo "Exiting .." exit 1 fi # build/version.txt written by prep.sh - BOOTCD_VERSION=$(cat build/version.txt) + BOOTCD_VERSION=$(cat ${VARIANT}/version.txt) if [ -f /etc/planetlab/plc_config ] ; then # Source PLC configuration @@ -116,7 +124,7 @@ function init_and_check () { # it seems that this feature has not been used nor tested in a long time, use with care usage() { - echo "Usage: build.sh [OPTION]..." + echo "Usage: $COMMAND [OPTION]..." echo " -f plnode.txt Node to customize CD for (default: none)" echo " -t 'types' Build the specified images (default: $DEFAULT_TYPES)" echo " NOTE: mentioning 'serial' as part of the type is not supported anymore" @@ -130,6 +138,7 @@ usage() { echo " can be a full path" echo " -o output-name The full name of the generated file" echo " -C custom-dir Custom directory" + echo " -V variant Use a variant - see kvariant.sh" echo " -n Dry run - mostly for debug/test purposes" echo " -k Add additional parameters to the kargs.txt file" echo " -h This message" @@ -143,7 +152,7 @@ function parse_command_line () { # init TYPES="" # Get options - while getopts "f:t:as:SO:o:C:k:nh" opt ; do + while getopts "f:t:as:SO:o:C:V:k:nh" opt ; do case $opt in f) NODE_CONFIGURATION_FILE=$OPTARG ;; t) TYPES="$TYPES $OPTARG" ;; @@ -153,6 +162,7 @@ function parse_command_line () { O) OUTPUT_BASE="$OPTARG" ;; o) OUTPUT_NAME="$OPTARG" ;; C) CUSTOM_DIR="$OPTARG" ;; + V) VARIANT="$OPTARG" ;; k) KARGS_STR="$KARGS_STR $OPTARG" ;; n) DRY_RUN=true ;; h|*) usage ;; @@ -161,6 +171,7 @@ function parse_command_line () { # use defaults if not set [ -z "$TYPES" ] && TYPES="$DEFAULT_TYPES" + [ -z "$VARIANT" ] && VARIANT="build" [ "$CONSOLE_INFO" == "default" ] && CONSOLE_INFO=$SERIAL_CONSOLE # check TYPES @@ -297,7 +308,7 @@ EOF fi # build/passwd copied out by prep.sh - sed -e "s@^root:[^:]*:\(.*\)@root:$ROOT_PASSWORD:\1@" build/passwd >$OVERLAY/etc/passwd + sed -e "s@^root:[^:]*:\(.*\)@root:$ROOT_PASSWORD:\1@" ${VARIANT}/passwd >$OVERLAY/etc/passwd # Install node configuration file (e.g., if node has no floppy disk or USB slot) if [ -f "$NODE_CONFIGURATION_FILE" ] ; then @@ -532,7 +543,7 @@ EOF # generate pl_rsysinit cat > etc/rc.d/init.d/pl_rsysinit <" + echo " with the same structure as the default /usr/share/bootcd/build" + echo " the kernel rpm will also be stored in the variant dir for future reference" + echo "e.g. $COMMAND centos5 http://mirror.onelab.eu/centos/5.2/updates/i386/RPMS/kernel-2.6.18-92.1.1.el5.i686.rpm" + exit 1 +} + +function bail () { + rm -rf $tmpdir $files + exit -1 +} + +## locate rpm and store it in variant +function getrpm () { + kernelrpm_url=$1; shift + kernelrpm_local=$1; shift + nocolon=$(echo $kernelrpm_url | sed -e s,:,,) + if [ "$kernelrpm_url" == "$nocolon" ] ; then + echo "Copying $kernelrpm_url in $variant_path" + cat $kernelrpm_url > $kernelrpm_local + else + echo "Fetching $kernelrpm_url in $variant_path" + curl -o $kernelrpm_local $kernelrpm_url + fi +} + +## sanity check +function checkrpm () { + filename=$1 + if [ -f "$filename" ] ; then + if [ $(rpm -qip $filename | wc -l) -eq 1 ] ; then + echo "$filename not a valid rpm file" + usage + fi + fi +} + +######################################## let's go +set -e + +[[ -z "$@" ]] && usage +variant=$1; shift +[[ -z "$@" ]] && usage +kernelrpm_url=$1; shift +[[ -n "$@" ]] && usage + +standard_path="/usr/share/bootcd/build" +if [ ! -d $standard_path ] ; then + echo "Cound not find standard image $standard_path - exiting" + exit 1 +fi + +variant_path=/usr/share/bootcd/$variant +if [ -e $variant_path ] ; then + echo "Found $variant_path - please remove first - exiting" + exit 1 +fi + +here=$(pwd) +mkdir $variant_path +echo "Creating $variant_path from $standard_path" +tar -C $standard_path -cf - . | tar -C $variant_path -xf - + +kernelrpm=$variant_path/$(basename $kernelrpm_url) +getrpm $kernelrpm_url $kernelrpm +checkrpm $kernelrpm + +isofsdir=$variant_path/isofs + +tmpdir= +files= + +tmpdir=$(mktemp -d /var/tmp/bootcd.XXXXXX) +trap "bail" ERR INT +echo "Updating bootcd image with $kernelrpm" +mkdir $tmpdir/bootcd +pushd $tmpdir/bootcd +echo "Unwrapping bootcd.img in $(pwd)" +gzip -d -c $isofsdir/bootcd.img | cpio -diu +echo "Cleaning up older kernel" +rm -rf boot/* +rm -rf lib/modules +echo "Replacing with new kernel" +rpm2cpio $kernelrpm | cpio -diu +echo "Running depmod" +version=$(cd ./boot && ls vmlinuz* | sed 's,vmlinuz-,,') +depmod -b . $version +echo "Exposing kernel" +cp boot/vmlinuz* ${tmpdir}/kernel +echo "Wrapping new bootcd.img" +find . | cpio --quiet -c -o | gzip -9 > ${tmpdir}/bootcd.img +popd + +# +echo -n "Preserving in $isofsdir .." +mv ${isofsdir}/kernel ${tmpdir}/kernel.orig +echo -n " kernel" +mv ${isofsdir}/bootcd.img ${tmpdir}/bootcd.img.orig +echo -n " bootcd.img" +echo "" + +# +echo -n "Populating $isofsdir .." +mv ${tmpdir}/kernel ${isofsdir}/kernel +echo -n " kernel" +mv ${tmpdir}/bootcd.img ${isofsdir}/bootcd.img +echo -n " bootcd.img" +echo "" + +rm -rf $tmpdir + +echo "new variant $variant ready" +trap - ERR +exit 0 -- 2.43.0