This is Gentoo's testing wiki. It is a non-operational environment and its textual content is outdated.
Please visit our production wiki at https://wiki.gentoo.org
システム時刻
Unix システムは、システムクロックによって裏付けられるシステム時刻を時刻の把握に使用しています。これは、ハードウェアクロックまたは外部タイム・サーバーによって設定することができます。
序文
ソフトウェアクロックとハードウェアクロック
カーネルによって提供されるシステムクロックは、1970年 1月 1日 00時00分00秒から行われたティック(訳註: タイマーの刻み)数の単純なカウントとして実装されています。これは Unix 時間 と呼ばれます。
ハードウェアクロック(また、リアルタイムクロックやRTCとして知られる)は、典型的には、メインボード上のコンポーネントです。オペレーティングシステムの状態に関係なく、コンピュータがシャットダウンしても常に実行されます。
UTC時間とローカルタイム
ハードウェアクロックの時刻は次の2つの標準を示すように変更できます: ローカルタイムまたは UTC 時間です。ローカルタイムは DST (訳註: 夏時間)も含めたタイムゾーンにおける実際の時刻です。推奨されるのは UTC 時間です。なぜなら、システム時刻はタイムゾーンの時差と DST を加算して算出されるからです。そうすれば夏時間の変更は自動的に適用されますし、またハードウェアクロックを変更することなくタイムゾーンを変更することができます。デュアルブートのシステムを使用する場合は例外かもしれません; 他のオペレーティングシステムが UTC のハードウェアクロックをサポートしていないか、またはそのように設定されていない場合です(デフォルトでは、Windows はローカルタイムを使用します)。
Configuration
タイムゾーン
時刻を適切に保つには、あなたのタイムゾーン(標準時)を選び、システムがどの地域にあるのかを知らせる必要があります。
OpenRC
See Timezone (AMD64 Handbook).
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 の記事をご覧ください。
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 ... と Set the RTC time ... というドライバーも有効化する必要があります:
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 rtcN) [*] /dev/rtcN (character devices) <*> PC-style 'CMOS'
Set the RTC time based on NTP synchronization は、いくつかの NTP 実装では使用されないことに注意してください。サポートされる NTP 実装には以下のものが含まれます: net-misc/chrony (詳しくは ここ を参照) と net-misc/ntp (詳しくは NTP の記事 を参照)。OpenNtpd(net-misc/openntpd) はハードウェア時刻の設定をサポートしていませんので、避けてください。
ハードウェア時刻が更新されているか確認するには、以下を実行します:
root #
adjtimex --print | grep status
報告された数字の64ビットはセットされていない状態(0)であるべきです。詳細な情報は hwclock の man page にあります('11 minute mode' を検索してください)。
OpenRC
OpenRC を使用している場合、hwclock init スクリプトでブート時にシステムクロックを設定し、またシャットダウン時にシステム時刻をハードウェアクロックに同期することができます。このサービスはデフォルトでは有効化されており、前に触れたカーネル内方式を選んだ場合には無効にすべきです。カーネルのリアルタイムクロックを使用している場合には hwclock スクリプトを実行しないでください。
root #
rc-update delete hwclock boot
It could however happen hwclock being started as dependency of another rc-service, e.g. sysklogd. In this case the rc-service osclock should be added to the same runlevel as the dependent 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
Troubleshooting
Dual booting with Windows
Systems that dual boot with another operating system, such as Windows, generally have a struggle over the hardware clock. To make Windows not adjust the hardware clock back to local time, add the following registry entry.
For 64-bit Windows, open regedit then browse to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation. Create a new QWORD entry called RealTimeIsUniversal, then set its value to 1
. Reboot the system. The clock should now be in UTC time.
参考
- Network Time Protocol
- NTP - ネットワークタイムプロトコルの実装の1つ。
- OpenNTPD - OpenBSD から移入された軽量な NTP サーバー
外部の情報
- http://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。