Linux 時鐘同步
還在為多服務部署時間不一致而擔憂嗎?快快參照以下套路設定一下吧
Linux下,預設情況下,系統時間和硬體時間並不會自動同步。在Linux執行過程中,系統時間和硬體時間以非同步的方式執行,互不干擾。硬體時間的執行,是靠BIOS電池來維持,而系統時間,是用CPU Tick來維持的。在系統開機的時候,會自動從BIOS中取得硬體時間,設定為系統時間。
一、檢視系統時間,可以用date命令:
1 //檢視時間
2 [[email protected] ~]# date
3 Tue Feb 25 20:15:18 CST 2020
4 //修改時間
5 [[email protected] ~]# date -s "20200225 20:16:00" #yyyymmdd hh:mm:ss
6 Tue Feb 25 20:16:00 CST 2020
7 //date 有多種時間格式可接受,檢視date --help
二、檢視硬體時間,可以用hwclock或者clock命令:
兩者基本相同,只用一個就行,只不過clock命令除了支援x86硬體體系外,還支援Alpha硬體體系
1 //檢視硬體時間可以是用hwclock ,hwclock --show 或者 hwclock -r
2 [[email protected] ~]# hwclock --show
3 Tue 25 Feb 2020 08:21:14 PM CST -0.327068 seconds
4 //設定硬體時間
5 [ [email protected] ~]# hwclock --set --date "20200225 20:23:00"
6 [[email protected] ~]# hwclock
7 Tue 25 Feb 2020 08:23:04 PM CST -0.750440 seconds
三、系統時間和硬體時間的同步
1 //以系統時間為基準,修改硬體時間
2 [[email protected] ~]# hwclock --systohc <== sys(系統時間)to(寫到)hc(Hard Clock)
3 //或者
4 [[email protected] ~]# hwclock -w
5 //以硬體時間為基準,修改系統時間
6 [ [email protected] ~]# hwclock --hctosys
7 //或者
8 [[email protected] ~]# hwclock -s
四、不同機器之間的時間同步
為了避免主機時間因為長期執行下所導致的時間偏差,進行時間同步(synchronize)的工作是非常必要的。Linux系統下,一般使用ntp伺服器來同步不同機器的時間。一臺機器,可以同時是ntp服務端和ntp客戶端。在生產系統中,推薦使用像DNS伺服器一樣分層的時間伺服器來同步時間。
不同機器間同步時間,可以使用ntpdate命令,也可以使用ntpd服務。
1、使用ntpdate命令
1 [[email protected] ~]# ntpdate [NTP IP/hostname]
2 [[email protected] ~]# ntpdate 192.168.0.1
3 [[email protected] ~]# ntpdate time.ntp.org
這樣的同步,只是強制性的將系統時間設定為ntp伺服器時間。如果CPU Tick有問題,只是治標不治本。所以,一般配合cron命令,來進行定期同步設定。比如,在crontab中新增
0 12 * * * /usr/sbin/ntpdate 192.168.0.1
這樣,會在每天的12點整,同步一次時間。ntp伺服器為192.168.0.1。
2、或者將下列指令碼新增到/etc/cron.hourly/,這樣就每小時會執行一次同步:
#!/bin/bash
#
# $Id: sync-clock,v 1.6 2009/12/23 15:41:29 jmates Exp $
#
# Use ntpdate to get rough clock sync with department of Genome Sciences
# time server.
NTPDATE=/usr/sbin/ntpdate
SERVER="192.168.0.1 "
# if running from cron (no tty available), sleep a bit to space
# out update requests to avoid slamming a server at a particular time
if ! test -t 0; then
MYRAND=$RANDOM
MYRAND=${MYRAND:=$$}
if [ $MYRAND -gt 9 ]; then
sleep `echo $MYRAND | sed 's/.*\(..\)$/\1/' | sed 's/^0//'`
fi
fi
$NTPDATE -su $SERVER
# update hardware clock on Linux (RedHat?) systems
if [ -f /sbin/hwclock ]; then
/sbin/hwclock --systohc
fi
3、ntpd服務
使用ntpd服務,要好於ntpdate加cron的組合。因為,ntpdate同步時間會造成時間的突變和跳躍,對一些依賴時間的程式和服務會造成影響。比如sleep,timer等。而且ntpd服務可以在修正時間的同時,修正CPU Tick。因此理想的做法為,在開機的時候,使用ntpdate強制同步時間,在其他時候使用ntpd服務來同步時間。
要注意的是,ntpd 有一個自我保護的機制:如果本機與上源時間相差太大,ntpd 不會執行時間同步操作,所以新設定的時間伺服器一定要先 ntpdate 從上源取得時間初值, 然後啟動 ntpd服務。ntpd服務執行後,先是每64秒與上源NTP伺服器同步一次,根據每次同步時測得的誤差值經複雜計算逐步調整自己的時間,隨著誤差減小,逐步增加同步的間隔。每次跳動,都會重複這個調整的過程。
(1)ntpd服務的設定
ntpd服務的相關設定檔案如下:
①、/etc/ntp.conf:這個是NTP daemon的主要設檔案,也是 NTP 唯一的設定檔案。
②、/usr /share/zoneinfo/:在這個目錄下的檔案其實是規定了各主要時區的時間設定檔案,例如北京地區的時區設定檔案在 /usr/share/zoneinfo/Asia/Shanghai 就是了。這個目錄裡面的檔案與底下要談的兩個檔案(clock 與localtime)是有關係的。
③、/etc/sysconfig/clock:這個檔案其實也不包含在NTP 的 daemon 當中,因為這個是 Linux 的主要時區設定檔案。每次開機後,Linux 會自動的讀取這個檔案來設定自己系統所預設要顯示的時間。
④、/etc /localtime:這個檔案就是"本地端的時間配置檔案"。剛剛那個clock 檔案裡面規定了使用的時間設定檔案(ZONE) 為 /usr/share/zoneinfo/Asia/Shanghai ,所以說,這就是本地端的時間了,此時, Linux系統就會將Shanghai那個檔案另存為一份 /etc/localtime檔案,所以未來我們的時間顯示就會以Beijing那個時間設定檔案為準。
/etc/ntp.conf檔案的設定
在 NTP Server 的設定上,建議不要對Internet 無限制的開放,儘量僅提供區域網內部的 Client 端聯機進行網路校時。此外,NTP Server 總也是需要網路上面較為準確的主機來自行更新自己的時間啊,所以在我們的 NTP Server 上面也要找一部最靠近自己的 Time Server 來進行自我校正。事實上, NTP 這個服務也是 Server/Client 的一種模式。
[[email protected] ~]# vi /etc/ntp.conf
# 1. 關於許可權設定部分
# 許可權的設定主要以 restrict 這個引數來設定,主要的語法為:
# restrict IP mask netmask_IP parameter
# 其中 IP 可以是軟體地址,也可以是 default ,default 就類似 0.0.0.0
# 至於 paramter 則有:
# ignore :關閉所有的 NTP 聯機服務
# nomodify:表示 Client 端不能更改 Server 端的時間引數,不過Client 端仍然可以透過 Server 端來進行網路校時。
# notrust :該 Client 除非通過認證,否則該 Client 來源將被視為不信任網域
# noquery :不提供 Client 端的時間查詢
# notrap :不提供trap這個遠端事件登入
# 如果 paramter 完全沒有設定,那就表示該 IP (或網域)"沒有任何限制"
restrict default nomodify notrap noquery # 關閉所有的 NTP 要求封包
restrict 127.0.0.1 #這是允許本機查詢
restrict 192.168.0.1 mask 255.255.255.0 nomodify
#在192.168.0.1/24網段內的伺服器就可以通過這臺NTP Server進行時間同步了
# 2. 上層主機的設定
# 要設定上層主機主要以 server 這個引數來設定,語法為:
# server [IP|HOST Name] [prefer]
# Server 後面接的就是上層 Time Server,而如果 Server 引數
# 後面加上 perfer 的話,那表示我們的 NTP 主機主要以該部主機來
# 作為時間校正的對應。另外,為了解決更新時間封包的傳送延遲動作,
# 所以可以使用 driftfile 來規定我們的主機
# 在與 Time Server 溝通時所花費的時間,可以記錄在 driftfile
# 後面接的檔案內,例如下面的範例中,我們的 NTP server 與
# cn.pool.ntp.org聯機時所花費的時間會記錄在 /etc/ntp/drift檔案內
server 0.pool.ntp.org
server 1.pool.ntp.org
server 2.pool.ntp.org
server cn.pool.ntp.org prefer
#其他設定值,以系統預設值即可
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
driftfile /var/lib/ntp/drift
broadcastdelay 0.008
keys /etc/ntp/keys
(2)、ntpd服務的啟動與查詢
在啟動NTP服務前,先對提供服務的這臺主機手動的校正一次時間(因為啟動伺服器,埠會被服務端佔用,就不能手動同步時間了)。
[[email protected] ~]# ntpdate cn.pool.ntp.org
25 Feb 21:10:52 ntpdate[9549]: adjust time server 202.112.31.197 offset 0.000101 sec
然後,啟動ntpd服務:
[[email protected] ~]# /etc/init.d/ntpd start
Starting ntpd: [ OK ]
[[email protected] ~]# date
Tue Feb 25 21:11:07 CST 2020
檢視埠(ntpd服務使用UDP的123埠):
[[email protected] ~]# netstat -ln |grep :123
udp 0 0 12.12.12.100:123 0.0.0.0:*
udp 0 0 192.168.0.100:123 0.0.0.0:*
udp 0 0 172.18.226.174:123 0.0.0.0:*
udp 0 0 10.10.10.100:123 0.0.0.0:*
udp 0 0 127.0.0.1:123 0.0.0.0:*
udp 0 0 0.0.0.0:123 0.0.0.0:*
udp 0 0 fe80::225:90ff:fe98:61ff:123 :::*
udp 0 0 fe80::225:90ff:fe98:61fe:123 :::*
udp 0 0 fe80::202:c903:1b:afa1:123 :::*
udp 0 0 ::1:123 :::*
udp 0 0 :::123 :::*
如何確認我們的NTP伺服器已經更新了自己的時間呢?
[[email protected] ~]# ntpstat
synchronised to NTP server (202.120.2.101) at stratum 4
time correct to within 557 ms
polling server every 64 s
# 該指令可列出NTP伺服器是否與上層聯機。由上述輸出結果可知,時間校正約為557*10(-6)秒,且每隔64秒會主動更新時間。
常見的錯誤:
unsynchronized time server re-starting polling server every 64 s
// 或者
25 Apr 15:30:17 ntpdate[11520]: no server suitable for synchronization found
這不是一個錯誤。而是由於每次重啟NTP伺服器之後大約要3-5分鐘客戶端才能與server建立正常的通訊連線。當此時用客戶端連線服務端就會報這樣的資訊。一般等待幾分鐘就可以了。
[[email protected] ~] # ntptrace –n
127.0.0.1:stratum 11, offset 0.000000,synch distance 0.950951
222.73.214.125:stratum 2,offset –0.000787,synch distance 0.108575
209.81.9.7:stratum 1,offset 0.000028,synch distance 0.00436,refid 'GPS'
# 這個指令可以列出目前NTP伺服器(第一層)與上層NTP伺服器(第二層)彼此之間的關係,注意:該命令需要安裝ntp-perl包
ntpq命令:
[[email protected] ~]# ntpq -p
指令"ntpq -p"可以列出目前我們的NTP與相關的上層NTP的狀態,以上的幾個欄位的意義如下:
remote:即NTP主機的IP或主機名稱。注意最左邊的符號,如果由"+"則代表目前正在作用鐘的上層NTP,如果是"*"則表示也有連上線,不過是作為次要聯機的NTP主機。
refid:參考的上一層NTP主機的地址
st:即stratum階層
when:幾秒前曾做過時間同步更新的操作
poll:下次更新在幾秒之後
reach:已經向上層NTP伺服器要求更新的次數
delay:網路傳輸過程鍾延遲的時間
offset:時間補償的結果
jitter:Linux系統時間與BIOS硬體時間的差異時間
最後提及一點,ntp服務預設只會同步系統時間。如果想要讓ntp同時同步硬體時間,可以設定/etc/sysconfig/ntpd 檔案。
在/etc/sysconfig/ntpd檔案中,新增 SYNC_HWCLOCK=yes 這樣,就可以讓硬體時間與系統時間一起同步。