为什么需要超级用户权限才能读取 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
)
实时时钟/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,这一操作可能会对系统造成破坏性影响。因此,只有超级用户才能 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
)