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身份运行时,它可以工作。
#1 楼
您可能需要运行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
评论
还是行不通。一切已更新,/ dev / gpiomem存在,当我尝试将用户添加到gpio组时,它说它已经是成员
–JoeyCK
15/12/28在0:06
@JoeyCK:请注意,更改组成员身份不会影响已经在运行的进程。运行id列出外壳程序的当前组,如果未列出gpio,请再次登录或重新启动。
– deltab
2015年12月28日,下午3:57
@JoeyCK RPi.GPIO报告什么版本?
–琼
15年12月28日在9:00
@joan版本0.5.11
–JoeyCK
15年12月28日在14:22
Pi总是会更好地支持@mjwittering Raspbian。如果您喜欢Ubuntu,则需要在每次启动时应用更改。您可以使用crontab中的启动脚本或重新启动项自动执行此操作。
–琼
16 Mar 24 '16 at 10:25
#2 楼
我立即遇到了这个问题,并通过以下方法解决了这个问题:sudo adduser my_new_user gpio
这样,用户“ my_new_user”被添加到了gpio组中,因此, gpio组可以访问GPIO引脚。
评论
您的意思是/ dev / gpiomem(不是/ dev / mem)。
–琼
16年6月7日在20:44
实际上,如果您都查看/ dev,则会发现两个设备都存在,并且问题主题是关于/ dev / mem
–ИванАндреевичЧерногоров
16年6月7日在21:51
否。gpio组的成员无权访问/ dev / mem。
–琼
16年6月7日在21:53
是的,kmem的成员确实如此,所以解决方案很简单
–ИванАндреевичЧерногоров
16年6月8日在14:53
好的,但关键是要提供对GPIO的安全,无根访问。将用户添加到kmem组是不安全的,并且不会授予对GPIO的访问权限。
–琼
16年6月8日在15:36
#3 楼
我可以回答这个问题。sudo chown root.gpio /dev/mem
这会将
/dev/mem
的所有者和组分别更改为root
和gpio
。sudo chmod g+rw /dev/mem
然后授予组对此
/dev/mem
对象的读写权限。/dev/mem
对象基本上是系统上的整个内存空间。这意味着现在组gpio
和其中的每个人都可以读写存储空间。现在,存储空间中有很多东西,包括CPU寄存器。当您切换GPIO引脚时,您正在其中一个寄存器中更改一位。更重要的是,您需要确保正确执行操作,否则系统可能会发生严重不良事件。
为了帮助保护整个内存空间,仅将需要使用GPIO位工作的内存部分映射的电源映射到
/dev/gpiomem
。这实际上屏蔽/屏蔽了其余存储空间,防止其被访问,并且仅允许访问GPIO位。这允许访问GPIO存储器地址,并禁止该存储器的任何其他部分,例如当前任何其他程序正在使用的存储器。实际上,这在安全性和系统稳定性保护方面都造成了漏洞允许访问GPIO内容以及内存的其余部分,但仅允许Pi组成员GPIO组中的用户使用。
以后,将使用诸如
bcm2835
之类的驱动程序库和wiringPi
将进行更多更新(某些更新已经在进行中),并且基于这些工具构建的应用将得到进一步更新,然后在将来,希望所有这些GPIO麻烦不再存在。< br直到您有两个选择,打开
/dev/mem
以对gpio
进行读/写分组,或者以root用户身份运行,这对/dev/mem
的所有对象都具有完全读权限。希望如此。
当前仍然存在许多问题,您仍然需要以
root
身份运行。例如,使用依赖于node-red-contrib-dht-sensor
的node-dht-sensor
模块,后者取决于BCM2835。它使用/dev/gpiomem
进行段故障,因为它仍然在node-dht-sensor
或/dev/gpiomem
中或它们的协同工作方式中存在一些错误。我不知道是哪种情况,但最终会解决。当BCM2835以“非根”身份运行并且存在/dev/gpiomem
时,它将尝试使用/dev/gpiomem
而不是/dev/mem
,因此将/dev/mem
打开到组gpio
并没有帮助。 Bummer。#4 楼
上面的答复均未包含所有步骤。我需要完成以下步骤,以非root用户访问GPIO引脚。我必须创建一个新组,将我的用户添加到该组中,然后更改权限(如前几篇文章所述)。#5 楼
只需在终端中使用以下命令:sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem
评论
您能否提供有关此命令的解释,以及为什么它与琼的答案不同? / dev / mem和/ dev / gpiomem有什么区别?
– Greenonline
16 Mar 20 '16 at 0:15
如果可以的话,最好使用Joan的答案,但是,如果无法将/ dev / mem更改为/ dev / gpiomem,将获得与/ dev / gpiomem相同的使用/ dev / mem的权限。
– Natim
18年8月2日在14:28
当更外科的方法解决了这个问题时,提供对所有/ dev / mem的访问是不安全的。
–布莱斯
18/12/18在1:53
#6 楼
如果要在geany中进行构建,则只需更改构建命令。要编译的Java命令应为
sudo pi4j --compile "%f"
,execute命令应为是
sudo pi4j --run "%e"
评论
sudo adduser my_new_user gpio是正确的,但请记住注销并重新登录,因为更新组成员身份需要重新登录才能生效。