Linux系统时间问题

🧩 一、Linux系统时间的两个来源

Linux 有两个时间:

  1. 系统时间(System Clock)

    • 内核在运行时维护的时间
    • 可用 date 查看或修改
    • ⚠️ 断电后会丢失
  2. 硬件时间(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 ✅ 持久 适合嵌入式
可联网 ntpdatesystemd-timesyncd ✅ 自动 推荐联网设备
程序控制 settimeofday() + 保存 ✅ 控制灵活 需 root 权限

posted @ 2025-11-06 15:39  江海余生  阅读(28)  评论(0)    收藏  举报