--- /dev/null
+#!/bin/bash
+#
+# Copyright (c) 2005 The Trustees of Princeton University (Trustees).
+# All Rights Reserved.
+#
+# Original from Mark Huang to setup uml
+# Adapted by Marc Fiucznski to support qemu
+#
+# umsetup is used to create a filesystem image, kernel, and related
+# files needed to run either UML or qemu. It is intended to be used
+# either by individuals for their own testing purposes, or as a
+# nightly script on an build/qa system for automated testing.
+#
+# $Id:$
+
+STEPS="Mkfs Install InstallKernel InstallVRef Config"
+
+usage ()
+{
+ echo "usage: $0 [-s $STEPS] [-t uml|qemu] [-y yum.conf] [kernelbuilddir] [installroot] [package ...]"
+ exit 1
+}
+
+# default filesystem setup for uml
+TYPE="qemu"
+
+# defaults
+YUMCONF=
+UTS_RELEASE=
+
+# Must be root for some tasks
+if [ $UID -ne 0 ] ; then
+ echo "Must be root to run $0"
+ exit 1
+fi
+
+# Get options
+while getopts 's:i:t:y:h' OPT ; do
+ case "$OPT" in
+ s)
+ STEPS=$OPTARG
+ ;;
+
+ t)
+ case "$OPTARG" in
+ uml)
+ TYPE="uml"
+ ;;
+ qemu)
+ TYPE="qemu"
+ ;;
+ *)
+ echo "expecting 'uml' or 'qemu', got $OPTARG"
+ usage
+ ;;
+ esac
+ ;;
+
+ y)
+ YUMCONF=$OPTARG
+ if [ ! -f "$YUMCONF" ]; then
+ echo "yum configuration file $YUMCONF not found"
+ usage
+ fi
+ ;;
+
+ h)
+ usage
+ ;;
+ esac
+done
+
+# Get arguments
+shift $(($OPTIND - 1))
+KERNEL=$1
+shift
+INSTALLROOT=$1
+PACKAGE="$@"
+
+
+# setup the UTS_RELEASE
+if [ -d "$KERNEL" -a -f "$KERNEL/include/linux/version.h" ] ; then
+ eval UTS_RELEASE=$(echo "#include <linux/version.h>" | cpp -I "$KERNEL/include" -dM - | awk '/UTS_RELEASE/ { print $3 }')
+else
+ echo "$KERNEL is not a valid linux kernel directory"
+ exit 0
+fi
+
+# set installation mount point
+if [ -z "$INSTALLROOT" ] ; then
+ INSTALLROOT=$(mktemp -d "/tmp/mountpoint.XXXXXX")
+fi
+# Convert to absolute path
+INSTALLROOT=$(cd $INSTALLROOT && pwd)
+
+# set packages
+if [ -z "$PACKAGE" ] ; then
+ PACKAGE=PlanetLab
+fi
+
+# Bail on any simple error
+set -e
+
+# Be verbose
+set -x
+
+Unmount ()
+{
+ # Unmount / image
+ if grep -q $INSTALLROOT /etc/mtab ; then
+ umount $INSTALLROOT
+ rmdir $INSTALLROOT
+ fi
+}
+
+Mount ()
+{
+ # Mount / image
+ if ! grep -q $INSTALLROOT /etc/mtab ; then
+ mkdir -p $INSTALLROOT
+ modprobe loop
+ mount -o loop fs.img $INSTALLROOT
+ fi
+}
+
+Mkfs ()
+{
+ # Make / image
+ if [ ! -f fs.img ] ; then
+ dd bs=1M count=2048 < /dev/zero > fs.img
+ fi
+ /sbin/mkfs.ext2 -F -j fs.img
+}
+
+MakeDevs ()
+{
+ FAKEROOT=$1
+ if [ ! -z "$FAKEROOT" -a "$FAKEROOT" != "/" ] ; then
+ rm -rf $FAKEROOT/dev
+ mkdir -p $FAKEROOT/dev
+ mknod -m 666 $FAKEROOT/dev/null c 1 3
+ mknod -m 666 $FAKEROOT/dev/zero c 1 5
+ mknod -m 666 $FAKEROOT/dev/full c 1 7
+ mknod -m 644 $FAKEROOT/dev/random c 1 8
+ mknod -m 644 $FAKEROOT/dev/urandom c 1 9
+ mknod -m 666 $FAKEROOT/dev/tty c 5 0
+ mknod -m 666 $FAKEROOT/dev/ptmx c 5 2
+ mkdir -p $FAKEROOT/dev/pts
+ # well, /proc really is not in /dev
+ mkdir -p $FAKEROOT/proc
+ fi
+}
+
+Install ()
+{
+ Mount
+
+ # Bootstrap RPM
+ mkdir -p $INSTALLROOT/var/lib/rpm
+ mkdir -p $INSTALLROOT/etc/rpm
+
+ # Only install English language locale files
+ cat > $INSTALLROOT/etc/rpm/macros <<EOF
+%_install_langs en_US:en
+EOF
+
+ # Initialize RPM database
+ rpm --root $INSTALLROOT --initdb
+
+ # Write TYPE specific fstab
+ if [ "$TYPE" = "uml" ] ; then
+ # Mount home directory inside UML
+ mkdir -p $INSTALLROOT/$HOME
+
+ cat > $INSTALLROOT/etc/fstab <<EOF
+/dev/ubd/0 / ext3 defaults 0 0
+/dev/ubd/1 /vservers ext3 defaults 0 0
+EOF
+ else
+ cat > $INSTALLROOT/etc/fstab <<EOF
+/dev/hda / ext3 defaults 0 0
+EOF
+ fi
+
+ # Write rest of fstab
+ cat >> $INSTALLROOT/etc/fstab <<EOF
+none /proc proc defaults 0 0
+none /dev/shm tmpfs defaults 0 0
+none /dev/pts devpts defaults 0 0
+none /rcfs rcfs defaults 0 0
+EOF
+
+ TMP=$(mktemp "/tmp/yum.conf.XXXXXX")
+ if [ -z "$YUMCONF" ] ; then
+ cp yum.conf $TMP
+ else
+ cp $YUMCONF $TMP
+ fi
+
+ MakeDevs $INSTALLROOT
+ # create mount points for /dev/pts and /proc
+ mount -t devpts none $INSTALLROOT/dev/pts
+ mount -t proc none $INSTALLROOT/proc
+
+ # Install
+ yum -c $TMP -y --installroot $INSTALLROOT install glibc yum
+ yum -c $TMP -y --installroot $INSTALLROOT groupinstall $PACKAGE
+ rm -f $TMP
+
+ umount $INSTALLROOT/dev/pts
+ umount $INSTALLROOT/proc
+
+ Unmount
+}
+
+InstallKernel ()
+{
+ Mount
+
+ mkdir -p $INSTALLROOT/boot
+
+ if [ -f $KERNEL/System.map ] ; then
+ cp $KERNEL/System.map $INSTALLROOT/boot/System.map-$UTS_RELEASE
+ fi
+ if [ -f $KERNEL/init/kerntypes.o ] ; then
+ cp $KERNEL/init/kerntypes.o $INSTALLROOT/boot/Kerntypes-$UTS_RELEASE
+ fi
+ make -C $KERNEL modules_install INSTALL_MOD_PATH=$INSTALLROOT DEPMOD=/bin/true
+
+ rm -f ./initrd-$UTS_RELEASE.img ./bzImage-$UTS_RELEASE $INSTALLROOT/boot/initrd-$UTS_RELEASE.img
+ /usr/sbin/chroot $INSTALLROOT /sbin/depmod -ae -F /boot/System.map-$UTS_RELEASE $UTS_RELEASE
+ /usr/sbin/chroot $INSTALLROOT mkinitrd /boot/initrd-$UTS_RELEASE.img $UTS_RELEASE
+ cp $INSTALLROOT/boot/initrd-$UTS_RELEASE.img .
+
+ rm -f ./bzImage-$UTS_RELEASE ./vmlinux-$UTS_RELEASE
+ ln $KERNEL/arch/i386/boot/bzImage ./bzImage-$UTS_RELEASE
+ ln $KERNEL/vmlinux ./vmlinux-$UTS_RELEASE
+
+ ln -fs ./bzImage-$UTS_RELEASE ./bzImage
+ ln -fs ./initrd-$UTS_RELEASE.img ./initrd
+ ln -fs ./vmlinux-$UTS_RELEASE ./vmlinux
+
+ Unmount
+}
+
+InstallVRef ()
+{
+ Mount
+
+ # Based on vserver-reference
+
+ VROOTDIR=$INSTALLROOT/vservers
+
+ # Make /vservers
+ mkdir -p $VROOTDIR
+ chmod 000 $VROOTDIR
+ chattr +t $VROOTDIR
+
+ # Build image in /vservers/.vtmp
+ mkdir -p $VROOTDIR/.vtmp
+ VROOT=$(mktemp -d $VROOTDIR/.vtmp/vserver-reference.XXXXXX)
+
+ # Make /vservers/.vtmp/vserver-reference.XXXXXX
+ mkdir -p $VROOT
+ chattr -t $VROOT
+ chmod 755 $VROOT
+
+ echo $"Building VServer reference: "
+
+ MakeDevs $VROOT
+ # create fake drive
+ touch $VROOT/dev/hdv1
+
+ # create mount points for /dev/pts and /proc
+ mount -t devpts none $VROOT/dev/pts
+ mount -t proc none $VROOT/proc
+
+ # Create a dummy /etc/fstab in reference image
+ mkdir -p $VROOT/etc
+
+ cat > $VROOT/etc/fstab <<EOF
+# This fake fstab exists only to please df and linuxconf.
+/dev/hdv1 / ext2 defaults 1 1
+EOF
+
+ cp $VROOT/etc/fstab $VROOT/etc/mtab
+
+ # Prevent all locales from being installed in reference image
+ mkdir -p $VROOT/etc/rpm
+ cat > $VROOT/etc/rpm/macros <<EOF
+%_install_langs en_US:en
+%_excludedocs 1
+%__file_context_path /dev/null
+EOF
+
+ # Initialize RPM database in reference image
+ mkdir -p $VROOT/var/lib/rpm
+ rpm --root $VROOT --initdb
+
+ # Install RPMs in reference image
+ TMP=$(mktemp "/tmp/yum.conf.XXXXXX")
+ if [ -z "$YUMCONF" ] ; then
+ cp yum.conf $TMP
+ else
+ cp $YUMCONF $TMP
+ fi
+
+ SSLCERTDIR=
+ yum $SSLCERTDIR -c $TMP --installroot=$VROOT -y groupinstall VServer
+ rm -f $TMP
+
+ # Clean up /dev in reference image
+ umount $VROOT/dev/pts
+
+ # Disable all services in reference image
+ chroot $VROOT /bin/sh -c "chkconfig --list | awk '{ print \$1 }' | xargs -i chkconfig {} off"
+
+ # Copy configuration files from host to reference image
+ for file in /etc/hosts /etc/resolv.conf /etc/yum.conf ; do
+ if [ -f $file ] ; then
+ echo $file | cpio -p -d -u $VROOT
+ fi
+ done
+
+ # Clean up
+ umount $VROOT/proc
+
+ # Swap them when complete
+ mv $VROOT $VROOTDIR
+ if [ -d $VROOTDIR/vserver-reference ] ; then
+ mv $VROOTDIR/vserver-reference $VROOT
+ rm -rf $VROOT
+ fi
+ mv $VROOTDIR/$(basename $VROOT) $VROOTDIR/vserver-reference
+
+ # turn off vserver-reference in host image
+ chkconfig --del vserver-reference
+
+
+ Unmount
+}
+
+
+Config ()
+{
+ Mount
+
+ # Set local time to UTC
+ ln -sf /usr/share/zoneinfo/UTC $INSTALLROOT/etc/localtime
+
+ # Write network configuration
+ cat > $INSTALLROOT/etc/hosts <<EOF
+127.0.0.1 localhost
+EOF
+ cp /etc/resolv.conf $INSTALLROOT/etc/
+
+ # Disable unneeded services
+ SERVICES="netfs rawdevices cpuspeed smartd"
+ # i686 only
+ SERVICES="$SERVICES microcode_ctl"
+ # syslogd and sendmail broken for some reason
+ SERVICES="$SERVICES syslog sendmail"
+ # Not now
+ SERVICES="$SERVICES pl_conf pl_nm pl_spd PlanetLabID PlanetLabConf"
+ for service in $SERVICES ; do
+ /usr/sbin/chroot $INSTALLROOT chkconfig $service off || :
+ done
+
+ Unmount
+}
+
+trap "Unmount ; exit 255"
+
+for step in $STEPS ; do
+ eval $step
+done