可以使用/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身份运行,但没有真正的理由它不能成为用户空间应用程序。我怀疑它需要使用实时时钟,但我的问题仍然存在。
答案 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
)