Linux内核:设置通过create_device()创build的/ dev文件的权限

我正在做一个小型的linux模块,它是一个字符设备的驱动程序。 在我的代码中,我创build了设备类,而不是它自己的设备,因此在我的系统中创build了一个/ dev文件。 问题是/ dev文件只有root权限,用户既没有读,也没有写或执行该文件的权限,我想改变/ dev文件的权限。

我已经search了networking上的答案,我发现是改变了udev文件,但是这个解决scheme在我的情况下是行不通的,因为我需要权限来dynamic地改变模块加载到内核的时间。 我正在写的模块不会总是在我的机器上运行,因此我需要它来“更改”权限。

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); 

有没有更改权限的function?

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

  2. 如果你正在实现一个字符设备驱动程序,那么可以考虑使用misc_register()misc_unregister()来覆盖上面的调用( 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 …)

希望这可以帮助。

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

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

在你的用户空间应用程序。 然后用open()打开设备文件并做任何事情。

还要注意:我们的程序chmod本身不能超级用户模式。 这是为了确保没有非法程序占用系统。

你可以试试这个

#include <sys/stat.h>

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

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

你可以修改default_mode = "0660"

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

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

这将设置读/写访问所有。 要执行读/写操作,您不需要是root用户。

希望这可以帮助。