Ядро 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 ответа
Вы можете написать небольшие правила Udev для достижения этой цели.
Если вы реализуете драйвер устройства с символами, подумайте об использовании
misc_register()
а такжеmisc_unregister()
который является оберткой над вышеуказанными вызовами (device_create()
...). Обратитесь к struct miscdevicestruct 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"