Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to write on /dev/* files

I'm writing a basic char device driver for Linux kernel. For this, the code flow I have considered is as follows:

  1. alloc_chrdev_region() -> to use dynamic allocation of major number
  2. class_create() -> to create device class in sysfs
  3. device_creat() -> to create device under /dev/
  4. cdv_init() -> to initialize char device structure
  5. cdev_add() -> to add my device structure in kernel

I have added read, write, open, release methods in code.

When I try to read device file under /dev/ my read method is called. But when I try to write on /dev/ file using echo it gives error

"bash: /dev/scull: Permission denied"

I have checked permissions of file using ls -l, and I have permissions to read or write on this file.

This problem occurs for every device driver module I have written. It works well in on another machine.

I'm working on ubuntu 15.10, custom compiled kernel 4.3.0

  1. the result of ls -l /dev/scull:

    crw------- 1 root root 247, 0 Dec 30 18:06 /dev/scull
    
  2. the exact command I used to open the file

    $ sudo echo 54 > /dev/scull
    
  3. the source code for the open implementation

    ssize_t scull_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){
         pr_alert("Device Written\n");
         return 0;
    }
    

Behavior I'm seeking here is, I should be able to see 'Device Written' in dmesg ouput?

like image 246
hiabcwelcome Avatar asked Dec 30 '15 03:12

hiabcwelcome


3 Answers

I assume that you are normally not root on your bash shell. Then this command line

sudo echo 54 > /dev/scull

does not what you think. The command is executed in two steps:

  1. The bash setups the output redirection, i.e., it tries to open /dev/scull with the current user privileges.
  2. The command sudo echo 54 is executed whereas stdout is connected to the file.

As you have no write-permissions as non-root user, the first step fails and the bash reports

"bash: /dev/scull: Permission denied"

You must already be root to setup the output redirection. Thus execute

sudo -i

which gives you an interactive shell with root privileges. The you can execute

echo 54 > /dev/scull

within that root shell.

like image 123
Martin Zabel Avatar answered Sep 30 '22 05:09

Martin Zabel


I wanted to note that on your system only root (file owner) has read / write permissions. Your (normal) user account has not! So another (fast) solution would be to give all users read / write permissions.

Probably this is not the safest solution! Only do this in your test environment!

sudo chmod a+rw /dev/scull

But now you test your module with your user account (without sudo)

echo "hello, world!" > /dev/scull
cat < /dev/scull

like image 27
Niklas Avatar answered Sep 30 '22 04:09

Niklas


I know the thread is too old to answer but just in case if someone wants to know alternative method without switching to root user, here is the solution:

sudo bash -c 'echo "54" > /dev/my_dev'
like image 21
Anamika Lall Avatar answered Sep 30 '22 06:09

Anamika Lall