6

实时时钟/dev/rtc可以使用hwclock -r 读取,但只能以 root 身份读取。

>hwclock -r --debug
来自 util-linux 2.23.2 的 hwclock
hwclock:无法打开/dev/rtc:权限被拒绝
找不到可用的时钟接口。
hwclock:无法通过任何已知方法访问硬件时钟。
>sudo hwclock -r
[sudo] xxx 的密码:
2017 年 4 月 26 日星期三 12:44:01 BST -0.281946 秒

我想不出任何好的理由来阻止任何用户阅读时钟。那么为什么这里需要root权限呢?

我唯一的想法是它必须与可以以某种方式与系统交互的低级查询有关。也许如果你不断地阅读 /dev/rtc 你可以阻止它足够长的时间来扰乱内核?

上下文:我现在负责从/dev/rtc读取的应用程序。因此,它必须以 root 身份运行,但没有真正的理由不能成为用户空间应用程序。我质疑它是否需要使用实时时钟,但我的问题仍然存在。

4

2 回答 2

6

这是在 Linux 中实现 RTC 访问方式的产物:/dev/rtc* 设备只能打开一次(直到它们关闭)并且它们是只读的。然后通过调用 来读取和设置 RTC ioctl

此外,只有超级用户可以设置RTC是有道理的,这可能会对系统产生破坏性影响。因此,只有超级用户才能open使用 RTC 设备。

实际上,这会导致rtc*设备属于root用户和组,即使可以想象还有其他方法可以实现此限制。例如,可以允许每个用户open使用设备,并检查ioctl通话中的适当权限。甚至可以基于每个用户授予对设备的读取访问权限,通过uaccess等。


根据 RTC内核文档,还有两个 RTC 接口:

  • /proc/driver/rtc是一个提供一些状态信息的伪文件。在我的系统上,它提供对所有人的读取访问权限,但我找不到任何规范。

  • 这些/sys/class/rtc/rtc*条目支持相应的/dev/rtc*设备(如果您可以找到cat /sys/class/rtc/rtcN/dev),还提供(通过“属性”文件)对所有日期、时间、自纪元以来的秒数等的读取访问权限。触发 uevents,修改最大中断率, 请求唤醒事件的时间仅提供给 root (MODE 0644)。

于 2017-04-26T12:23:09.027 回答
0

您显然在这里遇到了文件权限:

hwclock: cannot open /dev/rtc: Permission denied

在我的系统(openSUSE 42.1)中,只有 root 可以读/写/dev/rtc0. 现代 Linux 发行版使用udevd(现在它是 的一部分systemd)在 devtmpfs 中创建设备节点。如果您查看 systemd 源代码,您会发现没有用于设置rtc设备权限的指令:systemd/rules/50-udev-default.rules:9

# select "system RTC" or just use the first one
SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc"
SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100"

我可能只是推测没有那么多应用程序需要 RTC 访问权限,所以这就是他们没有为此创建特殊组的原因(例如 for tty

于 2017-04-26T12:23:22.683 回答