博客 / Linux/ Linux服务器时区与时间同步指南:设置东八区并更新硬件时钟

Linux服务器时区与时间同步指南:设置东八区并更新硬件时钟

问题背景

在使用国外Linux服务器与百度云BOS等云存储服务同步文件时,可能会遇到因时间不同步导致的错误,例如:

BceServerError: The difference between the request time and the server's time is too large.

这是因为许多云服务对请求时间戳的校验非常严格。为解决此问题,需要将服务器的系统时区设置为中国标准时间(东八区,Asia/Shanghai),并同步网络时间,最后将正确时间写入硬件时钟(BIOS/RTC),以确保重启后时间依然准确。

方法一:CentOS 7/8 及 RHEL 系统(推荐使用 timedatectl)

现代CentOS/RHEL 7及以上版本推荐使用 timedatectl 工具进行时区和时间管理。

1. 查看当前时间与时区状态

timedatectl

此命令将显示系统时间、时区、RTC(硬件时钟)时间以及NTP服务状态。

2. 设置系统时区为上海(东八区)

sudo timedatectl set-timezone Asia/Shanghai

设置后,再次运行 timedatectl 确认时区已变为“Asia/Shanghai”。

3. 同步网络时间

使用NTP服务同步时间。首先确保系统已启用并运行 chronydntpd 服务:

# 对于使用chrony的系统(CentOS 7/8 默认)
sudo systemctl enable --now chronyd
sudo chronyc sources

# 或者,使用ntpdate进行一次手动同步(如果未安装,请先安装:yum install ntpdate)
sudo ntpdate ntp.aliyun.com

注意:如果系统已启用并运行 chronydntpd,它们会自动持续同步时间,通常无需手动运行 ntpdate

4. 将系统时间写入硬件时钟(BIOS/RTC)

这是关键步骤,确保重启后时间正确。推荐将硬件时钟设置为UTC时间,由操作系统根据时区进行转换:

# 推荐:将硬件时钟设置为UTC
sudo timedatectl set-local-rtc 0
# 然后将当前正确的系统时间写入硬件时钟
sudo hwclock --systohc --utc

或者,如果你希望硬件时钟直接存储本地时间(不推荐,可能导致双系统问题):

sudo timedatectl set-local-rtc 1
sudo hwclock --systohc --localtime

重要说明:将硬件时钟设置为UTC是行业最佳实践,可以避免夏令时和时区变更带来的混乱。只有在特定需求(如某些旧版Windows双系统)下才设置为本地时间。

方法二:传统方法(适用于CentOS 6及更早版本)

1. 使用 tzselect 或直接链接设置时区

# 交互式选择时区(选择 Asia -> China -> Beijing Time)
tzselect
# 根据提示,将类似 TZ='Asia/Shanghai'; export TZ 的行添加到 /etc/profile 并 source

# 更直接的方法:创建时区软链接
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

2. 手动同步网络时间并写入硬件时钟

# 安装ntpdate(如未安装)
sudo yum install -y ntpdate
# 使用国内NTP服务器同步时间
sudo ntpdate ntp1.aliyun.com
# 将系统时间写入硬件时钟
sudo hwclock -w
# 或明确指定方式
sudo hwclock --systohc

方法三:Ubuntu/Debian 系统

Ubuntu系统同样使用 timedatectl,步骤与CentOS 7类似:

# 1. 设置时区
sudo timedatectl set-timezone Asia/Shanghai
# 2. 启用并确保NTP同步服务运行(Ubuntu 通常使用 systemd-timesyncd)
sudo timedatectl set-ntp true
# 3. 将系统时间写入硬件时钟(推荐UTC模式)
sudo hwclock --systohc --utc

验证与故障排查

  • 验证系统时间datetimedatectl
  • 验证硬件时钟时间sudo hwclock --show
  • 检查时区文件ls -l /etc/localtime 应指向 /usr/share/zoneinfo/Asia/Shanghai
  • 检查时间同步服务状态
    • CentOS 7/8: sudo systemctl status chronyd
    • Ubuntu: sudo systemctl status systemd-timesyncd

扩展知识:UTC vs Localtime

实时时钟(RTC/Hardware Clock):即BIOS时间,独立于操作系统运行。它可以被设置为存储协调世界时(UTC)或本地时间(Localtime)。
最佳实践:将RTC设置为UTC。操作系统启动时,会读取RTC的UTC时间,然后根据系统设置的时区(如Asia/Shanghai)转换为本地时间显示。这避免了时区切换、夏令时调整带来的问题,也是大多数Linux发行版的默认或推荐配置。仅在需要与设置为本地时间的其他操作系统(如某些Windows旧配置)共存时,才考虑将RTC设置为本地时间。

通过以上步骤,你可以确保你的Linux服务器使用正确的东八区时间,并与网络时间保持同步,同时将准确的时间固化到硬件中,彻底解决因时间偏差导致的云服务API错误。