ローカルタイムの設定

[サーバの実験室 Slackware]

作成 : 2002/12/31

"サーバの実験室"の検索


システム時間がヘン

date を実行すると、"Tue Dec 31 17:30:00 ifLocal time zone must be set -- see zic manual page2002" と表示される。 ログインしたときに表示される Last login メッセージも、"Last login: Tue Dec 31 17:30:00 +0000 2002 on tty1" だし。 日本時間に合わせたシステムだと、"Tue Dec 31 17:30:00 JST page2002" とか "Last login: Tue Dec 31 17:30:00 +0900 2002 on tty1" になっている。 ローカルタイムを設定しないといけないのかな。

どこで時間を設定しているか

システムを起動したときに ".... localtime ...." というメッセージが表示されたので、きっと /etc/rc.d のどこかで時間を設定するプロセスを起動しているのに違いない。 grep を実行して、"localtime" という文字列を含むものを探してみる。

# cd /etc/rc.d
# grep -n localtime *
rc.0:49:    echo "Saving system time to the hardware clock (localtime)."
rc.0:50:    /sbin/hwclock --localtime --systohc
rc.6:49:    echo "Saving system time to the hardware clock (localtime)."
rc.6:50:    /sbin/hwclock --localtime --systohc
rc.S:183:    echo "Setting system time from the hardware clock (localtime)."
rc.S:184:    /sbin/hwclock --localtime --hctosys

起動するときだから、rc.S っぽい。 rc.S を見てみると、

if fgrep -l Cobalt-APIC /proc/interrupts 1> /dev/null 2> /dev/null ; then
  echo "SGI Visual Workstation detected.  Not running hwclock."
elif [ -x /sbin/hwclock ]; then
  if grep "^UTC" /etc/hardwareclock 1> /dev/null 2> /dev/null ; then
    echo "Setting system time from the hardware clock (UTC)."
    /sbin/hwclock --utc --hctosys
  else
    echo "Setting system time from the hardware clock (localtime)."
    /sbin/hwclock --localtime --hctosys
  fi
fi

と書いてある。

hwclock

hwclock は、ハードウェアクロックを読み取り・設定するために使用される。 --hctosys は、ハードウェアクロックをシステムクロックに合わせるオプション。 --localtime は、ハードウェアクロックをローカルタイムにしていることを指定するオプション。 (--utc なら UTC(Universal Coordinated Time: 世界協定時)にしていることを指定) --localtime を指定すると、TZ 環境変数とか zoneinfo ディレクトリとか /etc/localtime を参照して、タイムゾーンを決めるらしい。 (hwclock については、linux.or.jp の Manpage of HWCLOCKを見てね)

--debug を指定すると、hwclock の動作を確認することができる。 --test を一緒に指定すると、ハードウェアクロックやシステムクロックを変更せずに、動作確認をすることができる。

# hwclock --localtime --hctosys --debug --test
hwclock 2.4c/util-linux-2.11r
Using /dev/rtc interface to clock.
Assuming hardware clock is kept in local time.
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2002/12/31 14:17:03
Hw clock time : 2002/12/31 14:17:03 = 1041311823 seconds since 1969
Calling settimeofday:
        tv.tv_sec = 1041311823, tv.tv_usec = 0
        tz.tz_minuteswest = -540
Not setting system clock because running in test mode.

/usr/share/zoneinfo ディレクトリと /etc/localtime

/usr/share/zoneinfo ディレクトリとその中のファイルは、glibc に含まれている。 glibc をデフォルトの /usr/local にインストールすると、zoneinfo ディレクトリは /usr/local/share の下になる。 zoneinfo ディレクトリを ls で見てみる。

# ls /usr/share/zoneinfo
Africa/      Canada/  Factory    Iceland    MST7MDT   Portugal   W-SU
America/     Chile/   GB         Indian/    Mexico/   ROC        WET
Antarctica/  Cuba     GB-Eire    Iran       Mideast/  ROK        Zulu
Arctic/      EET      GMT        Israel     NZ        Singapore  iso3166.tab
Asia/        EST      GMT+0      Jamaica    NZ-CHAT   SystemV/   localtime@
Atlantic/    EST5EDT  GMT-0      Japan      Navajo    Turkey     posix/
Australia/   Egypt    GMT0       Kwajalein  PRC       UCT        posixrules
Brazil/      Eire     Greenwich  Libya      PST8PDT   US/        right/
CET          Etc/     HST        MET        Pacific/  UTC        zone.tab
CST6CDT      Europe/  Hongkong   MST        Poland    Universal

Japan ファイルの中身はこんな感じ。 (Asia/Tokyo ファイルの中身と同じ) zoneinfo の中のタイムゾーン情報ファイルは、tzfile という形式で記述されているため、一部化けている。 (tzfile については、Manpage of TZFILEを見てね)

# more /usr/share/zoneinfo/Japan
TZi知p~~CJTJST

zoneinfo ディレクトリにも localtime ファイルがあるが、/etc/localtime へのシンボリックリンク。 ちなみに、/etc/localtime は /usr/share/zoneinfo/Factory へのシンボリックリンク。

/usr/share/zoneinfo/localtime -> /etc/localtime -> /usr/share/zoneinfo/Factory

タイムゾーンを日本に

/etc/localtime を /usr/share/zoneinfo の適切なファイルへのシンボリックリンクにすれば、ローカルタイムを設定できそう。 ln で /etc/localtime を /usr/share/zoneinfo/Japan へのシンボリックリンクにする。 -f オプションをつけないで ln を実行すると、localtime ファイルがすでに存在するため、エラーになる。

# cd /etc
# ln -f /usr/share/zoneinfo/Japan localtime

時計が 9 時間ずれる?

date を実行してみると、タイムゾーンは JST になったけど、時間が 9 時間進んでしまう。 hwclock でシステムクロックをハードウェアクロックに合わせると、正しい時間を示すようになる。

# hwclock --localtime --hctosys

システムを終了 / 再起動してしまった場合は、/etc/rc.d/rc.0(または rc.6)によってハードウェアクロックをシステムクロックに合わせてしまうため、ハードウェアクロックも 9 時間進んでしまう。 BIOS 設定か、システム起動後に date を実行する。


[サーバの実験室 slackware]