不只是針對時間的管理與調整,也討論一些實體機與虛擬機的時間管理。
先想一下根本問題:
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 時間。
IPMI 裡面會有 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.
3) tw.pool.ntp.org.
這些組織用高端科學儀器如衛星原子鐘來得到準確時間並同步。實在沒有什麼理由不使用?
至於微軟 windows server 拿來當 NTP Server ??!! 微軟都直接跟你挑明講自家的 NTP 不是 full-featured 外加被一堆原廠証證不相容。別幹這種事是最好,如果你嫌時間多願意花在除錯與調整 default configuration 讓它正常點…。
我真的無法了解巨硬公司連簡單的 NTP 都能搞砸,還能期待什麼東東可以信任?!
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc773061(v=ws.10)?redirectedfrom=MSDN