以非root身份访问GPIO(/ sys / class / gpio)

时间:2015-06-19 13:07:54

标签: bash raspberry-pi chmod chown raspberry-pi2

默认情况下,/sys/class/gpio只能以root进行访问。所以我喜欢新的gpio组可以使用/sys/class/gpio下的文件和目录。为实现这一点,我将以下行添加到/etc/rc.local(我在Debian上):

sudo chown root:gpio /sys/class/gpio/unexport /sys/class/gpio/export
sudo chmod 220 /sys/class/gpio/unexport /sys/class/gpio/export

因此,这为所有gpio组成员提供了写入权限。所以他们现在可以exportunexport很好。

问题是他们无法在export(e.x。/sys/class/gpio/gpio17)之后读取/写入特定的pin文件,因为这些文件再次归root:root所有。

如何更改它们默认创建为root:gpio?我的意思是每次导出引脚时我都可以手动执行此操作。但那有点不舒服。

更新

根据larsks的回答,我创建了缺少的规则文件。现在它部分有效:

-rwxrwx---  1 root gpio 4096 Jun 19 16:48 export
lrwxrwxrwx  1 root gpio    0 Jun 19 16:51 gpio17 -> ../../devices/soc/3f200000.gpio/gpio/gpio17
lrwxrwxrwx  1 root gpio    0 Jun 19 16:45 gpiochip0 -> ../../devices/soc/3f200000.gpio/gpio/gpiochip0
-rwxrwx---  1 root gpio 4096 Jun 19 16:45 unexport

但对于./gpio17/,我仍然得到root:root

-rw-r--r-- 1 root root 4096 Jun 19 16:52 active_low
lrwxrwxrwx 1 root root    0 Jun 19 16:52 device -> ../../../3f200000.gpio
-rw-r--r-- 1 root root 4096 Jun 19 16:52 direction
-rw-r--r-- 1 root root 4096 Jun 19 16:52 edge
drwxr-xr-x 2 root root    0 Jun 19 16:52 power
lrwxrwxrwx 1 root root    0 Jun 19 16:52 subsystem -> ../../../../../class/gpio
-rw-r--r-- 1 root root 4096 Jun 19 16:52 uevent
-rw-r--r-- 1 root root 4096 Jun 19 16:52 value

更新2

好的,我解决了这个问题。因为我在RaspbianInstaller上安装了Raspbian,所以我从来没有通过raspi-config工具。这似乎是一个问题。因为我也错过了/sys/device/virtual/gpio/文件夹。

我在这里遵循了这个指南:http://www.element14.com/community/message/139528/l/re-piface-digital-2--setup-and-use#139528

之后权限也是正确的(即使是针脚文件夹及其文件valuedirection,...)。

5 个答案:

答案 0 :(得分:8)

您可以使用udev规则执行此操作,这些规则可以定义在内核实例化新设备时要执行的操作。 Raspberry Pi设备的Raspbian发行版的当前版本在/etc/udev/rules.d/99-com.rules中包含以下内容:

SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio; chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio'"

这可确保/sys/class/gpio组成员始终可以使用gpio下的条目:

# ls -lL /sys/class/gpio/
total 0
-rwxrwx--- 1 root gpio 4096 May  6 23:36 export
drwxrwx--- 2 root gpio    0 Jan  1  1970 gpiochip0
-rwxrwx--- 1 root gpio 4096 May  6 23:37 unexport
# echo 11 > /sys/class/gpio/export 
# ls -lL /sys/class/gpio/
total 0
-rwxrwx--- 1 root gpio 4096 May  6 23:37 export
drwxrwx--- 2 root gpio    0 May  6 23:37 gpio11
drwxrwx--- 2 root gpio    0 Jan  1  1970 gpiochip0
-rwxrwx--- 1 root gpio 4096 May  6 23:37 unexport

<强>更新

各个引脚的权限也是正确的:

# ls -Ll /sys/class/gpio/gpio11/
total 0
-rwxrwx--- 1 root gpio 4096 May  6 23:37 active_low
drwxr-xr-x 3 root root    0 May  6 23:36 device
-rwxrwx--- 1 root gpio 4096 May  6 23:37 direction
-rwxrwx--- 1 root gpio 4096 May  6 23:37 edge
drwxrwx--- 2 root gpio    0 May  6 23:37 subsystem
-rwxrwx--- 1 root gpio 4096 May  6 23:37 uevent
-rwxrwx--- 1 root gpio 4096 May  6 23:37 value

答案 1 :(得分:8)

4.x内核的更常见规则将是以下

SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'find -L /sys/class/gpio/ -maxdepth 2 -exec chown root:gpio {} \; -exec chmod 770 {} \; || true'"

如果路径中存在符号链接,则初始答案中的规则将无法选择导出的gpio

UPD 请记住,当您通过sysfs导出某些GPIO时,您应该等到udev规则触发并完成,然后才能获得所需的访问权限。在我尝试访问GPIO文件之前,对我有用的事情是睡眠大约100毫秒。

答案 2 :(得分:1)

通过@ roman-savrulin扩展答案,这是一个简单的版本。

无需对REMOVE事件运行规则,仅对ADD事件运行。也不需要运行“ find”,因为udev环境将提供包含新GPIO引脚文件的sysfs目录的确切路径。您还可以使用“ chgrp”仅更改拥有的组,并使用“ chmod”中的符号模式仅添加组写入权限位。

在尝试打开图钉的文件之前,您仍然必须等待规则处理完成,但是该过程应以更简单的规则(仅涉及所需的最小文件数)来更快地完成。

SUBSYSTEM=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chgrp -R gpio /sys/${DEVPATH} && chmod -R g+w /sys/${DEVPATH}'"

答案 3 :(得分:0)

检查您所属的组:

userk@dopamine $: groups
userk sudo dialout

如果您属于以下拨出电话,则不注释。

userk@dopamine $: ls -l /dev/gpiomem 
crw------- root root /dev/gpiomem

此文件镜像与GPIO设备关联的内存。该命令的输出表示文件的所有者是root用户,“拥有”该文件的组是root用户。这10个字符代表文件类型和与其相关的权限。当前配置允许文件所有者读取和写入文件。

enter image description here

如果您想控制gpios,则希望能够读写该文件。

一种选择是修改群组所有者,使其与您所属的群组所有者匹配(在我的情况下为拨出),然后设置权限,以允许该群组的所有用户读写文件。

长话短说:

userk@dopamine $: sudo chown root:dialout /dev/gpiomem
userk@dopamine $: sudo chmod 660 /dev/gpiomem

等等!此设置不会永久保留,并且在重启后将消失。

有关此主题的更多信息,请参见此post

答案 4 :(得分:0)

对于 Ubuntu 运行。

sudo apt install rpi.gpio-common