Доступ к GPIO (малинового пи) без «sudo»

Конечно, этот вопрос может не относиться к Raspberry Pi. Кроме того, я относительно новичок в Linux.

Я хочу написать небольшую библиотеку (на node.js, если это имеет значение) для доступа к GPIO Raspberry Pi с помощью sysfs. Однако для доступа к sysfs требуется доступ sudo, а это плохо по очевидным причинам.

У Quick2Wire, кажется, есть решение, но я хочу лучше понять его, а не просто слепо использовать. Они, конечно, использовали C, но, насколько я понимаю, код не сложный, и, вероятно, его можно реализовать с помощью простого bash, хотя и менее элегантно. Однако больше всего я не уверен, почему это работает.

Любая помощь будет отличной.

Редактировать: Спасибо за комментарии. Понятно, что мне нужно перефразировать вопрос. Вот: как получается, что после установки (как root) приложению больше не требуются права root для использования? Как в этом случае помогает добавление кого-то в группу? /sys/devices/virtual/gpio это не то место, где доступен gpio sysfs, так в чем тут хитрость? Я действительно n00b, поэтому эти вопросы могут быть n00b-ишными, поэтому, пожалуйста, потерпите меня.


person Rakesh Pai    schedule 26.08.2012    source источник
comment
Так в чем вопрос? Вы хотите, чтобы это было переведено в bash?   -  person cnicutar    schedule 27.08.2012
comment
Извините за отсутствие ясности в вопросе. Я добавил правку. Надеюсь, что это проясняет вопрос.   -  person Rakesh Pai    schedule 27.08.2012
comment
@cnicutar Не хочу, чтобы это было переведено как таковое. Я понимаю bash лучше, чем C (хотя код C там совсем не сложный). Я просто думаю, что сценарий bash будет легче понять, чем C, учитывая мои знания C. Учитывая, что этот код (вместе с make-файлом), кажется, выполняет некоторые трюки, которые я не понимаю, сценарий bash мог бы лучше объяснить, по крайней мере, важные части для меня. Это не вопрос «дайте мне код». Это скорее вопрос, почему это работает.   -  person Rakesh Pai    schedule 27.08.2012
comment
@RakeshPai Где доступны необходимые файлы? т.е. по какому абсолютному пути.   -  person cnicutar    schedule 27.08.2012
comment
@cnicutar родной/оригинальный sysfs? Это в /sys/class/gpio. Связанный: я разумно убежден, что мой вопрос не имеет ничего общего с GPIO или с raspberry-pi. Я думаю, что речь идет только о пользователях, группах, разрешениях и о том, как все это работает, учитывая, что что-то требует sudo, но вы не хотите раскрывать это. Спасибо за помощь до сих пор.   -  person Rakesh Pai    schedule 27.08.2012
comment
@RakeshPai Вы уверены, что файлы не являются символическими ссылками?   -  person cnicutar    schedule 27.08.2012
comment
Makefile на github.com/quick2wire/quick2wire-gpio-admin/blob /master/, похоже, не создает никаких символических ссылок, равно как и код C. Похоже, что /sys/class/gpio sysfs не является синлинком из вывода ls -la. В любом случае, могут ли символические ссылки помочь в этом отношении? Мои не столь отточенные знания говорят мне, что просто символические ссылки не помогут решить проблемы, связанные с корнем, но я могу ошибаться.   -  person Rakesh Pai    schedule 27.08.2012
comment
@ракеш пай. Вы правы, в идеале правила udev должны иметь возможность устанавливать разрешения. Я провел пару часов прошлой ночью, пытаясь привыкнуть к установке разрешений, и просто не смог этого сделать. Кажется, многие люди пробовали и также не могут заставить его работать. На данный момент у вас есть два варианта: при загрузке запустить скрипт, который явно устанавливает разрешения, или использовать sudo.   -  person Tim Hoffman    schedule 01.09.2012


Ответы (1)


Ракеш, я только что пытался понять точно такую ​​же вещь, и я думаю, что решил ее.

Вам вообще не нужно разбираться в make-файле. Важными строками являются следующие, которые выполняются в bash при запуске sudo make install

install: install-files
    groupadd -f --system gpio
    chgrp gpio $(DESTDIR)/bin/gpio-admin
    chmod u=rwxs,g=rx,o= $(DESTDIR)/bin/gpio-admin

groupadd -f --system gpio создает системную группу под названием gpio. chgrp gpio $(DESTDIR)/bin/gpio-admin изменяет группу двоичного файла (в который был скомпилирован файл C gpio-admin.c) на gpio. Владельцем двоичного файла по-прежнему является root (поскольку вы запускаете make от имени root). chmod u=rwxs,g=rx,o= $(DESTDIR)/bin/gpio-admin выполняет две важные функции. Во-первых, он позволяет члену группы gpio запускать gpio-admin. Во-вторых, он устанавливает бит setuid на gpio-admin.

Когда вы добавляете себя в группу gpio, вы можете запускать gpio-admin без использования sudo, но gpio admin будет действовать так, как будто он запускается под sudo. Это позволяет ему писать в файл /sys/class/gpio/export. Это также позволяет изменить владельца файлов /sys/class/gpio/gpio[pin number]/direction и т. д., которые создаются.

Даже если вы измените группу /sys/class/gpio/export на gpio и установите разрешения, позволяющие вам писать в нее

sudo chgrp gpio /sys/class/gpio/export /sys/class/gpio/unexport
sudo chmod g+rwx /sys/class/gpio/export /sys/class/gpio/unexport

вы можете экспортировать булавку без полномочий суперпользователя

echo 22 > /sys/class/gpio/export

но файлы /sys/class/gpio/gpio22/direction и т. д. по-прежнему будут создаваться с root в качестве владельца и группы, и вам нужно будет использовать sudo для их изменения. Кроме того, право собственности на файлы экспорта и неэкспорта будет возвращаться к пользователю root после каждой перезагрузки.

person Harry Braviner    schedule 13.09.2012
comment
Спасибо, Гарри. Это очень помогает. Не могли бы вы также выяснить, что происходит с путем /sys/devices/virtual/gpio, где «виртуальный не существует по умолчанию»? - person Rakesh Pai; 14.09.2012