linux 裡時間的管理 (clock, localtime, UTC, timedatectl)

不只是針對時間的管理與調整,也討論一些實體機與虛擬機的時間管理。

先想一下根本問題:
1) 怎麼先確定實體機的時間絕對正確? 不正確有什麼影響?
2) 若上面有虛擬平台,怎麼確定虛擬平台的時間也絕對正確? 不正確又有什麼影響?
3) 怎麼確定虛擬機的時間也正確? 不正確又有什麼影響?

有些高手心中可能有幾千隻草泥馬開始跑過,這不是廢話嗎?!
但這些廢話就是有人弄的亂七八糟。
問題的根本核心思想是:

時間是絕對時間顯示? 還是相對時間顯示?

中間過程不講了,直接跳結論,電腦的標準就是使用 UTC (Coordinated Universal Time)  時間而已,之後看在哪個時區 (timezone),加上時區偏移量,就是相對的顯示時間。
(謎之音:這世界上就是有少數幾個程式不遵守這規定,等各位用心去發掘…蹩腳的windows早期使用local time,後來才加上了時區的設定…)

[root@centerm ~]# date -u ; date ; date -R
Thu Dec 27 12:56:28 UTC 2018
Thu Dec 27 20:56:28 CST 2018
Thu, 27 Dec 2018 20:56:28 +0800

在這例子上,很清楚的說明現在UTC時間是12:56,而中原標準時間是+8小時,變成20:56。
再強調一次:電腦是用UTC。

解答(1):電腦所使用的時間是 UTC 時間,請照標準把時間設成 UTC 時間。
IP
MI 裡面會有 NTP 校時設定可以幫忙。
最佳實踐:IPMI 伺服器主控台裡請設成 UTC 顯示 並使用 NTP,時區在此不重要。

解答(2):虛擬平台如 Nutanix AHV, VMware esxi 都是使用 UTC 沒有例外,在開機的過程中虛擬平台會去取得實體機的時間 (大部分時候我們稱做 RTC, Real-Time Clock),之後虛擬平台裡的 NTP 會協助虛擬平台做校時的動作。
注意有些關機過程中會把最後的時間寫回RTC,但這事實上沒什麼用,有些 RTC是不可寫入的,為什麼有些程式要幹這麼無聊的事。
最佳實踐:虛擬平台裡設成 UTC 顯示 並使用 NTP,時區在此不重要。

解答(3):虛擬平台會創造 virtual BIOS 給虛擬機,裡面也有 Virtual RTC (大部分也是唯讀的,跟著虛擬平台的時間走)。這時候虛擬機的時間因為是虛擬平台給的,所以也是正確的,之後虛擬機作對系統裡的 NTP 會協助虛擬機做校時的動作。
最佳實踐:虛擬機裡的本地時區設定在此重要,這是人類會看的資訊。並使用 NTP 精確校時。

我們觀察到了既然電腦的世界裡有開機流程,習習相關,系統層面何妨乖乖的全部用 UTC 格式,避免有些阿呆程式不懂慣例耍笨…。

再來一個問題是:找誰校時最好?虛擬機是找虛擬平台爸爸校時好?還是找NTP Server?
對我來說:這世界只有校時跟不校時二種設定,要校時,一律找NTP Server校時。這世界已經很複雜了,好好的唯一標準 NTP 不用,搞一些非正規的方式容易出問題,並且更好笑的是…永遠還離不開 NTP。要校時,請扁平化、標準化來看這件事,沒有例外,也不分實體機、虛擬機。

1) linux /etc/sysconfig/clock file and hwclock cmd
以觀察結果來說,這二個都沒有什麼用。clock file有些linux裡已經不存在,至於hwclock cmd是可以拿來讀取 RTC 時間,但寫入一點意義也沒有了。

2) /etc/localtime
這個文件檔用來設置系統的時區,將 /usr/share/zoneinfo/ 中相對做個 soft link 即可修改時區位置,又不會改變 UTC 時間 (如柯南說的真相只有一個,UTC 時間全球也只有一個)。date, hwclock, timedatectl cmd 都會用到這文件檔來進行 UTC 與本地時間的換算。

[root@centerm ~]# date -u ; date
Thu Dec 27 13:40:56 UTC 2018
Thu Dec 27 21:40:56 CST 2018
[root@centerm ~]# mv /etc/localtime /etc/localtime_taipei ; ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
[root@centerm ~]# date -u ; date
Thu Dec 27 13:42:01 UTC 2018
Thu Dec 27 22:42:01 JST 2018
[root@centerm ~]# rm -f /etc/localtime ; mv /etc/localtime_taipei /etc/localtime
[root@centerm ~]# date -u ; date
Thu Dec 27 13:42:36 UTC 2018
Thu Dec 27 21:42:36 CST 2018

[root@centerm ~]# timedatectl
Local time: Thu 2018-12-27 21:46:14 CST
Universal time: Thu 2018-12-27 13:46:14 UTC
RTC time: Thu 2018-12-27 13:46:14   (UTC與RTC一致)
Time zone: Asia/Taipei (CST, +0800)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no (linux也可以使用localtime,不是很建議而已)
DST active: n/a

使用 timedatectl set-timezone Asia/Taipei 可以改變 /etc/localtime file

3) /etc/adjtime 的第三行大部分是 UTC
可以用指令 timedatectl set-local-rtc 1
這時候 adjtime 第三行會變成 LOCAL,使用本地時間。(完全不建議)

4) 另外校時請儘可能使用:
1) time.google.com.
2) us.pool.ntp.org.

台灣那幾台…算了吧…別製造麻煩了。

 

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s