GentooのRTCとシステムクロック

前置き

前から気にはなっていたのですが、サーバの起動中に、システムクロック設定が失敗します。その後、ntpで補正するので、起動が完了してしまえば、正しい日時がセットされます。

しかし、ntpするまではローカル時間をUTCと解釈するので、タイムスタンプが未来の日時(9時間先)になってしまいます。また、ntpできない状況では、時計が狂ったままになります。

サーバ設置以来、ずっとこんな状態で放置していたのですが、この度、意外とあっさり解決できたのでメモっておきます。

※環境は2008年あたりの古いGentooなので、最近のGentooでは事情が異なると思います。

起動の流れ

rc-updateの抜粋
# rc-update show
            bootmisc | boot
             checkfs | boot
           checkroot | boot
               clock | boot
               local |      default nonetwork
          localmount | boot
             modules | boot
            net.eth0 |      default
              net.lo | boot
            netmount |      default
          ntp-client |      default
           rmnologin | boot
           syslog-ng |      default
      udev-postmount |      default

clockで、RTC(ハードウェアクロック、CMOSクロックと呼ぶこともある)の日時をシステムクロックへコピーします。その後、ntp-clientで、NTPサーバから日時を取得し、システムクロックを補正します。

clockスクリプト

clockスクリプトの実体は、/etc/init.d/clockです。この中ではhwclockコマンドを使って、RTCをシステムクロックへコピーします。

clockスクリプトの抜粋
start() {
    local myopts=""
    local myadj=""
    local errstr=""
    local ret=0

    ...

    setupopts

    ...

    # Since hwclock always exit's with a 0, need to check its output.
    errstr=$(/sbin/hwclock ${myadj} ${myopts} 2>&1 >/dev/null)
    errstr="${errstr}$(/sbin/hwclock --hctosys ${myopts} 2>&1 >/dev/null)"

    if [[ -n ${errstr} ]] ; then
        ewarn "${errstr}"
        ret=1
    else
        ret=0
    fi

試しに、手打ちで実行してみると、確かに失敗します。

hwclock失敗
# hwclock --show
クロックチックを待つための /dev/rtc への select() がタイムアウトしました

/dev/rtcが読めないみたいですね。ハードの問題か、カーネルのコンフィグの問題でしょうか。根本原因は分かりませんが、--directisaオプションで回避できるようです(名前からして危険な香りがしますが)。

hwclock成功
# hwclock --show --directisa
2013年08月13日 15時28分09秒  -0.865364 秒

というわけで、clockスクリプトを修正して、--directisaオプションを追加したら解決しました。

Last modified:2013/08/13 15:40:00
Keyword(s):
References:[サーバ管理・Linux関連]
This page is frozen.