无根访问GPIO引脚。无法访问/ dev / mem。尝试以root身份运行!


34

我已经使用RPi.GPIO库制作了一个python脚本。我需要在没有root用户的情况下运行它,但是在使用“ python ./script.py”运行它时出现此错误:

No access to /dev/mem. Try running as root!

我读过很多地方,您不再需要root才能使用该库的最新版本,但更新后仍然出现错误。我的版本是RPi.GPIO 0.6.0a3

这是代码:

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(18,GPIO.OUT)
print "LED on"
GPIO.output(18,GPIO.HIGH)
time.sleep(1)
print "LED off"
GPIO.output(18,GPIO.LOW)

和完整的错误:

pi@raspberrypi ~/Desktop/python $ python ./sensors.py
Traceback (most recent call last):
  File "./sensors.py", line 5, in <module>
    GPIO.setup(18,GPIO.OUT)
RuntimeError: No access to /dev/mem.  Try running as root!

当我以root身份运行它时,它可以工作。


sudo adduser my_new_user gpio是正确的,但请记住注销并重新登录,因为更新组成员身份需要重新登录才能生效。
Blindfreddy

Answers:


49

您可能需要运行Raspbian才能以非root用户身份使用RPi.GPIO,也可能需要是jessie。

是否/dev/gpiomem存在?如果是这样,则RPi.GPIO应该使用该设备访问GPIO。如果/dev/gpiomem不存在,请尝试:

sudo rpi-update

确保您使用的是最新内核,并且

sudo apt-get update
sudo apt-get upgrade

确保您使用的是最新的RPi.GPIO。

您还需要确保您是该gpio组的成员:

sudo adduser pi gpio

编辑添加

Raspbian系统似乎处于不断变化的状态。我不确定这是Raspbian还是(更可能是)raspberrypi.org问题。

检查/ dev / gpiomem是否具有正确的权限。

$ ls -l /dev/gpiomem
crw-rw---- 1 root gpio 244, 0 Dec 28 22:51 /dev/gpiomem

如果没有,请按照以下步骤设置正确的权限

sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem

4
还是行不通。一切都已更新,/ dev / gpiomem存在,当我尝试将用户添加到gpio组时,它说它已经是成员
JoeyCK 2015年

3
@JoeyCK:请注意,更改组成员身份不会影响已经在运行的进程。运行id以列出外壳程序的当前组,如果gpio未列出,请再次登录或重新启动。
deltab

@JoeyCK RPi.GPIO报告什么版本?
2015年

@joan版本0.5.11
JoeyCK 2015年

1
Pi总是会更好地支持@mjwittering Raspbian。如果您喜欢Ubuntu,则需要在每次启动时应用更改。您可以使用crontab中的启动脚本或重新启动项自动执行此操作。
2016年

7

我马上遇到了这个问题,并通过以下方法解决了:

sudo adduser my_new_user gpio

这样,用户“ my_new_user”将添加到gpio组,因此,gpio组中的所有用户都可以访问GPIO引脚。


1
您的意思是/ dev / gpiomem(不是/ dev / mem)。
2013年

其实两者,如果你看看到/ dev的,则将会看到两个设备存在,并且问题题目是关于的/ dev / MEM
ИванАндреевичЧерногоров

1
否。gpio组的成员无权访问/ dev / mem。
2016年

右,kmem的成员进行操作,溶液,然后是simmilar
ИванАндреевичЧерногоров

2
好的,但关键是要提供对GPIO的安全,无根访问。将用户添加到kmem组是不安全的,并且不会授予对GPIO的访问权限。
2013年

5

我可以回答。

sudo chown root.gpio /dev/mem

这将所有者和组分别更改/dev/memrootgpio

sudo chmod g+rw /dev/mem

然后授予该组对该/dev/mem对象的读写权限。

/dev/mem对象基本上是系统上的整个内存空间。这意味着现在该组gpio以及其中的每个人都可以读取和写入内存空间。

现在,内存空间中有很多东西,包括CPU寄存器。当您切换GPIO引脚时,您正在其中一个寄存器中更改一位。更重要的是,您需要确保正确执行操作,否则系统可能会发生严重不良事件。

为了帮助保护整个存储器空间,仅将需要与GPIO位配合使用的存储器部分映射的电源即可/dev/gpiomem。这实际上掩盖/屏蔽了其余存储空间,防止其被访问,并且仅允许访问GPIO位。这允许访问GPIO存储器地址,并禁止该存储器的任何其他部分,例如当前任何其他程序正在使用的存储器。

实际上,这在安全性和系统稳定性保护上都造成了漏洞,以允许访问GPIO填充以及内存的其余部分,但仅允许GPIO组(Pi属于其中)的用户访问。

将来,诸如bcm2835库之类的驱动程序wiringPi将得到更多更新(某些更新已经在进行中),并且在这些工具之上构建的应用将得到进一步更新,然后在将来,希望所有这些GPIO麻烦都可以根源解决。消失。

在此之前,您有两个选择,可以/dev/memgpio“读/写”方式打开to组,或者以“ root”身份运行,对所有都具有完全读权限/dev/mem

希望有道理。

当前仍存在许多问题,您仍需要以的身份运行root。例如,使用node-red-contrib-dht-sensor依赖于的模块,node-dht-sensor依赖于BCM2835的模块。使用seg-faults可以解决问题,/dev/gpiomem因为它仍然存在一些错误,无论它们是在内部node-dht-sensor还是在内部/dev/gpiomem或在它们一起工作的方式中。我不知道是哪种情况,但最终会解决。当BCM2835以“非根”身份运行并/dev/gpiomem存在时,它将尝试使用/dev/gpiomem而不是/dev/mem,因此打开/dev/memto组gpio无济于事。笨蛋


1

只需在终端中使用以下命令:

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem

2
您能否提供有关此命令的解释,以及为什么它与琼的答案不同?/dev/mem和之间有什么区别/dev/gpiomem
Greenonline '16

如果它可以是更好地利用琼的回答,但是如果你不能改变/dev/mem/dev/gpiomem这将让你同样的许可使用/dev/mem您有/dev/gpiomem
Natim

当更外科的方法解决了这个问题时,提供对所有/ dev / mem的访问是不安全的。
布莱斯

1

上面的答复均未包含所有步骤。我需要完成以下步骤以非root用户访问GPIO引脚。我必须创建一个新组,将用户添加到该组中,然后更改权限(如前几篇文章所述)。

sudo groupadd gpio
sudo usermod -a -G gpio user_name
sudo grep gpio /etc/group
sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.