システム時刻
システム時刻は、システムクロックによって裏付けられますが、Unix システムが時刻の把握に使用しています。これは、ハードウェアクロックまたは外部タイム・サーバーによって設定することができます。
Systems without a functioning Real-Time Clock (RTC) must set the system clock. at every system start, and on regular intervals thereafter. This is also beneficial for systems with a RTC, as the battery could fail, and clock skew can accumulate.
序文
ソフトウェアクロックとハードウェアクロック
カーネルによって提供されるシステムクロックは、世界協定時 (UTC) での 1970 年 1 月 1 日 00 時 00 分 00 秒のエポックから経過した時間です。これは Unix 時間と呼ばれます。
ハードウェアクロック (また、リアルタイムクロックや RTC として知られる) は、典型的には、メインボード上のコンポーネントです。コンピュータの電源供給が切られているときであっても、ノンストップで動き続けます。
In this case, the system will have the slightly incorrect time from the RTC only briefly, with NTP correcting it shortly after networking is established. The RTC can then be corrected, and in this manner will only drift significantly if the machine is left switched off for prolonged periods.
Some systems such as the Raspberry Pi (models up to 4) lack an RTC altogether. As such, these rely on NTP to start up with the correct time automatically.
UTC とローカルタイム
システム時刻は、ユーザのタイムゾーンによって決定される、夏時間 (DST) を考慮に入れたローカルタイムに常に設定されます。
ハードウェアクロックは、ローカルタイムか協定世界時 (UTC) のどちらかを表現することができます。UTC はタイムゾーンの時差と夏時間から独立しているため、UTC が好まれます。デュアルブートのシステムを使用する場合は例外かもしれません——Windows などの他のオペレーティングシステムがハードウェアクロックを UTC として解釈するように設定されていない場合です (これは変更できます——Windows とのデュアルブート節を参照してください)。
設定
タイムゾーン
時刻を適切に保つには、あなたのタイムゾーン(標準時)を選び、システムがどの地域にあるのかを知らせる必要があります。
OpenRC
タイムゾーン (AMD64 ハンドブック) を見てください。
systemd
systemd にはタイムゾーンを管理するための timedatectl コマンドが含まれています:
現在のゾーンを確認するには:
user $timedatectl利用可能なゾーンをリストアップするには:
user $timedatectl list-timezonesタイムゾーンをたとえばドイツに変更するには:
root #timedatectl set-timezone Europe/BerlinLC_TIME
日付や時刻のフォーマットはこの環境変数で定義されています。詳細については The GNU C Library を参照してください。
システムクロック
通常、システムクロックの時刻は起動時にハードウェアクロックによって設定されます。代替的には、システムクロックを手動で設定するか、ネットワークタイムサーバを使用することが可能です。
date コマンドを使ってシステムクロックの時刻を管理できます:
現在のソフトウェアクロックの時刻を確認するには:
user $dateシステムクロックをたとえば2016年5月6日12時34分にセットするには:
root #date 050612342016タイムサーバ
タイムサーバーの使用に関する情報については Chrony または Network Time Protocol の記事をご覧ください。
systemd
systemd にはシステムクロックを管理するための timedatectl コマンドが含まれています:
現在のソフトウェアクロックを確認するには:
user $timedatectlシステムクロックをセットするには:
root #timedatectl set-time "2012-12-17 12:30:59"ハードウェアクロック
ハードウェアクロックを得るには、以下のカーネルオプションが有効化されていなければなりません:
Device Drivers ---> [*] Real Time Clock ---> [ ] Set system time from RTC on startup and resume [ ] Set the RTC time based on NTP synchronization [*] /sys/class/rtc/rtcN (sysfs) [*] /proc/driver/rtc (procfs for rtc0) [*] /dev/rtcN (character devices) <*> PC-style 'CMOS'
実行中に現在のハードウェアクロックを確認するには:
root #hwclock --showハードウェアクロックを現在のシステムクロックに合わせて設定するには:
root #hwclock --systohcハードウェアクロックとシステム時刻を同期する
通常、ブート時にシステムクロックを設定するためにハードウェアクロックが使用されます。これはカーネル自体またはブートサービス (init スクリプト) によって行うことができます。同様に、シャットダウン時にはカーネルまたはサービスによってソフトウェアクロックをハードウェアクロックに書き込むことができます。これは、システムがブート時に正しい時刻を得るのに役立ちます。
カーネル内方式
十分に新しいカーネル(3.9 以降)では、自動的にシステム時刻のセットを処理するように Linux を設定できます。そうするためには、Set system time from RTC on startup and resume(CONFIG_RTC_HCTOSYS) と Set the RTC time based on NTP synchronization(CONFIG_RTC_SYSTOHC) というカーネルオプションを有効化する必要があります:
Device Drivers ---> [*] Real Time Clock ---> [*] Set system time from RTC on startup and resume (rtc0) RTC used to set the system time [*] Set the RTC time based on NTP synchronization (rtc0) RTC used to synchronize NTP adjustment [*] /sys/class/rtc/rtcN (sysfs) [*] /proc/driver/rtc (procfs for rtc0) [*] /dev/rtcN (character devices) <*> PC-style 'CMOS'
Set the RTC time based on NTP synchronization カーネルオプションは、現在 chrony [1] 、NTP そしてバージョン 5.9p1 以降の OpenNTPD [2] に対応しています。
ハードウェア時刻が更新されたか確認するには、net-misc/adjtimex をインストールし以下を実行します:
root #adjtimex --print | grep status報告された数字の 6 ビット目はセットされていない状態 (0) であるべきです。詳細な情報は hwclock の man ページにあります ('11 minute mode' を検索してください)。
OpenRC
OpenRC を使用している場合、hwclock init スクリプトでブート時にシステムクロックを設定し、またシャットダウン時にシステム時刻をハードウェアクロックに同期することができます。このサービスはデフォルトでは有効化されており、前に触れたカーネル内方式を選んだ場合には無効にすべきです。カーネルの RTC を使用している場合には hwclock スクリプトを実行しないでください。
root #rc-update delete hwclock bootしかしながら、hwclockが他のrc-service、例えばsysklogdなどの依存関係として開始されることがあります。この場合、rc-serviceのosclockを、依存しているrc-serviceと同じランレベルに追加するべきです。
ただし、OpenRC を使用する必要がある場合には、/etc/conf.d/hwclock の clock_hctosys と clock_systohc をいずれも YES に設定してください。デフォルトでは、このサービスは UTC 用に設定されています。ローカルタイムに変更するには clock="local" を追加します。
/etc/conf.d/hwclockハードウェアクロックの同期を追加するclock_hctosys="YES" clock_systohc="YES" # clock="local"
hwclock サービスを再起動し、ハードウェアクロック init スクリプトがシステムのブート時に起動するようにします:
root #rc-service hwclock restart
root #rc-update add hwclock boot
systemd
systemd を使用してブート時にシステムクロックを設定できます。ハードウェアクロックを管理するには timedatectl を使用します:
現在のハードウェアクロックを確認するには:
user $timedatectl | grep "RTC time"ハードウェアクロックを現在のシステムクロック (UTC) に合わせて設定するには:
root #timedatectl set-local-rtc 0ハードウェアクロックを現在のシステムクロック (ローカルタイム) に合わせて設定するには:
root #timedatectl set-local-rtc 1トラブルシューティング
Windows とのデュアルブート
Windowsのような他のオペレーティングシステムとデュアルブートしているシステムは、一般的にハードウェアクロックで苦労します。Windowsがハードウェアクロックをローカルタイムに戻さないようにするために、以下のレジストリ項目を追加してください。
This can lead to a difficulty when dual-booting: the time being correct on one operating system causes it to be incorrect on the other. When either uses NTP to obtain the time, they then 'correct' the RTC, only for the situation to revert when the other does the same, seemingly 'fighting' over the RTC, and resulting in the clock being incorrect by several hours.
To avoid Windows adjusting the hardware clock back to local time, add the following registry entry:
64 ビット Windows では、regedit を開き、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation を見てください。RealTimeIsUniversal という QWORD 項目を作成、値に 1 を設定し、システムを再起動してください。これでクロックは UTC 時刻となっているはずです。32 ビット Windows では、QWORD の代わりに DWORD を使用するという点を除き、64 ビットの手順に従ってください。
関連項目
- Network Time Protocol — used to synchronize the system time with other devices over the network.
- Chrony — Network Time Protocol (NTP) の多機能な実装
- OpenNTPD — a lightweight NTP server ported from OpenBSD.
外部資料
- https://lifehacker.com/5742148/fix-windows-clock-issues-when-dual-booting-with-os-x - RealTimeIsUniversal をセットした MS Windows とのデュアルブート。Windows 10 でもテスト済みです。
- http://tldp.org/HOWTO/Clock-2.html - クロックについてのちょっとしたHOWTO。
参照
- ↑ Comparison of NTP implementations, chrony, 2017年3月1日 2017年7月11日取得
- ↑ OpenNTPD. OpenNTPD 5.9p1, OpenNTPD, 2016年3月29日 2017年7月11日取得