计算机系统的时间
計算機(jī)系統(tǒng)的時間
?
目錄1. 計算機(jī)系統(tǒng)時間的組成
2. 計算機(jī)系統(tǒng)時鐘
3. 計算機(jī)系統(tǒng)時鐘運(yùn)行的行為
4. 計算機(jī)時鐘查看與維護(hù)
4.1 硬件時鐘
4.2 系統(tǒng)時鐘
4.2.1 讀取時鐘
4.2.2 設(shè)置系統(tǒng)時鐘
4.2.3 雙系統(tǒng)的時間標(biāo)準(zhǔn)設(shè)置
4.2.4 Windows中的UTC
4.2.5 時區(qū)
4.2.6 時間偏差
5. 參考及擴(kuò)展閱讀
5.1 時間同步
5.2 假hwclock
導(dǎo)讀:計算機(jī)系統(tǒng)的時間,對于雙系統(tǒng)用戶,有時會遇到系統(tǒng)時間總是不對,每次重啟進(jìn)入另外一個系統(tǒng)都要手動調(diào)整同步。或許需要閱讀下文了解個大概。
若不想浪費(fèi)時間,簡單的說,硬件時鐘和所有操作系統(tǒng)的系統(tǒng)時鐘的時間標(biāo)準(zhǔn)都設(shè)置為UTC全球時間標(biāo)準(zhǔn)即可。只要你知道怎么設(shè)置,就可以避免系統(tǒng)時間異常的問題,也不用繼續(xù)看下文了。
1. 計算機(jī)系統(tǒng)時間的組成
在操作系統(tǒng)中,時間(時鐘)time (clock) 由四部分決定:
- 幾個相同簡寫的CST https://zh.wikipedia.org/wiki/CST
- CST 中國 China Standard Time 比世界協(xié)調(diào)時快八小時(即: UTC+8)
- CST Central Standard Time 北美部分地區(qū)使用(即: UTC-6)
- CST 古巴 Cuba Standard Time (即: UTC-5)
- CST 中國 China Standard Time 比世界協(xié)調(diào)時快八小時(即: UTC+8)
- 幾個相同簡寫的CST https://zh.wikipedia.org/wiki/CST
2. 計算機(jī)系統(tǒng)時鐘
計算機(jī)主機(jī)系統(tǒng)始終有硬件時鐘和系統(tǒng)時鐘,網(wǎng)絡(luò)上還有提供時鐘同步的NTP時間服務(wù)器。
- Hardware clock 硬件時鐘: 計算機(jī)硬件有個使用電池的實時時鐘(Real-time Clock, RTC)也叫(CMOS時鐘,BIOS時間)。使用的時間標(biāo)準(zhǔn)由操作系統(tǒng)設(shè)置。(建議使用UTC全球時間標(biāo)準(zhǔn))
- Software clock 軟件時鐘: 計算機(jī)系統(tǒng)運(yùn)行時的時鐘(Syetem clock)。
NTP 網(wǎng)絡(luò)時間協(xié)議(Network Time Protocol)是用于通過分組交換,可變延遲數(shù)據(jù)網(wǎng)絡(luò)同步計算機(jī)系統(tǒng)的時鐘的協(xié)議。實現(xiàn)時間同步.
3. 計算機(jī)系統(tǒng)時鐘運(yùn)行的行為
大多數(shù)計算機(jī)系統(tǒng)的標(biāo)準(zhǔn)行為是:
4. 計算機(jī)時鐘查看與維護(hù)
4.1 硬件時鐘
硬件時鐘(又名實時時鐘(RTC)或CMOS時鐘)存儲的值:年,月,日,小時,分鐘和秒。
僅2016年或更高版本,UEFI固件能夠存儲時區(qū),以及是否使用DST。
讀硬件時鐘
$ sudo hwclock
2019-04-25 21:25:40.858698+08:00
查看開機(jī)引導(dǎo)時更新的系統(tǒng)時刻
$ cat /etc/adjtime
? 0.000000 1553241994 0.000000
? 1553241994
? UTC
額,這里的“1553241994”就是最近一次開機(jī)引導(dǎo)的時刻了(秒數(shù))。
是自1970年1月1日午夜UTC以來,到開機(jī)引導(dǎo)時,硬件時鐘的時間之間的秒數(shù)。
將硬件時鐘設(shè)置為當(dāng)前系統(tǒng)時鐘:此外,/etc/adjtime如果不存在,它會更新或創(chuàng)建它。
# hwclock --systohc
4.2 系統(tǒng)時鐘
系統(tǒng)時鐘(又名軟件時鐘)跟蹤:時間,時區(qū)和夏令時(如果適用)。它由Linux內(nèi)核計算為自1970年1月1日午夜UTC以來的秒數(shù)。系統(tǒng)時鐘的初始值由硬件時鐘計算,具體取決于內(nèi)容/etc/adjtime。啟動完成后,系統(tǒng)時鐘獨(dú)立于硬件時鐘運(yùn)行。Linux內(nèi)核通過計算定時器中斷來跟蹤系統(tǒng)時鐘。
4.2.1 讀取時鐘
要檢查當(dāng)前系統(tǒng)時鐘時間(以本地時間和UTC顯示)以及RTC(硬件時鐘):
$ timedatectl
- Local time: Fri 2019-04-26 16:29:01 CST // 本地時間
- Universal time: Fri 2019-04-26 08:29:01 UTC // 全球時間
- RTC time: Fri 2019-04-26 08:29:04 // 硬件時間
- Time zone: Asia/Shanghai (CST, +0800) // 時區(qū)
- System clock synchronized: no // 系統(tǒng)時間同步: 無
- NTP service: inactive // NTP網(wǎng)絡(luò)同步服務(wù): 未激活
- RTC in local TZ: no // 硬件時鐘時間標(biāo)準(zhǔn): 不是本地時間,
*有趣的事情就發(fā)生了,Local time是當(dāng)前的系統(tǒng)時間;RTC time是當(dāng)前的硬件時間;
開機(jī)引導(dǎo)時,系統(tǒng)時間獲取硬件時間作為自己的時間,2個時鐘獨(dú)自運(yùn)行了一段時間后,出現(xiàn)了差異。
再如Unix等服務(wù)器系統(tǒng)開機(jī)后會連續(xù)運(yùn)行數(shù)月,甚至數(shù)年。出現(xiàn)的差異可能會更加明顯。
$ who -b //查看最近一次開機(jī)時刻;
system boot 2019-04-23 11:44
$ uptime // 查看連續(xù)運(yùn)行時間;
16:22:59 up 3 days, 4:38, 1 user, load average: 2.67, 2.16, 1.86
$ cat /proc/uptime // 連續(xù)運(yùn)行秒數(shù);
275958.56 379537.26
// 其他命令也能看到: w, top, last reboot,
*由此可以了解到,本機(jī)連續(xù)運(yùn)行了3天多,系統(tǒng)時鐘就比硬件時鐘慢了3秒。
4.2.2 設(shè)置系統(tǒng)時鐘
直接設(shè)置系統(tǒng)時鐘的本地時間:
# timedatectl set-time "yyyy-MM-dd hh:mm:ss"
# timedatectl set-time "2019-04-26 11:13:54"
4.2.3 雙系統(tǒng)的時間標(biāo)準(zhǔn)設(shè)置
第一章有講到兩種時間標(biāo)準(zhǔn):本地時間和協(xié)調(diào)世界時(UTC)。
本地時間標(biāo)準(zhǔn)取決于當(dāng)前時區(qū),而UTC是全球時間標(biāo)準(zhǔn),與時區(qū)值無關(guān)。
或者說,本地時間=UTC+時區(qū)
默認(rèn)情況下,Windows使用localtime,macOS使用UTC,類UNIX系統(tǒng)也有所不同。
使用UTC標(biāo)準(zhǔn)的操作系統(tǒng)通常會將硬件時鐘視為UTC,并根據(jù)時區(qū)對其進(jìn)行調(diào)整以設(shè)置啟動時的操作系統(tǒng)時間。
如果計算機(jī)上安裝了多個操作系統(tǒng),它們將從相同的硬件時鐘獲取當(dāng)前時間:建議采用硬件時鐘的唯一標(biāo)準(zhǔn),以避免系統(tǒng)間沖突并將其設(shè)置為UTC。
否則,如果硬件時鐘設(shè)置為本地時間,則例如在DST改變之后,多個操作系統(tǒng)可以調(diào)整它,從而導(dǎo)致過度校正; 當(dāng)在不同時區(qū)之間旅行并使用其中一個操作系統(tǒng)重置系統(tǒng)/硬件時鐘時,也可能出現(xiàn)問題。
要將硬件時鐘時間標(biāo)準(zhǔn)更改為本地時間,請使用(不推薦):
#timedatectl set-local-rtc 1
要恢復(fù)為UTC的硬件時鐘,請鍵入:
#timedatectl set-local-rtc 0
這些會/etc/adjtime自動生成并相應(yīng)地更新RTC; 無需進(jìn)一步配置。
注意:使用timedatectl需要有源dbus。因此,可能無法在chroot下使用此命令(例如在安裝期間)。在這些情況下,您可以恢復(fù)為hwclock命令。如果/etc/adjtime不存在,則systemd假定硬件時鐘設(shè)置為UTC。
4.2.4 Windows中的UTC
要使用Windows進(jìn)行雙重啟動,建議將Windows配置為使用UTC,而不是使用Linux來使用本地時間。(Windows默認(rèn)使用localtime:請參閱此內(nèi)容。)
它可以通過一個簡單的注冊表修復(fù)來完成:打開regedit并添加DWORD了價值32位的Windows,或QWORD為64位之一,十六進(jìn)制值1到注冊表:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal
您可以從運(yùn)行的管理員命令提示符執(zhí)行此操作:
reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f
(替換DWORD用QWORD64位Windows。)(Replace DWORD with QWORD for 64-bit Windows.)
或者,使用以下內(nèi)容創(chuàng)建一個文件*.reg(在桌面上),然后雙擊它以將其導(dǎo)入注冊表:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]
"RealTimeIsUniversal"=dword:00000001
(替換dword用qword64位Windows。)(Replace dword with qword for 64-bit Windows.)
如果Windows因DST(夏令時)更改而要求更新時鐘,請放行。它將按預(yù)期將UTC保留為UTC,僅校正顯示的時間。
如果您遇到時間偏移問題,請嘗試重新安裝tzdata,然后重新設(shè)置時區(qū):
# timedatectl set-timezone America/Los_Angeles
4.2.5 時區(qū)
要檢查為系統(tǒng)定義的當(dāng)前區(qū)域:
$ timedatectl status
列出可用區(qū)域:
$ timedatectl list-timezones
設(shè)置時區(qū):
# timedatectl set-timezone Zone/SubZone
# timedatectl set-timezone Canada/Eastern
這將創(chuàng)建一個/etc/localtime指向zoneinfo文件的符號鏈接/usr/share/zoneinfo/。
$ ls /etc/localtime
/etc/localtime@
$ ls /etc/localtime -l
lrwxrwxrwx 1 root root 33 Mar 22 16:05 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai
如果您選擇手動創(chuàng)建鏈接(例如在chroot中timedatectl無法工作),請記住它必須是符號鏈接,如archlinux(7)中所指定:
# ln -sf /usr/share/zoneinfo/Zone/SubZone /etc/localtime
提示:也可以使用tzselect以交互方式選擇時區(qū)。$ tzselect
4.2.6 時間偏差
每個時鐘的值都與實時不同(最佳表示為國際原子時); 沒有時鐘是完美的。基于石英的電子時鐘可以保持不完美的時間,但保持一致的不準(zhǔn)確性。這個基礎(chǔ)'不準(zhǔn)確'被稱為'時間偏差'或'時間漂移'。
設(shè)置硬件時鐘時hwclock,每天以秒為單位計算新的漂移值。通過使用新值集和恰好在集合之前的硬件時鐘值之間的差來計算漂移值,同時考慮先前漂移值的值和硬件時鐘的最后設(shè)置時間。新的漂移值和設(shè)置時鐘的時間被寫入文件,/etc/adjtime覆蓋先前的值。因此,當(dāng)命令hwclock --adjust運(yùn)行時,可以調(diào)整硬件時鐘的漂移; 這也發(fā)生在關(guān)機(jī)時,但只有在hwclock守護(hù)進(jìn)程被啟用時,因此對于使用systemd的Arch系統(tǒng),這不會發(fā)生。
注意:如果在上一次設(shè)置后不到24小時再次設(shè)置了hwclock,則不會重新計算漂移,因為hwclock考慮到經(jīng)過的時間太短而無法準(zhǔn)確計算漂移。
5. 參考及擴(kuò)展閱讀
原文:https://wiki.archlinux.org/index.php/System_time
5.1 時間同步[?編輯]
的網(wǎng)絡(luò)時間協(xié)議(NTP)是用于通過分組交換,可變延遲數(shù)據(jù)網(wǎng)絡(luò)同步計算機(jī)系統(tǒng)的時鐘的協(xié)議。以下是Arch Linux可用的NTP實現(xiàn):
- ConnMan?- 具有NTP支持的輕量級網(wǎng)絡(luò)管理器。
- 網(wǎng)絡(luò)時間協(xié)議守護(hù)程序?-協(xié)議的參考實現(xiàn),特別推薦在時間服務(wù)器上使用。它還可以調(diào)整中斷頻率和每秒滴答次數(shù),以減少系統(tǒng)時鐘漂移,并使硬件時鐘每11分鐘重新同步一次。
- sntp?-?NTPd附帶的SNTP客戶端。它取代了ntpdate,建議在非服務(wù)器環(huán)境中使用。
- systemd-timesyncd?- 一個只實現(xiàn)客戶端的簡單?SNTP守護(hù)進(jìn)程,只關(guān)注從一個遠(yuǎn)程服務(wù)器查詢時間。它應(yīng)該適合大多數(shù)安裝。
- OpenNTPD?- OpenBSD項目的一部分,實現(xiàn)客戶端和服務(wù)器。
- Chrony?- 漫游友好的客戶端和服務(wù)器,專為不在線的系統(tǒng)而設(shè)計。
- ntpclient?- 一個簡單的命令行NTP客戶端。
5.2 假hwclock?[?編輯]
alarm-fake-hwclock專為沒有電池備份RTC的系統(tǒng)而設(shè)計,它包括一個systemd服務(wù),在關(guān)機(jī)時保存當(dāng)前時間并在啟動時恢復(fù)節(jié)省的時間,從而避免奇怪的時間旅行錯誤。
安裝?fake-hwclock-git?AUR,啟動并啟用該服務(wù)fake-hwclock.service。
https://wiki.gentoo.org/wiki/System_time
https://en.wikipedia.org/wiki/Network_Time_Protocol
https://linux.cn/lfs/LFS-BOOK-7.7-systemd/chapter07/clock.html
http://www.ntp.org/
更多關(guān)于Time的內(nèi)容。
https://en.wikipedia.org/wiki/Time
https://zh.wikipedia.org/wiki/UTC%2B08:00
https://tycho.usno.navy.mil/systime.html
https://www.ucolick.org/~sla/leapsecs/timescales.html
https://en.wikipedia.org/wiki/International_Atomic_Time
https://en.wikipedia.org/wiki/Coordinated_Universal_Time
https://zh.wikipedia.org/wiki/氫原子鐘
https://zh.wikipedia.org/wiki/銫
https://zh.wikipedia.org/wiki/銫鐘
總結(jié)
- 上一篇: vue实现生成二维码与扫描二维码
- 下一篇: java信息管理系统总结_java实现科