Truy cập chân GPIO mà không cần root. Không có quyền truy cập vào / dev / mem. Hãy thử chạy như root!


34

Tôi đã tạo một kịch bản python bằng thư viện RPi.GPIO. Tôi cần chạy nó mà không cần root nhưng tôi gặp lỗi này khi chạy nó với "python ./script.py":

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

Tôi đã đọc ở nhiều nơi rằng bạn không còn cần root với phiên bản mới nhất của thư viện nhưng tôi vẫn gặp lỗi sau khi cập nhật. Phiên bản tôi có là RPi.GPIO 0.6.0a3

Đây là mã:

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)

Và lỗi đầy đủ:

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!

Khi tôi chạy nó như root nó hoạt động.


sudo adduser my_new_user gpio là chính xác nhưng hãy nhớ đăng xuất và đăng nhập lại vì việc cập nhật thành viên nhóm yêu cầu đăng nhập lại để hoạt động.
Blindfreddy

Câu trả lời:


49

Bạn có thể cần phải chạy Raspbian để sử dụng RPi.GPIO với tư cách là người dùng không root, có thể nó cũng cần phải là jessie.

/dev/gpiomemtồn tại? Nếu vậy RPi.GPIO nên sử dụng thiết bị này để truy cập GPIO. Nếu /dev/gpiomemkhông tồn tại hãy thử:

sudo rpi-update

để đảm bảo bạn đang sử dụng kernel gần đây và

sudo apt-get update
sudo apt-get upgrade

để đảm bảo bạn đang sử dụng RPi.GPIO gần đây.

Bạn cũng sẽ cần đảm bảo rằng bạn là thành viên của gpionhóm:

sudo adduser pi gpio

EDITED ĐỂ THÊM

Hệ thống Raspbian dường như đang trong tình trạng thay đổi liên tục. Tôi không chắc đó là vấn đề Raspbian hay (nhiều khả năng) là vấn đề raspberrypi.org.

Kiểm tra xem / dev / gpiomem có quyền chính xác không.

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

Nếu không, hãy đặt quyền chính xác như sau

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

4
Vẫn không làm việc. Mọi thứ đều được cập nhật, / dev / gpiomem tồn tại và khi tôi cố gắng thêm người dùng vào nhóm gpio thì nó nói rằng đó đã là thành viên
JoeyCK

3
@JoeyCK: lưu ý rằng việc thay đổi thành viên nhóm không ảnh hưởng đến các quy trình đã chạy. Chạy idđể liệt kê các nhóm hiện tại của shell của bạn và nếu gpiokhông được liệt kê, hãy đăng nhập lại hoặc khởi động lại.
deltab

@JoeyCK Phiên bản nào được báo cáo bởi RPi.GPIO?
joan

@joan phiên bản 0.5.11
JoeyCK

1
@mjwittering Raspbian sẽ luôn được hỗ trợ tốt hơn trên Pi. Nếu bạn thích Ubuntu, bạn sẽ cần áp dụng các thay đổi cho mỗi lần khởi động. Bạn có thể làm điều đó tự động với một kịch bản khởi động hoặc một mục khởi động lại trong một crontab.
gia

7

Tôi đã có vấn đề này ngay lập tức và giải quyết chỉ với điều này:

sudo adduser my_new_user gpio

Với điều này, người dùng "my_new_user" được thêm vào nhóm gpio, vì vậy, tất cả người dùng trong nhóm gpio có thể truy cập vào các chân GPIO.


1
Ý bạn là / dev / gpiomem (không phải / dev / mem).
joan

cả trên thực tế, nếu bạn nhìn vào / dev vì bạn sẽ thấy rằng cả hai thiết bị tồn tại, và chủ đề câu hỏi là về / dev / mem
Иван Андреевич Черногоров

1
Không. Thành viên của nhóm gpio không có quyền truy cập vào / dev / mem.
gia

đúng, thành viên của kmem không, giải pháp sau đó là simmilar
Иван Андреевич Черногоров

2
Được rồi, nhưng vấn đề là cung cấp quyền truy cập an toàn, không root, vào GPIO. Thêm người dùng vào nhóm kmem không an toàn và sẽ không cấp quyền truy cập vào GPIO.
gia

5

Tôi có thể trả lời điều này.

sudo chown root.gpio /dev/mem

Điều này thay đổi chủ sở hữu và nhóm /dev/memđến rootgpiotương ứng.

sudo chmod g+rw /dev/mem

sau đó cung cấp cho nhóm đọc quyền truy cập ghi vào /dev/memđối tượng này .

Đối /dev/memtượng về cơ bản là toàn bộ không gian bộ nhớ trên hệ thống. Điều này có nghĩa là bây giờ nhóm gpiovà mọi người trong đó có thể đọc và ghi vào không gian bộ nhớ.

Bây giờ, trong không gian bộ nhớ có nhiều thứ, bao gồm các thanh ghi CPU. Khi bạn chuyển đổi các chân GPIO, bạn sẽ thay đổi một chút trong một trong các thanh ghi này. Các kicker là, bạn cần chắc chắn rằng bạn làm điều đó một cách chính xác hoặc những điều xấu xấu có thể xảy ra với hệ thống của bạn.

Để giúp bảo vệ toàn bộ không gian bộ nhớ, các quyền hạn được ánh xạ chỉ là các phần bộ nhớ mà chúng ta cần để làm việc với các bit GPIO /dev/gpiomem. Điều này trong mặt nạ hiệu ứng / che chắn phần còn lại của không gian bộ nhớ khỏi bị truy cập và chỉ cho phép các bit GPIO được truy cập. Điều này cho phép truy cập vào các địa chỉ bộ nhớ GPIO và không cho phép bất kỳ phần nào khác của bộ nhớ, chẳng hạn như bộ nhớ hiện đang được sử dụng bởi bất kỳ chương trình nào khác.

Trên thực tế, điều này thổi một lỗ hổng trong cả bảo vệ ổn định hệ thống và bảo mật để cho phép truy cập vào nội dung GPIO, cũng như phần còn lại của bộ nhớ, nhưng chỉ với những người dùng trong nhóm GPIO mà Pi là thành viên.

Trong tương lai, các trình điều khiển như bcm2835thư viện và wiringPisẽ được cập nhật thêm (một số cập nhật đã xảy ra) và các ứng dụng được xây dựng trên các công cụ đó sẽ được cập nhật thêm và trong tương lai, hy vọng tất cả các rắc rối GPIO này sẽ được root biến mất

Cho đến lúc đó, bạn có hai lựa chọn, mở ra /dev/memnhóm gpiođể đọc / ghi hoặc chạy với quyền root, có ghi đọc đầy đủ cho tất cả /dev/mem.

Hy vọng rằng có ý nghĩa.

Hiện tại vẫn còn một số vấn đề mà bạn vẫn cần phải chạy root. Ví dụ: sử dụng node-red-contrib-dht-sensormô-đun, phụ thuộc vào node-dht-sensor, phụ thuộc vào BCM2835. Nó sử dụng các lỗi phân tách /dev/gpiomemvì nó có một số lỗi vẫn còn node-dht-sensorhoặc trong /dev/gpiomemhoặc cách chúng hoạt động cùng nhau. Tôi không biết đó là trường hợp nào, nhưng cuối cùng nó sẽ được giải quyết. Khi BCM2835 chạy dưới dạng 'không root' và /dev/gpiomemtồn tại, nó cố gắng sử dụng /dev/gpiomemthay vì /dev/mem, vì vậy việc mở /dev/memnhóm gpiokhông giúp ích gì. Bummer.


1

Chỉ cần sử dụng lệnh sau trong thiết bị đầu cuối:

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

2
Bạn có thể đưa ra một lời giải thích về những gì lệnh này làm, và tại sao nó khác với câu trả lời của joan ? Sự khác biệt giữa /dev/memvà là /dev/gpiomemgì?
Greenonline

Nếu bạn nó có thể là tốt hơn để sử dụng câu trả lời của Joan, tuy nhiên nếu bạn không thể thay đổi /dev/memđể /dev/gpiomemđiều này sẽ giúp bạn có được sự cho phép tương tự để sử dụng /dev/memmà bạn có với/dev/gpiomem
Natim

Sẽ không an toàn khi cung cấp quyền truy cập vào tất cả / dev / mem, khi một phương pháp phẫu thuật hơn trả lời câu hỏi.
Bryce

1

Không có câu trả lời ở trên bao gồm tất cả các bước. Tôi cần hoàn thành các bước sau để có quyền truy cập không root vào các chân GPIO. Tôi đã phải tạo một nhóm mới, thêm người dùng của mình vào nhóm này sau đó thay đổi quyền (như trong các bài viết trước).

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

Nếu bạn đang xây dựng trong geany, chỉ cần thay đổi các lệnh xây dựng.

Các lệnh Java để biên dịch phải là

sudo pi4j --compile "%f"

và lệnh thực thi phải là

sudo pi4j --run "%e" 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.