3 # Copyright (c) 2005 The Trustees of Princeton University (Trustees).
6 # Original from Mark Huang to setup uml
7 # Adapted by Marc Fiucznski to support qemu
9 # umsetup is used to create a filesystem image, kernel, and related
10 # files needed to run either UML or qemu. It is intended to be used
11 # either by individuals for their own testing purposes, or as a
12 # nightly script on an build/qa system for automated testing.
16 STEPS="Mkfs Install InstallKernel InstallVRef Config"
20 echo "usage: $0 [-s $STEPS] [-t uml|qemu] [-y yum.conf] [kernelbuilddir] [installroot] [package ...]"
24 # default filesystem setup for uml
31 # Must be root for some tasks
32 if [ $UID -ne 0 ] ; then
33 echo "Must be root to run $0"
38 while getopts 's:i:t:y:h' OPT ; do
53 echo "expecting 'uml' or 'qemu', got $OPTARG"
61 if [ ! -f "$YUMCONF" ]; then
62 echo "yum configuration file $YUMCONF not found"
74 shift $(($OPTIND - 1))
81 # setup the UTS_RELEASE
82 if [ -d "$KERNEL" -a -f "$KERNEL/include/linux/version.h" ] ; then
83 eval UTS_RELEASE=$(echo "#include <linux/version.h>" | cpp -I "$KERNEL/include" -dM - | awk '/UTS_RELEASE/ { print $3 }')
85 echo "$KERNEL is not a valid linux kernel directory"
89 # set installation mount point
90 if [ -z "$INSTALLROOT" ] ; then
91 INSTALLROOT=$(mktemp -d "/tmp/mountpoint.XXXXXX")
93 # Convert to absolute path
94 INSTALLROOT=$(cd $INSTALLROOT && pwd)
97 if [ -z "$PACKAGE" ] ; then
101 # Bail on any simple error
110 if grep -q $INSTALLROOT /etc/mtab ; then
119 if ! grep -q $INSTALLROOT /etc/mtab ; then
120 mkdir -p $INSTALLROOT
122 mount -o loop fs.img $INSTALLROOT
129 if [ ! -f fs.img ] ; then
130 dd bs=1M count=2048 < /dev/zero > fs.img
132 /sbin/mkfs.ext2 -F -j fs.img
138 if [ ! -z "$FAKEROOT" -a "$FAKEROOT" != "/" ] ; then
140 mkdir -p $FAKEROOT/dev
141 mknod -m 666 $FAKEROOT/dev/null c 1 3
142 mknod -m 666 $FAKEROOT/dev/zero c 1 5
143 mknod -m 666 $FAKEROOT/dev/full c 1 7
144 mknod -m 644 $FAKEROOT/dev/random c 1 8
145 mknod -m 644 $FAKEROOT/dev/urandom c 1 9
146 mknod -m 666 $FAKEROOT/dev/tty c 5 0
147 mknod -m 666 $FAKEROOT/dev/ptmx c 5 2
148 mkdir -p $FAKEROOT/dev/pts
149 # well, /proc really is not in /dev
150 mkdir -p $FAKEROOT/proc
159 mkdir -p $INSTALLROOT/var/lib/rpm
160 mkdir -p $INSTALLROOT/etc/rpm
162 # Only install English language locale files
163 cat > $INSTALLROOT/etc/rpm/macros <<EOF
164 %_install_langs en_US:en
167 # Initialize RPM database
168 rpm --root $INSTALLROOT --initdb
170 # Write TYPE specific fstab
171 if [ "$TYPE" = "uml" ] ; then
172 # Mount home directory inside UML
173 mkdir -p $INSTALLROOT/$HOME
175 cat > $INSTALLROOT/etc/fstab <<EOF
176 /dev/ubd/0 / ext3 defaults 0 0
177 /dev/ubd/1 /vservers ext3 defaults 0 0
180 cat > $INSTALLROOT/etc/fstab <<EOF
181 /dev/hda / ext3 defaults 0 0
185 # Write rest of fstab
186 cat >> $INSTALLROOT/etc/fstab <<EOF
187 none /proc proc defaults 0 0
188 none /dev/shm tmpfs defaults 0 0
189 none /dev/pts devpts defaults 0 0
190 none /rcfs rcfs defaults 0 0
193 TMP=$(mktemp "/tmp/yum.conf.XXXXXX")
194 if [ -z "$YUMCONF" ] ; then
200 MakeDevs $INSTALLROOT
201 # create mount points for /dev/pts and /proc
202 mount -t devpts none $INSTALLROOT/dev/pts
203 mount -t proc none $INSTALLROOT/proc
206 yum -c $TMP -y --installroot $INSTALLROOT install glibc yum
207 yum -c $TMP -y --installroot $INSTALLROOT groupinstall $PACKAGE
210 umount $INSTALLROOT/dev/pts
211 umount $INSTALLROOT/proc
220 mkdir -p $INSTALLROOT/boot
222 if [ -f $KERNEL/System.map ] ; then
223 cp $KERNEL/System.map $INSTALLROOT/boot/System.map-$UTS_RELEASE
225 if [ -f $KERNEL/init/kerntypes.o ] ; then
226 cp $KERNEL/init/kerntypes.o $INSTALLROOT/boot/Kerntypes-$UTS_RELEASE
228 make -C $KERNEL modules_install INSTALL_MOD_PATH=$INSTALLROOT DEPMOD=/bin/true
230 rm -f ./initrd-$UTS_RELEASE.img ./bzImage-$UTS_RELEASE $INSTALLROOT/boot/initrd-$UTS_RELEASE.img
231 /usr/sbin/chroot $INSTALLROOT /sbin/depmod -ae -F /boot/System.map-$UTS_RELEASE $UTS_RELEASE
232 /usr/sbin/chroot $INSTALLROOT mkinitrd /boot/initrd-$UTS_RELEASE.img $UTS_RELEASE
233 cp $INSTALLROOT/boot/initrd-$UTS_RELEASE.img .
235 rm -f ./bzImage-$UTS_RELEASE ./vmlinux-$UTS_RELEASE
236 ln $KERNEL/arch/i386/boot/bzImage ./bzImage-$UTS_RELEASE
237 ln $KERNEL/vmlinux ./vmlinux-$UTS_RELEASE
239 ln -fs ./bzImage-$UTS_RELEASE ./bzImage
240 ln -fs ./initrd-$UTS_RELEASE.img ./initrd
241 ln -fs ./vmlinux-$UTS_RELEASE ./vmlinux
250 # Based on vserver-reference
252 VROOTDIR=$INSTALLROOT/vservers
259 # Build image in /vservers/.vtmp
260 mkdir -p $VROOTDIR/.vtmp
261 VROOT=$(mktemp -d $VROOTDIR/.vtmp/vserver-reference.XXXXXX)
263 # Make /vservers/.vtmp/vserver-reference.XXXXXX
268 echo $"Building VServer reference: "
272 touch $VROOT/dev/hdv1
274 # create mount points for /dev/pts and /proc
275 mount -t devpts none $VROOT/dev/pts
276 mount -t proc none $VROOT/proc
278 # Create a dummy /etc/fstab in reference image
281 cat > $VROOT/etc/fstab <<EOF
282 # This fake fstab exists only to please df and linuxconf.
283 /dev/hdv1 / ext2 defaults 1 1
286 cp $VROOT/etc/fstab $VROOT/etc/mtab
288 # Prevent all locales from being installed in reference image
289 mkdir -p $VROOT/etc/rpm
290 cat > $VROOT/etc/rpm/macros <<EOF
291 %_install_langs en_US:en
293 %__file_context_path /dev/null
296 # Initialize RPM database in reference image
297 mkdir -p $VROOT/var/lib/rpm
298 rpm --root $VROOT --initdb
300 # Install RPMs in reference image
301 TMP=$(mktemp "/tmp/yum.conf.XXXXXX")
302 if [ -z "$YUMCONF" ] ; then
309 yum $SSLCERTDIR -c $TMP --installroot=$VROOT -y groupinstall VServer
312 # Clean up /dev in reference image
313 umount $VROOT/dev/pts
315 # Disable all services in reference image
316 chroot $VROOT /bin/sh -c "chkconfig --list | awk '{ print \$1 }' | xargs -i chkconfig {} off"
318 # Copy configuration files from host to reference image
319 for file in /etc/hosts /etc/resolv.conf /etc/yum.conf ; do
320 if [ -f $file ] ; then
321 echo $file | cpio -p -d -u $VROOT
328 # Swap them when complete
330 if [ -d $VROOTDIR/vserver-reference ] ; then
331 mv $VROOTDIR/vserver-reference $VROOT
334 mv $VROOTDIR/$(basename $VROOT) $VROOTDIR/vserver-reference
336 # turn off vserver-reference in host image
337 chkconfig --del vserver-reference
348 # Set local time to UTC
349 ln -sf /usr/share/zoneinfo/UTC $INSTALLROOT/etc/localtime
351 # Write network configuration
352 cat > $INSTALLROOT/etc/hosts <<EOF
355 cp /etc/resolv.conf $INSTALLROOT/etc/
357 # Disable unneeded services
358 SERVICES="netfs rawdevices cpuspeed smartd"
360 SERVICES="$SERVICES microcode_ctl"
361 # syslogd and sendmail broken for some reason
362 SERVICES="$SERVICES syslog sendmail"
364 SERVICES="$SERVICES pl_conf pl_nm pl_spd PlanetLabID PlanetLabConf"
365 for service in $SERVICES ; do
366 /usr/sbin/chroot $INSTALLROOT chkconfig $service off || :
372 trap "Unmount ; exit 255"
374 for step in $STEPS ; do