From 346c0562033130b98c358bae331b3c0b22a9e8db Mon Sep 17 00:00:00 2001 From: Mike Hibler <mike@flux.utah.edu> Date: Tue, 9 Jan 2007 19:46:42 +0000 Subject: [PATCH] Frisbee MFS changes: * support FreeBSD 6 * client-side changes to support enable/disable of ACPI via slicefix * use dynamically linked Emulab binaries in frisbee MFS (for size) --- GNUmakefile.in | 12 ++++- cdrom/groklilo/GNUmakefile.in | 11 +++- os/frisbee.redux/GNUmakefile.in | 13 +++-- os/growdisk/GNUmakefile.in | 11 +++- tmcd/GNUmakefile.in | 17 ++++-- tmcd/freebsd/dhclient-exit-hooks | 11 +++- tmcd/freebsd/rc.frisbee | 5 +- tmcd/freebsd/slicefix | 88 +++++++++++++++++++++++++++++-- tmcd/freebsd5/frisbee/rc.conf | 30 +++++++++-- tmcd/freebsd5/mfs-frisbee-rc.conf | 37 ------------- tmcd/freebsd6/GNUmakefile.in | 12 ++++- 11 files changed, 186 insertions(+), 61 deletions(-) delete mode 100644 tmcd/freebsd5/mfs-frisbee-rc.conf diff --git a/GNUmakefile.in b/GNUmakefile.in index ae1c82a443..33d4e44b02 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -1,6 +1,6 @@ # # EMULAB-COPYRIGHT -# Copyright (c) 2000-2006 University of Utah and the Flux Group. +# Copyright (c) 2000-2007 University of Utah and the Flux Group. # All rights reserved. # # Testbed Makefile @@ -215,11 +215,21 @@ frisbee-mfs: mfsoscheck @$(MAKE) -C os frisbee-mfs @$(MAKE) -C tmcd frisbee-mfs +frisbee-mfs-nostatic: mfsoscheck + @NOSTATIC=1 $(MAKE) -C cdrom/groklilo client + @NOSTATIC=1 $(MAKE) -C os frisbee-mfs + @NOSTATIC=1 $(MAKE) -C tmcd frisbee-mfs + frisbee-mfs-install: destdircheck frisbee-mfs @CLIENT_BINDIR=/etc/testbed $(MAKE) -e -C cdrom/groklilo client-install @$(MAKE) -C os frisbee-mfs-install @$(MAKE) -C tmcd frisbee-mfs-install +frisbee-mfs-nostatic-install: destdircheck frisbee-mfs-nostatic + @CLIENT_BINDIR=/etc/testbed $(MAKE) -e -C cdrom/groklilo client-install + @$(MAKE) -C os frisbee-mfs-install + @$(MAKE) -C tmcd frisbee-mfs-install + # # A check to see if this is a 'real' install. Kinda hacky, but as far as I can # tell, you can't put ifeq()'s inside of targets diff --git a/cdrom/groklilo/GNUmakefile.in b/cdrom/groklilo/GNUmakefile.in index 5a11342722..32f573816c 100644 --- a/cdrom/groklilo/GNUmakefile.in +++ b/cdrom/groklilo/GNUmakefile.in @@ -1,6 +1,6 @@ # # EMULAB-COPYRIGHT -# Copyright (c) 2000-2004 University of Utah and the Flux Group. +# Copyright (c) 2000-2004, 2007 University of Utah and the Flux Group. # All rights reserved. # @@ -12,6 +12,13 @@ SUBDIR = cdrom/groklilo include $(OBJDIR)/Makeconf +ifeq ($(NOSTATIC),) +# for now we link everything static +LDSTATIC = -static +else +LDSTATIC = +endif + all: groklilo include $(TESTBED_SRCDIR)/GNUmakerules @@ -19,7 +26,7 @@ include $(TESTBED_SRCDIR)/GNUmakerules CFLAGS += -O -g -Wall -I${OBJDIR} -UINBOOTLOADER groklilo: groklilo.c - $(CC) $(CFLAGS) -static -g -o groklilo $< $(LFLAGS) + $(CC) $(CFLAGS) $(LDSTATIC) -g -o groklilo $< $(LFLAGS) client: groklilo diff --git a/os/frisbee.redux/GNUmakefile.in b/os/frisbee.redux/GNUmakefile.in index ce4eebd0ae..039b53ac19 100644 --- a/os/frisbee.redux/GNUmakefile.in +++ b/os/frisbee.redux/GNUmakefile.in @@ -1,6 +1,6 @@ # # EMULAB-COPYRIGHT -# Copyright (c) 2000-2004, 2006 University of Utah and the Flux Group. +# Copyright (c) 2000-2004, 2006, 2007 University of Utah and the Flux Group. # All rights reserved. # @@ -26,6 +26,13 @@ endif include $(OBJDIR)/Makeconf +ifeq ($(NOSTATIC),) +# for now we link everything static +LDSTATIC = -static +else +LDSTATIC = +endif + all: frisbee frisbeed include $(TESTBED_SRCDIR)/GNUmakerules @@ -54,8 +61,8 @@ SERVERFLAGS = $(CFLAGS) SERVERLIBS = $(PTHREADLIBS) SERVEROBJS = server.o $(SHAREDOBJS) -CFLAGS = -O2 -g -Wall -fno-builtin-log -static $(PTHREADCFLAGS) -DSTATS -LDFLAGS = -static +CFLAGS = -O2 -g -Wall -fno-builtin-log $(LDSTATIC) $(PTHREADCFLAGS) -DSTATS +LDFLAGS = $(LDSTATIC) # # Define this if your implementation of cond_vars works well diff --git a/os/growdisk/GNUmakefile.in b/os/growdisk/GNUmakefile.in index be9e0a8214..6456c56cfe 100644 --- a/os/growdisk/GNUmakefile.in +++ b/os/growdisk/GNUmakefile.in @@ -1,6 +1,6 @@ # # EMULAB-COPYRIGHT -# Copyright (c) 2000-2004 University of Utah and the Flux Group. +# Copyright (c) 2000-2004, 2007 University of Utah and the Flux Group. # All rights reserved. # @@ -11,11 +11,18 @@ SUBDIR = os/growdisk include $(OBJDIR)/Makeconf +ifeq ($(NOSTATIC),) +# for now we link everything static +LDSTATIC = -static +else +LDSTATIC = +endif + all: growdisk include $(TESTBED_SRCDIR)/GNUmakerules -CFLAGS = -O -g -static -I$(SRCDIR)/../imagezip +CFLAGS = -O -g $(LDSTATIC) -I$(SRCDIR)/../imagezip growdisk: growdisk.o $(CC) $(CFLAGS) growdisk.o -o growdisk diff --git a/tmcd/GNUmakefile.in b/tmcd/GNUmakefile.in index 60a362e363..bbdd7eb19c 100644 --- a/tmcd/GNUmakefile.in +++ b/tmcd/GNUmakefile.in @@ -1,6 +1,6 @@ # # EMULAB-COPYRIGHT -# Copyright (c) 2000-2006 University of Utah and the Flux Group. +# Copyright (c) 2000-2007 University of Utah and the Flux Group. # All rights reserved. # SRCDIR = @srcdir@ @@ -13,6 +13,13 @@ SYSTEM := $(shell uname -s) include $(OBJDIR)/Makeconf +ifeq ($(NOSTATIC),) +# for now we link everything static +LDSTATIC = -static +else +LDSTATIC = +endif + all: server fullclient client fullclient: tmcc client: tmcc-nossl findif dostype @@ -80,7 +87,7 @@ tmcd: tmcd.c ${TMCDLIBS} decls.h version.o $(SSLOBJ) $(ELVINFLAGS) $(TMCDLDFLAGS) $(TMCDLIBS) $(TMLIBS) tmcc: tmcc.c decls.h $(SSLOBJ) - $(CC) $(CFLAGS) $(SSLFLAGS) -static -g -o tmcc $< $(SSLOBJ) \ + $(CC) $(CFLAGS) $(SSLFLAGS) $(LDSTATIC) -g -o tmcc $< $(SSLOBJ) \ $(LFLAGS) $(TMLIBS) tmcc-shared: tmcc.c decls.h $(SSLOBJ) @@ -88,10 +95,10 @@ tmcc-shared: tmcc.c decls.h $(SSLOBJ) $(LFLAGS) $(TMLIBS) tmcc-nossl-debug: tmcc.c decls.h - $(CC) $(CFLAGS) -static -g -o $@ $< $(LFLAGS) $(TMSLIBS) + $(CC) $(CFLAGS) $(LDSTATIC) -g -o $@ $< $(LFLAGS) $(TMSLIBS) findif-debug: findif.o - $(CC) $(CFLAGS) -g -o $@ findif.o $(LFLAGS) -static + $(CC) $(CFLAGS) -g -o $@ findif.o $(LFLAGS) $(LDSTATIC) dostype-debug: dostype.o $(CC) $(CFLAGS) -g -o $@ dostype.o $(LFLAGS) @@ -139,7 +146,7 @@ ${OBJDIR}/lib/libtb/%: cd ${OBJDIR}/lib/tbdb && gmake $< clean: subdir-clean - rm -f *.o core tmcd tmcc tmcc-nossl findif dostype version.c + rm -f *.o core tmcd tmcc tmcc-nossl findif dostype *-debug version.c subdir-clean: @$(MAKE) -C $(MDSUBDIR) clean diff --git a/tmcd/freebsd/dhclient-exit-hooks b/tmcd/freebsd/dhclient-exit-hooks index d1ab9ebb7f..2536f106a3 100644 --- a/tmcd/freebsd/dhclient-exit-hooks +++ b/tmcd/freebsd/dhclient-exit-hooks @@ -1,7 +1,7 @@ #!/bin/sh # # EMULAB-COPYRIGHT -# Copyright (c) 2000-2005 University of Utah and the Flux Group. +# Copyright (c) 2000-2007 University of Utah and the Flux Group. # All rights reserved. # . /etc/emulab/paths.sh @@ -49,6 +49,15 @@ if [ x"$new_host_name" = x ]; then exit 0 fi +# +# XXX compenstate for a stupid long time bug in the dhclient-script +# +curhname=`hostname` +if [ $reason = BOUND -a -z "$curhname" -a -n "$new_host_name" ]; then + echo "`date`: hostname is $new_host_name" >>$LOGDIR/dhclient-exit.log 2>&1 + hostname $new_host_name +fi + # # Remember our server IP, real hostname, router IP, etc. # diff --git a/tmcd/freebsd/rc.frisbee b/tmcd/freebsd/rc.frisbee index 653ad75ce2..f8bcdd83bb 100755 --- a/tmcd/freebsd/rc.frisbee +++ b/tmcd/freebsd/rc.frisbee @@ -1,7 +1,7 @@ #!/bin/sh # # EMULAB-COPYRIGHT -# Copyright (c) 2000-2006 University of Utah and the Flux Group. +# Copyright (c) 2000-2007 University of Utah and the Flux Group. # All rights reserved. # # Optional flag argument says "do not reboot" @@ -85,6 +85,8 @@ DISK=`echo $LOADINFO | awk -F= '{ printf $5 }' | awk -F' ' '{ print $1 }'` DISK=${DISK:-'ad0'} ZFILL=`echo $LOADINFO | awk -F= '{ printf $6 }' | awk -F' ' '{ print $1 }'` ZFILL=${ZFILL:-'0'} +ACPI=`echo $LOADINFO | awk -F= '{ printf $7 }' | awk -F' ' '{ print $1 }'` +ACPI=${ACPI:-'unknown'} if [ "$PARTITION" != "0" ]; then SLICE="-s $PARTITION" @@ -218,6 +220,7 @@ if [ x"$ADDRESS" != x ]; then echo "Resizing final disk partition" $BINDIR/growdisk -vW /dev/$DISK echo "Adjusting slice-related files" + export SLICEFIX_ACPI=$ACPI $BINDIR/slicefix $PARTITION $DISK echo "Image load complete at `date`" diff --git a/tmcd/freebsd/slicefix b/tmcd/freebsd/slicefix index 5eab4c6536..f55ed20edd 100755 --- a/tmcd/freebsd/slicefix +++ b/tmcd/freebsd/slicefix @@ -1,7 +1,7 @@ #!/bin/sh # # EMULAB-COPYRIGHT -# Copyright (c) 2000-2005 University of Utah and the Flux Group. +# Copyright (c) 2000-2005, 2007 University of Utah and the Flux Group. # All rights reserved. # @@ -27,6 +27,22 @@ case $# in exit 1 esac +# +# Handle pseudo arguments in the environment. +# +ACPI=${SLICEFIX_ACPI:-'unknown'} +case $ACPI in +0|no|NO) + ACPI=no + ;; +1|yes|YES) + ACPI=yes + ;; +*) + ACPI=unknown + ;; +esac + dofreebsd() { # # ARGH! FreeBSD 5, which primarily uses UFS2, internally converts @@ -63,7 +79,7 @@ dofreebsd() { # # This is clearly not a solution. # - version=`uname -v | sed -e 's/FreeBSD \([0-9]\).*/\1/'` + vers=`uname -v | sed -e 's/FreeBSD \([0-9]\).*/\1/'` # see if there is a root ('a') partition on this BSD slice `disklabel ${disk}s${part} 2>&1 | grep -s -E '^[ ]+a:' >/dev/null` || { @@ -86,6 +102,7 @@ dofreebsd() { # changedisk=0 changeentropy=0 + changeacpi=0 # If our disk does not appear anywhere in fstab, we need to fix it grep "^/dev/${disk}s" /mnt/etc/fstab >/dev/null 2>&1 @@ -102,7 +119,40 @@ dofreebsd() { changeentropy=1 fi - if [ $changedisk -eq 0 -a $changeentropy -eq 0 ]; then + # + # See if we need to change the ACPI setting. + # + # If ACPI was not specified via TMCD, leave it along. + # + # If "acpi_load" does not appear at all in the loader.conf file, + # assume the OS cannot handle it (or that we do not know how to + # change it) and leave it alone. + # + if [ $ACPI != "unknown" ]; then + grep "acpi_load=" /mnt/boot/loader.conf >/dev/null 2>&1 + case $? in + 0) + grep "^acpi_load=\"YES\"" /mnt/boot/loader.conf >/dev/null 2>&1 + case $? in + 0) + if [ $ACPI = "no" ]; then + changeacpi=1 + fi + ;; + *) + if [ $ACPI = "yes" ]; then + changeacpi=1 + fi + ;; + esac + ;; + *) + ;; + esac + fi + + if [ $changedisk -eq 0 -a $changeentropy -eq 0 -a $changeacpi -eq 0 ]; then + echo " no changes necessary" umount $rootdev return 0 fi @@ -134,11 +184,39 @@ dofreebsd() { dd if=/dev/random of=/mnt/entropy bs=4096 count=1 >/dev/null 2>&1 fi + if [ $changeacpi -eq 1 ]; then + if [ $ACPI = "no" ]; then + on="dis" + else + on="en" + fi + echo " ${on}abling ACPI" + sed -E -i .orig -e "/[Aa][Cc][Pp][Ii]/d" /mnt/boot/loader.conf || { + echo "Failed to update /boot/loader.conf" + umount $rootdev + return 1 + } + if [ $ACPI = "no" ]; then + cat <<EOF1 >>/mnt/boot/loader.conf +# disable ACPI +acpi_load="NO" +hint.acpi.0.disabled=1 +loader.acpi_disabled_by_user=1 +EOF1 + else + cat <<EOF2 >>/mnt/boot/loader.conf +# enable ACPI +acpi_load="YES" +hint.acpi.0.disabled=0 +EOF2 + fi + fi + umount $rootdev # XXX need to fixup FS, see big comment above - if [ "x$version" = "x5" ]; then - echo "WARNING: FBSD5 may have modified the UFS1 root FS" + if [ "x$vers" != "x4" ]; then + echo "WARNING: FBSD${vers} may have modified the UFS1 root FS" fi return 0 diff --git a/tmcd/freebsd5/frisbee/rc.conf b/tmcd/freebsd5/frisbee/rc.conf index 1b6931f672..9f6196f477 100644 --- a/tmcd/freebsd5/frisbee/rc.conf +++ b/tmcd/freebsd5/frisbee/rc.conf @@ -1,13 +1,37 @@ +# Common to both MFSes sendmail_enable="NONE" inetd_enable="NO" -cron_enable="NO" ldconfig_paths="" ldconfig_paths_aout="" blanktime="NO" update_motd="NO" background_fsck="NO" rc_info="YES" -network_interfaces="lo0" - syslogd_enable="NO" + +# Specific to frisbee MFS +cron_enable="NO" devd_enable="NO" + +# +# FreeBSD has no way to say "DHCP on all available interfaces" without +# spelling out here what all those interfaces are. So here we just say +# to (statically) configure the loopback device. The real network +# interfaces are identified in rc.conf.d/dhclient for use by the +# rc.d/dhclient script. +# +network_interfaces="lo0" + +# +# Argh! dhclient in FreeBSD 5 has a new auto-background "feature", +# it dives into the background after 10 seconds regardless of whether +# it has received a response. This is fubar for us. Unfortunately, +# we cannot just crank this number through the roof because it is based +# on a polling interval which actually has a rational purpose. The timeout +# is actually (2 * polling_interval) where polling_interval is how often +# dhclient rechecks an interface without link. We need to keep this value +# reasonable in the event that we boot up and don't immediately have link +# on the control net. So lets try 15 seconds (30 second auto-background +# timeout) and see how things go. +# +dhclient_flags="-i 15" diff --git a/tmcd/freebsd5/mfs-frisbee-rc.conf b/tmcd/freebsd5/mfs-frisbee-rc.conf deleted file mode 100644 index 9f6196f477..0000000000 --- a/tmcd/freebsd5/mfs-frisbee-rc.conf +++ /dev/null @@ -1,37 +0,0 @@ -# Common to both MFSes -sendmail_enable="NONE" -inetd_enable="NO" -ldconfig_paths="" -ldconfig_paths_aout="" -blanktime="NO" -update_motd="NO" -background_fsck="NO" -rc_info="YES" -syslogd_enable="NO" - -# Specific to frisbee MFS -cron_enable="NO" -devd_enable="NO" - -# -# FreeBSD has no way to say "DHCP on all available interfaces" without -# spelling out here what all those interfaces are. So here we just say -# to (statically) configure the loopback device. The real network -# interfaces are identified in rc.conf.d/dhclient for use by the -# rc.d/dhclient script. -# -network_interfaces="lo0" - -# -# Argh! dhclient in FreeBSD 5 has a new auto-background "feature", -# it dives into the background after 10 seconds regardless of whether -# it has received a response. This is fubar for us. Unfortunately, -# we cannot just crank this number through the roof because it is based -# on a polling interval which actually has a rational purpose. The timeout -# is actually (2 * polling_interval) where polling_interval is how often -# dhclient rechecks an interface without link. We need to keep this value -# reasonable in the event that we boot up and don't immediately have link -# on the control net. So lets try 15 seconds (30 second auto-background -# timeout) and see how things go. -# -dhclient_flags="-i 15" diff --git a/tmcd/freebsd6/GNUmakefile.in b/tmcd/freebsd6/GNUmakefile.in index ca5ad41b42..f71d6476e1 100644 --- a/tmcd/freebsd6/GNUmakefile.in +++ b/tmcd/freebsd6/GNUmakefile.in @@ -1,6 +1,6 @@ # # EMULAB-COPYRIGHT -# Copyright (c) 2000-2006 University of Utah and the Flux Group. +# Copyright (c) 2000-2007 University of Utah and the Flux Group. # All rights reserved. # @@ -90,3 +90,13 @@ sysetc-install: dir-install netif-emulab script-install: dir-install # $(INSTALL) -m 755 $(SRCDIR)/prepare $(BINDIR)/prepare + +# +# NOTES: +# * We still use rc.conf.d/dhclient right now (til we switch to 6.x rc.d files) +# +frisbee-mfs-install: + (cd ../freebsd5; $(MAKE) all frisbee-mfs-install) + rm -f $(SYSETCDIR)/testbed/dhclient + rm -f $(DESTDIR)/usr/local/etc/dhclient* + ln -s /etc/dhclient* $(DESTDIR)/usr/local/etc/ -- GitLab