システム時刻

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page System time and the translation is 100% complete.


システム時刻は、システムクロックによって裏付けられますが、Unix システムが時刻の把握に使用しています。これは、ハードウェアクロックまたは外部タイム・サーバーによって設定することができます。

序文

ソフトウェアクロックとハードウェアクロック

カーネルによって提供されるシステムクロックは、世界協定時 (UTC) の 1970 年 1 月 1 日 00 時 00 分 00 秒から経過したティック (訳註: タイマーの刻み) 数の単純なカウントとして実装されています。これは Unix 時間と呼ばれます。

ハードウェアクロック (また、リアルタイムクロックや RTC として知られる) は、典型的には、メインボード上のコンポーネントです。オペレーティングシステムの状態に関係なく、コンピュータがシャットダウンしても常に実行されます。

UTC時間とローカルタイム

ハードウェアクロックの時刻は次の2つの標準を示すように変更できます: ローカルタイムまたは UTC 時間です。ローカルタイムは DST (訳註: 夏時間)も含めたタイムゾーンにおける実際の時刻です。推奨されるのは UTC 時間です。なぜなら、システム時刻はタイムゾーンの時差と DST を加算して算出されるからです。そうすれば夏時間の変更は自動的に適用されますし、またハードウェアクロックを変更することなくタイムゾーンを変更することができます。デュアルブートのシステムを使用する場合は例外かもしれません; 他のオペレーティングシステムが 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 resumeCONFIG_RTC_HCTOSYS) と Set the RTC time based on NTP synchronizationCONFIG_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/hwclockclock_hctosysclock_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がハードウェアクロックをローカルタイムに戻さないようにするために、以下のレジストリ項目を追加してください。

64 ビット Windows では、regedit を開き、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation を見てください。RealTimeIsUniversal という QWORD 項目を作成、値に 1 を設定し、システムを再起動してください。これでクロックは UTC 時刻となっているはずです。32 ビット Windows では、QWORD の代わりに DWORD を使用するという点を除き、64 ビットの手順に従ってください。

関連項目

外部の情報

参照

  1. Comparison of NTP implementations, chrony, 2017年3月1日 2017年7月11日取得
  2. OpenNTPD. OpenNTPD 5.9p1, OpenNTPD, 2016年3月29日 2017年7月11日取得