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


34

Я створив сценарій пітона за допомогою бібліотеки 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, він працює.


sudo adduser my_new_user gpio вірно, але не забудьте вийти та повернутися назад, оскільки для оновлення членства в групі потрібен повторний вхід, щоб стати активним.
Blindfreddy

Відповіді:


49

Вам, мабуть, потрібно запустити Raspbian, щоб використовувати RPi.GPIO як некористувацького користувача, можливо, він повинен бути і Джессі.

Чи /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

4
Ще не працює. Все оновлюється, / dev / gpiomem існує, і коли я намагаюся додати користувача до групи
gpio,

3
@JoeyCK: зауважте, що зміна членства в групі не впливає на процеси, які вже працювали. Запустіть, idщоб перелічити поточні групи вашої оболонки, а якщо gpioвони не вказані, увійдіть знову або перезавантажте.
дельтаб

@JoeyCK Про яку версію повідомляє RPi.GPIO?
Джоан

@joan версія 0.5.11
JoeyCK

1
@mjwittering Raspbian незмінно буде краще підтримуватися на Pi. Якщо ви віддаєте перевагу Ubuntu, вам потрібно буде застосувати зміни до кожного завантаження. Ви можете зробити це автоматично за допомогою сценарію завантаження або запису перезавантаження в кронтабі.
Жанна

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
Гаразд, але справа в тому, щоб надати безпечний, без корінь доступ до 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, до складу якої входить Pi.

Надалі такі драйвери, як bcm2835бібліотека, wiringPiбудуть оновлюватися більше (деякі оновлення вже відбуваються), а додатки, побудовані на основі цих інструментів, будуть оновлюватися далі, а потім у майбутньому, сподіваємось, все це клопотання GPIO як root буде зникають.

До цього часу у вас є два варіанти, відкрийте /dev/memгрупу gpioяк читати / писати, або запустіть як root, який має повне записування читання для всіх /dev/mem.

Сподіваюся, що це має сенс.

Наразі існує ще багато проблем, з якими вам все одно потрібно працювати root. Наприклад, використовуючи node-red-contrib-dht-sensorмодуль, який залежить від node-dht-sensor, що залежить від BCM2835. Це seg-помилки, використовуючи, /dev/gpiomemоскільки в ньому є деякі помилки або в, node-dht-sensorабо в, /dev/gpiomemабо в тому, як вони працюють разом. Я не знаю, що це за справа, але це з часом буде відпрацьовано. Коли BCM2835 працює як "некореневий" і /dev/gpiomemіснує, він намагається використовувати /dev/gpiomemзамість цього /dev/mem, тому відкриття /dev/memгрупи gpioне допомагає. Бампер.


1

Просто використовуйте таку команду в терміналі:

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

2
Чи можете ви надати пояснення, що робить ця команда, і чому вона відрізняється від відповіді Джоан ? У чому різниця між /dev/memі /dev/gpiomem?
Greenonline

Якщо ви можете, то краще використовувати відповідь Жанни, однак , якщо ви не можете змінити , /dev/memщоб /dev/gpiomemце отримати вам той же дозвіл на використання , /dev/memщо у вас є з/dev/gpiomem
Natim

Небезпечно пропонувати доступ до всіх / dev / mem, коли більш хірургічний підхід відповідає на питання.
Брайс

1

Жодна з наведених вище відповідей не включає всі кроки. Мені потрібно було виконати наступні кроки, щоб отримати позакореневий доступ до шпильок 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

Якщо ви будуєте геній, просто змініть команди збірки.

Команди Java для компілювання повинні бути

sudo pi4j --compile "%f"

і команда Execute повинна бути

sudo pi4j --run "%e" 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.