Ядро Linux: установка разрешений для файла /dev, который был создан с помощью create_device()

Я делаю небольшой модуль Linux, который является драйвером для устройства char. В моем коде я создаю класс устройства, а не само устройство и, таким образом, в моей системе создается файл / dev. проблема в том, что файл / dev имеет только корневые разрешения, а пользователь не имеет ни прав чтения, ни записи, ни выполнения этого файла, я хотел бы изменить разрешения файла / 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 ответа

  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 | и т.д...)

надеюсь это поможет.

Чтобы установить разрешение для вашего устройства misc, вы можете использовать поле режима следующим образом.

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

Это установит доступ для чтения / записи ко всем. Для выполнения операции чтения / записи вам не нужно быть пользователем root.

Надеюсь это поможет.

Я думаю, что Rocoder имел в виду сначала изменить права доступа к файлу вашего устройства с помощью

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

в вашем приложении пространства пользователя. Затем откройте файл устройства с помощью open() и сделайте что угодно.

также обратите внимание: у нас не может быть программы chmod самой в режиме суперпользователя внутри себя. Это сделано для того, чтобы никакая нелегальная программа не завладела системой.

Вы можете попробовать это

#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"

Другие вопросы по тегам