Доступ к контактам GPIO без рута. Нет доступа к / dev / mem. Попробуйте запустить как root!

34

Я сделал скрипт на Python, используя библиотеку RPi.GPIO. Мне нужно запустить его без рута, но я получаю эту ошибку при запуске с "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, он работает.

JoeyCK
источник
sudo adduser my_new_user gpio верен, но не забудьте выйти из системы и войти обратно, потому что обновление членства в группе требует повторного входа в систему, чтобы стать активным.
Слепой Фред

Ответы:

49

Возможно, вам нужно запустить Raspbian, чтобы использовать RPi.GPIO от имени пользователя, не являющегося пользователем root, возможно, это должна быть и Джесси.

Существует /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 или (более вероятно) 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 28.12.15
3
@JoeyCK: обратите внимание, что изменение членства в группе не влияет на уже запущенные процессы. Запустите, idчтобы увидеть список текущих групп вашей оболочки, и, если их gpioнет в списке, войдите в систему или перезагрузите компьютер.
Deltab
@JoeyCK О какой версии сообщает RPi.GPIO?
Джоан
@ Joan версия 0.5.11
JoeyCK
1
@mjwittering Raspbian всегда будет лучше поддерживаться на Pi. Если вы предпочитаете Ubuntu, вам нужно применять изменения при каждой загрузке. Вы можете сделать это автоматически с помощью загрузочного скрипта или записи перезагрузки в crontab.
Джоан
7

У меня была эта проблема сразу и решил именно с этим:

sudo adduser my_new_user gpio

При этом пользователь «my_new_user» добавляется в группу gpio, поэтому все пользователи в группе gpio могут получить доступ к контактам GPIO.

Иван Андреевич Черногоров
источник
1
Вы имеете в виду / dev / gpiomem (не / dev / mem).
Джоан
и на самом деле, если вы загляните в / dev, то увидите, что оба устройства существуют, и тема вопроса была о / dev / mem
Иван Андреевич Черногоров
1
Нет. Член группы gpio не имеет доступа к / dev / mem.
Джоан
верно, член kmem делает, решение тогда однозначное
Иван Андреевич Черногоров
2
Хорошо, но дело в том, чтобы предоставить безопасный, без root доступ к GPIO. Добавление пользователя в группу kmem небезопасно и не даст доступа к GPIO.
Джоан
5

Я могу ответить на это.

sudo chown root.gpio /dev/mem

Это меняет владельца и группу /dev/memна rootи gpioсоответственно.

sudo chmod g+rw /dev/mem

затем дает группе право на чтение и запись для этого /dev/memобъекта.

/dev/memОбъект в основном все пространство памяти в системе. Это означает, что теперь группа gpio, и все в ней, могут читать и записывать в область памяти.

Теперь в пространстве памяти много вещей, включая регистры процессора. Когда вы переключаете контакты GPIO, вы меняете немного в одном из этих регистров. Важно то, что вы должны быть уверены, что делаете все правильно, иначе с вашей системой могут случиться плохие вещи.

Чтобы помочь защитить все пространство памяти, мощности, которые должны быть сопоставлены только частям памяти, с которыми нам нужно работать с битами GPIO /dev/gpiomem. Это фактически маскирует / экранирует остальную часть пространства памяти от доступа и позволяет только доступ к битам GPIO. Это обеспечивает доступ к адресам памяти GPIO и запрещает любые другие части памяти, например, память, используемую в настоящее время любыми другими программами.

По сути, это пробивает дыры в защите как безопасности, так и стабильности системы, чтобы разрешить доступ к компонентам GPIO, а также к остальной памяти, но только пользователям группы GPIO, членом которой является Пи.

В будущем драйверы, такие как bcm2835библиотека, wiringPiбудут обновляться чаще (некоторые обновления уже происходят), а приложения, построенные на основе этих инструментов, будут обновляться, а затем в будущем, будем надеяться, что все эти проблемы GPIO будут выполняться как root. исчезают.

До тех пор у вас есть два варианта: открыть группу /dev/memto с gpioправами чтения / записи или запустить с правами суперпользователя, которая имеет полное чтение и запись для всех /dev/mem.

Надеюсь, что это имеет смысл.

В настоящее время все еще есть много проблем, по которым вам все еще нужно работать как root. Например, используя node-red-contrib-dht-sensorмодуль, который зависит от того node-dht-sensor, который зависит от BCM2835. Он обнаруживает неисправности, используя /dev/gpiomemнекоторые ошибки, как внутри, так node-dht-sensorи внутри, /dev/gpiomemили способ, которым они работают вместе. Я не знаю, в чем дело, но со временем все получится. Когда BCM2835 работает как «не-root» и /dev/gpiomemсуществует, он пытается использовать /dev/gpiomemвместо /dev/mem, поэтому открытие /dev/memгруппы gpioне помогает. Облом.

Карл Истерли
источник
1

Просто используйте следующую команду в терминале:

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem
harkirat1892
источник
2
Не могли бы вы объяснить, что делает эта команда и почему она отличается от ответа Джоан ? В чем разница между /dev/memи /dev/gpiomem?
Greenonline
Если вы можете, лучше использовать ответ Джоан, однако, если вы не можете изменить /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
Марк Тайерс
источник
1

Если вы строите в geany, просто измените команды сборки.

Команды Java для компиляции должны быть

sudo pi4j --compile "%f"

и команда execute должна быть

sudo pi4j --run "%e" 
Франческа Баннистер
источник