nRF24L01 без root, помогите

Тема в разделе "Raspberry Pi", создана пользователем SNAK84, 4 май 2018.

  1. SNAK84

    SNAK84 Нерд

    Собрал библиотеку http://tmrh20.github.io/RF24
    Скомпилировал пример, но возникла проблема запуска от пользователя.

    От root все работает, а при запуске от пользователя возникает ошибка

    Пользователю добавил следующие группы:

    Код (Bash):
    uid=1000(pi) gid=1000(pi) группы=1000(pi),0(root),108(netdev),999(spi),998(i2c),997(gpio)
    Код (Bash):
    RF24/examples/scanner/
    Ошибка сегментирования
    В google решение проблемы не нашел.
     
  2. Igor68

    Igor68 Гуру

    А ls -al /dev что показал? Для кого доступны устройства? В Вашем случае, как понимаю интересует SPI, I2C, GPIO. Будет понятно для кого и что доступно. А после изменения доступа надо обновить сессию.
     
  3. SNAK84

    SNAK84 Нерд


    Код (Bash):
     
    сессию обновлял.
     
  4. Igor68

    Igor68 Гуру

    Вот смотрите что Вы показали
    Код (Text):

    crw-rw----  1 root gpio    254,   0 май  5 00:17 gpiochip0
    crw-rw----  1 root gpio    254,   1 май  5 00:17 gpiochip1
    crw-rw----  1 root gpio    254,   2 май  5 00:17 gpiochip2
    crw-rw----  1 root i2c      89,   1 май  5 00:17 i2c-1
    crw-rw----  1 root spi     153,   0 май  5 00:17 spidev0.0
    crw-rw----  1 root spi     153,   1 май  5 00:17 spidev0.1
     
    Вот одно из решений... возможно и не верное (в смысле защиты доступа). Это разрешить доступ к устройству... для всех пользователей при включении питания и/или запуске/перезапуске системы прописав правила в файл /etc/rc.local
    напримертак:
    Код (Text):

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    # Print the IP address
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
      printf "My IP address is %s\n" "$_IP"
    fi

    #это для моего RAMDISK - только в моём случае
    /etc/init.d/ramdisk restart
    #это для монтирования RAMDISK - только в моём случае
    mount --bind /mnt/ram0 /home/httpd/ramdisk
    #что-то запускаю при старте - только в моём случае
    su www-data -c /home/httpd/bash/wwstart &
    #запускаю прокси - только в моём случае
    /etc/init.d/3proxyinit start

    #а это разрешение доступа к устройству например gpiochip0
    chmod 777 /dev/gpiochip0
    exit 0

     
    ну и после этого будет:
    Код (Text):

    crwxrwxrwx  1 root root  254,  0 May  3 18:54 gpiochip0
     
    а было:
    Код (Text):

    crw-------  1 root root  254,  0 May  3 18:54 gpiochip0
     
    Одним словом теперь к нему обращаться можно всем.
    Как Вы обратили внимание там пользователь root и группа root.
    С SPI несколько по другому... там
    crw-rw---- 1 root spi 153, 0 май 5 00:17 spidev0.0
    Второй вариант это добавить пользователя в группу... допустим spi, i2c. Только для GPIO группа root. Смотрите сами.
     
  5. parovoZZ

    parovoZZ Гуру

    О_о
    Подскажи, как бинарник в автозагрузку заправить? Читал, читал тырнеты- как- то мудрено все( Уровни запуска надо разруливать. Сейчас через screen сделан запуск - но это неудобно. В маздаях проще.
     
  6. Igor68

    Igor68 Гуру

    Доброго времени суток!
    ...всё, что бутет вставлено в конце файла /etc/rc.local (в некоторых дистрибутивах системы может быть и /etc/init.d/rc.local но всегда в /etc) бутет стартовать при запуске. И это будет от ROOT. Для запуска от имени пользователя смотрите пример постом выше... как раз в этом сасмом rc.local.
    Запуск чего бы то ни было от имени конкретного пользователя когда-то сам решал (спрашивал) тут:
    https://www.moxa.ru/forum/index.php?/topic/6748-автозапуск-от-пользователя-в-ia240/
     
  7. b707

    b707 Гуру

    не надо ничего разруливать. Пихаешь загрузку в файл rc.local - это аналог autoexec.bat в ДОСе %)
    запуск от имени пользователя делается через su, например

    su --command="mount /u" b707
    - монтирование раздела /u под правами юзера b707
     
    Igor68 нравится это.
  8. parovoZZ

    parovoZZ Гуру

    Внутри что писать? Я прописал полный путь до бинарника - не работает. Там же ещё есть разные уровни, которые грузятся каждый в своё время. Я пока через скрин сижу - удобно, потому как вывод в файл и одновременно на экран, но автозапуска нет
     
  9. Igor68

    Igor68 Гуру

    Делал так:
    Код (Text):

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    #ram disk
    /etc/init.d/ramdisk

    mkdir /mnt/ramdisk/httpd
    mount --bind /mnt/ramdisk/httpd /home/httpd/ramdisk
    chmod 777 /home/httpd/ramdisk

    #запуск элементов сессии www-data
    /home/httpd/start/tstart&

    exit 0
     
    А это то, что мне надо было запустить:
    Код (Text):

    #!/bin/bash
    #

    ########################
    # Старт по telnet
    # для сессии www-data
    # запуск с опцией "run &"
    ########################

    ########################
    #  29.05.2017  - редактирование для автозапуска при включении
    #
    ########################

    #запуск процессов индукционной печи
    function _telnet_session()
    {
      (
      sleep 1
      echo "www-data" #login
      sleep 1
      echo "www-data" #password
      sleep 1
      ##############################
      #собственно запуск элементов
      ##############################
      #система охлаждения и контроля печи ABP
      echo "cd /home/httpd/cool"
      sleep 1
      echo "./cool.sh run &"
      #система контроля станции катодной защиты
      echo "cd /home/httpd/catserver"
      sleep 1
      echo "./workscs.sh &"
      #система водоподготовки
      echo "cd /home/httpd/swc"
      sleep 1
      echo "./swcwork.sh &"
      #логирование напряжения питания
      echo "cd /home/httpd/powercontrol"
      sleep 1
      echo "./powerlog.sh start &"
      ((loop = 1))
      while ( ((loop > 0)) )
      do
      sleep 1
      done
      #
      ) | telnet 127.0.0.1  
    }

    #старт
    _telnet_session

     
    Тут я делал чеерез Telnet... но наверное разумнее так:
    Код (Text):

    su www-data -c /home/httpd/bash/wwstart &
     
     
  10. parovoZZ

    parovoZZ Гуру

    Хм. Мне надо скрипт написать для запуска бинарника, а уже потом этот скрипт прописать в rc.local?
     
  11. b707

    b707 Гуру

    Не надо, бинарник можно вписывать сразу в rc.local.
    Если у тебя не работает - значит что-то не так с правами. Когда вручную этот бинарник запускаешь - работает?
     
  12. parovoZZ

    parovoZZ Гуру

    Из скрина от su - работает. Он в интерфейс SPI лезет, поэтому с рутовыми правами.
     
  13. Igor68

    Igor68 Гуру

    В rc.local добавьте перед звпуском бинарника... ну хоть это:
    Код (Text):

    chmod 777 /dev/spidev0.0
    chmod 777 /dev/spidev0.1
     
    или как там SPI обзывается... уточните этим:
    Код (Text):

    ls -al /dev
     
    И будет SPI доступен всем... ну или включите пользователя в группу SPI.
     
  14. b707

    b707 Гуру

    системный rc.local от рута и выполняется... обычно. По крайней мере от su точно должен запускаться
     
  15. b707

    b707 Гуру

    ну блин... если это исполнится, значит нужные права уже есть и бинарник должен срабатывать и так
     
  16. Igor68

    Igor68 Гуру

    Ещё как исполнится... Уже много лет так делаю на всех линуксах.
     
  17. parovoZZ

    parovoZZ Гуру

    Раз уж у нас такая полемика, то кто скажет, как make файл создавать для GCC?
     
  18. Igor68

    Igor68 Гуру

    https://habr.com/post/155201/
    Для таких влпросов гугл и существует... сам лично пользуюсь шаблоном:
    Код (Text):

    ###########################
    # Simple Generic Makefile #
    ###########################
    #для андроид Terminal IDE
    #CC=terminal-gcc
    #для любой машины
    CC=gcc
    #для IA240
    #PREFIXPATH=/usr/local/arm-linux/bin
    #CC=$(PREFIXPATH)/arm-linux-gcc

    #STRIP=$(PREFIXPATH)/arm-linux-strip
    #NAME=proxy


    CFLAGS=-c -Wall
    LDFLAGS=-lpthread #подключил библиотеку потоков

    #SOURCES=*.c
    SOURCES=$(shell ls *.c)  #все файлы Си в текущей директории

    OBJECTS=$(SOURCES:.c=.o)
    EXECUTABLE=work    #имя будущей программы

    all: $(SOURCES) $(EXECUTABLE)

    $(EXECUTABLE): $(OBJECTS)
      $(CC) $(LDFLAGS) $(OBJECTS) -o $@

    .c.o:
      $(CC) $(CFLAGS) $< -o $@

    install:
      install -m 0755 $(EXECUTABLE) $(HOME)/local/bin

    clean:
      rm -rf *o $(EXECUTABLE)

     
    Внимание Makefile чувствителен к переносам и пробелам и табуляции
    Так что надо вручную проверить
    Компилятор выбираю раскомментировав одну из верхних строчек
     
  19. b707

    b707 Гуру

    ну ты спросил... "make это целый мир" :)
    Об make толстенные книжки написаны.
    Ищи в Гугле что-нибудь типа "первые шаги с make"
     
  20. b707

    b707 Гуру

    Да понятно, что исполнится. Я имел в виду, что для этой операции нужны рут-права, а значит вместо этого можно сразу запустить бинарник и он должен работать
     
    Igor68 нравится это.