X-Git-Url: http://git.onelab.eu/?p=bootcd.git;a=blobdiff_plain;f=build.sh;h=a051700d2be0d8790ede14d557ca0dabf3a202ae;hp=b62308b6096cb46cf636e1fb9b56d0589ddc486d;hb=HEAD;hpb=d44c6a7a18681c562b053e777d20cc9dc37f7d63 diff --git a/build.sh b/build.sh index b62308b..a051700 100755 --- a/build.sh +++ b/build.sh @@ -1,19 +1,33 @@ #!/bin/bash # # Builds custom BootCD ISO and USB images in the current -# directory. +# directory. # # Aaron Klingaman # 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 @@ -21,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 @@ -30,7 +48,7 @@ OUTPUT_BASE= DRY_RUN="" OUTPUT_NAME="" TYPES="" -KARGS_STR="" +KERNEL_ARGS="" # various globals BUILDTMP="" @@ -43,7 +61,6 @@ console_dev="" console_baud="" console_spec="" console_serial_line="" -kernel_args="" #################### compute all supported types @@ -56,10 +73,10 @@ for x in iso usb usb_partition; do for c in "" "_cramfs" ; do t="${x}${c}" case $t in usb_partition_cramfs) - # unsupported - ;; + # unsupported + ;; *) - ALL_TYPES="$ALL_TYPES $t" ;; + ALL_TYPES="$ALL_TYPES $t" ;; esac done; done @@ -87,16 +104,16 @@ function init_and_check () { # 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 + # this is because prep.sh needs to know pldistro if [ ! -f $ISOREF/isofs/bootcd.img -o ! -f $ISOREF/version.txt ] ; then - 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 + 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 @@ -104,7 +121,7 @@ function init_and_check () { if [ -f /etc/planetlab/plc_config ] ; then # Source PLC configuration - . /etc/planetlab/plc_config + . /etc/planetlab/plc_config fi # use /var/tmp that should be large enough on both chroot- or vserver-based myplc @@ -119,7 +136,7 @@ function init_and_check () { # without the need for a full devel environment # for example, you would create /root/custom-bootcd/etc/rc.d/init.d/pl_hwinit # and run this script with -C /root/custom-bootcd -# this creates a third .img image of the custom dir, that 'hides' the files from +# this creates a third .img image of the custom dir, that 'hides' the files from # bootcd.img in the resulting unionfs # it seems that this feature has not been used nor tested in a long time, use with care @@ -146,27 +163,27 @@ usage() { exit 1 } -#################### +#################### function parse_command_line () { # init TYPES="" # Get options 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" ;; - a) TYPES="$ALL_TYPES" ;; - s) CONSOLE_INFO="$OPTARG" ;; - S) CONSOLE_INFO=$SERIAL_CONSOLE ;; - 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 ;; - esac + case $opt in + f) NODE_CONFIGURATION_FILE=$OPTARG ;; + t) TYPES="$TYPES $OPTARG" ;; + a) TYPES="$ALL_TYPES" ;; + s) CONSOLE_INFO="$OPTARG" ;; + S) CONSOLE_INFO=$SERIAL_CONSOLE ;; + 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 done # use defaults if not set @@ -176,25 +193,25 @@ function parse_command_line () { 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" + 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 + # check TYPES local matcher="XXX$(echo $ALL_TYPES | sed -e 's,\W,XXX,g')XXX" for t in $TYPES; do - echo Checking type $t - echo $matcher | grep XXX${t}XXX &> /dev/null - if [ "$?" != 0 ] ; then - echo Unknown type $t - usage - fi + echo Checking type $t + echo $matcher | grep XXX${t}XXX &> /dev/null + if [ "$?" != 0 ] ; then + echo Unknown type $t + usage + fi done } @@ -203,24 +220,24 @@ function parse_command_line () { function init_serial () { local console=$1; shift if [ "$console" == "$GRAPHIC_CONSOLE" ] ; then - IS_SERIAL= - console_spec="" - echo "Standard, graphic, non-serial mode" + IS_SERIAL= + console_spec="" + echo "Standard, graphic, non-serial mode" else - IS_SERIAL=true - console_dev=$(echo "$console" | awk -F: ' {print $1}') - console_baud=$(echo "$console" | awk -F: ' {print $2}') - [ -z "$console_baud" ] && console_baud="115200" - local console_parity=$(echo "$console" | awk -F: ' {print $3}') - [ -z "$console_parity" ] && console_parity="n" - local console_bits=$(echo "$console" | awk -F: ' {print $4}') - [ -z "$console_bits" ] && console_bits="8" - console_spec="console=${console_dev},${console_baud}${console_parity}${console_bits}" - local tty_nb=$(echo $console_dev | sed -e 's,[a-zA-Z],,g') - console_serial_line="SERIAL ${tty_nb} ${console_baud}" - echo "Serial mode" - echo "console_serial_line=${console_serial_line}" - echo "console_spec=${console_spec}" + IS_SERIAL=true + console_dev=$(echo "$console" | awk -F: ' {print $1}') + console_baud=$(echo "$console" | awk -F: ' {print $2}') + [ -z "$console_baud" ] && console_baud="115200" + local console_parity=$(echo "$console" | awk -F: ' {print $3}') + [ -z "$console_parity" ] && console_parity="n" + local console_bits=$(echo "$console" | awk -F: ' {print $4}') + [ -z "$console_bits" ] && console_bits="8" + console_spec="console=${console_dev},${console_baud}${console_parity}${console_bits}" + local tty_nb=$(echo $console_dev | sed -e 's,[a-zA-Z],,g') + console_serial_line="SERIAL ${tty_nb} ${console_baud}" + echo "Serial mode" + echo "console_serial_line=${console_serial_line}" + echo "console_spec=${console_spec}" fi } @@ -229,14 +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 - # the syslinux that comes with f12 has this file in a new location - cp "/usr/lib/syslinux/isolinux.bin" "${BUILDTMP}/isofs" \ - || cp "/usr/share/syslinux/isolinux.bin" "${BUILDTMP}/isofs" - ISOFS="${BUILDTMP}/isofs" # Root of the ISO and USB images echo "* Populating root filesystem..." @@ -251,8 +280,8 @@ function build_overlay () { # the right CD is mounted. We used to boot from an initrd and mount # the CD on /usr. Now we just run everything out of the initrd. for file in $OVERLAY/pl_version $OVERLAY/usr/isolinux/pl_version ; do - mkdir -p $(dirname $file) - echo "$FULL_VERSION_STRING" >$file + mkdir -p $(dirname $file) + echo "$FULL_VERSION_STRING" >$file done # Install boot server configuration files @@ -262,15 +291,15 @@ function build_overlay () { # but never got around to it. Just install the same parameters for # both for now. for dir in $OVERLAY/usr/boot $OVERLAY/usr/boot/backup ; do - install -D -m 644 $PLC_BOOT_CA_SSL_CRT $dir/cacert.pem - install -D -m 644 $PLC_ROOT_GPG_KEY_PUB $dir/pubring.gpg - echo "$PLC_BOOT_HOST" >$dir/boot_server - echo "$PLC_BOOT_SSL_PORT" >$dir/boot_server_port - echo "/boot/" >$dir/boot_server_path + install -D -m 644 $PLC_BOOT_CA_SSL_CRT $dir/cacert.pem + install -D -m 644 $PLC_ROOT_GPG_KEY_PUB $dir/pubring.gpg + echo "$PLC_BOOT_HOST" >$dir/boot_server + echo "$PLC_BOOT_SSL_PORT" >$dir/boot_server_port + echo "/boot/" >$dir/boot_server_path done # Install old-style boot server configuration files - # as opposed to what a former comment suggested, + # as opposed to what a former comment suggested, # this is still required, somewhere in the bootmanager apparently install -D -m 644 $PLC_BOOT_CA_SSL_CRT $OVERLAY/usr/bootme/cacert/$PLC_BOOT_HOST/cacert.pem echo "$FULL_VERSION_STRING" >$OVERLAY/usr/bootme/ID @@ -282,11 +311,11 @@ function build_overlay () { echo "* Generating /etc/issue" if [ "$PLC_WWW_PORT" = "443" ] ; then - PLC_WWW_URL="https://$PLC_WWW_HOST/" + PLC_WWW_URL="https://$PLC_WWW_HOST/" elif [ "$PLC_WWW_PORT" != "80" ] ; then - PLC_WWW_URL="http://$PLC_WWW_HOST:$PLC_WWW_PORT/" + PLC_WWW_URL="http://$PLC_WWW_HOST:$PLC_WWW_PORT/" else - PLC_WWW_URL="http://$PLC_WWW_HOST/" + PLC_WWW_URL="http://$PLC_WWW_HOST/" fi mkdir -p $OVERLAY/etc @@ -306,41 +335,57 @@ password of the default $PLC_NAME Central administrator account at the time that this CD was created. EOF - + # Set root password echo "* Setting root password" if [ -z "$ROOT_PASSWORD" ] ; then # Generate an encrypted password with crypt() if not defined # in a static configuration. - ROOT_PASSWORD=$(python <$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 + 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 - KARGS_STR="$KARGS_STR ${console_spec}" - fi + [ -n "$IS_SERIAL" ] && KERNEL_ARGS="$KERNEL_ARGS ${console_spec}" - if [ -n "$KARGS_STR" ] ; then - echo "$KARGS_STR" > $OVERLAY/kargs.txt - kernel_args=$KARGS_STR - fi + # making sure the network interfaces are still numbered eth0 and above + KERNEL_ARGS="$KERNEL_ARGS biosdevname=0" + # this apparently is required instead (or in addition to) starting with f29 + KERNEL_ARGS="$KERNEL_ARGS net.ifnames=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" @@ -350,8 +395,8 @@ EOF pop_cleanup if [ -n "$CUSTOM_DIR" ]; then - echo "* Compressing custom image" - (cd "$CUSTOM_DIR" && find . | cpio --quiet -c -o) | gzip -9 >$ISOFS/custom.img + echo "* Compressing custom image" + (cd "$CUSTOM_DIR" && find . | cpio --quiet -c -o) | gzip -9 >$ISOFS/custom.img fi # Calculate ramdisk size (total uncompressed size of both archives) @@ -371,15 +416,21 @@ function build_iso() { # Write isolinux configuration cat >$ISOFS/isolinux.cfg <${BUILDTMP}/mtools.conf<$tmp </dev/null || : mcopy -i "$usb" "$tmp" z:/syslinux.cfg @@ -460,11 +517,13 @@ EOF tmp="${BUILDTMP}/syslinux.cfg" cat >$tmp </dev/null || : mcopy -i "$usb" "$tmp" ::/syslinux.cfg @@ -479,7 +538,7 @@ EOF #################### utility to setup CRAMFS related support function prepare_cramfs() { [ -n "$CRAMFS_PREPARED" ] && return 0 - local custom=$1; + local custom=$1; echo "* Setting up CRAMFS-based images" local tmp="${BUILDTMP}/cramfs-tree" @@ -501,7 +560,7 @@ function prepare_cramfs() { # relocate various directory to /tmp rm -rf root ln -fs /tmp/root root - ln -fs /sbin/init linuxrc + ln -fs /sbin/init linuxrc ln -fs /tmp/resolv.conf etc/resolv.conf ln -fs /tmp/etc/mtab etc/mtab @@ -544,13 +603,16 @@ 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 + echo "T0:23:respawn:/sbin/agetty -L $console_dev $console_baud vt100" >> etc/inittab # and let root log in - echo "$console_dev" >> etc/securetty + echo "$console_dev" >> etc/securetty fi # calculate the size of /tmp based on the size of /etc & /var + 8MB slack @@ -619,11 +681,13 @@ function build_iso_cramfs() { (cd $ISOFS && find . | grep -v "\.img$" | cpio -p -d -u $tmp/) cat >$tmp/isolinux.cfg <$tmp <