ファイアウォールの実装の一部として、次のように定義された属性を使用してsysfsデバイスを実装しています。
#define FILE_PERMISSIONS S_IWUSR | S_IRUGO
static DEVICE_ATTR(sysfs_att, FILE_PERMISSIONS, display, modify);
ファイルの読み込みに問題はありません。
cat /sys/class/secws_class/secws_class_secws_device/sysfs_att
ただし、変更(保存)操作をサポートしているため、次のコマンドを使用してデバイスと対話する予定です。
echo "0" > /sys/class/secws_class/secws_class_secws_device/sysfs_att
しかし、これにより
-bash: /sys/class/secws_class/secws_class_secws_device/sysfs_att: Permission denied
sudoで使用している場合でもこれが発生しますtee
。また、sysファイルに正しい権限があり、ユーザーへの書き込み権限があることも確認しました。
既に試した以外に、この問題を処理する新しい方法が見つかりません。もしかしたらアイデアはありますか?
編集:あなたの要求に応じて、ログは次のようになります。
fw@fw-VirtualBox:~/HW2$ make
make -C /lib/modules/4.15.0-118-generic/build M=/home/fw/HW2 modules
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-118-generic'
LD [M] /home/fw/HW2/hw2secws.o
Building modules, stage 2.
MODPOST 1 modules
LD [M] /home/fw/HW2/hw2secws.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-118-generic'
fw@fw-VirtualBox:~/HW2$ sudo insmod hw2secws.ko
fw@fw-VirtualBox:~/HW2$ cat /sys/class/secws_class/secws_class_secws_device/sysfs_att
358310
fw@fw-VirtualBox:~/HW2$ echo "0" | sudo tee /sys/class/secws_class/secws_class_secws_device/sysfs_att
0
tee: /sys/class/secws_class/secws_class_secws_device/sysfs_att: Operation not permitted
fw@fw-VirtualBox:~/HW2$ echo "0" > /sys/class/secws_class/secws_class_secws_device/sysfs_att
-bash: /sys/class/secws_class/secws_class_secws_device/sysfs_att: Permission denied
fw@fw-VirtualBox:~/HW2$ ls -l /sys/class/secws_class/secws_class_secws_device/sysfs_att
-rw-r--r-- 1 root root 4096 נוב 8 21:25 /sys/class/secws_class/secws_class_secws_device/sysfs_att
fw@fw-VirtualBox:~/HW2$ sudo chown fw /sys/class/secws_class/secws_class_secws_device/sysfs_att
fw@fw-VirtualBox:~/HW2$ ls -l /sys/class/secws_class/secws_class_secws_device/sysfs_att
-rw-r--r-- 1 fw root 4096 נוב 8 21:25 /sys/class/secws_class/secws_class_secws_device/sysfs_att
fw@fw-VirtualBox:~/HW2$ echo "0" | sudo tee /sys/class/secws_class/secws_class_secws_device/sysfs_att
0
tee: /sys/class/secws_class/secws_class_secws_device/sysfs_att: Operation not permitted
fw@fw-VirtualBox:~/HW2$ echo "0" > /sys/class/secws_class/secws_class_secws_device/sysfs_att
-bash: echo: write error: Operation not permitted
そしてMRE:
static int major_number;
static struct class* sysfs_class = NULL;
static struct device* sysfs_device = NULL;
static struct file_operations fops = {
.owner = THIS_MODULE
}
ssize_t display(struct device *dev, struct device_attribute *attr, char *buf){
...
}
ssize_t modify(struct device *dev, struct device_attribute *attr, const char *buff, size_t data_size)
{
...
}
#define FILE_PERMISSIONS S_IWUSR | S_IRUGO
static DEVICE_ATTR(sysfs_att, FILE_PERMISSIONS, display, modify);
int init_sysfs_module(void){
/* Register Char-Device */
major_number = register_chrdev(0, CHRDEV_NAME, &fops);\
if (major_number < 0)
return -1;
/* Create Sysfs-Class */
sysfs_class = class_create(THIS_MODULE, CLASS_NAME);
if (IS_ERR(sysfs_class))
{
unregister_chrdev(major_number, CHRDEV_NAME);
return -1;
}
/* Link DEVICE_NAME to sysfs_class */
sysfs_device = device_create(sysfs_class, NULL, MKDEV(major_number, 0), NULL, DEVICE_NAME);
if (IS_ERR(sysfs_device))
{
class_destroy(sysfs_class);
unregister_chrdev(major_number, CHRDEV_NAME);
return -1;
}
/* Modify the device to use defined show/store methods */
if (device_create_file(sysfs_device, (const struct device_attribute *)&dev_attr_sysfs_att.attr))
{
device_destroy(sysfs_class, MKDEV(major_number, 0));
class_destroy(sysfs_class);
unregister_chrdev(major_number, CHRDEV_NAME);
return -1;
}
return 0;
}
void deinit_sysfs_module(void){
device_remove_file(sysfs_device, (const struct device_attribute *)&dev_attr_sysfs_att.attr);
device_destroy(sysfs_class, MKDEV(major_number, 0));
class_destroy(sysfs_class);
unregister_chrdev(major_number, CHRDEV_NAME);
}
static int __init module_init_function(void) {
init_sysfs_module();
HANDLE_NF_HOOKS(REGISTER_NF_HOOKS);
return 0;
}
static void __exit module_exit_function(void) {
deinit_sysfs_module();
HANDLE_NF_HOOKS(CLEAR_NF_HOOKS);
}
module_init(module_init_function);
module_exit(module_exit_function);
編集2:私も次のことを試しました。
fw@fw-VirtualVox:~/HW2$ sudo su -
root@fw-VirtualBox:~# echo "0" > /sys/class/secws_class/secws_class_secws_device/sysfs_att
-sw: echo: write error: Operation not permitted