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 root
và gpio
tươ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/mem
tượ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 gpio
và 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ư bcm2835
thư viện và wiringPi
sẽ đượ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/mem
nhó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-sensor
mô-đ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/gpiomem
vì nó có một số lỗi vẫn còn node-dht-sensor
hoặc trong /dev/gpiomem
hoặ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/gpiomem
tồn tại, nó cố gắng sử dụng /dev/gpiomem
thay vì /dev/mem
, vì vậy việc mở /dev/mem
nhóm gpio
không giúp ích gì. Bummer.