【问题标题】:Reading /dev/cpu/*/msr from userspace: operation not permitted从用户空间读取 /dev/cpu/*/msr:不允许操作
【发布时间】:2013-09-10 19:14:45
【问题描述】:

我正在尝试编写一个可以读取 msr 寄存器的简单应用程序,并从用户空间运行此应用程序。

我已经加载了 msr 模块,并授予每个人对 /dev/cpu/*/msr 的读取权限。但是用户仍然无法访问这些文件,但 root 可以。

权限如下所示:

crw-r--r-- 1 root root 202, 0 sep  6 17:55 /dev/cpu/0/msr

crw-r--r-- 1 root root 202, 1 sep  6 17:55 /dev/cpu/1/msr

crw-r--r-- 1 root root 202, 2 sep  6 17:55 /dev/cpu/2/msr

crw-r--r-- 1 root root 202, 3 sep  6 17:55 /dev/cpu/3/msr

当我尝试从用户空间读取这些文件时,我不断收到“不允许操作”错误消息,但当 root 尝试访问它们时工作正常。我究竟做错了什么?我在内核版本为 3.11.0 的 Ubuntu 13.04 上。

【问题讨论】:

  • 你用 sudo 运行你的程序了吗?

标签: file-permissions user-permissions msr


【解决方案1】:

自 3.7 左右以来,主线 Linux 内核的更改现在要求可执行文件具有 CAP_SYS_RAWIO 功能来打开 MSR 设备文件 [2]。除了加载 MSR 内核模块并在 msr 设备文件上设置适当的文件权限外,还必须使用以下命令将 CAP_SYS_RAWIO 功能授予需要访问 MSR 驱动程序的任何用户可执行文件:

sudo setcap cap_sys_rawio=ep <user_executable>

【讨论】:

  • 谢谢,我尝试按照您的建议将 CAP_SYS_RAWIO 功能赋予可执行文件,但仍然面临同样的问题!
  • 我尝试从 msr-tools 为 rdmsr 和 wrmsr 设置它,但它对我不起作用。就我而言,它们是从 bash 脚本中调用的。这会是个问题吗?我开启了安全启动,MSR 模块已签名并加载。我的内核是 4.18.0-16。
  • 谢谢,它对我有用,既适用于自定义程序(直接读取 /dev/cpu 文件),也适用于 rdmsr 实用程序,我通过以下方式授予权限:sudo setcap cap_sys_rawio=ep `which rdmsr`
【解决方案2】:

对我来说(在 debian 上)它有助于在加载 msr 模块后设置设备权限。在除了PaulUTK的回答之外,以root身份:

setcap cap_sys_rawio=ep <user_executable>

设置设备权限(之前检查):

ls -l /dev/cpu/*/msr
crw------- ... /dev/cpu/0/msr

我添加了一个组msr 并分配了它。作为根:

chgrp msr /dev/cpu/*/msr
chmod g+rw /dev/cpu/*/msr
ls -l /dev/cpu/*/msr
crw-rw---- ... /dev/cpu/0/msr

将组分配给用户:

usermod -aG msr hardworkinguser

奖励提示:

将组应用为 hardworkinguser 无需重新登录:

newgrp msr

我还听说必须禁用安全启动。

【讨论】:

    【解决方案3】:

    可以看到vfs_read:

    ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
    {
        ret = rw_verify_area(READ, file, pos, count);
        if (ret >= 0) {
            ...
            if (file->f_op->read)  // your driver read .
                ret = file->f_op->read(file, buf, count, pos);
            else
                ret = do_sync_read(file, buf, count, pos);
            ....
    
        }
        // here,  if the ret is  13.  your error will be occur.
        return ret;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-06
      • 2017-03-20
      • 2015-02-04
      • 2016-02-05
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多