系统时间管理介绍:基于灵眸科技EASY-EAl-Monster

系统时间管理介绍:基于灵眸科技EASY-EAl-Monster 1.网络校时服务介绍通常的Linux系统都有网络校时服务它的作用在于协调网络时间与RTC芯片时间以达到给系统提供一个“准确时间”的目的。网络时间同步通常采用的是NTP协议。NTP网络时间协议使用 123/udp 端口进行网络时钟同步NTP 是仍在使用中的最古老的网络传输协议之一1985 年前开始。1.1不同系统的校时服务不同的Linux系统使用的校时服务实现也略有差异以下做个简单的汇总介绍。通用Linux系统采用ntpdate或者ntpd这两者为互斥关系不能同时使用。它们的区别在于ntpd是步进式平滑的逐渐调整时间而ntpdate是断点式(一旦发现时间不同步就立即无脑更新成远端时间服务器时间)调整时间。RHEL/CentOS 7.x 采用chrony作为默认的时间同步工具。debian/ubuntu/openSUSE通常采用systemd-ntpd或者systemd-timesyncd作为时间同步工具。但systemd-timesyncd只能作为客户端不能作为NTP服务器。要想设备成为NTP服务器可以采用systemd-ntpd又或者额外安装和配置chrony。由于ntpd的功能相对较为丰富而且使用的是debain系统可以采用systemd-ntpd对ntpd进行简化管理所以采用了ntpd作为校时服务。因此本文仅讨论ntpd的用法其它的校时服务不在本文的说明范围内若用户对其感兴趣可自行查阅相关资料了解。1.2ntpd服务的查看ntpd服务是否已启动有两种方式查看。方式一通过查看ntpd服务进程是否运行。ps -ef | grep ntpd方式二看NTP的默认端口是否被占用。netstat -tlun | grep 1231.3ntpd服务的配置文件ntpd配置文件位于/etc/ntp.conf。通常不用关心这个配置文件。1.4ntpd服务的启停用户可通过以下命令对校时服务进行停止或启动sudo systemctl stop ntp.service sudo systemctl start ntp.service也可以通过以下命令重启校时服务sudo systemctl restart ntp.service永久性禁用(每次重启设备都不会启动)校时服务。先停止服务再禁用服务sudo systemctl stop ntp.service sudo systemctl disable ntp.service使能(每次重启设备后会自动启动)校时服务。先使能服务再启动服务sudo systemctl enable ntp.service sudo systemctl start ntp.service1.5ntpd服务的特性容忍误差范围ntpd 服务并不是在任何情况下都会进行同步的。当时钟服务器时间和本地时间相差大于1000s 时ntp 服务就会认为是人为调整了时钟或出现了硬件故障。例如 RTC供电电池损坏等。步进式校时策略ntpd 自己会思考。它相信本地时间可能不对但是不会忽快忽慢甚至停滞。ntpd 通过多次收发包选择权威稳定的时间源算出双方间的网络延迟然后才会采信新的远端时钟进行时间同步。RTC偏差校正ntpd在和时间服务器的同步过程中会把RTC芯片的振荡频率偏差【或者说 Local Clock 的自然漂移(drift)】记录下来。这样即使网络有问题ntpd本机仍然能通过RTC配合drift算出一个相当精确的走时。ntpd与ntpdate的对比ntpdate是一个命令而 ntpd 则是一个体系。http://ntp.org在2012年时开始表示将让ntpd来取代ntpdate主要原因如下一、ntpd已经包含了ntpdate的功能。二、ntpd和ntpdate原本共用相同的程式码后来ntpd优化了裡面的演算法但ntpdate并没有更新。三、在生产环境中慎用ntpdate。时钟的跃变比如出现两个完全相同的时间戳或者时间戳倒流对于某些依赖时间戳的程序会导致很严重的问题。2.时间管理机制校时机制通常有两种网络校时、手动校时。2.1时区时区为了照顾到各地区的使用方便又使其他地方的人容易将本地的时间换算到别的地方时间上去。有关国际会议决定将地球表面按经线从东到西划成一个个区域并且规定相邻区域的时间相差1小时。在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。当人们跨过一个区域就将自己的时钟校正1小时向西减1小时向东加1小时跨过几个区域就加或减几小时。这样使用起来就很方便。Universal Time Coordinated协调世界时又称世界统一时间世界标准时间国际协调时间。它是一个与时区相关的时间目前将世界时区分为24个。UTC跟GMTGreenwich Mean Time格林威治时间一致因为格林威治位于0时区UTC时间即是0时区的时间。中国位于东八区所以对应的时间是UTC时间加8小时即UTC8也称为CSTChina Standard Time因此时区信息为Asia/ShanghaiCST, 0800。Linux系统会通过/etc/timezone得知目前被设置成哪一个时区。再通过读取并解析/etc/localtime文件获取有关本时区里的所有信息。而所有地区对应的时区信息又存放在/usr/share/zoneinfo/目录中。(注/etc/localtime与/usr/share/zoneinfo存在一定的关联。不同管理软件有不同的关联方式详细说明可阅读后面的章节。)2.2设置时区首先要确认设备具体支持哪些时区可以通过查看/usr/share/zoneinfo目录得知。然后可以采用timedatectl命令来设置时区如下所示sudo timedatectl set-timezone Asia/ShangHai注采用timedatectl修改时区RTC时钟也会立即被同步到系统时钟。2.3网络校时机制网络校时即【校时服务】【时区】。通常来说无论什么样的网络校时服务都不会关心设备处于哪一个时区。它只会每隔一段时间就自动地把UTC时间同步到系统时钟时间戳和RTC时钟。我们可以通过以下不同的命令来查看UTC时间hwclock命令查看RTC时钟sudo hwclock -ldate命令查看系统时钟或者查看时间戳date -u date %s也可以通过以下不同的命令查看加上时区后的时间hwclock命令查看本时区的RTC时间sudo hwclock sudo hwclock -u sudo hwclock -rdate命令查看本时区的系统时间date2.4手动校时机制手动校时即【手动设置】【时区】。如果用户确定要采用手动校时必须先确保所有的网络校时服务都要停掉或者无任何网络。否则系统时钟和RTC时钟会受到网络校时服务的影响而被改写。3.时间管理方法对比在EASY EAI Monster的桌面系统中时间会被显示在右上角的面板上如图所示。另外有两款校时软件可以进行时间管理。分别是xfce桌面系统上的GUI校时软件和timedatectl它们在使用过程中会有些差异将在下方进行说明。3.1GUI校时软件GUI校时软件需要临时获得root权限鼠标左键点击【解锁】然后输入密码123456。此软件修改时区是直接把/usr/share/zoneinfo/下对应的时区文件复制出去拿去覆盖替换掉原来的/etc/localtime。自动校时桌面系统自带的GUI管理软件能够对ntpd服务进行启停控制。特别注意虽然GUI管理软件能够启停ntpd服务但是无法禁用ntpd服务。改成手动校时模式在系统重启以后ntpd服务依然会被启动。并且GUI的状态与ntpd服务的状态是不同步的。如下图所示。手动校时可以通过工具选择【时区】与精确的【日期-时间】但是这里与date命令相似只会修改系统时钟并不会去同步RTC时钟。然后需要用hwclock命令手动同步RTC时钟如下所示。sudo hwclock -w或者sudo hwclock --systohc使用建议若用户把本开发板当作一台个人电脑使用可采取此软件配置成【网络校时】在操作上相对方便。若用户需要手动校时不建议采用此软件。3.2timedatectl与GUI校时软件不同通过timedatectl命令修改时区不会直接拿/usr/share/zoneinfo/下的文件去覆盖/etc/localtime。而是把/etc/localtime创建成一个软链接指向/usr/share/zoneinfo/内对应的时区文件。自动校时timedatectl的自动校时设置与systemd-timesyncd关联由于EASY EAI Monster采用的是systemd-ntpd因此就无法通过timedatectl set-ntp true(ture or false)来启停校时服务。手动校时可以通过set-time参数来进行时间设置。命令如下所示。sudo timedatectl set-time 2023-09-20 18:30:36注采用timedatectl修改时间系统时钟被修改的同时也会被立即同步到RTC时钟。3.3时间管理情况总结会影响【系统时钟】与【RTC时钟】的情况总结如下图所示。注* udev守护进程(udevd)是负责读取和执行/usr/lib/udev/rules.d/目录中的udev规则的进程。其中/usr/lib/udev/rules.d/85-hwclock.rules规则与时间同步相关其作用是在系统启动时把RTC时钟同步到系统时钟。* 在debian 11中只要通过apt-get安装了util-linux即可。* 在其它的Debian系版本中可以先用apt-file查找一下85-hwclock.rules在哪个包里再用apt-get安装相关的软件包即可。