如何在Linux上以编程方式设置硬件时钟?

15

Linux提供了stime(2)调用以设置系统时间。然而,虽然这将更新系统的时间,但它不会将BIOS硬件时钟设置为与新的系统时间匹配。

Linux系统通常在关机和周期性间隔中同步硬件时钟与系统时间。然而,如果机器在自动同步之前断电,那么当机器重新启动时时间将是不正确的。

如何确保在设置系统时间时更新硬件时钟?


请指定编程语言。 - Lightness Races in Orbit
编程语言为什么很重要?你对不同的编程语言有不同的答案吗? - Kristopher Johnson
额...............是的。 - Lightness Races in Orbit
5个回答

19

查看rtc手册以获取详细信息,但如果您已以root身份登录,类似于以下内容:

#include <linux/rtc.h>
#include <sys/ioctl.h>


    struct       rtc_time {
        int         tm_sec;      
        int         tm_min;      
        int         tm_hour;     
        int         tm_mday;     
        int         tm_mon;      
        int         tm_year;     
        int         tm_wday; /* unused */
        int         tm_yday; /* unused */
        int         tm_isdst;/* unused */
    };

int fd;
struct rtc_time rt;
/* set your values here */
fd = open("/dev/rtc", O_RDONLY);
ioctl(fd, RTC_SET_TIME, &rt);
close(fd);

1
无需root权限,只需要根据rtc(4)的CAP_SYS_TIME功能即可。 - Erikw
你好,我有三个关于答案的问题。1. 为什么使用自己的rtc_time而不是rtc.h中的rtc_time?2. O_RDONLY?这不只是用于读取吗?3. 如果我尝试从ioctl获取代码,则会得到-1和errno 22。那是什么意思? - Offler
@Offler 这个答案并不是一个可直接复制粘贴使用的解决方案。我包含了这个结构体来展示它的工作原理。如果需要真实的例子,请查看 hwclock 程序的源代码。 - Zan Lynx

8

在调用 stime() 函数之后,需要执行以下操作:

system("/sbin/hwclock --systohc");

请参阅hwclock(8)手册以获取更多信息。


2
请注意,如果您的RTC设置为使用UTC时间,则需要添加“--utc”或“--localtime”,否则会出现问题。 - Julien Hirel

2
我想指出硬件时钟只能精确到一定程度(我见过每天会失去/增加几秒钟的系统)。
您是否考虑设置网络时间守护程序以根据时间服务器同步您的时钟?
值得承认的是,这种同步在守护进程启动之后才会发生,因此在电源开启和时间守护程序根据时间服务器同步之间保持硬件时钟同步也有所帮助。

根据我的经验,大多数这些变化都是由于主板电池电压过低造成的。如果不是关键任务,我建议在设置不必要的服务之前先检查一下它。 - Manuel Ferreria

2

我建议先阅读hwclock的源代码。


2
你可能正在为嵌入式系统编写代码,没有足够的空间来添加另一个程序。或者也许你只是出于好奇想要了解这个问题的答案。 - Zan Lynx
那是对原问题的回答。我不知道为什么需要它。 - iny
@iny,我的意思是“为什么要阅读hwclock的源代码,而不是直接调用hwclock?”Zan给出了一个很好的答案。 - Kristopher Johnson
1
运行 "strace hwclock" 可能是满足好奇心最快的方法。 - sigjuice

-2

如果文本编辑器不同于kubuntu(默认编辑器为Kate),请在终端中使用sudo命令使用您自己的编辑器。

  1. 打开终端
  2. 复制并粘贴此命令:sudo kate /etc/default/rcS,然后按Enter
  3. 输入用户密码(即登录密码),然后按Enter
  4. 桌面上将打开文本编辑器
  5. 将行UTC=yes更改为UTC=no
  6. 然后点击保存(位于文本编辑器选项卡栏的顶部)
  7. 重新启动计算机

似乎与所提出的问题毫无关系。 - cosimo193

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接