3

我正在制作一个小型 linux 模块,它是 char 设备的驱动程序。在我的代码中,我创建了设备类,而不是它自己的设备,因此在我的系统中创建了 /dev 文件。问题是 /dev 文件只有 root 权限,并且用户对该文件既没有读、写也没有执行权限,我想更改 /dev 文件的权限。

我在网上搜索了答案,我发现是更改 udev 文件,但这个解决方案在我的情况下不起作用,因为我需要在模块加载到内核时动态更改权限。我正在编写的模块不会总是在我的机器上运行,因此我需要它来“即时”更改权限。

major_number_firewall = register_chrdev(0, device_name_firewall, &my_file_implementation_firewall);

device_class = class_create(THIS_MODULE, class_name_firewall);

log_file_device = device_create(device_class, NULL, MKDEV(major_number_firewall, MINOR_LOG), NULL, device_name_log_file);

有更改权限的功能吗?

4

4 回答 4

4
  1. 您可以编写一个小的udev 规则来实现这一点。

  2. 如果您正在实现一个 char 设备驱动程序,那么请考虑使用misc_register()and misc_unregister()which 是上述调用的包装器(device_create()...)。参考struct miscdevice

    struct miscdevice  {
        int minor;
        const char *name;
        const struct file_operations *fops;
        struct list_head list;
        struct device *parent;
        struct device *this_device;
        const char *nodename;
        umode_t mode;
    };
    

您可以使用该成员(struct miscdevice *)->mode设置适当的权限(S_IRUGO | S_IRWXUGO | S_IALLUGO | etc ...)

希望这可以帮助。

于 2014-11-05T13:25:46.383 回答
1

我认为 Rocoder 的意思是首先使用更改设备文件的权限

int chmod(const char *path, mode_t 模式); 或 int fchmod(int fd, mode_t 模式);

在您的用户空间应用程序中。然后使用 open() 打开设备文件并执行任何操作。

另请注意:我们不能让程序 chmod 本身进入超级用户模式。这是为了确保没有非法程序控制系统。

于 2014-11-05T12:30:24.507 回答
0

你可以试试这个

#include <sys/stat.h>

int chmod(const char *path, mode_t mode); 或者 int fchmod(int fd, mode_t mode);

或在里面/etc/udev/udev.conf,

你可以修改default_mode = "0660"

于 2014-05-02T14:20:29.757 回答
0

要为您的其他设备设置权限,您可以使用模式字段,如下所示。

static struct miscdevice somedevice = {
    .minor  = MISC_DYNAMIC_MINOR,
    .name   = DEVICE_NAME,
    .fops   = &some_fops,
    .mode   = 0666,
};

这将为所有人设置读/写访问权限。要执行读/写操作,您不需要是 root。

希望这可以帮助。

于 2017-01-21T13:44:48.480 回答