রুট ছাড়াই জিপিআইও পিনগুলি অ্যাক্সেস করুন। / Dev / mem এ অ্যাক্সেস নেই। রুট হিসাবে চালানোর চেষ্টা করুন!


34

আমি RPi.GPIO লাইব্রেরি ব্যবহার করে একটি পাইথন স্ক্রিপ্ট তৈরি করেছি। আমাকে এটিকে মূল ছাড়াই চালানো দরকার তবে এটি "পাইথন ./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 সঠিক তবে লগ আউট এবং পিছনে ফিরে যেতে ভুলবেন না কারণ গোষ্ঠী সদস্যতার আপডেট করার জন্য সক্রিয় হওয়ার জন্য পুনরায় লগইন প্রয়োজন।
ব্লাইন্ডফ্রেডি

উত্তর:


49

আপনাকে আরপিআই.জি.পি.আই.ও. কে নন-রুট ব্যবহারকারী হিসাবে ব্যবহার করতে সম্ভবত রাস্পবিয়ান চালানো দরকার, সম্ভবত এটি জেসিও হওয়া দরকার।

না /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

যোগ করুন সম্পাদনা করুন

রাস্পবিয়ান সিস্টেমটি প্রবাহিত অবস্থায় দেখা দেয়। আমি নিশ্চিত নই যে এটি রাস্পবিয়ান বা (সম্ভবত আরও) একটি রাস্প্পেরিপিআরও সমস্যা আছে।

/ 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 বিদ্যমান এবং যখন আমি জিপিও গ্রুপে ব্যবহারকারীকে যুক্ত করার চেষ্টা করি তখন এটি বলে যে এটি ইতিমধ্যে একজন সদস্য
JoeyCK

3
@ জোয়েসিকে: নোট করুন যে গ্রুপ সদস্যপদ পরিবর্তন করা ইতিমধ্যে চলমান প্রক্রিয়াগুলিকে প্রভাবিত করে না। চালান idআপনার শেল বর্তমান গ্রুপ তালিকা, এবং যদি gpioতালিকায় না থাকে, আবার, অথবা পুনরায় বুট লগ ইন করুন।
ডেলটাব

@ জোয়েসিকে কি সংস্করণটি RPI.GPIO দ্বারা প্রতিবেদন করা হয়েছে?
Joan

@ জোয়ান সংস্করণ 0.5.11
জোয়িসি কে

1
@ এমজিউইটারিং রাস্পবিয়ান পি-তে আরও সমর্থনযোগ্য হবে। আপনি যদি উবুন্টুকে পছন্দ করেন তবে আপনাকে প্রতিটি বুটে পরিবর্তনগুলি প্রয়োগ করতে হবে। আপনি এটি কোনও বুট স্ক্রিপ্ট বা কোনও ক্রন্টবায় একটি রিবুট এন্ট্রি দিয়ে স্বয়ংক্রিয়ভাবে করতে পারেন।
Joan

7

আমি এই মুহুর্তে এই সমস্যাটি নিয়েছিলাম এবং কেবল এটির মাধ্যমে সমাধান করেছি:

sudo adduser my_new_user gpio

এর সাহায্যে, "my_new_user" ব্যবহারকারীটি জিপিও গ্রুপে যুক্ত করা হয়েছে, সুতরাং, জিপিও গ্রুপের সমস্ত ব্যবহারকারী জিপিআইও পিনগুলি অ্যাক্সেস করতে পারে।


1
আপনার অর্থ / দেব / জিপিওম (না / দেব / মেম)।
Joan

উভয়ই আসলে, যদি আপনি / দেবের দিকে নজর দেন তবে আপনি দেখতে পাবেন যে উভয় ডিভাইসই বিদ্যমান, এবং প্রশ্নটির বিষয়টি ছিল / ডিভ / মেম
Андреевич Черногоров

1
নং গ্রুপ জিপিওর সদস্যের / ডিভ / মেমের অ্যাক্সেস নেই।
Joan

ঠিক আছে, কেমেমের সদস্য করেন, সমাধানটি তখন সিমিলার
Иван Андреевич Черногоров

2
ঠিক আছে, তবে মূল বিষয়টি হ'ল জিপিআইওতে নিরাপদ, রুটহীন, অ্যাক্সেস দেওয়া। কোনও ব্যবহারকারীকে কেএমএম গ্রুপে যুক্ত করা নিরাপদ নয় এবং জিপিআইওতে অ্যাক্সেস দেবে না।
Joan

5

আমি এর উত্তর দিতে পারি।

sudo chown root.gpio /dev/mem

এই মালিক এবং গোষ্ঠীর পরিবর্তন /dev/memকরতে rootএবং gpioযথাক্রমে।

sudo chmod g+rw /dev/mem

তারপরে গ্রুপটি পড়ার জন্য এই /dev/memবিষয়টিতে অ্যাক্সেস দেয় ।

/dev/memবস্তু মূলত সিস্টেমে সমগ্র মেমরির স্থান। এর অর্থ এখন গ্রুপ gpioএবং এর মধ্যে থাকা সবাই মেমরির জায়গাতে পড়তে এবং লিখতে পারে।

এখন, মেমরি স্পেসে সিপিইউ রেজিস্টার সহ অনেকগুলি জিনিস রয়েছে। আপনি যখন জিপিআইও পিনগুলি টগল করেন, আপনি এই নিবন্ধগুলির মধ্যে একটিতে কিছুটা পরিবর্তন করছেন। কিকারটি হ'ল, আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে আপনি এটি সঠিকভাবে করেছেন বা খারাপ সিস্টেমে আপনার সিস্টেমে ঘটতে পারে।

পুরো মেমরির স্থানটি সুরক্ষিত করতে, জিপিআইও বিটগুলির সাথে আমাদের কাজ করতে হবে এমন মেমরির অংশগুলি ম্যাপ করা শক্তিগুলি /dev/gpiomem। এটি কার্যকরভাবে মুখোশ / মেমরির বাকী অংশগুলি অ্যাক্সেস থেকে রক্ষা করে এবং কেবলমাত্র জিপিআইও বিটগুলি অ্যাক্সেস করতে দেয়। এটি জিপিআইও মেমরির ঠিকানাগুলিতে অ্যাক্সেসের অনুমতি দেয় এবং মেমরির অন্য কোনও অংশকে মঞ্জুরি দেয় না যেমন মেমরির অন্য কোনও প্রোগ্রাম দ্বারা বর্তমানে ব্যবহৃত হচ্ছে।

বাস্তবে, এটি জিপিআইও স্টাফগুলিতে অ্যাক্সেসের অনুমতি দেওয়ার জন্য সুরক্ষা এবং সিস্টেম উভয়ই স্থিতিশীলতা সুরক্ষা উভয় ক্ষেত্রে একটি গর্ত প্রবাহিত করে, পাশাপাশি বাকী স্মৃতিতে, তবে কেবল জিপিআইও গ্রুপের ব্যবহারকারীদের, যা পাই এর সদস্য।

ভবিষ্যতে, ড্রাইভার যেমন bcm2835 লাইব্রেরিরwiringPi আরও আপডেট হবে (কিছু আপডেট ইতিমধ্যে ঘটছে) এবং সেই সরঞ্জামগুলির উপরে নির্মিত অ্যাপগুলি আরও আপডেট হবে এবং ভবিষ্যতে, আশা করি মূলত এই সমস্ত জিপিআইও ঝামেলা হবে উধাও হয়ে যায়।

ততক্ষণে আপনার দুটি পছন্দ রয়েছে, পড়া / লেখার /dev/memজন্য গোষ্ঠীটি খুলুন gpioবা মূল হিসাবে চালিত করুন, যার সমস্তটিতে সম্পূর্ণ পঠন লিখন রয়েছে/dev/mem

আশা করি তা উপলব্ধি করে।

এখনও এখনও বেশ কয়েকটি সমস্যা রয়েছে যেখানে আপনার এখনও চালানো দরকার root। উদাহরণস্বরূপ, node-red-contrib-dht-sensorমডিউলটি ব্যবহার করে node-dht-sensorযা বিসিএম 2835 এর উপর নির্ভর করে। এটি সেগ-ফল্টস /dev/gpiomemহিসাবে ব্যবহার করছে কারণ এতে কিছু বাগ রয়েছে এখনও node-dht-sensorবা ততক্ষণে /dev/gpiomemবা তারা যেভাবে একসাথে কাজ করছে। আমি জানি না কোনটি, তবে শেষ পর্যন্ত এটি কার্যকর হয়ে যাবে। যখন বিসিএম 2835 'নন-রুট' হিসাবে চালিত হয় এবং /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?
গ্রিননলাইন

যদি আপনি এটা জোয়ান এর উত্তর ব্যবহার করতে, কিন্তু যদি আপনি পরিবর্তন করতে পারবেন না উত্তম পারেন /dev/memকরতে /dev/gpiomemএই আপনার ব্যবহারের জন্য একই অনুমতি পাবেন /dev/memআপনার সাথে আছে/dev/gpiomem
Natim

যখন আরও শল্যচিকিত্সা পদ্ধতির প্রশ্নের উত্তর দেয়, তখন / dev / mem এর সমস্তটিতে অ্যাক্সেস সরবরাহ করা নিরাপদ নয়।
ব্রাইস

1

উপরের উত্তরগুলির মধ্যে কোনওটিতেই সমস্ত পদক্ষেপ অন্তর্ভুক্ত নয়। জিপিআইও পিনগুলিতে অ-রুট অ্যাক্সেস পাওয়ার জন্য আমাকে নিম্নলিখিত পদক্ষেপগুলি সম্পন্ন করতে হবে। আমাকে একটি নতুন গোষ্ঠী তৈরি করতে হয়েছিল, আমার ব্যবহারকারীকে এই গোষ্ঠীতে যুক্ত করতে হবে তবে অনুমতিগুলি পরিবর্তন করতে হবে (আগের পোস্টগুলির মতো)।

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

আপনি যদি জিনিতে বিল্ডিং করেন তবে বিল্ড কমান্ডগুলি পরিবর্তন করুন।

সংকলনের জন্য জাভা কমান্ডগুলি হওয়া উচিত

sudo pi4j --compile "%f"

এবং এক্সিকিউট কমান্ড হওয়া উচিত

sudo pi4j --run "%e" 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.