# Mark Huang <mlhuang@cs.princeton.edu>
# Copyright (C) 2004-2007 The Trustees of Princeton University
#
-# $Id$
-#
+COMMAND=$(basename $0)
+DIRNAME=$(dirname $0)
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# defaults
DRY_RUN=""
OUTPUT_NAME=""
TYPES=""
-KARGS_STR=""
+KERNEL_ARGS=""
# various globals
BUILDTMP=""
console_baud=""
console_spec=""
console_serial_line=""
-kernel_args=""
#################### compute all supported types
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}"
# 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"
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"
# 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" ;;
O) OUTPUT_BASE="$OPTARG" ;;
o) OUTPUT_NAME="$OPTARG" ;;
C) CUSTOM_DIR="$OPTARG" ;;
- k) KARGS_STR="$OPTARG" ;;
+ V) VARIANT="$OPTARG" ;;
+ k) KERNEL_ARGS="$KERNEL_ARGS $OPTARG" ;;
n) DRY_RUN=true ;;
h|*) usage ;;
esac
# 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
for i in "$ISOREF"/isofs/{bootcd.img,kernel}; do
ln -s "$i" "${BUILDTMP}/isofs"
done
- cp "/usr/lib/syslinux/isolinux.bin" "${BUILDTMP}/isofs"
+ # 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
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
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
+ # 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"
+# cannot use this mecahnism to set systemd default target because this applies to kexec boots as well
+# # set default target for systemd
+# KERNEL_ARGS="$KERNEL_ARGS systemd.unit=pl_boot.target"
+ # output more systemd-related messages on the console
+ KERNEL_ARGS="$KERNEL_ARGS systemd.log_level=debug systemd.log_target=kmsg"
+ [ -n "$KERNEL_ARGS" ] && echo "$KERNEL_ARGS" > $OVERLAY/kargs.txt
# Pack overlay files into a compressed archive
echo "* Compressing overlay image"
cat >$ISOFS/isolinux.cfg <<EOF
${console_serial_line}
DEFAULT kernel
-APPEND ramdisk_size=$ramdisk_size initrd=bootcd.img,overlay.img${custom:+,custom.img} root=/dev/ram0 rw ${kernel_args}
+APPEND ramdisk_size=$ramdisk_size initrd=bootcd.img,overlay.img${custom:+,custom.img} root=/dev/ram0 rw ${KERNEL_ARGS}
DISPLAY pl_version
PROMPT 0
TIMEOUT 40
# Create ISO image
echo "* Creating ISO image"
- mkisofs -o "$iso" \
- $MKISOFS_OPTS \
- $ISOFS
+ mkisofs -o "$iso" $MKISOFS_OPTS $ISOFS
}
#################### USB with partitions
local cylinders=$(( ($size*1024*2)/($heads*$sectors) ))
local offset=$(( $sectors*512 ))
- /usr/lib/syslinux/mkdiskimage -M -4 "$usb" $size $heads $sectors
-
+ if [ -f /usr/lib/syslinux/mkdiskimage ] ; then
+ /usr/lib/syslinux/mkdiskimage -M -4 "$usb" $size $heads $sectors
+ else
+ mkdiskimage -M -4 "$usb" $size $heads $sectors
+ fi
+
cat >${BUILDTMP}/mtools.conf<<EOF
drive z:
file="${usb}"
sectors=$sectors
offset=$offset
mformat_only
+mtools_skip_check=1
EOF
# environment variable for mtools
export MTOOLSRC="${BUILDTMP}/mtools.conf"
cat >$tmp <<EOF
${console_serial_line}
DEFAULT kernel
-APPEND ramdisk_size=$ramdisk_size initrd=bootcd.img,overlay.img${custom:+,custom.img} root=/dev/ram0 rw ${kernel_args}
+APPEND ramdisk_size=$ramdisk_size initrd=bootcd.img,overlay.img${custom:+,custom.img} root=/dev/ram0 rw ${KERNEL_ARGS}
DISPLAY pl_version
PROMPT 0
TIMEOUT 40
mdel -i "$usb" z:/isolinux.cfg 2>/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."
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<<EOF
+mtools_skip_check=1
+EOF
+ # environment variable for mtools
+ export MTOOLSRC="${BUILDTMP}/mtools.conf"
+
# Populate it
echo -n " populating USB image... "
mcopy -bsQ -i "$usb" "$ISOFS"/* ::/
cat >$tmp <<EOF
${console_serial_line}
DEFAULT kernel
-APPEND ramdisk_size=$ramdisk_size initrd=bootcd.img,overlay.img${custom:+,custom.img} root=/dev/ram0 rw ${kernel_args}
+APPEND ramdisk_size=$ramdisk_size initrd=bootcd.img,overlay.img${custom:+,custom.img} root=/dev/ram0 rw ${KERNEL_ARGS}
DISPLAY pl_version
PROMPT 0
TIMEOUT 40
mdel -i "$usb" ::/isolinux.cfg 2>/dev/null || :
mcopy -i "$usb" "$tmp" ::/syslinux.cfg
rm -f "$tmp"
+ rm -f "${MTOOLSRC}"
+ unset MTOOLSRC
echo "making USB image bootable."
syslinux "$usb"
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
# generate pl_rsysinit
cat > etc/rc.d/init.d/pl_rsysinit <<EOF
#!/bin/sh
-# generated by build.sh
+# generated by $COMMAND
echo -n "pl_rsysinit: preparing /etc and /var for pl_sysinit..."
mount -t tmpfs -orw,size=${msize}M,mode=1777 tmpfs /tmp
mkdir -p /tmp/root
cat >$tmp/isolinux.cfg <<EOF
${console_serial_line}
DEFAULT kernel
-APPEND ramdisk_size=$cramfs_size initrd=cramfs.img root=/dev/ram0 ro ${kernel_args}
+APPEND ramdisk_size=$cramfs_size initrd=cramfs.img root=/dev/ram0 ro ${KERNEL_ARGS}
DISPLAY pl_version
PROMPT 0
TIMEOUT 40
cat >$tmp <<EOF
${console_serial_line}
DEFAULT kernel
-APPEND ramdisk_size=$cramfs_size initrd=cramfs.img root=/dev/ram0 ro ${kernel_args}
+APPEND ramdisk_size=$cramfs_size initrd=cramfs.img root=/dev/ram0 ro ${KERNEL_ARGS}
DISPLAY pl_version
PROMPT 0
TIMEOUT 40
####################
function main () {
- init_and_check
-
parse_command_line "$@"
+ init_and_check
+
echo "* Building images for $FULL_VERSION_STRING"
# Do not tolerate errors
set -e