hwclock就是硬件时间, 类似于物理机上的BIOS time. 这个时间是可以和操作系统的时间不一样的. 如果hwclock是一个错误的时间的话, 一些强烈依赖时间的service就有可能会出错, 本文介绍Ubuntu下面的解决方法.
hwclock时间通常可以使用以下命令来查看
hwclock -r #查看hwclock时间
hwclock -w --systohc #将操作系统时间写入hwclock时间
1, 安装htpdate(非必需步骤)
此项非必需. 仅仅是因为我的CloudCone vps屏蔽了ntp使用的UDP 123端口, 我才需要这一步, 对于大多数KVM VPS来说, 这一项是不必要的.
$ apt-get install htpdate
$ systemctl status htpdate.service #此时应该是默认进入运行状态且系统时间已经同步正确了
$ grep -v ^# /etc/default/htpdate #查看其配置
HTP_SERVERS="www.pool.ntp.org www.ntp.br www.wikipedia.org"
HTP_OPTIONS="-D -s"
2, 编写systemd服务
请注意, 如果你没有执行第一步的话, 请把下方文件中的htpdate.service去掉.
$ vim /etc/systemd/system/hwclock-sync.service #写入如下内容
[Unit]
Description=update hwclock time
After=network-online.target htpdate.service
Wants=network-online.target htpdate.service
[Service]
Type=onshot
ExecStart=/sbin/hwclock -w --systohc
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
提示:
Type=onshot表示该服务是一条一次性命令, 运行完以后就会退出
RemainAfterExit表示退出后仍视为该服务会运行状态, 通常这俩个选项会搭配使用
systemctl daemon-reload
systemctl enable hwclock-sync.service
3, 启动顺序的优化
比如某v2ray.service依赖时间, 我们可以修改一下这个service. After和Wants选项之后均加上hwclock-sync.service即可:
vim /etc/systemd/system/v2ray.service
[Unit]
Description=V2Ray Service
After=network.target hwclock-sync.service
Wants=network.target hwclock-sync.service
[Service]
Type=simple
PIDFile=/var/run/v2ray.pid
ExecStart=/usr/bin/v2ray/v2ray -config /etc/v2ray/config.json
Restart=on-failure
[Install]
WantedBy=multi-user.target