[arch-dev-public] [PATCH 2/6] Allow skipping of all hardware clock adjustments

Dan McGee dan at archlinux.org
Sun Aug 16 00:55:25 EDT 2009


For virtualized machines, the hardware clock doesn't actually exist, so all
hwclock calls fail and print error messages during system startup, shutdown,
and the hourly adjtime cronjob. By explicitly looking for HARDWARECLOCK to
be set to 'UTC' or 'localtime', all other values will result in hwclock
calls being skipped (e.g. set the variable to 'none').

Signed-off-by: Dan McGee <dan at archlinux.org>
---
 adjtime.cron |   18 ++++++++++++++++--
 rc.conf      |    3 ++-
 rc.shutdown  |    2 +-
 rc.sysinit   |   15 ++++++++++-----
 4 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/adjtime.cron b/adjtime.cron
index 40c02f2..b1c8950 100755
--- a/adjtime.cron
+++ b/adjtime.cron
@@ -1,3 +1,17 @@
-#!/bin/sh
+#!/bin/bash
 # Update our hwclock for system drift
-/sbin/hwclock --adjust
+
+. /etc/rc.conf
+
+HWCLOCK_PARAMS="--adjust"
+if [ "$HARDWARECLOCK" = "UTC" ]; then
+	HWCLOCK_PARAMS="$HWCLOCK_PARAMS --utc"
+elif [ "$HARDWARECLOCK" = "localtime" ]; then
+	HWCLOCK_PARAMS="$HWCLOCK_PARAMS --localtime"
+else
+	HWCLOCK_PARAMS=""
+fi
+
+if [ -n "$HWCLOCK_PARAMS" ]; then
+	/sbin/hwclock $HWCLOCK_PARAMS
+fi
diff --git a/rc.conf b/rc.conf
index b9495f8..252a9b1 100644
--- a/rc.conf
+++ b/rc.conf
@@ -7,7 +7,8 @@
 # -----------------------------------------------------------------------
 #
 # LOCALE: available languages can be listed with the 'locale -a' command
-# HARDWARECLOCK: set to "UTC" or "localtime"
+# HARDWARECLOCK: set to "UTC" or "localtime", any other value will result
+#   in the hardware clock being left untouched (useful for virtualization)
 # TIMEZONE: timezones are found in /usr/share/zoneinfo
 # KEYMAP: keymaps are found in /usr/share/kbd/keymaps
 # CONSOLEFONT: found in /usr/share/kbd/consolefonts (only needed for non-US)
diff --git a/rc.shutdown b/rc.shutdown
index b0d8195..e2a4a84 100755
--- a/rc.shutdown
+++ b/rc.shutdown
@@ -80,7 +80,7 @@ elif [ "$HARDWARECLOCK" = "localtime" ]; then
 else
 	HWCLOCK_PARAMS=""
 fi
-if [ "$HWCLOCK_PARAMS" != "" ]; then
+if [ -n "$HWCLOCK_PARAMS" ]; then
 	/sbin/hwclock $HWCLOCK_PARAMS
 fi
 stat_done
diff --git a/rc.sysinit b/rc.sysinit
index 322b512..0e67721 100755
--- a/rc.sysinit
+++ b/rc.sysinit
@@ -35,7 +35,8 @@ fi
 
 # enable rtc access
 /sbin/modprobe rtc-cmos >/dev/null 2>&1
-RTC_MAJOR=$(/bin/grep -w rtc /proc/devices 2>/dev/null); RTC_MAJOR="${RTC_MAJOR%% *}"
+RTC_MAJOR=$(/bin/grep -w rtc /proc/devices 2>/dev/null)
+RTC_MAJOR="${RTC_MAJOR%% *}"
 if [ -n "$RTC_MAJOR" ]; then
 	/bin/mknod /dev/rtc0 c $RTC_MAJOR 0
 	/bin/ln -s /dev/rtc0 /dev/rtc
@@ -44,13 +45,15 @@ fi
 HWCLOCK_PARAMS="--hctosys"
 if [ "$HARDWARECLOCK" = "UTC" ]; then
 	HWCLOCK_PARAMS="$HWCLOCK_PARAMS --utc"
-else
+elif [ "$HARDWARECLOCK" = "localtime" ]; then
 	HWCLOCK_PARAMS="$HWCLOCK_PARAMS --localtime"
+else
+	HWCLOCK_PARAMS=""
 fi
 
 # Set clock early to fix some bugs with filesystem checks
 # Clock is set again later to match rc.conf
-if [ -f /etc/localtime ]; then
+if [ -n "$HWCLOCK_PARAMS" -a -f /etc/localtime ]; then
 	/sbin/hwclock $HWCLOCK_PARAMS --noadjfile
 fi
 
@@ -302,8 +305,10 @@ if [ "$TIMEZONE" != "" -a -e "/usr/share/zoneinfo/$TIMEZONE" ]; then
 	/bin/cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime
 fi
 
-/sbin/hwclock --adjust #Adjust for system drift
-/sbin/hwclock $HWCLOCK_PARAMS
+if [ -n "$HWCLOCK_PARAMS" ]; then
+	/sbin/hwclock --adjust #Adjust for system drift
+	/sbin/hwclock $HWCLOCK_PARAMS
+fi
 stat_done
 
 RANDOM_SEED=/var/lib/misc/random-seed
-- 
1.6.4



More information about the arch-dev-public mailing list