centos7下配置ntp客戶端同步時間服務

語言: CN / TW / HK

需求:在CentOS7下配置NTP客戶端同步時間服務
簡介:
NTP服務是為了時鐘同步使用,特別在一些實時性資料庫場景中非常重要。
Centos7下預設使用chronyd服務代替過渡ntpd服務,因此經常遇到大部分人還是記住ntpd服務而不去配置chronyd服務,因此經常在centos7下遇到無法使用ntp服務或ntp服務存在一些問題。以下就centos7下配置和使用ntp服務、ntp驗證、時區等配置進行講解。


本篇所有操作和講解只針對NTP客戶端,不涉及ntp-server操作

CentOS7下安裝和配置NTP(Centos6、redhat系列亦可以參考,不衝突)

    CentOS6和6之前的版本預設使用ndpd服務做客戶端去向ntp-server同步時間。

1、安裝ntp和ntpdate兩個rpm包。
使用yum install ntp、yum install ntpdate命令執行安裝操作(本次省略)
2、配置ntp客戶端檔案【/etc/ntp.conf】中的server項, 只保留server的有效行(預設有3-4行server有效行去向公網同步時間,需註釋掉)。如

server 172.29.12.120  perfer      #提供ntp-server的主機地址
server  172.29.120.12 perfer      #提供ntp-server的主機地址

3、啟動ntpd服務、並新增至開機啟動項。如

systemctl  start  ntpd        #啟動ntpd服務
systemctl  start  ntpdate
systemctl enable  ntpd        #將ntpd新增到開機啟動項
systemctl enable  ntpdate
systemctl is-enabled ntpd        #檢視是否在開機啟動項
systemctl is-enabled ntpdate
systemctl list-unit-files | grep ntp     #檢視是否在開機啟動項
systemctl status ntpd                     #檢視ntpd服務的狀態

4、驗證

 ntpq -p       #檢視該主機使用的ntp-server情況和同步延時等資訊;
 timedatectl      #檢視ntpd服務或chronyd服務是否生效。只有centos7、redhat7、ubuntu14等以上(含)才有該命令;

5、其他配置(或新增時間同步的計劃任務)
使用ntpdate命令也可以執行ntp時間同步,不需要ntp客戶的ntpd服務。如

ntpdate 172.29.120.12     #向172.29.120.12的ntpserver主機同步本地系統時間。
ntpdate -u  172.29.120.12  ##同上,-u引數是可以在客戶端ntpd服務啟動時同時執行的命令。

計劃任務中的時間同步,同樣的效果。也可以和客戶端的ntpd服務同時存在。

crontab -l
0 0 * * 0 /usr/sbin/ntpdate -u 172.29.120.12 || /usr/sbin/ntpdate -u 172.29.12.120

例子:
centos7下配置ntp客戶端同步時間服務

CentOS7下使用NTP遇到的問題

問題1、在CentOS7下使用NTP時,客戶端ntpd服務新增到開機啟動項中了,但主機系統啟動後ntpd服務還是停止狀態(dead),無法正常啟動。

解決以上現象有兩種方法 ,本人常用方法一的操作:
方法一
1.通過命令 systemctl enable ntpd 設定NTP服務開機自啟動。
2.重啟虛擬機器後檢視 服務執行狀態 systemctl status ntpd ,發現服務並沒有成功啟動。
3.檢視chrony是否被設定為開機自啟動。通過指令 systemctl is-enabled chronyd
或systemctl list-unit-files | grep chrony 檢視,發現這個服務已經被設定為開機自啟動所以導致NTP服務的自啟動失敗。

4.所以要把 chrony 的自啟動去掉。執行指令 systemctl disable chronyd 。
5.重啟虛擬機器, 執行 systemctl status ntpd ,問題解決。
systemctl list-unit-files|grep ntpd
systemctl list-unit-files|grep chrony
centos7下配置ntp客戶端同步時間服務
方法二
需要開機自啟動某服務,第一個想到的當然是開機啟動自定義指令碼
在Centos之前版本只要在 /etc/rc.d/rc.local 檔案中加入 啟動服務的命令,當虛擬機器重啟時就會執行該檔案中的命令,服務也就啟動了。但是但Centos7版本,這個檔案的許可權被降低了,所以當你開啟這個檔案時,註釋中很友好的提示讓你給這個檔案賦權,以確保它有可執行許可權。chmod +x /etc/rc.d/rc.local 。
所以只要把指令寫到這個檔案中,就可以在開機時啟動服務或者讓虛擬機器做其它事情。
chmod +x /etc/rc.d/rc.local
echo "systemctl start ntpd" >> !$
centos7下配置ntp客戶端同步時間服務















問題2、ntpdate命令執行報錯,提示ntpd服務已經存在(ntpdate:the NTP socket is in use, exiting)

報錯的原因是因為客戶端有ntpd服務在執行。因此需要繼續執行,必須加-u引數,如
update -u 172.29.120.12
centos7下配置ntp客戶端同步時間服務

問題3、啟動了ntpd服務,卻未執行過同步時間操作。

需要檢查ntpd服務是否生效、並應用是否也生效了。如
centos7下配置ntp客戶端同步時間服務
centos7下配置ntp客戶端同步時間服務

附錄

1、npq -p 執行結果的引數解釋

centos7下配置ntp客戶端同步時間服務
ntpq -p命令列出了所有作為時鐘源校正過本地NTP伺服器時鐘上層NTP伺服器的列表,每一列的含義分別如下:
remote:響應請求的NTP伺服器的名稱(IP地址或域名),帶“”的表示本地NTP伺服器與該伺服器同步
refid:遠端NTP伺服器使用的上一級ntp伺服器的IP地址
st:遠端NTP伺服器的級別,由於NTP是層級結構,有頂端的伺服器,多層的Relay Server再到客戶端。所以伺服器從高到低,級別可以設定為1~16級。為了減緩負荷和網路堵塞,原則上應該避免直接連線到級別為1的伺服器。
t:本地NTP伺服器與遠端NTP伺服器的通訊方式。u:單播;b:廣播;I:本地
when:上次成功請求後到現在的秒數
poll:本地NTP伺服器與遠端NTP伺服器同步的時間間隔。
reach:這是一個八進位制的值,用來測試衡量前八次查詢是否成功和伺服器連線。377表示都成功,0表示不成功
delay:網路延時,單位為微秒(μs)
offset:本地NTP伺服器與遠端NTP伺服器的時間偏移,單位為毫秒(ms)。offset越接近於0,主機與NTP伺服器的時間越接近
jitter:查詢偏差的分佈值,用於表示遠端NTP的網路延時是否穩定,單位為微秒(μs)*










2、timedatectl 命令的講解

timedatectl輸出解析
centos7下配置ntp客戶端同步時間服務
1.1.Local time
本地時間,初始值來自於RTC,由核心維護,系統啟動之後和RTC就沒有關係,通常等於RTC+時區值(如上圖的本地時間=RTC+8)


1.2.Universal time
系統時間永遠是UTC,在應用程式使用的時候轉換為本地時間

1.3.RTC(real-time clock)time
指硬體時間,一般是主機板上的特殊電路,專用用於記錄時間,有電池供電,不受伺服器和作業系統的開啟關閉影響。也稱作BIOS時間。
需要注意的是:當/etc/sysconfig/clock 檔案中 UTC=true時, BIOS 使用UTC時間; UTC=false時, BIOS 使用本地時間。
hwclock --localtime #顯示 BIOS 中實際的時間
hwclock --systohc #根據系統時間設定硬體時間



1.4.Time zone
本地時區,即伺服器所在的時區,在中國通常使用Asia/Shanghai
timedatectl set-timezone "Asia/Shanghai" #設定時區為上海

1.5.NTP enable
狀態為“yes”,表示開啟NTP同步。
網路時間協議,英文名稱:Network Time Protocol(NTP)是用來使計算機時間同步化的一種協議,它可以使計算機對其伺服器或時鐘源(如石英鐘,GPS等等)做同步化,它可以提供高精準度的時間校正。
timedatectl set-ntp true #開啟ntp同步
timedatectl set-ntp false #禁止ntp同步



1.6.NTP synchronized
為“yes”,表示NTP同步完成。

1.7.RTC in local TZ
設定RTC時間,為"no"表示未設定
timedatectl set-local-rtc 1 #將RTC設定為本地時間
timedatectl set-local-rtc 0 #將RTC設定為UTC


2.2、timedatectl常用命令
timedatectl set-time 15:58:30 #只設置時間
timedatectl set-time 20151120 #只設置日期
timedatectl set-time '16:10:40 2015-11-20' #設定時間和日期


以上是個人經驗總結,望多多指教