ntp_linux

linux 时间同步

  • 在windows中,系统时间设定后,机器关机、重启时系统时间会自动保存在Bios的时钟里面。启动计算机的时候会自动在bios里面读取硬件时间,以保证时间的不间断。
  • 在linux下,默认情况,系统时间和硬件时间不会自动同步。在linux运行过程中,系统时间和硬件时间互不干扰。硬件时间是靠bios电池来维持,系统时间是靠cpu tick来维持。

linux时间与时区

  • 概念:

    • 系统时间 system time

      • linux操作系统运行时的时间,存储在内存中,内核会持续更新这个时间。在系统重启后,系统时间从硬件时钟中读取并加载到内存中,操作系统使用系统时间作为主要的时间源。
    • 硬件时间hardware time, RTC(Real-Time Clock)

      • 硬件时间是主板上的实时时钟RTC提供的时间信息,它在系统关闭时仍然保持运行,确保时间不会丢失。硬件时钟是杜立德,不以来操作系统的运行,系统关机后依然记录时间。
      • 系统启动时,内核会读取硬件时间,并设置系统时间。
      • 系统关机或重启时,通常会将系统时间写回到硬件时间,以确保下一次启动时硬件时间是最新的。
      • 系统运行期间,系统时间会定期同步或手动同步,不会直接影响硬件时间。
    • 时区 Timezone

      • 时区是定义时间相对于标准时间UTC的偏移量。时区定义了一个地理区域的标准时间,linux系统允许用户设置本地失去,以便显示本地时间。

      • UTC vs 本地时间

        • 在linux系统中默认使用UTC(universal Time Coordinated),来存储和计算时间。如果设置了本地时区,系统会在显示时将UTC时间转换为指定时区的本地时间。

        • 时区文件: 时区信息保存在 /etc/localtime文件中, 这个文件是一个指向具体时区信息的符号链接,时区数据存储在 /usr/share/zoneinfo/目录中。可以通过链接到指定区域的时区文件来临更改系统的时区。

          1
          sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
        • timedatectl命令

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          ## 查看当前时区
          timedatectl
          # Local time: Mon 2024-10-18 12:34:56 CST
          # Universal time: Mon 2024-10-18 04:34:56 UTC
          # RIC time: Mon 2024-10-18 04:34:56
          # Time zone: Asia/Shanghai (CST, +0800)
          #System clock synchronized: yes
          # NTP serveice: active
          # TRC in local TZ: no ## RTC是否以本地时区存储

          ## 设置时区
          sudo timedatectl set-timezone Asia/Shanghai

          ## 将硬件硬件时钟设置为UTC:
          sudo timedatectl set-local-rtc 0

          ## 将硬件时钟设置为本地时区:
          sudo timedatectl set-local-rtc 1
          # windows的做法,如果同一台机器装了linux和windows需要这样做

linux 系统时间的设定

  • date命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ## 查看命令
    date
    #2024年10月19日星期五 18:00:32 CST

    ## 设置命令
    date -set="2024-10-19 00:01"
    #2024年10月19日星期五00:00:01 CST

    ## 设置命令
    date 101900012004.35
    #2004年10月19日00:01:35 CST

linux 硬件时间的设定

  • hwclock命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ## 查看命令
    hwclock --show
    #2024-10-18 18:11:13.147770+08:0

    ## 查看命令
    hwclock
    #2024-10-18 18:11:13.147770+08:0

    ## 设置命令
    hwclock --set --date="10/19/23 00:00:01"
    #2023年10月19日 00:00:01 cst

    ## 根据系统时间设置硬件时间
    hwclock -w

linux系统时间和硬件时间的同步

  • hwclock命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ## 根据系统时间设置硬件时间 
    hwclock --systohc # sys time to hadr clock

    ## 根据系统时间设置硬件时间
    hwclock -w

    ## 根据硬件时间设置系统时间
    hwclock -hctosys # hadr clock to sys time

    ## 根据硬件时间设置系统时间
    hwclcok -s

linux 不同机器间的时间同步

  • 为了避免主机因长时间运转下所导致的时间偏差,进行时间同步synchronize的工作是非常必要的。linux系统下,一般使用ntp服务器来同步不同机器的时间,一台机器可以同时是ntp客户端和ntp服务器。

  • ntpdate命令 强制将系统时间设置为ntp服务器时间

    1
    2
    3
    ntpdate [-nv] [NTP IP/hostname]
    ntpdate time.ntp.org
    ntpdate 192.168.0.2

    这样的同步只是强制性的将系统时间设置为ntp服务器时间,如果cpu tick有问题,只是指标不治本。所以一般配合cron命令,来进行定期同步设置。在crontab中添加0 12 * * * * /usr/sbin/ntpdate 192.168.0.1,这样会在每天12点同步一次时间。 ntp服务器ip为192.168.0.1

  • ntpd有一个自我保护设置:如果本机与ntp服务器时间差距太大,ntpd将不会运行。新设置的时间服务器一定要先ntpdate从上源取得时间初值。然后启动ntpd服务。ntpd服务先是每64秒与ntp服务器同步一次,根据每次同步时测得的时间差值经复杂计算逐步调整自己的时间,随着误差减小,逐步增加同步的间隔,每次跳动都会重复这个过程。

  • ntpd服务

    • ntp安装
    1
    sudo pacman -S ntp # archlinux
    • 配置文件/etc/ntp.conf

      1
      2
      3
      4
      server 0.pool.ntp.org iburst # iburst客户端无法立即连接到服务器时,允许快速发送几个同步请求 
      server 1.pool.ntp.org iburst #pool.ntp.org通用的ntp服务器
      server 2.pool.ntp.org iburst
      server 3.pool.ntp.org iburst
    • 启动ntpd

      1
      2
      3
      sudo systemctl start ntpd
      sudo systemctl status ntpd
      sudo systemctl enable ntpd
    • 手动同步时间

      1
      2
      sudo ntpd -gq 
      ## -g 允许时间进行大幅度调整,-q ntpd调整完后立即退出而不作为守护进程
    • 查看ntp同步状态

      1
      2
      3
      4
      5
      ntpq -p 
      # remote refid st t when poll reach delay offset jitter
      # =======================================================================
      # time.cloudflare .CFCD. 3 u 60 64 1 50.236 -12.345 5.678
      # ntp1.ntp.org .GPS. 1 u 30 64 1 32.586 0.234 1.234

      第一个当前使用的服务器 time.cloudflare

      第二个备选服务器ntp1.ntp.org

      st 层级 stratum

      delay 客户端和服务器之间的延迟

      offset 本地时钟和远程时钟之间的时间差

      jitter 时间抖动(时间的波动)