Probleme mit HiPi / BCM2835 Library, Zugriff auf /dev/mem

Begonnen von tatus1969, 08 Januar 2014, 10:57:02

Vorheriges Thema - Nächstes Thema

tatus1969

hat jemand Erfahrung mit Raspberry / HiPi (http://raspberry.znix.com/) und BCM2835 Library (http://www.airspayce.com/mikem/bcm2835/) ? Ich schaffe es nicht, auf /dev/mem Zugriff zu bekommen.

Ich habe jetzt in meiner Not bereits "sudo chmod a+rwx /dev/mem" probiert, es bleibt jedoch immer die Fehlermeldung "operation not permitted", sobald ich das Perl-Kommando "HiPi::BCM2835::bcm2835_init()" probiere. Perl wird auch als root ausgeführt..

Viele Grüße
Frank

betateilchen

#1
Dokumentation zur BCM2835 Library lesen, dort ist das Problem beschrieben.
(Wir hatten die Diskussion zu /dev/mem auch schonmal hier im Forum, deshalb weiss ich das)

Zitat"Because HiPi::BCM2835 accesses the SOC registers directly via /dev/mem, it must run with the necessary root privileges to gain access to /dev/mem."
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

tatus1969

deshalb führe ich perl ja als root aus, hatte ich geschrieben (sudo perl fhem.pl fhem.cfg) ;-)

Es kommt ja auch nicht die Meldung "permission denied", die kommen würde wenn die Rechte nicht ausreichen. Ich  habe jetzt einige Stunden google bearbeitet, leider ohne Erfolg...

Viele Grüße
Frank

betateilchen

Zitat von: tatus1969 am 08 Januar 2014, 13:01:52deshalb führe ich perl ja als root aus, hatte ich geschrieben

Das hatte ich durchaus gelesen.

Kannst Du beschreiben, wann genau die Fehlermeldung auftritt? (Deine Aussage, "sobald ich das Perl-Kommando HiPi::.... probiere" habe ich auch gelesen, ich will das trotzdem genauer wissen.)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

tatus1969

#4
Klar... ich versuche mal zu rekapitulieren was ich gestern alles gemacht habe:

wget http://raspberry.znix.com/hipifiles/hipi-install
perl hipi-install

Dann gksudo hipi-control-gui, und mit dem GUI gespielt. Dort konnte ich z.B. Pullups aktivieren, mit dem Ergebnis dass der entsprechende Port dann high gesetzt wurde. Devicetreiber habe ich keine aktiviert. Ich nehme an, dass hier bereits der /dev/mem Zugriff geklappt haben muss?!

Dann fhem per Konsole gestartet: "sudo perl fhem.pl fhem.cfg".

Dann in fhem ein kleines sub in 99_Utils.pm geschrieben:

sub
gpiotest
{
  use HiPi::BCM2835;
  use HiPi::Constant;

HiPi::BCM2835::bcm2835_init();
HiPi::BCM2835::bcm2835_close();

#  my $bcm  = HiPi::BCM2835->new();
#  my $pin  = $bcm->get_pin( RPI_PAD1_PIN_7 );
#  $pin->mode( RPI_PINMODE_ALT0 );

#  $bcm->peri_read( BCM2835_CLOCK_BASE + 0x1C );
}

Dann in der fhem-Befehlszeile {gpiotest} eingegeben. Fhem quittiert das dann mit "Failed to initialise libbcm2835 at ./FHEM/99_Utils.pm line 21". In der Konsole wird passend dazu "bcm2835_init: Unable to open /dev/mem: operation not permitted" angezeigt.

Während meiner Versuche habe ich irgendwann die Zugriffsrechte auf /dev/mem erweitert, also "sudo chmod a+rwx /dev/mem". Auch das hat es nicht verbessert. Ich werde heute abend mal versuchen, ein kleines C-Programm zu bauen um zu schauen ob das Problem vielleicht woanders liegt, und vor allem auch noch einmal das HiPi-GUI probieren.

Viele Grüße
Frank

betateilchen

#5
Sowas ähnliches dachte ich mir...

Leg doch mal die sub in eine eigene .pl-Datei und starte dann perl mit dieser Datei per strace.

Ich vermute, dass der HiPi Aufruf selbst als "unprivileged user" erfolgt und das von Linux entsprechend quittiert wird.
strace sollte Dir entsprechende Infos liefern.


Das hier kennst Du schon?


http://raspberrypi.znix.com/hipidocs/mod_gpio_bcm2835.htm

Access Permissions

Because HiPi::BCM2835 accesses the SOC registers directly via /dev/mem, it must run with the necessary root privileges to gain access to /dev/mem. This means you must start your Perl script with root privileges using sudo or from the root account. This always presents a security risk.

You can ameliorate the risk somewhat by reducing your process permissions to those of an ordinary user once HiPi::BCM2835 has opened and mapped the required areas of the SOC registers. The HiPi::Utils module provides a function to simplify this action.

  use HiPi::BCM2835;
  use HiPi::Utils;

  my($user, $group) = ('pi', 'pi');

  my $bcm = HiPi::BCM2835->new();

  # or using function type calls :
  # HiPi::BCM2835::bcm2835_init();

  HiPi::Utils::drop_permissions_name($user, $group);
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

tatus1969

Zitat von: betateilchen am 08 Januar 2014, 15:54:45
Leg doch mal die sub in eine eigene .pl-Datei und starte dann perl mit dieser Datei per strace.
Mach ich heute abend, melde mich morgen wieder. Danke schonmal für Deine Ideen!

Zitat von: betateilchen am 08 Januar 2014, 15:54:45
Das hier kennst Du schon?
Sicher :-)

Viele Grüße
Frank

tatus1969

@betateilchen: gut getippt! Wenn ich den Code direkt in ein Perlskript eingebe, dann klappt es wunderbar.

Jetzt frage ich mich: warum hilft "sudo perl fhem.pl fhem.cfg" nicht, und was kann ich tun, damit sich das ändert?

klausw

direkt zum thema kann ich zwar nix sagen, aber wenn Du die GPIOs ansteuern möchtest kannst Du auch das RPI_GPIO Modul verwenden
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

betateilchen

Zitat von: tatus1969 am 08 Januar 2014, 19:54:11Jetzt frage ich mich: warum hilft "sudo perl fhem.pl fhem.cfg" nicht

Hm... ich weiß zwar prinzipiell, warum das (technisch) so ist, aber ich hab keine Ahnung, wie ich es Dir erklären soll :( Und Du kannst daran vermutlich kaum etwas ändern. Das gleiche Problem gab es schon bei der Erstellung des Moduls für den BMP180 an I2C, damals gab es auch keine andere praktikable Lösung, als auf die Verwendung der Library zu verzichten.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

tatus1969

@klausw: das reicht leider nicht. Ich brauche neben GPIOs auch SPI (MCP3008 und MCP4922, beide in HiPi implementiert), und einer der Ports muss so konfiguriert werden dass an GPCLK ein Takt von 1MHz rauskommt...

@betateilchen: ich habe nochmal weitergeschaut und es sieht so aus, dass FHEM beim Start seine Rootrechte aufgibt und auf den User "fhem" umsteigt - wenn dieser existiert.

Radikaler Test: "userdel fhem" (vorher perl/fhem stoppen), und jetzt geht's!

Was mich wundert ist, dass ich zuerst versucht habe, den User fhem in /etc/sudoers hinzuzufügen, aber das hat nicht ausgereicht.

betateilchen

Ja, das mit dem Löschen des fhem-users ist eine Lösung. Aber aus verschiedenen Gründen wollte ich die hier nicht propagieren :D
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

tatus1969

Zitat von: betateilchen am 09 Januar 2014, 10:05:39
Ja, das mit dem Löschen des fhem-users ist eine Lösung. Aber aus verschiedenen Gründen wollte ich die hier nicht propagieren :D

Kann ich verstehen, darf auch in meiner Installation nicht so bleiben. Nur was tun wenn man frontal gegen die Wand fährt? Erstmal die Wand woanders hinstellen :-)

Grüße
Frank

betateilchen

Vorschlag, da dieses Problem nun schon zum zweiten Mal hier im Forum rumschwebt:

Beschreibe doch dieses Berechtigungsproblem einmal in einem separaten Thread in der Rubrik FHEM->Sonstiges denn dort ist der richtige Forumbereich für Fragen zur fhem.pl. Vielleicht hat Rudi eine Idee, wie man diese Anforderung lösen könnte, er zeichnet für die fhem.pl verantwortlich.


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!