Greifen Sie auf GPIO-Pins ohne Root zu. Kein Zugriff auf / dev / mem. Versuchen Sie es als root!

34

Ich habe ein Python-Skript mit der RPi.GPIO-Bibliothek erstellt. Ich muss es ohne root ausführen, aber ich bekomme diesen Fehler, wenn ich es mit "python ./script.py" ausführe:

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

Ich habe an vielen Stellen gelesen, dass Sie mit der neuesten Version der Bibliothek kein root mehr benötigen, aber nach dem Update erhalte ich immer noch den Fehler. Die Version, die ich habe, ist RPi.GPIO 0.6.0a3

Hier ist der Code:

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)

Und der volle Fehler:

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!

Wenn ich es als root ausführe, funktioniert es.

JoeyCK
quelle
sudo adduser my_new_user gpio ist korrekt, aber denken Sie daran, sich aus- und wieder einzuloggen, da für die Aktualisierung der Gruppenmitgliedschaft eine erneute Anmeldung erforderlich ist, um aktiv zu werden.
Blindfreddy

Antworten:

49

Sie müssen wahrscheinlich Raspbian ausführen, um RPi.GPIO als Nicht-Root-Benutzer zu verwenden. Möglicherweise muss es sich auch um Jessie handeln.

Gibt /dev/gpiomemes In diesem Fall sollte RPi.GPIO dieses Gerät verwenden, um auf das GPIO zuzugreifen. Wenn /dev/gpiomemnicht vorhanden, versuchen Sie:

sudo rpi-update

um sicherzustellen, dass Sie einen aktuellen Kernel verwenden, und

sudo apt-get update
sudo apt-get upgrade

um sicherzustellen, dass Sie ein aktuelles RPi.GPIO verwenden.

Sie müssen außerdem sicherstellen, dass Sie Mitglied der gpioGruppe sind:

sudo adduser pi gpio

BEARBEITET ZUM HINZUFÜGEN

Das Raspbian-System scheint sich im Fluss zu befinden. Ich bin nicht sicher, ob es sich um ein Raspbian- oder (wahrscheinlicher) ein raspberrypi.org-Problem handelt.

Stellen Sie sicher, dass / dev / gpiomem die richtigen Berechtigungen hat.

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

Wenn dies nicht der Fall ist, stellen Sie die richtigen Berechtigungen wie folgt ein

sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem
joan
quelle
4
Funktioniert immer noch nicht. Alles ist aktualisiert, / dev / gpiomem existiert und wenn ich versuche, den Benutzer zur gpio-Gruppe hinzuzufügen, heißt es, dass er bereits Mitglied ist
JoeyCK
3
@JoeyCK: Beachten Sie, dass sich das Ändern der Gruppenmitgliedschaft nicht auf Prozesse auswirkt, die bereits ausgeführt wurden. Führen idSie den Befehl aus, um die aktuellen Gruppen Ihrer Shell gpioaufzulisten. Wenn dies nicht der Fall ist, melden Sie sich erneut an oder starten Sie den Computer neu.
Deltab
@JoeyCK Welche Version wird von RPi.GPIO gemeldet?
28.
@joan version 0.5.11
JoeyCK
1
@mjwittering Raspbian wird auf dem Pi immer besser unterstützt. Wenn Sie Ubuntu bevorzugen, müssen Sie die Änderungen bei jedem Start anwenden. Sie können dies automatisch mit einem Boot-Skript oder einem Neustart-Eintrag in einer Crontab durchführen.
Joan
7

Ich hatte dieses Problem sofort und löste es einfach so:

sudo adduser my_new_user gpio

Damit wird der Benutzer "my_new_user" zur gpio-Gruppe hinzugefügt, sodass alle Benutzer in der gpio-Gruppe auf die GPIO-Pins zugreifen können.

Иван Андреевич Черногоров
quelle
1
Du meinst / dev / gpiomem (nicht / dev / mem).
Joan
beide tatsächlich, wenn Sie in / dev schauen, werden Sie sehen, dass beide Geräte existieren und das Fragethema war / dev / mem
Иван Андреевич Черногоров
1
Nein. Ein Mitglied der Gruppe gpio hat keinen Zugriff auf / dev / mem.
Joan
Richtig, Mitglied von kmem tut, die Lösung ist dann ähnlich
Иван Андреевич Черногоров
2
Okay, aber es geht darum, einen sicheren, wurzellosen Zugriff auf das GPIO zu gewähren. Das Hinzufügen eines Benutzers zur Gruppe kmem ist nicht sicher und bietet keinen Zugriff auf das GPIO.
Joan
5

Ich kann das beantworten.

sudo chown root.gpio /dev/mem

Dadurch ändert sich die Eigentümer und die Gruppe /dev/memzu rootund gpiosind.

sudo chmod g+rw /dev/mem

Anschließend erhält die Gruppe Lese- und Schreibzugriff auf dieses /dev/memObjekt.

Das /dev/memObjekt ist im Grunde der gesamte Speicherplatz auf dem System. Dies bedeutet, dass jetzt die Gruppe gpiound jeder in ihr den Speicherplatz lesen und beschreiben kann.

Im Speicherbereich befinden sich nun viele Dinge, einschließlich der CPU-Register. Wenn Sie die GPIO-Pins umschalten, ändern Sie ein wenig in einem dieser Register. Der Kicker ist, Sie müssen sicher sein, dass Sie es richtig machen, oder es können schlimme schlimme Dinge mit Ihrem System passieren.

Um den gesamten Speicherplatz zu schützen, werden die zuzuordnenden Kräfte nur den Speicherteilen zugeordnet, an denen wir mit den GPIO-Bits arbeiten müssen /dev/gpiomem. Dies maskiert / schützt den restlichen Speicherplatz vor dem Zugriff und ermöglicht nur den Zugriff auf die GPIO-Bits. Dies ermöglicht den Zugriff auf die GPIO-Speicheradressen und sperrt alle anderen Teile des Speichers, z. B. den Speicher, der derzeit von anderen Programmen verwendet wird.

Tatsächlich ist dies eine Lücke in den Sicherheits- und Systemstabilitätsschutz, um den Zugriff auf die GPIO-Inhalte sowie den Rest des Speichers zu ermöglichen, jedoch nur für die Benutzer in der Gruppe GPIO, bei der Pi Mitglied ist.

In Zukunft werden Treiber wie die bcm2835Bibliothek und wiringPimehr aktualisiert (einige Aktualisierungen finden bereits statt) und die Apps, die auf diesen Tools basieren, werden weiter aktualisiert, und in Zukunft wird hoffentlich all dieser GPIO-Aufwand als Root auftreten verschwinden.

Bis dahin haben Sie zwei Möglichkeiten: Öffnen Sie die /dev/memGruppe "to" gpioals "read / write" oder führen Sie sie als "root" aus, bei der "read write" für alle ausgeführt wird /dev/mem.

Hoffe das macht Sinn.

Derzeit gibt es noch viele Probleme, unter denen Sie noch ausgeführt werden müssen root. Zum Beispiel mit dem node-red-contrib-dht-sensorModul, das von dem abhängt node-dht-sensor, das von BCM2835 abhängt. Es kann Fehler verursachen, /dev/gpiomemda es noch einige Fehler in node-dht-sensoroder in /dev/gpiomemder Art und Weise hat, wie sie zusammenarbeiten. Ich weiß nicht, was der Fall ist, aber irgendwann wird es klappen. Wenn BCM2835 als "Nicht-Root" ausgeführt wird und/dev/gpiomem vorhanden ist, wird dies /dev/gpiomemanstelle von verwendet /dev/mem. Das Öffnen der /dev/memGruppe "Zu" gpiohilft also nicht. Schade.

Karl Osterlich
quelle
1

Verwenden Sie einfach den folgenden Befehl im Terminal:

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem
harkirat1892
quelle
2
Können Sie erklären, was dieser Befehl bewirkt und warum er sich von der Antwort von Joan unterscheidet ? Was ist der Unterschied zwischen /dev/memund /dev/gpiomem?
Greenonline
Wenn Sie es können, ist es besser, Joans Antwort zu verwenden. Wenn Sie dies jedoch nicht ändern können /dev/mem, /dev/gpiomemerhalten Sie die gleiche Erlaubnis, /dev/memdie Sie für die Verwendung haben/dev/gpiomem
Natim
Es ist unsicher, Zugriff auf / dev / mem zu gewähren, wenn ein chirurgischer Ansatz die Frage beantwortet.
Bryce
1

Keine der obigen Antworten enthält alle Schritte. Ich musste die folgenden Schritte ausführen, um nicht-root-Zugriff auf die GPIO-Pins zu erhalten. Ich musste eine neue Gruppe erstellen, meinen Benutzer dieser Gruppe hinzufügen und dann die Berechtigungen ändern (wie in den vorherigen Beiträgen).

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
Mark Tyers
quelle
1

Wenn Sie in Geany bauen, ändern Sie einfach die Build-Befehle.

Die zu kompilierenden Java-Befehle sollten sein

sudo pi4j --compile "%f"

und der Ausführungsbefehl sollte sein

sudo pi4j --run "%e" 
Francesca Bannister
quelle