เข้าถึง GPIO โดยไม่ต้องรูท ไม่มีการเข้าถึง / dev / mem ลองใช้งานเป็น root!


34

ฉันสร้างสคริปต์หลามโดยใช้ห้องสมุด RPi.GPIO ฉันต้องการเรียกใช้โดยไม่ต้องรูท แต่ฉันได้รับข้อผิดพลาดนี้เมื่อใช้งานด้วย "python ./script.py":

No access to /dev/mem. Try running as 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!

เมื่อฉันรันมันในฐานะรูทมันก็ใช้งานได้


sudo adduser my_new_user gpio นั้นถูกต้อง แต่อย่าลืมออกจากระบบและกลับเข้ามาใหม่เพราะการอัพเดทความเป็นสมาชิกกลุ่มต้องเข้าสู่ระบบอีกครั้งเพื่อให้ใช้งานได้
Blindfreddy

คำตอบ:


49

คุณอาจต้องใช้ Raspbian เพื่อใช้ RPi.GPIO ในฐานะผู้ใช้ที่ไม่ใช่รูทซึ่งอาจต้องเป็น jessie เช่นกัน

ไม่/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 จะมีข้อความระบุว่าเป็นสมาชิกอยู่แล้ว
JoeyCK

3
@JoeyCK: โปรดทราบว่าการเปลี่ยนความเป็นสมาชิกกลุ่มจะไม่ส่งผลกระทบต่อกระบวนการที่กำลังทำงานอยู่ เรียกใช้idเพื่อแสดงรายการกลุ่มปัจจุบันของเชลล์และหากgpioไม่อยู่ในรายการให้ลงชื่อเข้าใช้อีกครั้งหรือรีบูต
deltab

@JoeyCK RPi.GPIO รุ่นใดที่รายงานโดย
joan

@joan เวอร์ชัน 0.5.11
JoeyCK

1
@mjwittering Raspbian จะได้รับการสนับสนุนอย่างต่อเนื่องใน Pi หากคุณต้องการอูบุนตูคุณจะต้องใช้การเปลี่ยนแปลงในการบู๊ตแต่ละครั้ง คุณสามารถทำได้โดยอัตโนมัติด้วยบูตสคริปต์หรือรายการรีบูตใน crontab
joan

7

ฉันมีปัญหานี้ทันทีและแก้ไขเพียงแค่นี้:

sudo adduser my_new_user gpio

ด้วยวิธีนี้ผู้ใช้ "my_new_user" จะถูกเพิ่มในกลุ่ม gpio ดังนั้นผู้ใช้ทั้งหมดในกลุ่ม gpio สามารถเข้าถึงหมุด GPIO


1
คุณหมายถึง / dev / gpiomem (ไม่ใช่ / dev / mem)
joan

ทั้งที่จริงแล้วถ้าคุณดู / dev คุณจะเห็นว่ามีอุปกรณ์ทั้งสองอยู่และหัวข้อคำถามเกี่ยวกับ / dev / mem
ИванАндреевичЧерногоров

1
ไม่สมาชิกของกลุ่ม gpio ไม่สามารถเข้าถึง / dev / mem
joan

ถูกต้องสมาชิกของ kmem ทำวิธีแก้ปัญหาก็คือ simmilar
ИванАндреевичЧерногоров

2
โอเค แต่ประเด็นก็คือให้การเข้าถึง GPIO ที่ปลอดภัยและไม่เป็นอันตราย การเพิ่มผู้ใช้ในกลุ่ม kmem นั้นไม่ปลอดภัยและจะไม่ให้การเข้าถึง GPIO
joan

5

ฉันสามารถตอบคำถามนี้

sudo chown root.gpio /dev/mem

สิ่งนี้จะเปลี่ยนเจ้าของและกลุ่มของ/dev/memเป็นrootและgpioตามลำดับ

sudo chmod g+rw /dev/mem

จากนั้นให้กลุ่มอ่านการเขียนการเข้าถึง/dev/memวัตถุนี้

/dev/memวัตถุนั้นเป็นพื้นที่หน่วยความจำทั้งหมดในระบบ ซึ่งหมายความว่าขณะนี้กลุ่มgpioและทุกคนในนั้นสามารถอ่านและเขียนลงในพื้นที่หน่วยความจำได้

ตอนนี้ในพื้นที่หน่วยความจำมีหลายสิ่งรวมถึง CPU register เมื่อคุณสลับพิน GPIO คุณกำลังเปลี่ยนบิตหนึ่งในรีจิสเตอร์เหล่านี้ นักเตะคือคุณต้องแน่ใจว่าคุณทำอย่างถูกต้องหรือสิ่งเลวร้ายเกิดขึ้นกับระบบของคุณ

เพื่อช่วยปกป้องพื้นที่หน่วยความจำทั้งอำนาจที่ถูกแมปเพียงบางส่วนหน่วยความจำที่เราต้องทำงานร่วมกับบิต GPIO /dev/gpiomemไป ซึ่งมีผลบังคับใช้มาสก์ / ป้องกันส่วนที่เหลือของพื้นที่หน่วยความจำไม่ให้เข้าถึงและอนุญาตให้เข้าถึงบิต GPIO เท่านั้น วิธีนี้ช่วยให้สามารถเข้าถึงที่อยู่หน่วยความจำ GPIO และไม่อนุญาตให้ส่วนอื่น ๆ ของหน่วยความจำเช่นหน่วยความจำที่กำลังใช้งานโดยโปรแกรมอื่น ๆ

ผลกระทบนี้จะทำให้เกิดช่องโหว่ทั้งการรักษาความปลอดภัยและการป้องกันความเสถียรของระบบเพื่อให้สามารถเข้าถึงเนื้อหาของ GPIO รวมถึงหน่วยความจำที่เหลือ แต่เฉพาะกับผู้ใช้ในกลุ่ม GPIO ซึ่ง Pi เป็นสมาชิกของ

ในอนาคตไดรเวอร์เช่นbcm2835ไลบรารีและwiringPiจะได้รับการอัปเดตมากขึ้น (มีการอัปเดตบางอย่างเกิดขึ้นแล้ว) และแอปที่สร้างขึ้นบนเครื่องมือเหล่านั้นจะได้รับการอัปเดตเพิ่มเติมและในอนาคตหวังว่า GPIO ทั้งหมดนี้ หายไป

จนแล้วคุณมีสองทางเลือกเปิด/dev/memไปยังกลุ่มgpioเป็นอ่าน / /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 ทั้งหมดเมื่อวิธีการผ่าตัดเพิ่มเติมตอบคำถาม
Bryce

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

หากคุณกำลังสร้างใน geany เพียงแค่เปลี่ยนคำสั่งสร้าง

คำสั่ง Java เพื่อคอมไพล์ควรเป็น

sudo pi4j --compile "%f"

และคำสั่ง execute ควรเป็น

sudo pi4j --run "%e" 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.