ローカルタイムの設定
作成 : 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 を実行する。