Linux時間同步,ntpdate命令、ntpd服務詳解


聲明:以下內容來自網友整理(http://blog.sina.com.cn/s/blog_636a55070101u1mg.html),為便於以后學習暫時收錄,請不要隨意轉載

Linux默認情況下,系統時間和硬件時間,並不會自動同步。在Linux運行過程中,系統時間和硬件時間以異步的方式運行,互不干擾。硬件時間的運行,是靠Bios電池來維持,而系統時間,是用CPU tick來維持的。在系統開機的時候,會自動從Bios中取得硬件時間,設置為系統時間。

  1. linux系統時間設置,在Linux中設置系統時間,可以用date命令,修改時間可以使用date -s "2016-12-16-8:30:00"
  2. Linux硬件時間設置,硬件時間的設置,可以用hwclock或者clock命令。其中,clock和hwclock用法相近,只用一個就行,只不過clock命令除了支持x86硬件體系外,還支持Alpha硬件體系;查看硬件時間可以使用hwclock --show或hwclock -r命令,修改
    硬件時間hwclock --set --date="1/25/09 00:00" ,hwclock  -w  是根據系統時間設置硬件時間。
  3. 系統時間和硬件時間同步,以系統時間為基礎修改硬件時間:hwclock --systohc,hwclock -w;以硬件時間為基礎修改系統時間:hwclock --hctosys、hwclock -s;
  4. 不同服務器之間的時間同步,為了避免主機時間因為長期運作下所導致的時間偏差,進行時間同步(synchronize)的工作是非常必要的。Linux系統下,一般使用ntp服務器來同步不同機器的時間。一台機器,可以同時是ntp服務器和ntp客戶機。在網絡中,推薦使用像DNS服務器一樣分層的時間服務器來同步時間。 同步時間,可以使用ntpdate命令,也可以使用ntpd服務,使用ntpdate命令同步時間比較簡單,ntpdate ip、ntpdate server,但這樣的同步,只是強制性的將系統時間設置為ntp服務器時間,如果cpu tick有問題,只是治標不治本。所以,一般配合cron命令,來進行定期同步設置。比如,在crontab中添加:0 12 * * * * /usr/sbin/ntpdate 192.168.0.1 這樣,會在每天的12點整,同步一次時間,ntp服務器為192.168.0.1;使用ntpd服務,要好於ntpdate加cron的組合。因為,ntpdate同步時間,會造成時間的跳躍,對一些依賴時間的程序和服務會造成影響。比如sleep,timer等。而且,ntpd服務可以在修正時間的同時,修正cpu tick。理想的做法為,在開機的時候,使用ntpdate強制同步時間,在其他時候使用ntpd服務來同步時間。要注意的是,ntpd有一個自我保護設置: 如果本機與上源時間相差太大, ntpd不運行. 所以新設置的時間服務器一定要先ntpdate從上源取得時間初值, 然后啟動ntpd服務。ntpd服務運行后, 先是每64秒與上源服務器同步一次, 根據每次同步時測得的誤差值經復雜計算逐步調整自己的時間, 隨着誤差減小, 逐步增加同步的間隔. 每次跳動, 都會重復這個調整的過程.
  5. ntpd服務設置,ntpd服務的相關設置文件如下:
    /etc/ntp.conf:這個是NTP daemon的主要設文件,也是 NTP 唯一的設定文件。
    /usr /share/zoneinfo/:在這個目錄下的文件其實是規定了各主要時區的時間設定文件,例如北京地區的時區設定文件在/usr/share/zoneinfo/Asia/Beijing 就是了。這個目錄里面的文件與底下要談的兩個文件(clock 與localtime)是有關系的;
    /etc/sysconfig/clock:這個文件其實也不包含在NTP 的 daemon 當中,因為這個是linux的主要時區設定文件。每次開機后,Linux 會自動的讀取這個文件來設定自己系統所默認要顯示的時間; 
    /etc /localtime:這個文件就是“本地端的時間配置文件”。剛剛那個clock 文件里面規定了使用的時間設置文件(ZONE) 為/usr/share/zoneinfo/Asia/Beijing ,所以說,這就是本地端的時間了,此時, Linux系統就會將Beijing那個文件另存為一份/etc/localtime文件,所以未來我們的時間顯示就會以Beijing那個時間設定文件為准。
    /etc/timezone:系統時區文件
    以下是重點:
    下面重點說說 /etc/ntp.conf文件的設置。在 NTP Server 的設定上面,其實最好不要對 Internet 無限制的開放,盡量僅提供您自己內部的 Client 端聯機進行網絡校時就好。此外, NTP Server 總也是需要網絡上面較為准確的主機來自行更新自己的時間啊,所以在我們的 NTP Server 上面也要找一部最靠近自己的 Time Server 來進行自我校正。事實上, NTP 這個服務也是Server/Client 的一種模式。

    [root@linux ~]# 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 nomodifynotrapnoquery # 關閉所有的 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

    總結一下,restrict用來設置訪問權限,server用來設置上層時間服務器,driftfile用來設置保存漂移時間的文件。

  6. ntp服務的啟動與觀察
    在啟動NTP服務前,先對提供服務的這台主機手動的校正一次時間咯。(因為啟動服務器,端口會被服務端占用,就不能手動同步時間了)
     ntpdate cn.pool.ntp.org
    然后再啟動服務,service ntpd start或/etc/init.d/ntpd start
    查看端口:
    netstat -ln|grep 123
    如何確認我們的NTP服務器已經更新了自己的時間呢?

    [root@linux ~] # ntpstat

    synchronized to NTP server(127.127.1.0) at stratum 11

    time correct to within 950ms

    polling server every 64 s

    #該指令可列出NTP服務器是否與上層聯機。由上述輸出結果可知,時間校正約

    #為950*10(-6)秒。且每隔64秒會主動更新時間。

    常見的錯誤:

    25 Apr 15:30:17 ntpdate[11520]: no server suitable for synchronization found

    其實,這不是一個錯誤。而是由於每次重啟NTP服務器之后大約要3-5分鍾客戶端才能與server建立正常的通訊連接。當此時用客戶端連接服務端就會報這樣的信息。一般等待幾分鍾就可以了。

    [root@linux ~] # ntptrace –n 127.0.0.1

    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服務器(第二層)彼此之間的

    #關系

    [root@linux ~] # 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 這樣,就可以讓硬件時間與系統時間一起同步。

    配制時間服務器
    在linux下,我們可以通過自帶的NTP(Network Time Protocol)協議通過網絡使自己的系統保持精確的時間。可用的公共時間服務器列表可以從下面的地址獲取:http://ntp.isc.org/bin/view/Servers/NTPPoolServers
    NTP是用來使系統和一個精確的時間源保持時間同步的協議。建議大家在自己管理的網絡中建立至少一台時間服務器來同步本地時間,這樣可以使得在不同的系統上處理和收集日志和管理更加容易。
    介紹一下環境:179為本地時間服務器,其他服務器和179同步。179和網上時間服務器同步。
    1、首先查詢NTP軟件版本
      rpm -qa|grepntp
      ntp-4.1.2-4.EL3.1
      如果沒有可以從linux安裝盤上查找,安裝此ntp包
    2、編輯配置文件
         vi /etc/ntp.conf
      首先定義服務器
      server pool.ntp.org
      restrict default nomodifynotrapnoquery
      restrict 192.168.0.0 mask 255.255.255.0 notrustnomodifynotrap #從192.168.0.1-192.168.0.254的服務器都可以使用我們的NTP服務器來同步時間。
      注釋掉以下一行
      #restrict default ignore
    3、啟動NTP服務器
      #chkconfigntpd on
      #/etc/init.d/ntpd start
      #/etc/init.d/ntpd stop
      #/etc/init.d/ntpd restart
      默認情況下,我們配置的NTP服務器不會去時間源那里同步時間,所以必須修改/etc/ntp/step-tickers文件,加入我們的時間源,這樣每次通過/etc/init.d/ntpd來啟動服務的時候就會自動更新時間
        檢查服務器同步狀態:
      ntpq -p
      ntptrace 192.168.0.179
      如果輸出正確,則說明時間服務器成功。每次啟動服務器,會自動同步時間。
      配置LINUX客戶端
      在linux客戶端上執行ntpdatentp_server_ip就可以根據時間服務器統一局域網的時間了,將上面的命令放到cron里每天早上3點定期執行,crontab –e 然后輸入
      0 3 * * * /usr/sbin/ntpdate 192.168.0.17

      為什么電腦要對時?因為電腦自己的鍾不准。破電腦一天慢五分鍾也不奇怪。對時需要對到什么精度?一般家用的電腦時鍾誤差一分鍾完全可以接受。集群服務器配合工作一般需要所有的時鍾同步在一秒之內。
          和誰同步?一般是和世界各地的 NTP (Network Time Protocol)服務器同步的。米國標准時間由 NIST 發布,NIST 提供了一些服務器。現代 Windows 操作系統自動和 time.windows.com 對時。Linux 下面一般用NTPPool來自動選擇服務器。       中國國家授時中心 NTP 210.72.145.44 是中國權威時間。中國教育網有自己的NTP 服務器網。如果是集群服務器,一般會在內網配置幾個本地 NTP 服務器

         上面這么多 NTP 服務器有沒有優劣呢?有的,但是對於一般的應用來說,看不出什么區別。理論上說,NTP 服務器是分等級(Stratum)的,Stratum = 1 的 NTP 服務器是直接和世界標准時鍾同步的,包括 GPS 時間、銫原子鍾、某些手機網絡          等。NIST、中國國家授時中心和中國教育網的第一級時間服務器都是這個級別的。Stratum = 2 的 NTP 服務器是和 Stratum = 1的服務器同步的,性能稍差,但精確度也在毫秒的量級,所以用起來沒什么區別。再往下每同步一級,Stratum 就加         一。Windows 2000 開始包含了自動時間同步的服務。Windows XP 上,打開時間設置就有網絡對時的設置。默認是每星期和time.windows.com 對時一次。這個一星期同步一次太長了,可以通過注冊表調整,或者用Wits修改。

    Linux 下面的ntpd就要靈活多啦。默認配置一般足夠好用。下面在 Fedora 下舉個例子。配置:

    # grep "^server" /etc/ntp.conf
    server 0.pool.ntp.org
    server 1.pool.ntp.org
    server 2.pool.ntp.org
    server pool.ntp.org
    server   127.127.1.0 # local clock

    啟動ntpd之后查看狀態

    # ntpq -pn
          remote            refid       st t when poll reach    delay    offset   jitter
    ==============================================================================
     64.25.87.54      128.118.25.5      2 u    10    64    17    79.194   -542.89    1.942
     64.72.116.51     129.7.1.66        2 u     9    64    17    51.569   -532.23    1.803
     64.72.116.50     129.7.1.66        2 u    11    64    17    51.417   -516.70    1.417
     64.72.116.45     129.7.1.66        2 u     7    64    17    51.586   -532.36    1.135
    *127.127.1.0      LOCAL(0)         10 l     3    64    17     0.000     0.000    0.001

    st這列顯示自動選的四個 NTP 服務器都是 Stratum = 2。最后一個是本地時鍾。前四行的 offset 顯示本地時鍾和四個 NTP 服務器都有大概 500 毫秒的差距。ntpstat顯示目前只和本地時鍾同步:

    # ntpstat
    synchronised to local net at stratum 11
        time correct to within 949 ms
        polling server every 64 s

    過一會再看:

    # ntpq -pn
          remote            refid       st t when poll reach    delay    offset   jitter
    ==============================================================================
    +64.25.87.54      128.118.25.5      2 u    56    64   377    78.548   250.871   37.180
    +64.72.116.51     129.7.1.66        2 u    58    64   377    51.551   268.538   36.817
    *64.72.116.50     129.7.1.66        2 u    58    64   377    51.539   274.497   36.629
    +64.72.116.45     129.7.1.66        2 u    49    64   377    51.485   271.750   37.841
     127.127.1.0      LOCAL(0)         10 l    44    64   377     0.000     0.000    0.001
    # ntpstat
    synchronised to NTP server (64.72.116.50) at stratum 3
        time correct to within 263 ms
        polling server every 64 s

    本地時鍾已經成功和外面的 NTP 服務器同步。ntpq報告中第一列 * 表示目前選擇的主同步服務器,標 + 的表示有可能被用來進一步提高同步精度的次要服務器。因為是和 Stratum = 2 的服務器同步,所以本地的ntpd Stratum 就是 3 了。一個細節是ntpq對時鍾是慢慢調整的,而不是直接跳好多秒,這樣平滑的調整時間可以保證很多程序的流程平穩。不過,如果時鍾誤差過大,ntpd可能會拒絕調整時間;或者有人也可能希望立刻調正時間,這樣的話可以直接執行命令:ntpdate -b pool.ntp.org(需要停掉ntpd服務執行)。

    在我另一個服務器上,配置了好多 NTP 服務器:

    # grep "^server" /etc/ntp.conf
    server time-a.nist.gov
    server time-b.nist.gov
    server time.nist.gov
    server time.windows.com
    server 0.pool.ntp.org
    server 1.pool.ntp.org
    server 2.pool.ntp.org
    server pool.ntp.org
    server   127.127.1.0 # local clock
    # ntpq -p
          remote            refid       st t when poll reach    delay    offset   jitter
    ==============================================================================
    +time-a.nist.gov .ACTS.            1 u    61   128   377    76.113    -1.046    3.424
    *time-b.nist.gov .ACTS.            1 u    65   128   377    81.063     0.398    1.892
    -time.nist.gov    .ACTS.            1 u   251   128   356    38.911     1.353   30.226
    -time.windows.co 18.26.4.105       2 u    45   128   267    31.218    13.180    6.039
    -194.109.64.200   192.87.106.2      2 u   122   128   377   155.132     0.596   38.674
    -a.mirror.fizzel 43.75.42.44       3 u    56   128   377   163.391   -11.756   13.006
    -enfield.ikk.szt 195.111.99.186    2 u   118   128   377   188.326    -2.520   32.359
    +ntp1.esat.net    .GPS.             1 u    59   128   377   161.103    -1.321    0.460
    LOCAL(0)         .LOCL.           10 l    48    64   377     0.000     0.000    0.001

    標注 - 的是那些相對來說不太准的鍾(offset 或 jitter 偏大),自動被剔除了。從 delay 這里可以看到,我這里和 NIST 幾個鍾網絡延遲比較小(100 毫秒之內),一般這樣的鍾誤差小一些。倒數第二個 pool.ntp.org 選擇的是一個和 GPS 同步的鍾,Stratum = 1,是一個比較准的鍾了,只是網絡延遲稍大。同時可以看到 time.windows.com 的 Stratum = 2,在一年以前,它曾經是 6。堂堂國際大公司微軟也不花幾百塊錢買個 GPS 接收器建一個Stratrum = 1 的時鍾服務器造福千千萬萬的 windows用戶,真是不可理解。

    最后,linux下防火牆規則如果極嚴格的話可能會影響ntpd對時,打開 sport 123 即可(假設 OUTPUT 鏈全 ACCEPT):

    iptables -I INPUT -p udp -m udp --sport 123 -j ACCEPT


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM