如何保持正確的時間,如何使用 NTP 和 systemd 讓你的電腦在不濫用時間伺服器的前提下保持同步。
讓 Linux 來告訴你時間的時候,它是很奇怪的。你可能認為是使用 time 指令來告訴你時間,其實不是,因為 time 只是一個測量一個行程運行了多少時間的計時器。要得到時間,你需要執行的是 date 指令,你想查看更多的日期,你可以執行 cal 指令。文件上的時間戳記也是一個容易混淆的地方,因為根據你的發行版預設情況不同,它一般有兩種不同的顯示方法。下面是來自 Ubuntu 16.04 LTS 的範例:
$ ls -l drwxrwxr-x 5 carla carla 4096 Mar 27 2017 stuff drwxrwxr-x 2 carla carla 4096 Dec 8 11:32 things -rw-rw-r-- 1 carla carla 626052 Nov 21 12:07 fatpdf.pdf -rw-rw-r-- 1 carla carla 2781 Apr 18 2017 oddlots.txt
有些顯示年,有些顯示時間,這樣的方式讓你的文件更混亂。 GNU 預設的情況是,如果你的檔案在六個月以內,則顯示時間而不是年。我想這樣做可能是有原因的。如果你的 Linux 是這樣的,試著用 ls -l --time-style=long-iso 指令,讓時間戳用同一種方式去顯示,按字母順序排序。
NTP —— 網路時間協議,它是保持電腦正確時間的老式方法。 ntpd 是 NTP 守護程序,它透過週期性地查詢公共時間伺服器來按需調整你的電腦時間。它是一個簡單的、輕量級的協議,使用它的基本功能時設定非常容易。 systemd 透過使用 systemd-timesyncd.service 已經越俎代庖地 “幹了 NTP 的活”,它可以用作 ntpd 的客戶端。
在我們開始與 NTP “打交道” 之前,先花一些時間來了檢查一下當前的時間設定是否正確。你的系統上(至少)有兩個時鐘:系統時間 —— 它由 Linux 核心管理,第二個是你的主機板上的硬體時鐘,它也稱為實時時鐘(RTC)。當你進入系統的 BIOS 時,你可以看到你的硬體時鐘的時間,你也可以去改變它的設定。當你安裝新的Linux 時,在一些圖形化的時間管理器中,你會被詢問是否設定你的RTC 為UTC(世界標準時間Coordinated Universal Time)時區,因為所有的時區和夏令時都是基於UTC 的。你可以使用hwclock 指令去檢查:
$ sudo hwclock --debug hwclock from util-linux 2.27.1 Using the /dev interface to the clock. Hardware clock is on UTC time Assuming hardware clock is kept in UTC time. Waiting for clock tick... ...got clock tick Time read from Hardware Clock: 2018/01/22 22:14:31 Hw clock time : 2018/01/22 22:14:31 = 1516659271 seconds since 1969 Time since last adjustment is 1516659271 seconds Calculated Hardware Clock drift is 0.000000 seconds Mon 22 Jan 2018 02:14:30 PM PST .202760 seconds
Hardware clock is on UTC time 顯示了你的電腦的 RTC 是使用 UTC 時間的,雖然它把該時間轉換為你的本地時間。如果它被設定為本地時間,它將顯示 Hardware clock is on local time。你應該有一個 /etc/adjtime 檔。如果沒有的話,使用以下指令同步你的 RTC 為系統時間:
$ sudo hwclock -w
這個指令將會產生該文件,內容看起來類似如下:
$ cat /etc/adjtime 0.000000 1516661953 0.000000 1516661953 UTC
新發明的 systemd 方式是去執行 timedatectl 指令,執行它不需要 root 權限:
$ timedatectl Local time: Mon 2018-01-22 14:17:51 PST Universal time: Mon 2018-01-22 22:17:51 UTC RTC time: Mon 2018-01-22 22:17:51 Time zone: America/Los_Angeles (PST, -0800) Network time on: yes NTP synchronized: yes RTC in local TZ: no
RTC in local TZ: no 表示它使用 UTC 時間。那要怎麼改成使用本地時間?這裡有許多種方法可以做到。最簡單的方法是使用一個圖形配置工具,例如像 openSUSE 中的 YaST。你也可使用 timedatectl:
$ timedatectl set-local-rtc 0
或編輯 /etc/adjtime,將 UTC 替換為 LOCAL。
systemd 提供了 systemd-timesyncd.service 客户端,它可以查询远程时间服务器并调整你的本地系统时间。在 /etc/systemd/timesyncd.conf 中配置你的(时间)服务器。大多数 Linux 发行版都提供了一个默认配置,它指向他们维护的时间服务器上,比如,以下是 Fedora 的:
[Time] #NTP= #FallbackNTP=0.fedora.pool.ntp.org 1.fedora.pool.ntp.org
你可以输入你希望使用的其它时间服务器,比如你自己的本地 NTP 服务器,在 NTP= 行上输入一个以空格分隔的服务器列表。(别忘了取消这一行的注释)NTP= 行上的任何内容都将覆盖掉 FallbackNTP 行上的配置项。如果你不想使用 systemd 呢?那么,你将需要 NTP 就行。
配置你自己的局域网 NTP 服务器是一个非常好的实践,这样你的网内计算机就不需要不停查询公共 NTP 服务器。在大多数 Linux 上的 NTP 都来自 ntp 包,它们大多都提供 /etc/ntp.conf 文件去配置时间服务器。查阅 NTP 时间服务器池 去找到你所在的区域的合适的 NTP 服务器池。然后在你的 /etc/ntp.conf 中输入 4 - 5 个服务器,每个服务器用单独的一行:
driftfile /var/ntp.drift logfile /var/log/ntp.log server 0.europe.pool.ntp.org server 1.europe.pool.ntp.org server 2.europe.pool.ntp.org server 3.europe.pool.ntp.org
driftfile 告诉 ntpd 它需要保存用于启动时使用时间服务器快速同步你的系统时钟的信息。而日志也将保存在他们自己指定的目录中,而不是转储到 syslog 中。如果你的 Linux 发行版默认提供了这些文件,请使用它们。
现在去启动守护程序;在大多数主流的 Linux 中它的命令是 sudo systemctl start ntpd。让它运行几分钟之后,我们再次去检查它的状态:
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================== +dev.smatwebdesi 192.168.194.89 3 u 25 64 37 92.456 -6.395 18.530 *chl.la 127.67.113.92 2 u 23 64 37 75.175 8.820 8.230 +four0.fairy.mat 35.73.197.144 2 u 22 64 37 116.272 -10.033 40.151 -195.21.152.161 195.66.241.2 2 u 27 64 37 107.559 1.822 27.346
我不知道这些内容是什么意思,但重要的是,你的守护程序已经与时间服务器开始对话了,而这正是我们所需要的。你可以去运行 sudo systemctl enable ntpd 命令,永久启用它。如果你的 Linux 没有使用 systemd,那么,给你留下的家庭作业就是找出如何去运行 ntpd。
现在,你可以在你的局域网中的其它计算机上设置 systemd-timesyncd,这样它们就可以使用你的本地 NTP 服务器了,或者,在它们上面安装 NTP,然后在它们的 /etc/ntp.conf 上输入你的本地 NTP 服务器。
以上是讓 Linux 保持精確時間的詳細內容。更多資訊請關注PHP中文網其他相關文章!