X-Git-Url: http://git.onelab.eu/?p=bootcd.git;a=blobdiff_plain;f=build.sh;fp=build.sh;h=0e1f598eeba380d60e115fc868d95a5bcec1ac5c;hp=0000000000000000000000000000000000000000;hb=d5019c8cd35d3ec4b5fee35744c8425f12aa7925;hpb=bd0b3cf306759c5aa5e43a88e4f030100dbac496 diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..0e1f598 --- /dev/null +++ b/build.sh @@ -0,0 +1,555 @@ +#!/bin/bash +# +# Builds custom BootCD ISO and USB images in the current +# directory. For backward compatibility, if an old-style static +# configuration is specified, that configuration file will be parsed +# instead of the current PLC configuration in +# /etc/planetlab/plc_config. +# +# Aaron Klingaman +# Mark Huang +# Copyright (C) 2004-2006 The Trustees of Princeton University +# +# $Id: build.sh,v 1.40 2006/07/25 23:51:39 mlhuang Exp $ +# + +PATH=/sbin:/bin:/usr/sbin:/usr/bin + +CONFIGURATION=default +NODE_CONFIGURATION_FILE= +ALL=0 + +usage() +{ + echo "Usage: build.sh [OPTION]..." + echo " -c name (Deprecated) Static configuration to use (default: $CONFIGURATION)" + echo " -f planet.cnf Node to customize CD for (default: none)" + echo " -a Build all images (default: only base images)" + echo " -h This message" + exit 1 +} + +# Get options +while getopts "c:f:ah" opt ; do + case $opt in + c) + CONFIGURATION=$OPTARG + ;; + f) + NODE_CONFIGURATION_FILE=$OPTARG + ;; + a) + ALL=1 + ;; + h|*) + usage + ;; + esac +done + +# Do not tolerate errors +set -e + +# Change to our source directory +srcdir=$(cd $(dirname $0) && pwd -P) +pushd $srcdir + +# Root of the isofs +isofs=$PWD/build/isofs + +# Build reference image if it does not exist. This should only need to +# be executed once at build time, never at run time. +if [ ! -f $isofs/bootcd.img ] ; then + ./prep.sh +fi + +# build/version.txt written by prep.sh +BOOTCD_VERSION=$(cat build/version.txt) + +if [ -f /etc/planetlab/plc_config ] ; then + # Source PLC configuration + . /etc/planetlab/plc_config +fi + +### This support for backwards compatibility can be taken out in the +### future. RC1 based MyPLCs set $PLC_BOOT_SSL_CRT in the plc_config +### file, but >=RC2 based bootcd assumes that $PLC_BOOT_CA_SSL_CRT is +### set. +if [ -z "$PLC_BOOT_CA_SSL_CRT" -a ! -z "$PLC_BOOT_SSL_CRT" ] ; then + PLC_BOOT_CA_SSL_CRT=$PLC_BOOT_SSL_CRT +fi + +# If PLC configuration is not valid, try a static configuration +if [ -z "$PLC_BOOT_CA_SSL_CRT" -a -d configurations/$CONFIGURATION ] ; then + # (Deprecated) Source static configuration + . configurations/$CONFIGURATION/configuration + PLC_NAME="PlanetLab" + PLC_MAIL_SUPPORT_ADDRESS="support@planet-lab.org" + PLC_WWW_HOST="www.planet-lab.org" + PLC_WWW_PORT=80 + if [ -n "$EXTRA_VERSION" ] ; then + BOOTCD_VERSION="$BOOTCD_VERSION $EXTRA_VERSION" + fi + PLC_BOOT_HOST=$PRIMARY_SERVER + PLC_BOOT_SSL_PORT=$PRIMARY_SERVER_PORT + PLC_BOOT_CA_SSL_CRT=configurations/$CONFIGURATION/$PRIMARY_SERVER_CERT + PLC_ROOT_GPG_KEY_PUB=configurations/$CONFIGURATION/$PRIMARY_SERVER_GPG +fi + +FULL_VERSION_STRING="$PLC_NAME BootCD $BOOTCD_VERSION" + +echo "* Building images for $FULL_VERSION_STRING" + +# From within a myplc chroot /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. +[ -d /data ] && BUILDTMP=/data || BUILDTMP=/tmp + +# Root of the ISO and USB images +echo "* Populating root filesystem..." +overlay=$(mktemp -d ${BUILDTMP}/overlay.XXXXXX) +install -d -m 755 $overlay +trap "rm -rf $overlay" ERR INT + +# Create version files +echo "* Creating version files" + +# Boot Manager compares pl_version in both places to make sure that +# 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 +done + +# Install boot server configuration files +echo "* Installing boot server configuration files" + +# We always intended to bring up and support backup boot servers, +# 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 +done + +# (Deprecated) Install old-style boot server configuration files +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 +echo "$PLC_BOOT_HOST" >$overlay/usr/bootme/BOOTSERVER +echo "$PLC_BOOT_HOST" >$overlay/usr/bootme/BOOTSERVER_IP +echo "$PLC_BOOT_SSL_PORT" >$overlay/usr/bootme/BOOTPORT + +# Generate /etc/issue +echo "* Generating /etc/issue" + +if [ "$PLC_WWW_PORT" = "443" ] ; then + PLC_WWW_URL="https://$PLC_WWW_HOST/" +elif [ "$PLC_WWW_PORT" != "80" ] ; then + PLC_WWW_URL="http://$PLC_WWW_HOST:$PLC_WWW_PORT/" +else + PLC_WWW_URL="http://$PLC_WWW_HOST/" +fi + +mkdir -p $overlay/etc +cat >$overlay/etc/issue <$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" + install -D -m 644 $NODE_CONFIGURATION_FILE $overlay/usr/boot/plnode.txt +fi + +# Pack overlay files into a compressed archive +echo "* Compressing overlay image" +(cd $overlay && find . | cpio --quiet -c -o) | gzip -9 >$isofs/overlay.img + +rm -rf $overlay +trap - ERR INT + +# Calculate ramdisk size (total uncompressed size of both archives) +ramdisk_size=$(gzip -l $isofs/bootcd.img $isofs/overlay.img | tail -1 | awk '{ print $2; }') # bytes +ramdisk_size=$((($ramdisk_size + 1023) / 1024)) # kilobytes + +# Write isolinux configuration +echo "$FULL_VERSION_STRING" >$isofs/pl_version +cat >$isofs/isolinux.cfg <$isofs/isolinux.cfg <$tmp/syslinux.cfg <$tmp/syslinux.cfg <./etc/fstab <> etc/inittab +# and let root log in +echo "ttyS0" >> etc/securetty + +#calculate the size of /tmp based on the size of /etc & /var + 8MB slack +etcsize=$(du -s ./etc | awk '{ print $1 }') +varsize=$(du -s ./etc | awk '{ print $1 }') +let msize=($vsize+$esize+8192)/1024 + + +# generate pl_rsysinit +cat > etc/rc.d/init.d/pl_rsysinit < /tmp/etc/mtab + +# copy over directory contents of all _o directories from /etc and /var +# /tmp/etc and /tmp/var +pushd /etc +for odir in \$(cd /etc && ls -d *_o); do dir=\$(echo \$odir | sed 's,\_o$,,'); (mkdir -p /tmp/etc/\$dir && cd \$odir && find . | cpio -p -d -u /tmp/etc/\$dir); done +popd +pushd /var +for odir in \$(cd /var && ls -d *_o); do dir=\$(echo \$odir | sed 's,\_o$,,'); (mkdir -p /tmp/var/\$dir && cd \$odir && find . | cpio -p -d -u /tmp/var/\$dir); done +popd + +echo "done" +# hand over to pl_sysinit +echo "pl_rsysinit: handing over to pl_sysinit" +/etc/init.d/pl_sysinit +EOF +chmod +x etc/rc.d/init.d/pl_rsysinit + +popd + +chown -R 0.0 $cramfs + +#create the cramfs image +echo "* Creating cramfs image" +mkfs.cramfs $tmp/ $cramfs +# Leave 1 MB of free space on the VFAT filesystem +cramfs_size=$(($(du -sk $cramfs | awk '{ print $1; }'))) +mv $cramfs ${BUILDTMP}/cramfs.img +rm -rf $tmp +trap - ERR INT + +# Create ISO CRAMFS image +echo "* Creating ISO CRAMFS-based image" +iso="$PLC_NAME-BootCD-$BOOTCD_VERSION-cramfs.iso" + +tmp=$(mktemp -d ${BUILDTMP}/bootcd.XXXXXX) +trap "$tmp; rm -rf $tmp" ERR INT +(cd $isofs && find . | grep -v "\.img$" | cpio -p -d -u $tmp/) +cat >$tmp/isolinux.cfg <$tmp/isolinux.cfg <$tmp/syslinux.cfg <$tmp/syslinux.cfg <