システム時刻
システム時刻は、システムクロックによって裏付けられますが、Unix システムが時刻の把握に使用しています。これは、ハードウェアクロックまたは外部タイム・サーバーによって設定することができます。
序文
ソフトウェアクロックとハードウェアクロック
カーネルによって提供されるシステムクロックは、世界協定時 (UTC) の 1970 年 1 月 1 日 00 時 00 分 00 秒から経過したティック (訳註: タイマーの刻み) 数の単純なカウントとして実装されています。これは Unix 時間と呼ばれます。
ハードウェアクロック (また、リアルタイムクロックや RTC として知られる) は、典型的には、メインボード上のコンポーネントです。コンピュータの電源供給が切られているときであっても、ノンストップで動き続けます。
UTC時間とローカルタイム
システム時刻は、ユーザのタイムゾーンによって決定される、夏時間 (DST) を考慮に入れたローカルタイムに常に設定されます。
ハードウェアクロックの時刻は、ローカルタイムまたは協定世界時 (UTC) を示すように変更できます。UTC はタイムゾーンの時差と夏時間から独立しているため、UTC が好まれます。デュアルブートのシステムを使用する場合は例外かもしれません——Windows などの他のオペレーティングシステムがハードウェアクロックを UTC として解釈するように設定されていない場合です (これは変更できます——Windows とのデュアルブート節を参照してください)。
設定
タイムゾーン
時刻を適切に保つには、あなたのタイムゾーン(標準時)を選び、システムがどの地域にあるのかを知らせる必要があります。
OpenRC
タイムゾーン (AMD64 ハンドブック) を見てください。
systemd
systemd にはタイムゾーンを管理するための timedatectl コマンドが含まれています:
現在のゾーンを確認するには:
user $
timedatectl
利用可能なゾーンをリストアップするには:
user $
timedatectl list-timezones
タイムゾーンをたとえばドイツに変更するには:
root #
timedatectl set-timezone Europe/Berlin
LC_TIME
日付や時刻のフォーマットはこの環境変数で定義されています。詳細については The GNU C Library を参照してください。
システムクロック
通常、システムクロックの時刻は起動時にハードウェアクロックによって設定されます。代替的には、システムクロックを手動で設定するか、ネットワークタイムサーバを使用することが可能です。
date コマンドを使ってシステムクロックの時刻を管理できます:
現在のソフトウェアクロックの時刻を確認するには:
user $
date
システムクロックをたとえば2016年5月6日12時34分にセットするには:
root #
date 050612342016
タイムサーバ
タイムサーバーの使用に関する情報については NTP または Chrony の記事をご覧ください。
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 スクリプトでブート時にシステムクロックを設定し、またシャットダウン時にシステム時刻をハードウェアクロックに同期することができます。このサービスはデフォルトでは有効化されており、前に触れたカーネル内方式を選んだ場合には無効にすべきです。カーネルのリアルタイムクロックを使用している場合には 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"
を追加します。
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がハードウェアクロックをローカルタイムに戻さないようにするために、以下のレジストリ項目を追加してください。
64 ビット Windows では、regedit を開き、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation を見てください。RealTimeIsUniversal という QWORD 項目を作成、値に 1
を設定し、システムを再起動してください。これでクロックは UTC 時刻となっているはずです。32 ビット Windows では、QWORD の代わりに DWORD を使用するという点を除き、64 ビットの手順に従ってください。
関連項目
- Network Time Protocol — is used to synchronize the system time with other devices over the network.
- Ntp — is a suite of tools utilizing Network Time Protocol. Their purpose is to keep the system clock in time.
- Chrony — a versatile implementation of the 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日取得