X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=build.sh;h=5ce3605ac67a7e335211f15a93e5c83d97a16576;hb=f7518050cb637ff55750717d226f5118dd58819c;hp=afe01908fe083d00582858b745dcdb2a13ac3feb;hpb=90d0c58a91cc2b39f67b6dfdf602bd708f8d6276;p=bootcd.git diff --git a/build.sh b/build.sh index afe0190..5ce3605 100755 --- a/build.sh +++ b/build.sh @@ -7,11 +7,27 @@ # Mark Huang # Copyright (C) 2004-2007 The Trustees of Princeton University # -# $Id$ -# +# Jan 2015 - f21 comes with isolinux 6.03 (was 4.05 in f20) +# http://www.syslinux.org/wiki/index.php/ISOLINUX +COMMAND=$(basename $0) +DIRNAME=$(dirname $0) PATH=/sbin:/bin:/usr/sbin:/usr/bin +# debugging flags +# keep KERNEL_DEBUG_ARGS void for production +KERNEL_DEBUG_ARGS="" +# add more flags here for debugging +# KERNEL_DEBUG_ARGS="$KERNEL_DEBUG_ARGS some_other_kernel_arg" +# see also +# (*) GetBootMedium that has some provisions for common +# kargs, like e.g. for removing the hangcheck feature, +# or for turning on debug messages for systemd +# these can be turned on with tags on the node +# (*) tests default config, that uses this feature so +# the tests can benefit these features, without deploying +# them by default in production + # defaults DEFAULT_TYPES="usb iso" # Leave 4 MB of free space @@ -19,6 +35,10 @@ GRAPHIC_CONSOLE="graphic" SERIAL_CONSOLE="ttyS0:115200:n:8" CONSOLE_INFO=$GRAPHIC_CONSOLE MKISOFS_OPTS="-R -J -r -f -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table" +# isolinux-debug.bin is supposedly helpful as well if available, +# when things don't work as expected +#MKISOFS_OPTS="-R -J -r -f -b isolinux-debug.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table" + FREE_SPACE=4096 # command-line settable args @@ -28,6 +48,7 @@ OUTPUT_BASE= DRY_RUN="" OUTPUT_NAME="" TYPES="" +KERNEL_ARGS="" # various globals BUILDTMP="" @@ -75,41 +96,36 @@ 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 . /etc/planetlab/plc_config fi - # From within a myplc chroot /usr/tmp is too small - # to build all possible images, whereas /data is part of the host - # filesystem and usually has sufficient space. What we - # should do is check whether the expected amount of space - # is available. - BUILDTMP=/usr/tmp - if [ -d /data/tmp ] ; then - isreadonly=$(mktemp /data/tmp/isreadonly.XXXXXX || /bin/true) - if [ -n "$isreadonly" ] ; then - rm -f "$isreadonly" - BUILDTMP=/data/tmp - fi - fi + # use /var/tmp that should be large enough on both chroot- or vserver-based myplc + BUILDTMP=/var/tmp FULL_VERSION_STRING="${PLC_NAME} BootCD ${BOOTCD_VERSION}" @@ -125,7 +141,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" @@ -139,7 +155,9 @@ 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" echo "All known types: $ALL_TYPES" exit 1 @@ -151,7 +169,7 @@ function parse_command_line () { # init TYPES="" # Get options - while getopts "f:t:as:SO:o:C: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" ;; @@ -161,6 +179,8 @@ function parse_command_line () { O) OUTPUT_BASE="$OPTARG" ;; o) OUTPUT_NAME="$OPTARG" ;; C) CUSTOM_DIR="$OPTARG" ;; + V) VARIANT="$OPTARG" ;; + k) KERNEL_ARGS="$KERNEL_ARGS $OPTARG" ;; n) DRY_RUN=true ;; h|*) usage ;; esac @@ -168,8 +188,21 @@ 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 + if [ -n "$NODE_CONFIGURATION_FILE" ] ; then + # check existence of NODE_CONFIGURATION_FILE and normalize as we will change directory + if [ ! -f "$NODE_CONFIGURATION_FILE" ] ; then + echo "Node configuration file $NODE_CONFIGURATION_FILE not found - exiting" + exit 1 + fi + cf_dir="$(dirname $NODE_CONFIGURATION_FILE)" + cf_dir="$(cd $cf_dir; pwd -P)" + cf_file="$(basename $NODE_CONFIGURATION_FILE)" + NODE_CONFIGURATION_FILE="$cf_dir"/"$cf_file" + fi + # check TYPES local matcher="XXX$(echo $ALL_TYPES | sed -e 's,\W,XXX,g')XXX" for t in $TYPES; do @@ -213,12 +246,26 @@ function build_overlay () { BUILDTMP=$(mktemp -d ${BUILDTMP}/bootcd.XXXXXX) push_cleanup rm -fr "${BUILDTMP}" - mkdir "${BUILDTMP}/isofs" + + # initialize ISOFS + ISOFS="${BUILDTMP}/isofs" + mkdir -p "$ISOFS" for i in "$ISOREF"/isofs/{bootcd.img,kernel}; do - ln -s "$i" "${BUILDTMP}/isofs" + ln -s "$i" "$ISOFS" + done + # use new location as of fedora 12 + # used to be in /usr/lib/syslinux/isolinux.bin + # removed backward compat in jan. 2015 + # as of syslinux 6.05 (fedora 21) ldlinux.c32 is required by isolinux.bin + # the debug version can come in handy at times, and is 40k as well + isolinuxdir="/usr/share/syslinux" + # ship only what is mandatory, and forget about + # (*) isolinux-debug.bin as its name confuses mkisofs + # (*) memdisk that is not useful + isolinuxfiles="isolinux.bin ldlinux.c32" + for isolinuxfile in $isolinuxfiles; do + [ -f $isolinuxdir/$isolinuxfile ] && cp $isolinuxdir/$isolinuxfile "${BUILDTMP}/isofs" done - cp "/usr/lib/syslinux/isolinux.bin" "${BUILDTMP}/isofs" - ISOFS="${BUILDTMP}/isofs" # Root of the ISO and USB images echo "* Populating root filesystem..." @@ -304,17 +351,41 @@ 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 + +# this is more harmful than helpful +# idea being, since we start a full-featured fedora system now, it would +# have been nice to be able to enter sshd very early on - before bm has even been downloaded +# however somehow it appears that these lines ruin all chances to enter ssh at all +# either early or even later on; +# plus, it is unclear what this would give on non=systemd nodes, so I am backing off for now +# # recent bootCDs rely on a standard systemd startup sequence +# # so allow debug key to enter in this context whenever that makes sense +# mkdir -p $OVERLAY/root/.ssh +# chmod 700 $OVERLAY/root/.ssh +# cp $PLC_DEBUG_SSH_KEY_PUB $OVERLAY/root/.ssh/authorized_keys +# chmod 600 $OVERLAY/root/.ssh/authorized_keys # Install node configuration file (e.g., if node has no floppy disk or USB slot) if [ -f "$NODE_CONFIGURATION_FILE" ] ; then echo "* Installing node configuration file $NODE_CONFIGURATION_FILE -> /usr/boot/plnode.txt of the bootcd image" install -D -m 644 $NODE_CONFIGURATION_FILE $OVERLAY/usr/boot/plnode.txt + NODE_ID=$(source $NODE_CONFIGURATION_FILE; echo $NODE_ID) + echo "* Building network configuration for $NODE_ID" + plnet -- --root $OVERLAY --files-only --program BootCD $NODE_ID fi - if [ -n "$IS_SERIAL" ] ; then - echo "${console_spec}" > $OVERLAY/kargs.txt - fi + [ -n "$IS_SERIAL" ] && KERNEL_ARGS="$KERNEL_ARGS ${console_spec}" + + # tmp: should be restricted to f15 nodes and above + # making sure the network interfaces are still numbered eth0 and above + KERNEL_ARGS="$KERNEL_ARGS biosdevname=0" + # making sure selinux is turned off - somehow this is needed with lxc/f14 + KERNEL_ARGS="$KERNEL_ARGS selinux=0" + # add any debug flag if any (defined in the header of this script) + KERNEL_ARGS="$KERNEL_ARGS $KERNEL_DEBUG_ARGS" + # propagate kernel args for later boot stages + [ -n "$KERNEL_ARGS" ] && echo "$KERNEL_ARGS" > $OVERLAY/kargs.txt # Pack overlay files into a compressed archive echo "* Compressing overlay image" @@ -345,18 +416,22 @@ function build_iso() { # Write isolinux configuration cat >$ISOFS/isolinux.cfg <${BUILDTMP}/mtools.conf<$tmp </dev/null || : mcopy -i "$usb" "$tmp" z:/syslinux.cfg rm -f "$tmp" - rm -f "${BUILDTMP}/mtools.conf" + rm -f "${MTOOLSRC}" unset MTOOLSRC echo "making USB image bootable." @@ -418,8 +500,15 @@ function build_usb() { local usb="$1" ; shift local custom="$1" + rm -f "$usb" mkfs.vfat -C "$usb" $(($(du -Lsk $ISOFS | awk '{ print $1; }') + $FREE_SPACE)) + cat >${BUILDTMP}/mtools.conf<$tmp </dev/null || : mcopy -i "$usb" "$tmp" ::/syslinux.cfg rm -f "$tmp" + rm -f "${MTOOLSRC}" + unset MTOOLSRC echo "making USB image bootable." syslinux "$usb" @@ -510,9 +603,12 @@ EOF popd # update etc/inittab to start with pl_rsysinit - sed -i 's,pl_sysinit,pl_rsysinit,' etc/inittab + for file in etc/inittab etc/event.d/rcS etc/init/rcS.conf; do + [ -f $file ] && sed -i 's,pl_sysinit,pl_rsysinit,' $file + done # modify inittab to have a serial console + # xxx this might well be broken with f12 and above xxx if [ -n "$serial" ] ; then echo "T0:23:respawn:/sbin/agetty -L $console_dev $console_baud vt100" >> etc/inittab # and let root log in @@ -532,7 +628,7 @@ EOF # generate pl_rsysinit cat > etc/rc.d/init.d/pl_rsysinit <$tmp/isolinux.cfg <$tmp <