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

时间:2017-04-26 12:06:40

标签: linux clock real-time-clock

可以使用/dev/rtc -r读取实时时钟hwclock,但只能以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

我想不出有任何理由阻止任何用户阅读时钟。那么为什么

我唯一的想法是它必须与低级查询有关,它可能以某种方式与系统接口。也许如果你不断读取/ dev / rtc,你可以阻止它足够长时间来破坏内核吗?

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

2 个答案:

答案 0 :(得分:5)

这是在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可以找到),并且还提供(通过“属性”文件)读取访问权限所有日期,时间,自纪元以来的秒数等。触发事件,修改最大中断速率和请求唤醒事件的时间仅提供给root(模式0644)。

答案 1 :(得分: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访问权限,所以这就是为什么他们没有为此创建特殊组(如tty