自身が管理しているサーバーの時刻が正しく設定されているか確認する手順です。
一昔前は、サーバーは「物理サーバー」が中心だったので時刻の設定は単純でしたが、今は「物理サーバー」、「仮想マシン」、「クラウド」と環境が混在していることが普通になりました。
時刻を持っているシステムは
- 物理サーバーのBIOS(ハードウェアクロック)
- 物理サーバー
- 仮想マシン
- ホスト(仮想マシンを搭載するサーバー)
- ホストのBIOS(ハードウェアクロック)
- クラウド(AWS EC2)
など多種多様です。
今回の環境
今回は以下の3種類の環境で試しました。
- CentOS7(仮想マシン)
- CentOS6(仮想マシン)
- RHEL7(AWS)
基本はタイムゾーンの設定を正しくする
基本的にタイムゾーンの設定が正しければ、時刻も正しくなります。
更に全台のサーバーのタイムゾーンが「JST(Japan Standard Time)」で統一されていて、且つ NTP で時刻同期をしていれば時刻のずれはなくなります。
タイムゾーンの確認
タイムゾーンの確認は、いずれの環境も「date」コマンドで確認できます。
【CentOS7】dateコマンド
JSTです。
[root@cent07 ~]# date |
【CentOS6】dateコマンド
JSTです。
[root@cent06 ~]# date [root@cent06 ~]# |
【RHEL7】【AWS】dateコマンド
AWS は起動した直後です。
AWS はメディアを挿入してパーティションを切ったり、ロケールを設定してインストールをすると言うことがないので、デフォルトで起動した状態です。
タイムゾーンやロケールの設定は何もしていません。
タイムゾーンは「EDT」になりました。
# date # |
EDTとは(Eastern Standard Time、東部標準時)の略です。
アメリカやカナダで使用されています。
JSTとEDTの時差は「13時間」です。
【参考】日本標準時と米国東部標準時(夏時間)の時間差表
JST EDT
00:00 11:00(前日)
01:00 12:00(前日)
02:00 13:00(前日)
03:00 14:00(前日)
04:00 15:00(前日)
05:00 16:00(前日)
06:00 17:00(前日)
07:00 18:00(前日)
08:00 19:00(前日)
09:00 20:00(前日)
10:00 21:00(前日)
11:00 22:00(前日)
12:00 23:00(前日)
13:00 00:00
タイムゾーンの変更手順
/etc/localtime にタイムゾーンを設定します。
現在の /etc/localtime の確認方法
初めに現在の「/etc/localtime」を確認します。
【CentOS7】
[root@cent07 ~]# strings /etc/localtime |
【CentOS6】
[root@cent06 ~]# strings /etc/localtime |
【AWS】【RHEL7】
# strings /etc/localtime |
「/usr/share/zoneinfo/Asia/Tokyo」を「/etc/localtime」にシンボリックリンクを張りタイムゾーンを変更する
cpコピーでコピーしても OK です。
今回は「ln」コマンドでシンボリックリンクを張る方式にします。
「ln -sf」としていますが、すでにリンクが張ってあるとエラーになるので「-f」オプションで強制的にシンボリックリンクを張っています。
【CentOS7】
[root@cent07 Asia]# cp -ip /etc/localtime /etc/localtime_20170916 [root@cent07 Asia]# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime |
【CentOS6】
[root@cent06 Asia]# cp -ip /etc/localtime /etc/localtime_20170916 [root@cent06 Asia]# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime |
【AWS】【RHEL7】
# cp -ip /etc/localtime /etc/localtime_20170916 # ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime |
シンボリックリンクは「貼る」?「張る」?
「貼る」は限定的な使い方をするようです。
【例】ポスターを貼る、貼り紙をするなど。
「paste(ペースト)」は「貼る」です。
「張る」は「貼る」と同じ意味ですが、範囲が広いです。
氷が張る、意地を張る、気が張るなど。
ペーストという意味なら
- 障子を張る ○
- 障子を貼る ○
と両方使えますが、
ペースト以外だと、
- 意地を張る ○
- 意地を貼る ×
と少々おかしな感じになります。
シンボリックリンクやリンクなどは「張る」でも「貼る」でも正しいような気がしますが、厳密に言えばリンクを「貼る(コピペするというニュアンス)」よりリンクを「張る(リンクの設定をするというニュアンス)」の方がより意味が分かりやすいと思います。
動作確認:loggerでログを吐いてみる
タイムゾーンを変更したら、反映されているか「logger」コマンドでログを吐いてみてタイムスタンプを確認します。
[root@cent07 log]# logger test |
ハードウェアクロックとは?
ハードウェアクロックも時刻を持っています。
以下、「システムクロック」と「ハードウェアクロック」の違いです。
- システムクロック ← OS が持っている時刻。電源断で時刻は消える。
- ハードウェアクロック ← マザーボードが持っている時刻。電源断でも電池があるので消えない。BIOSの時刻情報はハードウェアクロック。
通常、時刻は NTP を利用して取得をしていることが多いと思います。
特に1つのシステムにサーバーが数十台あるような場合は、時刻がずれるとデータベースのデータに不整合が起きたり、アプリケーションの動作にも影響が出ます。
では、NTP で時刻を取得した後、どのように時刻を「システムクロック」「ハードウェアクロック」に反映しているのでしょうか?
まずは NTP で時刻を取得した後、取得した時刻をシステムクロックに反映させます。
そしてOSによって多少は変わるかもしれませんが定期的に「システムクロック」を「ハードウェアクロック」に反映させます。
NTP を使用する場合は、ハードウェアクロックは 11 分ごとにシステムクロックに自動的に同期されます。
ハードウェアクロックの設定
タイムゾーンを「JST」に変更したにもかからわず、時刻が「JST」に変わらない場合はハードウェアクロックの設定も確認しましょう。
ちなみにハードウェアクロックの設定は
- CentOS6 → /etc/sysconfig/clock
- CentOS7 → timedatectl コマンド
timezone 設定ファイル /etc/sysconfig/clock
【CentOS6】
ファイルで管理をしています。
[test@cent06 ~]$ cat /etc/sysconfig/clock |
timedatectl コマンド
【CentOS7・RHEL7】
[root@cent07 log]# timedatectl |
date コマンドで「JST」、timedatectl コマンドでも「JST」、しかし /var/log/messages のログのタイムスタンプが変化なしの場合は OS の再起動が必要?
「システムクロック」も「JST」、「ハードウェアクロック」も「JST」、しかし「/var/log/messges」のタイムスタンプは変化なしの場合は OS を再起動すると反映されました。
ということは、OSの再起動が必要ということなのでしょうか??
Sep 16 10:16:26 ip-xxx-xxx-xxx-xxx dbus[461]: [system] Successfully activated service ‘org.freedesktop.nm_dispatcher’ |
ログを見ていて気が付いたことは「rsyslog」です。
rsyslogサービスがログを管理していました。
[root@ip-172-31-19-246 ~]# systemctl list-unit-files | grep syslog |
ということは、/var/log/messages ファイルにログを出力しているのは rsyslog です。
ちなみに、rsyslog に対する設定変更を反映するためには OS 再起動まで必要なくて rsyslog デーモンの再起動だけで大丈夫なはずです。
すでに OS を再起動してしまいましたが・・・
/etc/adjtime の設定の確認
「/etc/adjtime」とはハードウェアクロックのタイムゾーンを保存しています。
以下、/etc/adjtime の設定は「UTC」になっていますが、間違っているわけではありません。
これはハードウェアクロックの時刻を「UTC」として扱うということです。
【CentOS6】
[root@cent07 Asia]# cat /etc/adjtime |
【CentOS7】
[root@cent06 Asia]# cat /etc/adjtime |
【RHEL7】
# cat /etc/adjtime |
「タイムゾーン」と「ロケール」の違い
簡単に言うと
- タイムゾーン → 地域による時差を調整する。
- ロケール → 言語や国の違いを調整する。
です。
今回は時刻について説明をしていますが、「タイムゾーン」と「ロケール」は関連があります。
例えば「日本」で「日本語」を利用しているなら、必然的に「日本標準時」になるということです。
※もちろん例外もあります。
【AWS】【RHEL7】ロケール
AWSのディストリビューション情報です。
RHEL7です。
$ cat /etc/redhat-release |
ロケールは「US」になっています。
$ localectl status |
ハードウェアクロックの構成
補足ですが man コマンドの結果を記載します。
NOTES Linuxシステムには2つのメインクロックがあります。
The Hardware Clock: This is a clock that runs independently of any control program running in the CPU and even when the machine is powered off. ハードウェアクロック:これは、CPUで実行中の制御プログラムとは無関係に、またマシンの電源がオフになっているときにも実行されるクロックです。
On an ISA system, this clock is specified as part of the ISA standard. ISAシステムでは、このクロックはISA規格の一部として指定されています。 制御プログラムはこのクロックを1秒間に読み取るか設定することができますが、制御プログラムは1秒クロックティックのエッジも検出することができるため、実際にはクロックは実質的に無限の精度を持ちます。
This clock is commonly called the hardware clock, the real time clock, the RTC, the BIOS clock, and the CMOS clock. このクロックは、一般にハードウェアクロック、リアルタイムクロック、RTC、BIOSクロック、およびCMOSクロックと呼ばれます。
Hardware Clock, in its capitalized form, was coined for use by hwclock because all of the other names are inappropriate to the point of being misleading. ハードウェア・クロックは、大文字の形式で、hwclockで使用するために作成されました。 他のすべての名前は誤解を招くような点には不適切です。
So for example, some non-ISA systems have a few real time clocks with only one of them having its own power domain. したがって、たとえば、一部の非ISAシステムではリアルタイムクロックが数個しかなく、そのうちの1つに独自の電源ドメインがあります。
A very low power external I2C or SPI clock chip might be used with a backup battery as the hardware clock to initialize a more functional integrated real-time clock which is used for most other purposes. 非常に低電力の外部I2CまたはSPIクロック・チップを、ハードウェア・クロックとしてバックアップ・バッテリと共に使用して、他の大部分の目的に使用されるより機能的な統合リアルタイム・クロックを初期化することができます。
The System Time: This is the time kept by a clock inside the Linux kernel and driven by a timer interrupt. システム時間:これは、Linuxカーネル内の時計によって保持され、タイマ割り込みによって駆動される時間です。 (ISAマシンでは、タイマ割り込みはISA標準の一部です) これは、Linuxがマシン上で実行されている間だけ意味があります。 システム時間は、1970年1月1日00:00:00(またはより簡潔には、1969年以降の秒数)からの秒数です。 しかし、System Timeは整数ではありません。 事実上無限の精度を持っています。 The System Time is the time that matters. システム時間は重要な時間です。 ハードウェアクロックの基本的な目的は、Linuxが動作していない時間を維持することです。 Linuxの起動時にハードウェアクロックからの時間にシステム時間を初期化し、ハードウェアクロックを再び使用しないでください。 ISAが設計されたDOSでは、ハードウェアクロックが唯一のリアルタイムクロックであることに注意してください。 It is important that the System Time not have any discontinuities such as would happen if you used the date(1L) program to set it while the system is running. システム稼動中に日付(1L)プログラムを使用して設定した場合など、システム時間に不連続性がないことが重要です。 ただし、システムの稼働中にハードウェアクロックを実行することができます。また、次回のLinuxの起動時には、ハードウェアクロックからの調整時間を使用して実行します。 A Linux kernel maintains a concept of a local timezone for the system. Linuxカーネルは、システムのローカルタイムゾーンの概念を維持しています。 しかし、誤解されることはありません。カーネルがそれが何であると思うかはほとんど誰も気にしていません。 しかし、ファイルシステムのようなLinuxカーネルの一部のプログラムやフリンジ部分は、カーネルのタイムゾーン値を使用します。
An example is the vfat filesystem. 一例はvfatファイルシステムです。 If the kernel timezone value is wrong, the vfat filesystem will report and set the wrong timestamps on files. カーネルのタイムゾーン値が間違っていると、vfatファイルシステムはファイルに対して間違ったタイムスタンプを報告して設定します。 hwclock sets the kernel timezone to the value indicated by TZ and/or /usr/share/zoneinfo when you set the System Time using the –hctosys option. hwclockは、–hctosysオプションを使用してシステム時刻を設定すると、カーネルのタイムゾーンをTZおよび/または/ usr / share / zoneinfoで示される値に設定します。
The timezone value actually consists of two parts: 1) a field tz_minuteswest indicating how many minutes local time (not adjusted for DST) lags behind UTC, and 2) a field tz_dsttime indicating the type of Daylight Savings Time (DST) convention that is in effect in the locality at the present time. タイムゾーン値は、実際には、1)現地時間(DSTに対して調整されていない)がUTCより遅れた時間を示すフィールドtz_minuteswestと、2)夏時間(DST)規則のタイプを示すフィールドtz_dsttime 現在の地域における効果。 This second field is not used under Linux and is always zero. (See also settimeofday(2).) この2番目のフィールドはLinuxでは使用されず、常にゼロです。 (settimeofday(2)も参照してください)。
Users access and setuid ユーザーのアクセスとsetuid Sometimes, you need to install hwclock setuid root. 場合によっては、hwclock setuid rootをインストールする必要があります。 If you want users other than the superuser to be able to display the clock value using the direct ISA I/O method, install it setuid root. スーパーISA以外のユーザーがダイレクトISA I / Oメソッドを使用してクロック値を表示できるようにするには、setuid rootをインストールします。 If you have the /dev/rtc interface on your system or are on a non-ISA system, there’s probably no need for users to use the direct ISA I/O method, so don’t bother. あなたのシステムに/ dev / rtcインターフェースを持っているか、ISA以外のシステムにいる場合は、ユーザがダイレクトISA I / Oメソッドを使う必要はないかもしれないので、気にしないでください。
In any case, hwclock will not allow you to set anything unless you have the superuser real uid. いずれにせよ、hwclockでは、スーパーユーザーの本当のuidを持っていない限り、何も設定することができません。 (これは、setuid rootをインストールしていない場合は必要ありませんが、現在はそこにあります)。
How hwclock Accesses the Hardware Clock hwclockがハードウェアクロックにアクセスする方法 hwclock uses many different ways to get and set Hardware Clock values. hwclockはハードウェアクロックの値を取得および設定するためにさまざまな方法を使用します。 最も一般的な方法は、デバイス特殊ファイル /dev/rtc に対して I/O を行うことです。 これは、rtcデバイスドライバによって駆動されると推定されます。 ただし、この方法は常に利用可能なわけではありません。 1つ目は、rtcドライバはLinuxに比較的最近追加されたドライバです。 古いシステムにはそれがありません。 また、DEC Alphasで動作するrtcドライバのバージョンもありますが、rtcドライバが動作しないアルファがたくさんあるようです(一般的な症状はhwclockがぶら下がっています)。
Moreover, recent Linux systems have more generic support for RTCs, even systems that have more than one, so you might need to override the default by specifying /dev/rtc0 or /dev/rtc1 instead. さらに、最近のLinuxシステムでは、複数のシステムを持つシステムであっても、RTCをより一般的にサポートしているため、代わりに /dev/rtc0 または /dev/rtc1 を指定してデフォルトを上書きする必要があります。
On older systems, the method of accessing the Hardware Clock depends on the system hardware. 古いシステムでは、ハードウェアクロックにアクセスする方法はシステムのハードウェアによって異なります。 On an ISA system, hwclock can directly access the “CMOS memory” registers that constitute the clock, by doing I/O to Ports 0x70 and 0x71. ISAシステムでは、hwclockは、ポート0x70および0x71へのI / Oを実行することによって、クロックを構成する “CMOSメモリ”レジスタに直接アクセスできます。 これは実際の I/O 命令で行います。したがって、スーパーユーザーの有効なユーザーIDで実行している場合にのみ実行できます。 (Jensen Alphaの場合、hwclockがこれらの I/O 命令を実行する方法はないため、/dev/port デバイス特殊ファイルを使用します。これは、I/O サブシステム)。 This is a really poor method of accessing the clock, for all the reasons that user space programs are generally not supposed to do direct I/O and disable interrupts. これは、ユーザ空間プログラムが一般的に直接 I/O を行い、割り込みを無効にすることは想定されていないという理由から、クロックにアクセスするには本当に貧弱な方法です。 Hwclockは、ISAとAlphaシステムで利用可能な唯一の方法であり、動作可能なrtcデバイスドライバを利用できないため、これを提供します。 On an m68k system, hwclock can access the clock via the console driver, via the device special file /dev/tty1. m68kシステムでは、hwclockは、デバイス特殊ファイル/ dev / tty1を介して、コンソールドライバ経由でクロックにアクセスできます。 hwclock tries to use /dev/rtc. hwclockは /dev/rtc の使用を試みます。 その機能を持たないカーネル用にコンパイルされている場合、または/ dev / rtc(またはコマンドラインで定義した別の特殊ファイル)を開くことができない場合、hwclockは利用可能であれば別のメソッドにフォールバックします。 ISA または Alpha マシンでは、 –devirectory オプションを指定することによって、/dev/rtc を試すことなしに hwclock に CMOS レジスタの直接操作を強制することができます。
The Adjust Function 調整機能
The Hardware Clock is usually not very accurate. ハードウェアクロックは通常、あまり正確ではありません。 However, much of its inaccuracy is completely predictable – it gains or loses the same amount of time every day. This is called systematic drift. hwclock’s “adjust” function lets you make systematic corrections to correct the systematic drift. hwclockの “調整”機能を使用すると、系統的な補正を行って系統的なドリフトを補正することができます。 It works like this: hwclock keeps a file, /etc/adjtime, that keeps some historical information. これはadjtimeファイルと呼ばれます。 Suppose you start with no adjtime file. あなたがadjtimeファイルなしで始めると仮定します。 You issue a hwclock –set command to set the Hardware Clock to the true current time. Hwclockは同じことをします:2秒を引いて、時計が調整された最後の時刻としてadjtimeファイルを現在の時刻で更新します。 Every time you calibrate (set) the clock (using –set or –systohc), hwclock recalculates the systematic drift rate based on how long it has been since the last calibration, how long it has been since the last adjustment, what drift rate was assumed in any intervening adjustments, and the amount by which the clock is presently off. hwclockは、クロックを較正(設定)するたびに、最後の較正からどれぐらいの時間が経過したか、最後の調整からどれぐらいの時間が経過したか、どのドリフトをドリフトしているか レートは、介入調整およびクロックが現在オフになっている量で仮定された。 A small amount of error creeps in any time hwclock sets the clock, so it refrains from making an adjustment that would be less than 1 second. 後で調整を再度要求すると、蓄積されたドリフトは1秒以上になり、hwclockは調整を行います。 It is good to do a hwclock –adjust just before the hwclock –hctosys at system startup time, and maybe periodically while the system is running via cron. システム起動時にはhwclock – hctosysの直前に、システムがcronで動作している間は、ちょうどhwclockを実行するとよいでしょう。 The adjtime file, while named for its historical purpose of controlling adjustments only, actually contains other information for use by hwclock in remembering information from one invocation to the next. adjtimeファイルは、調整のみを制御するという歴史的な目的のために名前が付けられていますが、hwclockが1回の呼び出しから次の呼び出しまでの情報を記憶するためのその他の情報を含んでいます。
The format of the adjtime file is, in ASCII: adjtimeファイルの形式は、ASCII形式です。 Line 1: 3 numbers, separated by blanks: 1) systematic drift rate in seconds per day, floating point decimal; 2) Resulting number of seconds since 1969 UTC of most recent adjustment or calibration, decimal integer; 3) zero (for compatibility with clock(8)) as a decimal integer. 行1:空白で区切られた3つの数字:1)1日あたりの体系的なドリフト率、浮動小数点小数点。 2)最新の調整または較正の1969 UTCからの結果の秒数、10進整数。 3)ゼロ(clock(8)との互換性のため)を10進整数として使用します。
Line 2: 1 number: Resulting number of seconds since 1969 UTC of most recent calibration. これは10進整数です。
Line 3: “UTC” or “LOCAL”. この値は、hwclockコマンドラインのオプションで常に上書きすることができます。 You can use an adjtime file that was previously used with the clock(8) program with hwclock. hwclockでclock(8)プログラムで以前に使用されていたadjtimeファイルを使用することができます。
Automatic Hardware Clock Synchronization By the Kernel (ntpは、システムタイムをネットワークのどこかのタイムサーバーか、システムに接続されたラジオクロックに同期させる方法です(RFC 1305を参照)。 This mode (we’ll call it “11 minute mode”) is off until something turns it on. システム時刻を旧式に設定するhwclock –hctosysなど、何かを実行することでオフにすることができます。 If your system runs with 11 minute mode on, don’t use hwclock –adjust or hwclock –hctosys. 起動時にhwclock –hctosysを使用して、システムが外部ソースからシステム時間を設定して11分モードを開始できるようになるまで、適切なシステム時間を取得することは許容されます。
ISA Hardware Clock Century value ISAハードウェアクロック世紀値 There is some sort of standard that defines CMOS memory Byte 50 on an ISA machine as an indicator of what century it is. hwclockはそのバイトを定義していないマシンがいくつか存在するので、そのバイトを使用したり設定したりすることはありません。実際には必要ありません。なぜなら、何世紀にもわたる世紀を意味する良い仕事をしているからです。 If you have a bona fide use for a CMOS century byte, contact the hwclock maintainer; an option may be appropriate. CMOS世紀のバイトを真に使用している場合は、hwclockの管理者に連絡してください。 オプションが適切かもしれない。 Note that this section is only relevant when you are using the “direct ISA” method of accessing the Hardware Clock. ACPIは、ハードウェアでサポートされている世紀の値にアクセスするための標準的な方法を提供します。
ENVIRONMENT VARIABLES
FILES
SEE ALSO |
コメント