[arch-projects] [PATCH] Make hwclock --adjust as well as --systohc optional (FS#13684)
Dave Reisner
d at falconindy.com
Mon Mar 28 10:20:58 EDT 2011
On Mon, Mar 28, 2011 at 03:34:22PM +0200, Kurt J. Bosch wrote:
> This turns all hardware clock write access (setting and adjusting)
> the into an optional daemon. (FS#13684)
> Should fix issues when using ntpd (kernel 11-minute-mode) and also
> in case of dual-boot.
> Further more the out of box HARDWARECLOCK setting is changed to
> "UTC" and "localtime" is discouraged because it can really mess up
> things especially with 'hwclock --adjust'.
>
> For previous discussion see https://bugs.archlinux.org/task/13684
>
> From 39d86d1d831210aca9f592eed5555389b2216d7c Mon Sep 17 00:00:00 2001
> From: Kurt J. Bosch <kjb-temp-2009 at alpenjodel.de>
> Date: Mon, 28 Mar 2011 15:01:43 +0200
> Subject: [PATCH] Make hwclock --adjust as well as --systohc optional
> (FS#13684)
>
> ---
> adjtime.cron | 2 +-
> hwclock | 39 +++++++++++++++++++++++++++++++++++++++
> install.sh | 2 +-
> rc.conf | 8 ++++++--
> rc.shutdown | 13 ++-----------
> rc.sysinit | 27 +++------------------------
> 6 files changed, 52 insertions(+), 39 deletions(-)
> create mode 100644 hwclock
>
> diff --git a/adjtime.cron b/adjtime.cron
> index a876506..7691aa5 100755
> --- a/adjtime.cron
> +++ b/adjtime.cron
> @@ -10,6 +10,6 @@ case $HARDWARECLOCK in
> *) HWCLOCK_PARAMS="";;
> esac
>
> -if [[ $HWCLOCK_PARAMS ]]; then
> +if [[ $HWCLOCK_PARAMS && -f /var/daemons/hwclock ]]; then
Think you meant /var/run/daemons/hwclock here.
> /sbin/hwclock $HWCLOCK_PARAMS
> fi
> diff --git a/hwclock b/hwclock
> new file mode 100644
> index 0000000..d584276
> --- /dev/null
> +++ b/hwclock
> @@ -0,0 +1,39 @@
> +#!/bin/bash
> +
> +. /etc/rc.conf
> +. /etc/rc.d/functions
> +
> +case $HARDWARECLOCK in
> + UTC) HWCLOCK_PARAMS="--utc";;
> + localtime) HWCLOCK_PARAMS="--localtime";;
> + *) HWCLOCK_PARAMS="";;
> +esac
> +
> +case "$1" in
> + start)
> + if [[ $HWCLOCK_PARAMS ]]; then
> + status "Adjusting Hardware Clock" \
> + /sbin/hwclock --adjust
> + stat_busy "Setting System Clock"
> + /sbin/hwclock --hctosys $HWCLOCK_PARAMS || stat_die
> + stat_done
> + # Note: This also enables /etc/cron.hourly/adjtime
> + add_daemon clock
And you probably meant add_daemon hwclock here.
> + fi
> + ;;
> + stop)
> + if [[ $HWCLOCK_PARAMS ]]; then
> + stat_busy "Saving System Clock"
> + /sbin/hwclock --systohc $HWCLOCK_PARAMS || stat_die
> + stat_done
> + fi
> + rm_daemon clock
> + ;;
> + restart)
> + $0 stop
> + sleep 1
> + $0 start
> + ;;
> + *)
> + echo "usage: $0 {start|stop|restart}"
> +esac
> diff --git a/install.sh b/install.sh
> index 2b2cbbc..8e6c3d7 100755
> --- a/install.sh
> +++ b/install.sh
> @@ -15,7 +15,7 @@ done
> install -D -m755 adjtime.cron ${DESTDIR}/etc/cron.hourly/adjtime
>
> install -D -m644 functions ${DESTDIR}/etc/rc.d/functions || exit 1
> -for i in network netfs; do
> +for i in hwclock network netfs; do
> install -D -m755 $i ${DESTDIR}/etc/rc.d/$i || exit 1
> done
>
> diff --git a/rc.conf b/rc.conf
> index d2b0517..02bb1d7 100644
> --- a/rc.conf
> +++ b/rc.conf
> @@ -11,6 +11,7 @@
> # process. If set to 'no', the C locale will be used.
> # HARDWARECLOCK: set to "UTC" or "localtime", any other value will result
> # in the hardware clock being left untouched (useful for virtualization)
> +# Note: Using "localtime" is discouraged.
> # 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)
> @@ -19,7 +20,7 @@
> #
> LOCALE="en_US.UTF-8"
> DAEMON_LOCALE="no"
> -HARDWARECLOCK="localtime"
> +HARDWARECLOCK="UTC"
> TIMEZONE="Canada/Pacific"
> KEYMAP="us"
> CONSOLEFONT=
> @@ -105,4 +106,7 @@ NETWORK_PERSIST="no"
> # - prefix a daemon with a ! to disable it
> # - prefix a daemon with a @ to start it up in the background
> #
> -DAEMONS=(syslog-ng network netfs crond)
> +# If something other takes care of your hardware clock (ntpd, dual-boot...)
> +# you should disable 'hwclock' here.
> +#
> +DAEMONS=(hwclock syslog-ng network netfs crond)
> diff --git a/rc.shutdown b/rc.shutdown
> index 0acca49..fef1117 100755
> --- a/rc.shutdown
> +++ b/rc.shutdown
> @@ -35,21 +35,12 @@ fi
> /bin/dd if=/dev/urandom of=$RANDOM_SEED count=1 bs=$POOL_SIZE &> /dev/null
> stat_done
>
> -stat_busy "Saving System Clock"
> if [[ $TIMEZONE && -e /usr/share/zoneinfo/$TIMEZONE ]]; then
> /bin/rm -f /etc/localtime
> - /bin/cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime
> + status "Saving Time Zone" \
> + /bin/cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime
Where'd this come from?
> fi
>
> -HWCLOCK_PARAMS="--systohc"
> -case $HARDWARECLOCK in
> - UTC) HWCLOCK_PARAMS="$HWCLOCK_PARAMS --utc";;
> - localtime) HWCLOCK_PARAMS="$HWCLOCK_PARAMS --localtime";;
> - *) HWCLOCK_PARAMS="";;
> -esac
> -[[ $HWCLOCK_PARAMS ]] && /sbin/hwclock $HWCLOCK_PARAMS
> -stat_done
> -
> # removing psmouse module to fix some reboot issues on newer laptops
> /sbin/modprobe -r psmouse >/dev/null 2>&1
>
> diff --git a/rc.sysinit b/rc.sysinit
> index 9797611..e949180 100755
> --- a/rc.sysinit
> +++ b/rc.sysinit
> @@ -66,7 +66,7 @@ if [[ $HWCLOCK_PARAMS ]]; then
> # configured timezone. Any new timezone put in rc.conf is
> copied over at
> # a later time.
> # This does *NOT* take into account a time adjustment file as
> /var may not be
> - # mounted yet. A second set occurs later to match rc.conf.
> + # mounted yet. A second set may occur in rc.d/hwclock to match rc.conf.
> if [[ -f /etc/localtime ]]; then
> /sbin/hwclock $HWCLOCK_PARAMS --noadjfile
> fi
> @@ -304,28 +304,12 @@ status "Retrying failed UDev events"
> /sbin/udevadm trigger --action=add --type=f
>
> status "Activating Swap" /sbin/swapon -a
>
> -stat_busy "Configuring System Clock"
> if [[ $TIMEZONE && -e /usr/share/zoneinfo/$TIMEZONE ]]; then
> /bin/rm -f /etc/localtime
> - /bin/cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime
> + status "Configuring Time Zone" \
> + /bin/cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime
> fi
>
> -clock_pid=""
> -if [[ $HWCLOCK_PARAMS ]]; then
> - # This time, we set the clock for real. Use the adjustment file
> now that
> - # /var will definitely be available, and then set the system clock once
> - # the hardware clock has been adjusted accordingly. The
> backgrounding magic
> - # is due to the fact that the second call to hwclock will almost always
> - # take ~1 second because of the clock granularity, and we might as well
> - # stay busy.
> - (
> - /sbin/hwclock --adjust
> - /sbin/hwclock $HWCLOCK_PARAMS
> - ) &
> - clock_pid=$!
> -fi
> -stat_done
> -
> RANDOM_SEED=/var/lib/misc/random-seed
> if [[ -f $RANDOM_SEED ]]; then
> stat_busy "Initializing Random Seed"
> @@ -398,11 +382,6 @@ set_consolefont
>
> /bin/dmesg >| /var/log/dmesg.log
>
> -# final hwclock setting needs to be done at this point
> -if [[ $clock_pid ]]; then
> - wait $clock_pid
> -fi
> -
> run_hook sysinit_end
>
> # End of file
> --
> 1.7.0.3
This is an awful lot of movement for just one patch. I also don't agree
with adding an extra daemon to take care of the hwclock when it could be
satisfied just as easily by a simple var in /etc/rc.conf (falling back
on the current behavior if it doesn't exist).
dave
More information about the arch-projects
mailing list