Accedi ai pin GPIO senza root. Nessun accesso a / dev / mem. Prova a correre come root!


34

Ho realizzato uno script Python usando la libreria RPi.GPIO. Devo eseguirlo senza root ma ottengo questo errore quando lo eseguo con "python ./script.py":

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

Ho letto in molti punti che non è più necessario eseguire il root con l'ultima versione della libreria, ma dopo l'aggiornamento ho ancora visualizzato l'errore. La versione che ho è RPi.GPIO 0.6.0a3

Ecco il codice:

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)

E l'errore completo:

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!

Quando lo eseguo come root funziona.


sudo adduser my_new_user gpio è corretto ma ricordati di disconnetterti e riconnetterti perché l'aggiornamento dell'appartenenza al gruppo richiede un nuovo accesso per diventare attivo.
Blindfreddy

Risposte:


49

Probabilmente devi eseguire Raspbian per usare RPi.GPIO come utente non root, probabilmente deve essere anche jessie.

Esiste /dev/gpiomem? In tal caso RPi.GPIO dovrebbe utilizzare questo dispositivo per accedere a GPIO. Se /dev/gpiomemnon esiste provare:

sudo rpi-update

per essere sicuro di usare un kernel recente e

sudo apt-get update
sudo apt-get upgrade

per essere sicuro di utilizzare un RPi.GPIO recente.

Dovrai anche assicurarti di essere un membro del gpiogruppo:

sudo adduser pi gpio

MODIFICATO PER AGGIUNGERE

Il sistema Raspbian sembra essere in uno stato di flusso. Non sono sicuro che si tratti di un problema di Raspbian o (più probabilmente) di raspberrypi.org.

Verifica che / dev / gpiomem disponga delle autorizzazioni corrette.

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

In caso contrario, impostare le autorizzazioni corrette come segue

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

4
Continua a non funzionare. Tutto è aggiornato, / dev / gpiomem esiste e quando provo ad aggiungere l'utente al gruppo gpio dice che è già un membro
JoeyCK,

3
@JoeyCK: notare che la modifica dell'appartenenza al gruppo non influisce sui processi che erano già in esecuzione. Esegui idper elencare i gruppi correnti della shell e, se gpionon è elencato, accedere nuovamente o riavviare.
deltab,

@JoeyCK Quale versione è riportata da RPi.GPIO?
joan,

@joan versione 0.5.11
JoeyCK,

1
@mjwittering Raspbian sarà invariabilmente supportato meglio sul Pi. Se preferisci Ubuntu dovrai applicare le modifiche ad ogni avvio. Potresti farlo automaticamente con uno script di avvio o una voce di riavvio in un crontab.
joan

7

Ho avuto subito questo problema e ho risolto proprio questo:

sudo adduser my_new_user gpio

Con questo, l'utente "my_new_user" viene aggiunto al gruppo gpio, quindi tutti gli utenti del gruppo gpio possono accedere ai pin GPIO.


1
Intendi / dev / gpiomem (non / dev / mem).
joan

entrambi in realtà, se guardi in / dev vedrai che entrambi i dispositivi esistono, e l'argomento della domanda era su / dev / mem
Иван Андреевич Черногоров

1
No. Un membro del gruppo gpio non ha accesso a / dev / mem.
joan

giusto, membro di kmem, la soluzione è simile
Иван Андреевич Черногоров

2
Va bene, ma il punto è dare accesso sicuro, senza root, al GPIO. L'aggiunta di un utente al gruppo kmem non è sicura e non consentirebbe l'accesso al GPIO.
joan

5

Posso rispondere a questo.

sudo chown root.gpio /dev/mem

Questo cambia il proprietario e il gruppo di /dev/memal roote gpio, rispettivamente.

sudo chmod g+rw /dev/mem

quindi fornisce al gruppo l'accesso in lettura e scrittura a questo /dev/memoggetto.

L' /dev/memoggetto è sostanzialmente l'intero spazio di memoria sul sistema. Ciò significa che ora il gruppo gpio, e tutti gli utenti, possono leggere e scrivere nello spazio di memoria.

Ora, nello spazio di memoria ci sono molte cose, inclusi i registri della CPU. Quando si attivano i pin GPIO, si cambia un po 'in uno di questi registri. Il kicker è che devi essere sicuro di farlo correttamente o che nel tuo sistema possono accadere cose brutte.

Per proteggere l'intero spazio di memoria, i poteri che devono essere mappati solo sulle parti di memoria a cui dobbiamo lavorare con i bit GPIO /dev/gpiomem. Ciò in effetti maschera / protegge il resto dello spazio di memoria dall'accesso e consente l'accesso solo ai bit GPIO. Ciò consente l'accesso agli indirizzi di memoria GPIO e non consente altre parti della memoria, come la memoria attualmente utilizzata da altri programmi.

In effetti, ciò crea un buco nelle protezioni di sicurezza e stabilità del sistema per consentire l'accesso alle cose GPIO, così come il resto della memoria, ma solo agli utenti del gruppo GPIO, di cui Pi è membro.

In futuro, driver come la bcm2835libreria e wiringPiverranno aggiornati di più (alcuni aggiornamenti sono già in corso) e le app che si basano su tali strumenti verranno ulteriormente aggiornate e, in futuro, si spera che tutta questa seccatura di GPIO come root sarà scompaiono.

Fino ad allora hai due scelte, apri il /dev/memgruppo to gpiocome lettura / scrittura o esegui come root, che ha la lettura completa in scrittura su tutti /dev/mem.

Spero che abbia un senso.

Al momento ci sono ancora molti problemi in cui è ancora necessario eseguire il comando root. Ad esempio, utilizzando il node-red-contrib-dht-sensormodulo, che dipende da node-dht-sensor, che dipende da BCM2835. Segrega i guasti usando /dev/gpiomemcome ha ancora alcuni bug nel node-dht-sensoro nel /dev/gpiomemmodo in cui lavorano insieme. Non so quale sia il caso, ma alla fine verrà risolto. Quando BCM2835 viene eseguito come "non root" ed /dev/gpiomemesiste, tenta di utilizzare /dev/gpiomeminvece di /dev/mem, quindi aprire il /dev/memgruppo to gpionon aiuta. Bummer.


1

Basta usare il seguente comando nel terminale:

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

2
Potresti fornire una spiegazione su cosa fa questo comando e perché differisce dalla risposta di Joan ? Qual è la differenza tra /dev/meme /dev/gpiomem?
Greenonline

Se puoi, è meglio usare la risposta di Joan, tuttavia se non riesci a passare /dev/mema /dev/gpiomemquesto ti otterrà la stessa autorizzazione per l'uso /dev/memche hai con/dev/gpiomem
Natim

Non è sicuro offrire l'accesso a tutti / dev / mem, quando un approccio più chirurgico risponde alla domanda.
Bryce,

1

Nessuna delle risposte sopra include tutti i passaggi. Avevo bisogno di completare i seguenti passaggi per ottenere l'accesso non root ai pin GPIO. Ho dovuto creare un nuovo gruppo, aggiungere il mio utente a questo gruppo, quindi modificare le autorizzazioni (come nei post precedenti).

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

1

Se stai costruendo in geany basta cambiare i comandi build.

I comandi Java da compilare dovrebbero essere

sudo pi4j --compile "%f"

e il comando di esecuzione dovrebbe essere

sudo pi4j --run "%e" 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.