VMWARE安装的LINUX系统时间与实际时间差8个小时

文章讲述了在VMware部署的Almalinux8系统上,Zabbix记录的时间比实际时间快8小时。通过排查,发现是由于虚拟机未同步主机系统时间,修正时区设置和启用虚拟机时间同步后解决了问题。

背景:系统是VMWAER部署的Almalinux 8,部署了zabbix和 mysql ,在系统部与软件安装完成后。在查看zabbix仪表盘时,发现记录数据时间与真实时间相关8小时。

其实,修改VMWAER的本地时间同步及可。

问题排查过程:

首先,想到的时时区错误,但印象中安装系统是明确选择了上海UTC时区。

检查时区:date 

反馈结果:

[root@VM01zabbix /]# timedatectl
               Local time: 一 2023-10-02 17:35:55 CST
           Universal time: 一 2023-10-02 09:35:55 UTC
                 RTC time: 一 2023-10-02 09:35:55

根据网上查到的方法,基本上是:

#rm /etc/localtime    删除之前的时区。

#ln  -s  /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime    使用北京上海时区

删除CST时间后,只有UTC时间是正确的,再次使用上海时区后,Local time再次快了8小时。

中国是东八区时间,所以是UTC+8,现在是Local time +8 。说明UTC时间是不正确的,UTC时间比实际快了8小时。

检查虚拟机配置,发现虚拟机未同步主机系统时间。开启时间同步后,虚拟机CST时间与现实时间一致。

<think>我们正在解决OPNsense设置时区为上海后系统时间相差8小时的问题。根据引用内容,时区问题通常系统配置、硬件时钟设置或服务同步有关。以下将结合引用信息OPNsense系统特点提供解决方案。 关键点: 1. 引用[1]提到Linux系统中需要设置硬件时钟采用UTC(即UTC=false),并同步时区文件,然后通过ntpdate同步网络时间,最后更新硬件时钟。 2. 引用[3]解释了CentOS系统时间差8小时的原因是:系统时区设置为上海(CST),但硬件时钟被当作UTC时间,导致时差8小时(CST=UTC+8)。 3. OPNsense基于FreeBSD,因此我们需要考虑FreeBSD的配置方式。 步骤: 1. **确认时区设置**:在OPNsense网页界面中,确保时区设置为“Asia/Shanghai”。 - 路径:System > Settings > General > Timezone 2. **检查系统时间硬件时钟的关系**:在FreeBSD(OPNsense的基础系统)中,默认行为是将硬件时钟视为本地时间(local time)还是UTC?根据引用[3],Linux默认将硬件时钟视为UTC,而系统时间根据时区转换。但FreeBSD的默认行为可能同。 - 在FreeBSD中,通常硬件时钟被视为本地时间。但是,我们需要确认OPNsense的配置。 3. **调整硬件时钟设置**(关键步骤): - 根据引用[1]中Linux的解决方法,设置硬件时钟为本地时间(即采用UTC)。在FreeBSD中,我们可以通过调整`/etc/wall_cmos_clock`文件来实现。 - 在FreeBSD中,如果硬件时钟设置为本地时间,则创建`/etc/wall_cmos_clock`文件(空文件即可);如果设置为UTC,则删除该文件。 - 因此,为了让系统将硬件时钟视为本地时间,我们执行: ```bash touch /etc/wall_cmos_clock ``` - 或者,我们可以通过sysctl设置: ```bash sysctl kern.settime=1 # 表示硬件时钟是本地时间 ``` 要使重启后生效,在`/etc/sysctl.conf`中添加: ``` kern.settime=1 ``` 4. **同步网络时间并更新硬件时钟**: - 在OPNsense网页界面中,配置NTP服务器(如asia.pool.ntp.org)并启用NTP服务。 - 或者,在命令行中手动同步时间(需要先安装ntp,但OPNsense默认应已包含): ```bash ntpdate asia.pool.ntp.org ``` - 将系统时间同步到硬件时钟: ```bash hwclock -w ``` 在FreeBSD中,命令为`hwclock`可能可用,应使用`adjkerntz`或直接使用`ntpdate`同步后,系统自动更新硬件时钟?实际上,在FreeBSD中更新硬件时钟的命令是: ```bash adjdb -s # 这会将系统时间写入硬件时钟 ``` 但更常见的做法是使用`ntpd`服务来同步并自动更新。 5. **重启系统**:进行上述更改后,重启系统以使更改生效。 6. **验证**: - 在命令行中执行`date`查看系统时间。 - 执行`sysctl kern.clockrate`或`hwclock -r`(如果可用)查看硬件时间。 注意:OPNsense是基于FreeBSD的,所以操作可能略有同。在OPNsense中,我们通常通过Web界面进行配置,但也可以通过命令行。 另外,引用[2][4][5]分别针对Java、数据库PHP的时区问题,系统时区设置相关度高,但提醒我们在应用程序中也可能需要单独设置时区,但本问题仅关注系统时间。 因此,解决OPNsense系统时间差8小时的步骤总结如下: **步骤详解:** 1. **Web界面设置时区**: - 登录OPNsense的Web界面。 - 转到 System > Settings > General。 - 在“Timezone”中选择“Asia/Shanghai”。 - 保存设置。 2. **通过SSH登录到OPNsense命令行**(或使用控制台)。 3. **设置硬件时钟为本地时间**: ```bash echo 'kern.settime=1' >> /etc/sysctl.conf sysctl kern.settime=1 ``` 或者,创建`/etc/wall_cmos_clock`文件(如果系统使用此机制): ```bash touch /etc/wall_cmos_clock ``` 4. **配置NTP服务器并同步时间**: - 在Web界面中: - 转到 Services > NTP > Settings。 - 在“Time Servers”中添加服务器(如0.asia.pool.ntp.org、1.asia.pool.ntp.org)。 - 勾选“Enable NTP server”“Enable NTP client”。 - 保存并应用。 - 或者,在命令行中手动同步(临时): ```bash ntpdate -u 0.asia.pool.ntp.org ``` 5. **将系统时间写入硬件时钟**: ```bash adjkerntz -s # 这个命令在FreeBSD中用于同步硬件时钟,但注意adjkerntz通常用于处理时区变化,同时也会更新硬件时钟。在系统启动时运行。手动同步硬件时钟可以使用: hwclock -u -w # 但FreeBSD中通常使用hwclock命令的选项可能同,或者使用rtc(8)工具。 ``` 实际上,在FreeBSD中,可以使用以下命令将当前系统时间写入硬件时钟: ```bash /etc/rc.d/ntpd onefetch # 强制ntpd同步一次(如果ntpd服务已启用) # 或者直接写RTC adjkerntz -i # 初始化时区调整,并更新硬件时钟?但更直接的是: ntpwait -v # 等待ntp同步完成(如果ntpd正在运行) # 然后使用以下命令写入硬件时钟: sysctl kern.settime=1 # 确保设置 date # 显示当前系统时间 # 写入硬件时钟 /libexec/save-entropy # 这个命令通常用于保存随机种子,但写入硬件时钟通常由系统自动完成。我们可以手动用: /sbin/sysctl -w kern.settime=1 # 再次确认设置 # 或者,重启后系统会自动调整?但为了立即生效,我们可以重启。 # 如果以上方法明确,可以尝试直接写硬件时钟的命令(需要root): # 在FreeBSD中,硬件时钟设备为/dev/rtc,我们可以用以下命令读取: # rtc -r # 写入:rtc -w `date -j -f "%Y%m%d%H%M%S" "now" +"%Y%m%d%H%M%S"` # 但是,OPNsense可能没有rtc命令,所以建议使用标准方法:通过调整系统设置并重启。 ``` 考虑到OPNsense是一个专用防火墙系统,我们更倾向于使用Web界面操作标准服务。 另一种简单方法:在Web界面中设置正确的时区后,重启系统。因为OPNsense在启动时会根据时区设置调整时间,并同步硬件时钟。 如果问题仍然存在,请尝试以下步骤: 6. **检查系统启动时的时区设置**:确保在系统启动过程中时区设置被正确加载。可以检查系统日志(/var/log/system.log)中关于时区的信息。 7. **手动设置时间**:如果时间仍然对,可以临时手动设置时间: ```bash date 202311221630 # 例如:2023年11月22日16:30 ``` 8. **更新OPNsense**:确保系统是最新版本,因为时区问题可能在更新中修复。 由于OPNsense基于FreeBSD,其处理方式Linux(如CentOS)略有同。根据FreeBSD文档,系统在启动时会读取硬件时钟,并假设其为UTC时间,然后根据时区调整系统时间。但是,如果硬件时钟实际上是本地时间,那么就会导致时间错误(相差时区)。因此,我们需要告诉系统硬件时钟是本地时间,即设置`kern.settime=1`(表示硬件时钟存储的是本地时间)。 因此,关键步骤是设置`kern.settime=1`并确保在每次启动时生效。 综上所述,解决方案如下: **最终解决方案步骤:** 1. 通过Web界面设置时区为Asia/Shanghai(System > Settings > General)。 2. 通过SSH登录OPNsense命令行。 3. 执行以下命令: ```bash # 设置硬件时钟为本地时间(非UTC) echo 'kern.settime=1' >> /etc/sysctl.conf sysctl kern.settime=1 ``` 4. 重启系统: ```bash reboot ``` 5. 系统重启后,检查系统时间(`date`命令)是否本地时间一致。 6. 如果仍然一致,检查NTP服务是否正常工作(在Web界面中启用NTP服务并配置合适的服务器)。 注意:如果硬件时钟原本是UTC时间,那么在设置`kern.settime=1`后,系统启动时会将其当作本地时间,因此时间显示会多8小时(假设原硬件时钟是UTC)。所以,在设置之后,需要确保用正确的时间去设置硬件时钟。因此,在设置`kern.settime=1`后,应该立即用当前正确的系统时间更新硬件时钟。但是,在重启前,系统时间可能是正确的(通过NTP同步),我们可以在重启前执行: ```bash # 将当前系统时间(已经根据时区调整过)写入硬件时钟(作为本地时间) hwclock --systohc # 在FreeBSD中,这个命令可能可用,所以使用以下方法: ``` 在FreeBSD中,我们可以使用: ```bash adjkerntz -s # 这个命令会重新计算时区偏移并设置硬件时钟?实际上,adjkerntz主要是在系统启动时区改变时调整。我们可以用: ntpdate -u pool.ntp.org # 同步系统时间 # 然后手动写入硬件时钟: /sbin/hwclock --systohc --localtime # 如果hwclock命令可用(OPNsense可能没有),否则: # 或者,使用sysctl强制写入 sysctl -w kern.settime=1 # 确保设置 # 系统在关机时会自动同步系统时间到硬件时钟(作为本地时间)? ``` 在FreeBSD中,系统关机时会将系统时间同步到硬件时钟,并且根据`kern.settime`的设置来决定是作为UTC还是本地时间。 因此,我们执行以下步骤: 1. 设置sysctl.conf 2. 同步系统时间(通过NTP) 3. 重启(在重启过程中,系统会自动将当前系统时间写入硬件时钟,并按照本地时间存储) 这样,下次启动时,系统读取硬件时钟(作为本地时间)就再需要调整时区,因此时间正确。 如果重启后时间仍然对,请检查硬件时钟时间是否正确(在启动时进入单用户模式检查?),并确认NTP服务在启动后是否成功同步。 由于OPNsense是一个专用系统,可能还提供了其他时间管理工具。如果问题仍然存在,建议查阅OPNsense官方文档或社区支持。 §§相关问题§§ 1. 如何验证OPNsense系统时间是否正确? 2. OPNsense中如何配置NTP服务器? 3. FreeBSD系统中如何设置硬件时钟为本地时间? </think> ### 解决OPNsense设置时区为上海后系统时间相差8小时问题 该问题通常由**硬件时钟(BIOS时间系统时钟的时区标准一致**导致。根据引用内容[^1][^3],Linux/BSD系统中若硬件时钟被设为UTC时间(世界协调时),而系统时区设置为上海(CST, UTC+8),则系统时间会显示为硬件时间+8小时,导致实际时间误差。以下是具体解决方案: --- #### **步骤1:通过Web界面修正系统配置** 1. **登录OPNsense后台** 访问 `https://<OPNsense_IP>` 进入控制台。 2. **设置时区** - 导航至:`System > Settings > General` - 在 **Timezone** 中选择 `Asia/Shanghai` - 保存设置(*此步骤确保系统时区正确*) 3. **配置硬件时钟模式(关键步骤)** - 在同一个页面 (`System > Settings > General`) 中,找到 **Hardware clock** 选项 - 将其改为 **Local time**(默认为UTC) - 保存并应用更改: ![OPNsense硬件时钟设置](https://docs.opnsense.org/manual/images/settings_general.png) [^1] > ✅ **原理**:硬件时钟设为 `Local time` 后,系统再自动将硬件时间视为UTC+0,避免了8小时时差[^3]。 --- #### **步骤2:通过SSH命令行强制同步时间** ```bash # 登录SSH(默认用户:root) ssh root@<OPNsense_IP> # 手动同步网络时间(需先安装ntp) opnsense-update -y ntp # 安装NTP工具 ntpdate -u pool.ntp.org # 从公共NTP服务器同步 # 将系统时间写入硬件时钟(关键) hwclock --systohc # 保存系统时间到硬件时钟 # 重启时间服务 service ntpd restart ``` > ⚠️ **注意**:若提示 `hwclock` 命令可用,需先安装 `os-hw-probe` 插件(通过Web界面:`System > Firmware > Plugins`)。 --- #### **步骤3:验证时间同步** - **检查系统时间**: ```bash date # 应显示上海时间(如:Wed May 22 14:30:00 CST 2024) ``` - **检查硬件时钟**: ```bash hwclock --show # 应系统时间一致 ``` --- #### **其他可能原因排查** 1. **NTP服务未启用** - 在 `Services > NTP > Settings` 中启用NTP客户端,并添加亚洲服务器(如 `cn.pool.ntp.org`)。 2. **虚拟机环境问题** - 若OPNsense运行在虚拟机(如VMware/Hyper-V)中,需在宿主机设置时区为上海,并启用时间同步功能。 3. **应用层时区问题** - 若数据库或应用(如PHP/Java)仍显示错误时间,需单独配置时区(参考引用[^2][^4][^5]): ```java // Java示例:显式设置上海时区 TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); ``` ```php // PHP示例:在php.ini中添加 date.timezone = "Asia/Shanghai" ``` --- #### **总结** | 步骤 | 操作 | 目标 | |------|------|------| | 1 | Web界面设置硬件时钟为 `Local time` | 消除UTCCST的8小时时差 | | 2 | SSH执行 `ntpdate` `hwclock --systohc` | 强制同步系统硬件时间 | | 3 | 启用NTP服务 | 保持长期时间准确 | 通过以上操作,系统时间硬件时钟将统一为上海时区(CST),解决8小时偏差问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值