为什么需要超级用户权限才能读取 Linux 上的实时时钟?

Why do you need superuser permissions to read the real-time clock on Linux?

实时时钟/dev/rtc can be read using hwclock -r 但仅作为 root。

>hwclock -r --debug
hwclock from util-linux 2.23.2
hwclock: cannot open /dev/rtc: Permission denied
No usable clock interface found.
hwclock: Cannot access the Hardware Clock via any known method.
>sudo hwclock -r
[sudo] password for xxx: 
Wed 26 Apr 2017 12:44:01 BST  -0.281946 seconds

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

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

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

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

来读取和设置 RTC

此外,只有超级用户才能设置 RTC,这一操作可能会对系统造成破坏性影响。因此,只有超级用户才能 open RTC 设备。

事实上,这导致 rtc* 设备属于 root 用户和组,尽管可以想象还有其他方法可以实现此限制。例如,可以允许 每个 用户使用 open 设备,并检查 ioctl 调用的适当权限。甚至可以通过 uaccess

为每个用户授予对设备的读取权限

根据 RTC kernel documentation,还有两个 RTC 接口:

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

  • /sys/class/rtc/rtc* 条目支持相应的 /dev/rtc* 设备(如果你 cat /sys/class/rtc/rtcN/dev 可以找到),并且还提供(通过 "attribute" 文件)读取所有日期、时间、自纪元以来的秒数等。触发事件、修改最大中断率和请求唤醒事件的时间仅提供给根(模式 0644)。

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

hwclock: cannot open /dev/rtc: Permission denied

在我的系统(openSUSE 42.1)中只有root可以read/write到/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 访问权限,所以这就是他们没有为此创建特殊组的原因(比如 tty