Time (日本語)

From ArchWiki
Revision as of 07:20, 16 August 2013 by Kusakata (Talk | contribs) (Created page with "en:Time es:Time fa:زمان fr:Horloge ru:Time zh-CN:Time Category:Mainboards and BIOS (日本語) <!-- with regard to the hardware clock -...")

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary end

オペレーティングシステムでは、時間(時計)は4つのパーツで決まっています: 時刻値・時刻系・標準時間帯・夏時間 (Daylight Saving Time, DST)。この記事ではこれらが何なのか、そしてどうやって読み込み・設定するのか説明します。ネットワークを使って正確なシステム時刻を維持する方法は Network Time Protocol を見て下さい。

ハードウェアクロックとシステムクロック

コンピューターは2つの時計を持っていることを考慮しなくてはなりません: "ハードウェアクロック" と "システム(ソフトウェア)クロック" です。

ハードウェアクロック (又の名をリアルタイムクロック (Real Time Clock, RTC) もしくは CMOS クロック) は次の値を保存しています: 年・月・日・時・分・秒。時刻系 (localtime か UTC) や夏時間が使われているかどうかの情報を保存することはできません。

システムクロック (又の名をソフトウェアクロック) は次の情報を記録しています: 時刻、タイムゾーン、そして DST が適用されるかどうか。Linux カーネルは1970年1月1日の午前0時からの秒数でシステムクロックをはじき出します。システムクロックの初期値は /etc/adjtime を使ってハードウェアクロックから算定されます。起動が完了した後は、システムクロックはハードウェアクロックとは独立して動作します。Linux カーネルはタイマー割り込みを数えることによりシステムクロックを記録します。

時刻を表示する

現在のシステム時刻を確認するには (UTC と地方時どちらも表示されます):

$ timedatectl status

root で同じコマンドを実行すればハードウェアクロックの時間も表示します。

時刻を設定する

直接システムクロックを設定するには:

# timedatectl set-time "2012-10-30 18:17:16"

RTC

ほとんどのオペレーティングシステムは:

  • 起動時にハードウェアクロックからシステムクロックを設定します
  • NTP デーモンを使ってシステムクロックの時間を正確に保ちます
  • シャットダウン時にシステムクロックからハードウェアクロックを設定します

時刻系

2つの時刻系が存在します: 地方時 (localtime) と 協定世界時 (Coordinated Universal Time, UTC) です。地方時系は現在のタイムゾーンによって決まりますが、UTC は世界時であり、タイムゾーンの値は関係ありません。概念的には異なっていますが、UTC は GMT (グリニッジ標準時, Greenwich Mean Time) とも言われます。

ハードウェアクロック (CMOS クロック, BIOS で表示される時間) で使われる時刻系はオペレーティングシステムによって定義されます。デフォルトでは、Windows は localtime を使いますが、Mac OS は UTC を使っていて、UNIX ライクなオペレーティングシステムでは決まっていません。一般的に、UTC を使う OS は起動時に CMOS (ハードウェアクロック) の時間を UTC 時間 (GMT, Greenwich time) だと認識して、あなたのタイムゾーンによってその時間を調整してシステム時刻を設定します。

Linux を使う時はハードウェアクロックを UTC 時刻系に設定するのが有益です。Linux でハードウェアクロックを UTC で定義すれば夏時間が自動的に使われます。地方時系を使う場合、システム時刻は DST によって変わらなくなり他のオペレーティングシステムが DST の切り替えを引き受けることになります (そして NTP エージェントは動作しません)。

ハードウェアクロックの時刻系の設定はコマンドラインから可能です。Arch Linux をインストールした時にあなたがどちらを設定したのか確認するには:

$ timedatectl status | grep local

ハードウェアクロックは timedatectl コマンドで尋ねたり設定できます。ハードウェアクロックの時刻系を localtime に変更するには次を実行してください:

# timedatectl set-local-rtc 1

逆に時刻系を UTC に設定するには次を実行してください:

# timedatectl set-local-rtc 0

上記コマンドで /etc/adjtime が自動的に設定されます; 他の設定は必要ありません。

カーネルの起動中、RTC ドライバーがロードされた時点で、ハードウェアクロックからシステムクロックが設定されるかもしれません。設定されるかどうかはハードウェアプラットフォーム、カーネルのバージョン・ビルドオプション次第です。設定される場合、ブートシーケンスで既に、ハードウェアクロックは UTC と認識され /sys/class/rtc/rtcN/hctosys (N=0,1,2,..) の値は 1 に設定されます。Later, the system clock is set again from the hardware clock from systemd, dependent on values in /etc/adjtime. Hence, having the hardware clock using localtime may cause some unexpected behavior during the boot sequence; e.g system time going backwards, which is always a bad idea.

Note: The use of timedatectl requires an active dbus. Therefore, it may not be possible to use this command under a chroot (such as during installation). In these cases, you can revert back to the hwclock command.

UTC in Windows

Using regedit, add a DWORD value with hexadecimal value 1 to the registry:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal

Alternatively, create a *.reg file (on the desktop) with the following content and double-click it to import it into registry:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]
     "RealTimeIsUniversal"=dword:00000001

Windows XP and Windows Vista SP1 have support for setting the time standard as UTC and can be activated in the same way. However, there is a bug after resuming from the suspend/hibernation state that resets the clock to localtime. For these operating systems, it is recommended to use localtime.

Should Windows ask to update the clock due to DST changes, let it. It will leave the clock in UTC as expected, only correcting the displayed time.

The hardware clock and system clock time may need to be updated after setting this value.

If you are having issues with the offset of the time, try reinstalling tzdata and then setting your time zone again.

# pacman -S tzdata
# timedatectl set-timezone America/Los_Angeles

It makes sense to disable time synchronization in Windows - otherwise it will mess up the hardware clock.

タイムゾーン

現在のゾーンを確認するには:

$ timedatectl status

利用可能なゾーンを一覧するには:

$ timedatectl list-timezones

タイムゾーンを変更するには:

# timedatectl set-timezone <Zone>/<SubZone>

例:

# timedatectl set-timezone Asia/Tokyo

このコマンドによって /usr/share/zoneinfo/ 下の zoneinfo ファイルを指し示したシンボリックリンク /etc/localtime が作られます。リンクを手動で作成する場合、archlinux(7) で指摘されているように、絶対リンクではなく相対リンクを使うことに注意してください。

詳細は man 1 timedatectl, man 5 localtime, man 7 archlinux を見て下さい。

Note: systemd 以前の設定ファイル /etc/timezone がシステムにまだ存在している場合、もう使われていないので削除しても問題ありません。

Time skew

Every clock has a value that differs from real time (the best representation of which being International Atomic Time); no clock is perfect. A quartz-based electronic clock keeps imperfect time, but maintains a consistent inaccuracy. This base 'inaccuracy' is known as 'time skew' or 'time drift'.

When the hardware clock is set with hwclock, a new drift value is calculated in seconds per day. The drift value is calculated by using the difference between the new value set and the hardware clock value just before the set, taking into account the value of the previous drift value and the last time the hardware clock was set. The new drift value and the time when the clock was set is written to the file /etc/adjtime overwriting the previous values. The hardware clock can therefore be adjusted for drift when the command hwclock --adjust is run; this also occurs on shutdown but only if the hwclock daemon is enabled (hence for systems using systemd, this does not happen).

Note: If the hwclock has been set again less than 24 hours after a previous set, the drift is not recalculated as hwclock considers the elapsed time period too short to accurately calculate the drift.

If the hardware clock keeps losing or gaining time in large increments, it is possible that an invalid drift has been recorded (but only applicable, if the hwclock daemon is running). This can happen if you have set the hardware clock time incorrectly or your time standard is not synchronized with a Windows or Mac OS install. The drift value can be removed by removing the file /etc/adjtime, then set the correct hardware clock and system clock time, and check if your time standard is correct.

Note: For those using systemd, but wish to make use of the drift value stored in /etc/adjtime (i.e. perhaps cannot or do not want to use NTP); they need to call hwclock --adjust on a regular basis, perhaps by creating a cron job.

The software clock is very accurate but like most clocks is not perfectly accurate and will drift as well. Though rarely, the system clock can lose accuracy if the kernel skips interrupts. There are some tools to improve software clock accuracy:

  • NTP can synchronize the software clock of a GNU/Linux system with Internet time servers using the Network Time Protocol. NTP can also adjust the interrupt frequency and the number of ticks per second to decrease system clock drift. Running NTP will also cause the hardware clock to be re-synchronised every 11 minutes.
  • adjtimexAUR in the AUR can adjust kernel time variables like interrupt frequency to help improve the system clock time drift.

資料