Uzyskaj dostęp do pinów GPIO bez rootowania. Brak dostępu do / dev / mem. Spróbuj uruchomić jako root!

34

Zrobiłem skrypt Pythona przy użyciu biblioteki RPi.GPIO. Muszę uruchomić go bez roota, ale pojawia się ten błąd podczas uruchamiania go z „python ./script.py”:

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

Przeczytałem w wielu miejscach, że nie potrzebujesz już roota z najnowszą wersją biblioteki, ale nadal pojawia się błąd po aktualizacji. Moja wersja to RPi.GPIO 0.6.0a3

Oto kod:

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)

I pełny błąd:

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!

Kiedy uruchamiam go jako root, działa.

JoeyCK
źródło
sudo adduser my_new_user gpio jest poprawny, ale pamiętaj, aby się wylogować i zalogować ponownie, ponieważ aktualizacja członkostwa w grupie wymaga ponownego zalogowania, aby stać się aktywnym.
Blindfreddy

Odpowiedzi:

49

Prawdopodobnie musisz uruchomić Raspbian, aby używać RPi.GPIO jako użytkownik inny niż root, być może musi to być również jessie.

Czy /dev/gpiomemistnieje Jeśli tak, RPi.GPIO powinno użyć tego urządzenia do uzyskania dostępu do GPIO. Jeśli /dev/gpiomemnie istnieje, spróbuj:

sudo rpi-update

aby upewnić się, że używasz najnowszego jądra, i

sudo apt-get update
sudo apt-get upgrade

aby upewnić się, że korzystasz z najnowszego RPi.GPIO.

Musisz także upewnić się, że jesteś członkiem gpiogrupy:

sudo adduser pi gpio

ZMIENIONO DO DODANIA

System Raspbian wydaje się być w stanie ciągłego przepływu. Nie jestem pewien, czy jest to problem Raspbian, czy (bardziej prawdopodobne) problem raspberrypi.org.

Sprawdź, czy / dev / gpiomem ma odpowiednie uprawnienia.

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

Jeśli nie, ustaw odpowiednie uprawnienia w następujący sposób

sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem
joan
źródło
4
Wciąż nie działa. Wszystko jest aktualizowane, / dev / gpiomem istnieje, a kiedy próbuję dodać użytkownika do grupy gpio, mówi, że jest już członkiem
JoeyCK
3
@JoeyCK: pamiętaj, że zmiana członkostwa w grupie nie wpływa na procesy, które już działały. Uruchom, idaby wyświetlić listę bieżących grup powłoki, a jeśli gpionie ma jej na liście, zaloguj się ponownie lub uruchom ponownie.
deltab
@JoeyCK Jaką wersję zgłasza RPi.GPIO?
joan
@joan wersja 0.5.11
JoeyCK
1
@mjwittering Raspbian będzie niezmiennie lepiej obsługiwany w Pi. Jeśli wolisz Ubuntu, musisz zastosować zmiany przy każdym uruchomieniu. Możesz to zrobić automatycznie za pomocą skryptu rozruchowego lub wpisu restartu w crontab.
joan
7

Miałem ten problem od razu i rozwiązałem właśnie to:

sudo adduser my_new_user gpio

Dzięki temu użytkownik „my_new_user” zostaje dodany do grupy gpio, więc wszyscy użytkownicy w grupie gpio mogą uzyskać dostęp do pinów GPIO.

Иван Андреевич Черногоров
źródło
1
Masz na myśli / dev / gpiomem (not / dev / mem).
joan
oba tak naprawdę, jeśli spojrzysz na / dev, zobaczysz, że oba urządzenia istnieją, a temat pytania dotyczył / dev / mem
Иван Андреевич Черногоров
1
Nie. Członek grupy gpio nie ma dostępu do / dev / mem.
joan
tak, członek Kmem robi, rozwiązanie jest podobne
Иван Андреевич Черногоров
2
Okej, ale chodzi o to, aby zapewnić bezpieczny, bez rootowania dostęp do GPIO. Dodanie użytkownika do grupy kmem nie jest bezpieczne i nie zapewniłoby dostępu do GPIO.
joan
5

Mogę na to odpowiedzieć.

sudo chown root.gpio /dev/mem

Zmienia to odpowiednio właściciela i grupę /dev/memna rooti gpio.

sudo chmod g+rw /dev/mem

następnie daje grupie prawo odczytu do zapisu dla tego /dev/memobiektu.

/dev/memObiekt jest w zasadzie cała przestrzeń pamięci w systemie. Oznacza to, że teraz grupa gpioi wszyscy w niej mogą czytać i zapisywać w pamięci.

Teraz w przestrzeni pamięci jest wiele rzeczy, w tym rejestry procesora. Kiedy przełączasz piny GPIO, zmieniasz nieco w jednym z tych rejestrów. Kicker polega na tym, że musisz upewnić się, że robisz to poprawnie, inaczej złe rzeczy mogą przytrafić się Twojemu systemowi.

Aby pomóc chronić całą przestrzeń pamięci, moce, które są mapowane tylko na części pamięci, do których musimy pracować z bitami GPIO /dev/gpiomem. To w efekcie maskuje / chroni pozostałą część pamięci przed dostępem i pozwala tylko na dostęp do bitów GPIO. Umożliwia to dostęp do adresów pamięci GPIO i uniemożliwia wszelkie inne części pamięci, takie jak pamięć używana obecnie przez inne programy.

W efekcie powoduje to lukę zarówno w zabezpieczeniach, jak i zabezpieczeniach stabilności systemu, aby umożliwić dostęp do rzeczy GPIO, a także reszty pamięci, ale tylko dla użytkowników w grupie GPIO, której członkiem jest Pi.

W przyszłości sterowniki, takie jak bcm2835biblioteka, wiringPizostaną zaktualizowane w większym stopniu (niektóre aktualizacje już się odbywają), a aplikacje zbudowane na tych narzędziach będą dalej aktualizowane, a następnie w przyszłości, mam nadzieję, że wszystkie te problemy GPIO będą kłopotliwe z rootowaniem znikać.

Do tego czasu masz dwie możliwości: otwórz /dev/memgrupę gpiojako odczyt / zapis lub uruchom jako root, który ma pełny odczyt zapisu do wszystkich /dev/mem.

Mam nadzieję, że to ma sens.

Obecnie nadal istnieje wiele problemów, w których nadal musisz działać jako root. Na przykład za pomocą node-red-contrib-dht-sensormodułu, który zależy od node-dht-sensor, który zależy od BCM2835. To SEG-usterek przy użyciu /dev/gpiomemjak to ma pewne błędy ciągle albo w node-dht-sensorlub w /dev/gpiomemlub sposób ich współpracy. Nie wiem, co się dzieje, ale w końcu to się rozwiąże. Gdy BCM2835 działa jako „inny niż root” i /dev/gpiomemistnieje, próbuje użyć /dev/gpiomemzamiast /dev/mem, więc otwarcie /dev/memgrupy gpionie pomaga. Bummer.

Karl Easterly
źródło
1

Wystarczy użyć następującego polecenia w terminalu:

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem
harkirat1892
źródło
2
Czy możesz wyjaśnić, co robi to polecenie i dlaczego różni się od odpowiedzi Joanny ? Jaka jest różnica między /dev/memi /dev/gpiomem?
Greenonline,
Jeśli można to lepiej użyć odpowiedzi Joan, jednak jeśli nie można zmienić /dev/mem, aby /dev/gpiomemto dostanie to samo uprawnienie do używania /dev/mem, że masz z/dev/gpiomem
Natim
Nie jest bezpieczne oferowanie dostępu do wszystkich / dev / mem, gdy bardziej chirurgiczne podejście odpowiada na pytanie.
Bryce,
1

Żadna z powyższych odpowiedzi nie obejmuje wszystkich kroków. Musiałem wykonać następujące kroki, aby uzyskać dostęp użytkownika innego niż root do styków GPIO. Musiałem utworzyć nową grupę, dodać mojego użytkownika do tej grupy, a następnie zmienić uprawnienia (jak w poprzednich postach).

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
źródło
1

Jeśli budujesz w geany, po prostu zmień polecenia kompilacji.

Polecenia Java do kompilacji powinny być

sudo pi4j --compile "%f"

i polecenie wykonania powinno być

sudo pi4j --run "%e" 
Francesca Bannister
źródło