Linux系统时间问题
🧩 一、Linux系统时间的两个来源
Linux 有两个时间:
-
系统时间(System Clock)
- 内核在运行时维护的时间
- 可用
date查看或修改 - ⚠️ 断电后会丢失
-
硬件时间(RTC, Real Time Clock)
- 存在于
/dev/rtc0 - 一般由主板电池维持
- 重启时内核会从 RTC 读取系统时间
- 存在于
如果你的嵌入式设备没有电池或 RTC 芯片,
或者系统没有正确同步 RTC,
就会导致:
改完时间 → 重启 → 系统重新从默认值开始(例如 1970-01-01)
✅ 二、永久修改时间的正确方法
🧭 方法一:手动命令方式(推荐)
# 1. 设置系统时间
sudo date -s "2025-10-24 15:30:00"
# 2. 写入硬件时钟(RTC)
sudo hwclock -w
# 3. 验证
hwclock -r
✅ 如果
/dev/rtc0存在,并且hwclock -r能返回正确时间,
那么重启后系统时间就不会丢失。
🧭 方法二:嵌入式系统无RTC的解决方案
如果你的设备 没有 RTC 芯片(很多 ARM 板、开发板都是这样),
那么你需要:
方案 1:启动时自动设置时间
在 /etc/rc.local 或启动脚本中添加:
date -s "2025-10-24 15:30:00"
或者:
hwclock -s || date -s "$(cat /etc/default/timebackup)"
方案 2:关机前保存时间
在关机脚本(如 /etc/init.d/halt)中添加:
date "+%Y-%m-%d %H:%M:%S" > /etc/default/timebackup
这样:
- 每次关机保存当前时间;
- 每次启动恢复上次时间。
非常适合无RTC嵌入式板卡。
🧭 方法三:使用 NTP 自动同步(联网设备)
如果设备可以联网,可以用 ntpdate:
sudo apt install ntpdate
sudo ntpdate time.windows.com
或者在 /etc/crontab 中自动同步:
0 * * * * /usr/sbin/ntpdate -u time.windows.com
✅ 三、嵌入式系统(BusyBox)中的最小实现
如果你用的是 BusyBox(很多嵌入式Linux系统都用它):
# 设置时间
date -s "2025-10-24 15:30:00"
# 保存到文件
date "+%Y-%m-%d %H:%M:%S" > /etc/time.save
# 在启动脚本中恢复
if [ -f /etc/time.save ]; then
date -s "$(cat /etc/time.save)"
fi
✅ 这样在没有 RTC 的情况下也能保持时间连续性。
✅ 四、程序内修改系统时间(C/C++)
如果你希望在你的嵌入式程序中直接修改系统时间:
#include <sys/time.h>
#include <stdio.h>
void SetSystemTime(int year, int mon, int day, int hour, int min, int sec)
{
struct tm t;
struct timeval tv;
t.tm_year = year - 1900;
t.tm_mon = mon - 1;
t.tm_mday = day;
t.tm_hour = hour;
t.tm_min = min;
t.tm_sec = sec;
t.tm_isdst = 0;
tv.tv_sec = mktime(&t);
tv.tv_usec = 0;
if (settimeofday(&tv, NULL) < 0)
perror("settimeofday");
else
printf("System time set successfully\n");
}
⚠️ 注意:
settimeofday()需要 root 权限。
若要保存到 RTC,还需调用hwclock -w或自己写入/dev/rtc0。
🧭 总结对比
| 场景 | 解决方案 | 持久性 | 说明 |
|---|---|---|---|
| 有 RTC | date -s + hwclock -w |
✅ 永久 | 推荐标准方式 |
| 无 RTC | 保存时间文件 /etc/time.save |
✅ 持久 | 适合嵌入式 |
| 可联网 | ntpdate 或 systemd-timesyncd |
✅ 自动 | 推荐联网设备 |
| 程序控制 | settimeofday() + 保存 |
✅ 控制灵活 | 需 root 权限 |

浙公网安备 33010602011771号