... и далее.

Тема в разделе "Флудилка", создана пользователем Igor68, 30 дек 2017.

  1. Igor68

    Igor68 Гуру

    от 17.01.2018
    Код (Text):
    # interfaces(5) file used by ifup(8) and ifdown(8)

    # Please note that this file is written to be used with dhcpcd
    # For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

    # Include files from /etc/network/interfaces.d:
    source-directory /etc/network/interfaces.d

    auto lo
    iface lo inet loopback

    ######################
    auto eth0
    iface eth0 inet dhcp
    ######################

    ######################
    auto eth0:0
    iface eth0:0 inet static
    address 192.168.1.131
    netmask 255.255.255.0
    ######################

    allow-hotplug wlan0
    iface wlan0 inet static
      address  192.168.7.1
      netmask  255.255.255.0
      network  192.168.7.0
      broadcast  192.168.7.255
    #post-up service udhcpd restart
    #up iptables-restore < /etc/iptables.ipv4.nat

    allow-hotplug wlan1
    iface wlan1 inet dhcp
    #wpa-ssid "dark_gray"
    #wpa-psk "13022005"
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
     
    Это мой /etc/network/interfaces как пример - понятное дело "dark_gray" это имя сети роутера, а "13022005" пароль для подключения к ней. Узел делает автоподключение... и создаёт свою подсеть по WIFI с IP 192.168.7.XX. параметры которой по правилу:
    http://academicfox.com/raspberry-pi-besprovodnaya-tochka-dostupa-wifi-access-point/
    Кстати:
    Код (Text):

    Проблема с wlan0 у Raspberry 3

    У Raspberry 3 есть свой собственный wifi адаптер. Хорошая новость в том, что он не висит на usb-шине и если раздавать интернет через него, то можно достичь максимальной скорости Wifi. Однако плохая новость в том, что Raspberry Pi 3 не всегда монтирует встроенный адаптер, как wlan0. Если на USB-шине уже висит какой-то wi-fi адаптер, то он может стать wlan0, а встроенный адаптер становится wlan1. Это не удобно, потому стоит "жёстко" закрепить wlan0 за встроенным адаптером. Для этого нужно добавить правило в файл /etc/udev/rules.d/70-persistent-net.rules. Правило должно выглядеть примерно так:

    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="b8:27:eb:53:4d:fd", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"

    Где b8:27:eb:53:4d:fd — это mac-адрес встроенного адаптера (его можно узнать с помощю команды ifconfig).
    Взято тут:
    http://musuk.guru/blog/raspberry-pi/raspberry-pi-2-wifi-router
    таким образом мой файл /etc/udev/rules.d/70-persistent-net.rules, которого не было и надо было создать редактором
    Код (Text):

    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="14:cc:20:16:12:9b", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan1"
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="b8:27:eb:27:74:e2", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"
     
    ...а применялся встроенный wlan0 и usb-wifi, который wlan1(не умеет быть хостом... а только для работы с внешней сетью). Теперь они не путаются.
    Код (Text):

    allow-hotplug wlan0
    auto wlan0
    iface wlan0 inet dhcp
    #iface wlan0 inet static
    wpa-ssid "bot_gray"
    wpa-psk "24011968"
     
    После этого все узлы будут подключены к одному, который организует сеть WIFI и раздаёт IP. Это только параметры из /etc/network/interfaces узлов. Но eth0 есть в каждом... иначе как настроить без дисплея и клавиатуры
    собственно источник:
    https://www.raspberrypi.org/forums/viewtopic.php?t=29175
    Но забыли про доступ для всех.
    Путь должен быть таким: /etc/init.d/ramdisk для этого файла:
    ramdisk.zip
    Сто делает:
    1. Организует RAM-диск. Путь: /mnr/ram0;
    2. Монтируем RAM-диск в заранее подготовленную директорию(для пользователя www-data) Путь: /home/httpd/ramdisk;
    3. Запускаем стартовый файл /home/httpd/bash/wwstart от имени www-data, который запустит то, что нам надо.
    Код (C++):
    #!/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

    #
    /etc/init.d/ramdisk restart
    #
    mount --bind /mnt/ram0 /home/httpd/ramdisk
    #
    su www-data -c /home/httpd/bash/wwstart &
    #
    exit 0
    После этого механизм работы и взаимодействия уже есть!
    Да требуется чтобы одна машина сама проверяла состояние другой. И ещё проводила обмен файлами с ней.
     

    Вложения:

    • bash.zip
      Размер файла:
      6,6 КБ
      Просмотров:
      243
    • config.zip
      Размер файла:
      382 байт
      Просмотров:
      235
    • src.zip
      Размер файла:
      22,5 КБ
      Просмотров:
      222
    • task.zip
      Размер файла:
      535 байт
      Просмотров:
      226
    • ramdisk.zip
      Размер файла:
      544 байт
      Просмотров:
      387
    • ipmem.zip
      Размер файла:
      58,5 КБ
      Просмотров:
      215
    Последнее редактирование: 17 янв 2018
  2. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Это для настройки малины из уже настроенной другой малины.
    Правим /etc/rc.local на настриваемой малине (с правами ROOT) :
    Код (Bash):
    #!/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

    #
    /etc/init.d/ramdisk restart
    #
    mount --bind /mnt/ram0 /home/httpd/ramdisk
    #
    su www-data -c /home/httpd/bash/wwstart &
    #
    exit 0
     
    Создаётся RAM-диск в /mnt/ram0, монтируется в /home/httpd/ramdisk и запускается /home/httpd/bash/wwstart (это будет после следующего включения/перезапуска.
    Копируем директории:
    Директория home/httpd/bash(как ранее говорилось это может быть и автоматически в дальнейшем)... но делайте из RAM-диска. Для этого скопировать sshcmd.sh в RAM-диск(/home/httpd/ramdisk) и перейти в него. Посмотреть и найти настраиваемую малину в /home/httpd/ramdisk/sshosts
    Код (Bash):
    192.168.7.1 22 Connection to 192.168.7.1 22 port [tcp/ssh] succeeded!
    192.168.7.18 22 Connection to 192.168.7.18 22 port [tcp/ssh] succeeded!
    192.168.7.19 22 Connection to 192.168.7.19 22 port [tcp/ssh] succeeded!
    192.168.7.20 22 Connection to 192.168.7.20 22 port [tcp/ssh] succeeded!
    192.168.7.21 22 Connection to 192.168.7.21 22 port [tcp/ssh] succeeded!
    Понятное дело все адреса выданы автоматически первой малиной.
    Код (Bash):

    www-data@raspberrypi:~/ramdisk$ ./sshcmd.sh tcmd www-data@192.168.7.18 www-data ./tt1 "ls -al"

    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.

    SSH is enabled and the default password for the 'pi' user has not been changed.
    This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

    total 12
    drwxr-xr-x 3 www-data www-data 4096 Mar  3 19:08 .
    drwxr-xr-x 4 root  root  4096 Mar  3 16:38 ..
    www-data@raspberrypi:~/ramdisk$
     
    Как видно наша директория пуста... и не заходя туда сделаем /home/httpd/ramdisk
    Код (Bash):
    www-data@raspberrypi:~/ramdisk$ ./sshcmd.sh tcmd www-data@192.168.7.18 www-data ./tt1 "mkdir ramdisk"

    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.

    SSH is enabled and the default password for the 'pi' user has not been changed.
    This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.
    www-data@raspberrypi:~/ramdisk$
    Ну и проверим:
    Код (Bash):
    www-data@raspberrypi:~/ramdisk$ ./sshcmd.sh tcmd www-data@192.168.7.18 www-data ./tt1 "ls -al"

    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.

    SSH is enabled and the default password for the 'pi' user has not been changed.
    This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

    total 12
    drwxr-xr-x 3 www-data www-data 4096 Mar  3 19:08 .
    drwxr-xr-x 4 root     root     4096 Mar  3 16:38 ..
    drwxr-xr-x 2 www-data www-data 4096 Mar  3 19:08 ramdisk
    www-data@raspberrypi:~/ramdisk$
    Диск создан! Копируем наш(на малине) /home/httpd/*****:
    Код (Bash):
    www-data@raspberrypi:~/ramdisk$ ./sshcmd.sh tohost www-data@192.168.7.18 www-data ./ttt /home/httpd/bash /home/httpd/bash
    www-data@192.168.7.18 www-data ./ttt /home/httpd/bash /home/httpd/bash
    www-data@raspberrypi:~/ramdisk$ ./sshcmd.sh tohost www-data@192.168.7.18 www-data ./ttt /home/httpd/config /home/httpd/config
    www-data@192.168.7.18 www-data ./ttt /home/httpd/config /home/httpd/config
    www-data@raspberrypi:~/ramdisk$ ./sshcmd.sh tohost www-data@192.168.7.18 www-data ./ttt /home/httpd/src /home/httpd/src
    www-data@192.168.7.18 www-data ./ttt /home/httpd/src /home/httpd/src
    www-data@raspberrypi:~/ramdisk$ ./sshcmd.sh tohost www-data@192.168.7.18 www-data ./ttt /home/httpd/task /home/httpd/task
    www-data@192.168.7.18 www-data ./ttt /home/httpd/task /home/httpd/task
    www-data@raspberrypi:~/ramdisk$
    и после проверяем:
    Код (Bash):
    www-data@raspberrypi:~/ramdisk$ ./sshcmd.sh tcmd www-data@192.168.7.18 www-data ./tt1 "ls -al"

    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.

    SSH is enabled and the default password for the 'pi' user has not been changed.
    This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

    total 28
    drwxr-xr-x 7 www-data www-data 4096 Mar  3 19:18 .
    drwxr-xr-x 4 root     root     4096 Mar  3 16:38 ..
    drwxr-xr-x 2 www-data www-data 4096 Mar  3 19:15 bash
    drwxr-xr-x 2 www-data www-data 4096 Mar  3 19:16 config
    drwxr-xr-x 2 www-data www-data 4096 Mar  3 19:08 ramdisk
    drwxr-xr-x 3 www-data www-data 4096 Mar  3 19:17 src
    drwxr-xr-x 2 www-data www-data 4096 Mar  3 19:18 task
    www-data@raspberrypi:~/ramdisk$
    И так всё на месте... и перезапуск. От имени ROOT так, что входим на устройство по SSH и потом перейдя по su перегружаем устройство по reboot

    и... на вскидку проверяем для наглядности:
    Код (Bash):
    www-data@raspberrypi:~/ramdisk$ ./sshcmd.sh tcmd www-data@192.168.7.18 www-data ./tt1 "ps -A"

    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.

    SSH is enabled and the default password for the 'pi' user has not been changed.
    This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

      PID TTY          TIME CMD
        1 ?        00:00:03 systemd
        2 ?        00:00:00 kthreadd
        3 ?        00:00:00 ksoftirqd/0
        4 ?        00:00:00 kworker/0:0
        5 ?        00:00:00 kworker/0:0H
        6 ?        00:00:01 kworker/u8:0
        7 ?        00:00:00 rcu_sched
        8 ?        00:00:00 rcu_bh
    ...
    ...
    ...
    7609 ?        00:00:00 spp.sh
    7613 ?        00:00:00 spp.sh
    7616 ?        00:00:00 nc
    7633 ?        00:00:00 spp.sh
    7637 ?        00:00:00 spp.sh
    7644 ?        00:00:00 nc
    7654 ?        00:00:00 sshd
    7657 ?        00:00:00 spp.sh
    7660 ?        00:00:00 spp.sh
    7664 ?        00:00:00 nc
    7666 ?        00:00:00 bash
    7678 ?        00:00:00 spp.sh
    7682 ?        00:00:00 spp.sh
    7683 ?        00:00:00 nc
    7692 ?        00:00:00 spp.sh
    7694 ?        00:00:00 spp.sh
    7696 ?        00:00:00 nc
    7702 ?        00:00:00 spp.sh
    7704 ?        00:00:00 spp.sh
    7706 ?        00:00:00 nc
    7714 ?        00:00:00 spp.sh
    7716 ?        00:00:00 spp.sh
    7718 ?        00:00:00 nc
    7731 ?        00:00:00 ps
    7732 ?        00:00:00 spp.sh
    7734 ?        00:00:00 spp.sh
    7736 ?        00:00:00 nc
    19800 ?        00:00:00 sshd
    24825 ?        00:00:00 sshd
    24827 pts/0    00:00:00 bash
    www-data@raspberrypi:~/ramdisk$
     
    А что собственно произошло?
    1 - наш /etc/rc.local запустил /home/httpd/bash/wwstart - это скрипт... а он скопировал lwork.sh в ramdisk и запустил его там в тени. А lwork.sh рабочий цикл, который проверяя /home/httpd/task запускает процессы (если такие не запущены), указанные там (там только имена). В ряде случаев имена это пустые файлы с именем файла из /home/httpd/bash. Но если он не пустой, то содержимое будет входными параметрами для одноимённого файла в ../bash. Перед запуском каждый запускаемый файл копируется в RAM-диск(/home/httpd/ramdisk), а потом запускается. Цикличность работы скрипта lwork.sh определяется параметром в /home/httpd/config/lwork.cfg. Как можно заметить контролируется не только список хостов с портом 22 в этой сети(подсети), но и наличие и версия проекта в /home/httpd/src... кока что ipmem. Если /home/httpd/src/ipmem/src/work/ipmem ,будет отсутствовать или не соответствовать версии, указанной в /home/httpd/src/ipmem/src/version.h, будет тут же откомпилирован и помещён в /home/httpd/src/ipmem/work/ipmem. Кстати результаты сканирования сети размещаются в ramdisk/sshhost с интервалом 10 сек(за это время успевает проверить адреса с 192.168.7.1 по 192.168.7.254 порт 22)
     
    Последнее редактирование: 13 янв 2018
  3. Igor68

    Igor68 Гуру

    Доброго времени суток!
    ...собственно начало. Всё в проекте "ipmem". Пока только выработка метода взаимодействия программы с выделенной памятью. Пока, сто это разделяемая память на устройстве... и как таковой сервер ещё не в действии... но в действии отдельные тестовые программы "test1" и "test2". Участие принимает разделяемая память на устройстве - директория "/dev/shm".
    Смысл теста:
    Код (Bash):
    #!/bin/bash
    #
    killall -9 test1
    killall -9 test2
    echo -e "======= test ======"
    echo -e "1) создание разделяемой памяти с помощью \"ipmem\" 256 байт"
    ./ipmem --cleshm -nshm testm -smfshm tests -szshm 256
    echo -e "2) программа модификации дампа памяти \"test1\""
    ./test1 -nshm testm -smfshm tests -szshm 256 &
    echo -e "4) программа вывода  дампа памяти \"test2\""
    ./test2 -nshm testm -smfshm tests -szshm 256 &
     
    Смысл в том, что:
    1) "ipmem", хоть только и начало формирует:
    Код (Text):
    igor@debian-i:/dev/shm$ ls -al
    итого 272
    drwxrwxrwt  2 root root      220 Янв 17 20:00 .
    drwxr-xr-x 33 root root     1380 Янв 17 20:08 ..
    -r--------  1 igor igor 67108904 Янв 17 19:56 pulse-shm-176937212
    -r--------  1 igor igor 67108904 Янв 17 19:55 pulse-shm-2038499273
    -r--------  1 igor igor 67108904 Янв 17 19:55 pulse-shm-2597288203
    -r--------  1 igor igor 67108904 Янв 17 19:57 pulse-shm-2824082406
    -r--------  1 igor igor 67108904 Янв 17 19:56 pulse-shm-2834672448
    -r--------  1 igor igor 67108904 Янв 17 19:56 pulse-shm-3140599038
    -rwxr-xr-x  1 igor igor       16 Янв 17 20:00 sem.tests
    -rwxr-xr-x  1 igor igor      257 Янв 17 20:01 testm
    -rw-r--r--  1 root root        0 Янв 17 19:53 .tmpfs
    igor@debian-i:/dev/shm$
    то есть:
    Код (Text):
    -rwxr-xr-x  1 igor igor       16 Янв 17 20:00 sem.tests
    -rwxr-xr-x  1 igor igor      257 Янв 17 20:01 testm
    Собственно семафор и сегмент памяти:
    2) программа "test1" реализует и заполняет свой внутренний буфер размером 256 байт... и заполняя его значениями 0...255 записывает его в разделяемую память "/dev/shm/testm". Далее в цикле читается содержимое "/dev/shm/testm" в свой буфер и каждое его значение увеличивается на 1, после чего записывается обратно в "/dev/shm/testm". Ну и по циклу бесконечно.
    3) программа "test2" просто читает содержимое "/dev/shm/testm" и выводит его на экран в виде дампа... тоже в бесконечном цикле:
    Код (Text):
    ---dump---
    14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23
    24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33
    34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43
    44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53
    54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63
    64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73
    74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83
    84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93
    94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3
    A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3
    B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3
    C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3
    D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3
    E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3
    F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF 00 01 02 03
    04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
    ---dump---
    15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24
    25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34
    35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44
    45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54
    55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64
    65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74
    75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84
    85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94
    95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4
    A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4
    B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4
    C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4
    D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4
    E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4
    F5 F6 F7 F8 F9 FA FB FC FD FE FF 00 01 02 03 04
    05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14
    ---dump---
    16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25
    26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35
    36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45
    46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55
    56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65
    66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75
    76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85
    86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95
    96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5
    A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5
    B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5
    C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5
     
    В принципе ничего серьёзного... но "одновременный" доступ к одному адресному пространству разных программ - это многое означает. Именно - допустим картинка с камеры будет доступна множеству программ. А дальнейшее развитие проекта позволит расширить линейное адресное пространство на много устройств... и каждая (и не одна) программа на каждом устройстве будет иметь доступ к своим адресам.
    Пока только отработка интерфейса... с конечной точкой - какой-то программой.
    Все применения в "ipmem.zip" от 17.01.2018. Заголовочный файл 'imclient.h и содержит функции для работы со стороны конечной точки - программы! Всё в "test1" и "test2" после компиляции всё будет в ../bin. там и тестовый скрипт запуска двух программ.
    После теста остановить:
    killall test1
    killall test2

    Ранее задавал вопрос на эту тему с фразой: "Может велосипед делаю?"... но в ответ тишина и разговоры про котов.

    !!! Для тестирования надо перекомпилировать (ipmem,test1,test2).
     
    Последнее редактирование: 18 янв 2018
  4. Igor68

    Igor68 Гуру

    Доброго времени суток!
    ...Вот потребовалось снова устанавливать Open CV на малину. Старая SD карта умерла и скопировать образ не удалось, да и Debian там был прежней версии. И вот все бубны сломал... хотел конечно последнюю версию... но то CMake старый, то собрать не выходит, то ещё что. и каждый Open CV (opencv-2.2.0(совсем старый), opencv-2.4.7(по моему он у меня был ранее), opencv-2.4.10(вот сейчас он у меня только что) ну и opencv-3.3.0(что-то не пошло, да и не пытался более).
    И как в разных инструкциях:
    http://cxem.net/arduino/arduino112.php
    http://robotclass.ru/articles/raspberrypi-3-opencv-3-install/
    http://3dberry.org/node/10
    https://www.pyimagesearch.com/2015/02/23/install-opencv-and-python-on-your-raspberry-pi-2-and-b/
    http://robocraft.ru/blog/computervision/3242.html
    ну и других. Скажу сразу, что не осведомлён про конфигурации вот эти:
    Код (Text):
    cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/Downloads/opencv_contrib-master/modules
    -D BUILD_EXAMPLES=ON ..
    ,
    эти:
    Код (Text):
    cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_gpu=OFF -DBUILD_opencv_ocl=OFF
    и просто
    Код (Text):
    cmake ..
    ... короче взяв отовсюду компоненты для установки и испытав всё это установил:
    из директории opencv-2.4.10/build (распаковываем архив opencv-2.4.10 и создаём в той директории директорию "build")... там запускаем:
    Код (Text):
    $ cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_gpu=OFF -DBUILD_opencv_ocl=OFF ..
    /две точки означают, что он будет всё брать из директорий, что выше на уровень - если одна точка, то все запускается в папке проекта... но это мусорить там/
    Далее ждём и получаем отчёты... должно всё быть нормально, если всё есть и cmake подходящий по версии... а наша папка "build" станет заполнена этим:
    Код (Text):
    www-data@raspberrypi:~/install/opencv-2.4.10/build$ ls
    3rdparty  CMakeCache.txt       cmake_uninstall.cmake    cvconfig.h  include               lib       opencv2                     OpenCVModules.cmake
    apps      CMakeFiles           CPackConfig.cmake        data        install_manifest.txt  Makefile  OpenCVConfig.cmake          unix-install
    bin       cmake_install.cmake  CPackSourceConfig.cmake  doc         junk                  modules   OpenCVConfig-version.cmake  version_string.tmp
    www-data@raspberrypi:~/install/opencv-2.4.10/build$
    , а в отчёте не будет ошибок.
    Итак всё готово теперь:
    Код (C++):
    make -j4
    кстати -j4 это чтобы заработали все 4 ядра... будет быстрее, чем с одним... но все равно не быстро. У меня малины как серверы только по ssh и никаких клавиатур и дисплеев... да ещё через другую малину, которая раздаёт WIFI. Ну и если все в порядке то дойдёте до 100%.
    после этого
    Код (Text):
    sudo make install
    понятное дело если из под ROOT то sudo не надо. И всё вуфля!
    Нооооооо вот у меня доходило до половины и ошибки то какого то CODE_ID_XXX не находит и всё с файлами
    Код (Text):
    cap_ffmpeg.cpp
    cap_ffmpeg_api.hpp
    cap_ffmpeg_impl.hpp
    ... и т.д.
    И вот решил:
    https://uzverss.livejournal.com/74703.html
    Код (Text):
    11:52 pm - FFmpeg - установка на Debian GNU/Linux 8 (Jessie)
    Если вам требуется перекодировать видео, вынуть из него скриншот, нарезать видеофайл или объединить, то ffmpeg — это то, что вам нужно! В Debian Jessie этот пакет исключили из официального репозитория и вместо него оставили avconv(Libav), который является форком и был рождем из-за конфликта внутри команды разработчиков. Конечно можно использовать и его или сделать линк в папке /usr/local/bin, но многие плагины требуют по привычке ffmpeg. Поэтому давайте рассмотрим несколько способо установки этого замечательного пакета.

    1. Настроим apt на использование deb-multimedia репозитория
    Это форк дебиана, в котором используется ffmpeg вместо avconv (Libav). Следующие команды выполняются из-под рута.

    1.1) Добавте следующие команды вниз /etc/apt/sources.list:

    sudo nano /etc/apt/sources.list

    добавить:

    deb http://www.deb-multimedia.org jessie main non-free
    deb-src http://www.deb-multimedia.org jessie main non-free

    1.2) Обновите базу пакетов apt:

    sudo apt-get update

    1.3) Добавим ключи deb-multimedia:

    sudo apt-get install deb-multimedia-keyring

    1.4) Обновим базу пакетов снова:

    sudo apt-get update

    2. Удалим пакет ffmpeg debian и установим новый из репозитория

    2.1) Очистим систему от прошлых установок, если они были, чтобы предотвратить конфликт двух установленных версий и связанных с ним пакетов:

    sudo apt-get remove ffmpeg
    sudo apt-get install ffmpeg

    На этом можно было-бы и закончить, но недавно вышла версия 3,в которой добавили много разных вкусностей. А так как контрибьютеры не спешат добавлять ее в репозиторий, то мы поставим ее из иходников.

    3. Установка библиотек и зависимостей для сбоки из исходников

    sudo apt-get install build-essential libmp3lame-dev libvorbis-dev libtheora-dev libspeex-dev yasm pkg-config libfaac-dev libopenjpeg-dev libx264-dev

    4. Собираем пакет

    4.1) Скачаем и распакуем исходный код:

    mkdir software; cd software; wget http://ffmpeg.org/releases/ffmpeg-3.1.4.tar.bz2; cd ..; mkdir src; cd src; tar xvjf ../software/ffmpeg-3.1.4.tar.bz2

    4.2) Перейдем в папку с исходным кодом:

    cd ffmpeg-3.1.4

    4.3) Сконфигурируем, соберем и установим:

    ./configure --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libx264 --enable-libspeex --enable-shared --enable-pthreads --enable-libopenjpeg --enable-libfaac --enable-nonfree

    make

    sudo make install

    4.4) Запустим "/sbin/ldconfig" из-под root. На этом наша установка закончена.

    чтобы потом не мучится с make uninstall вместо sudo make install я предпочитаю
    sudo checkinstall -D

    если при сборке возникает ошибка:
    mkdir: невозможно создать каталог «/usr/local/share/ffmpeg»: Нет такого файла или каталога
    Makefile:166: ошибка выполнения рецепта для цели «install-data»
    make: *** [install-data] Ошибка 1

    mkdir: невозможно создать каталог «/usr/local/share/ffmpeg»: Нет такого файла или каталога
    Makefile:166: ошибка выполнения рецепта для цели «install-data»
    make: *** [install-data] Ошибка 1
    ****  Установка неудачна. Отменяется создание пакета.
    Очищается...OK
    Удачи.

    то

    sudo mkdir /usr/local/share/ffmpeg

    а затем

    sudo checkinstall -D

    удалим лишнее:

    cd ../..; rm -rf software/ src/
    После этого make дополз до 100% и всё установилось, вот только выполнил всё до пункта 2.1 включительно.
    Удачи!
     
    Последнее редактирование: 25 мар 2018
  5. parovoZZ

    parovoZZ Гуру

    это что такое высыпалось???
     
  6. Igor68

    Igor68 Гуру

    О! Привет!
    Да нет конечно! Это про установку пакета Open CV. Сильный пакет, но бывают нюансы при установке. Конечно зависит от варианта установленного Rasbian. Вы наверное заметили тут
    http://cxem.net/arduino/arduino112.php
    что не все используют устройство с монитором. Если не затруднит и интересно, то почитайте про этот пакет. Интересно... не правда ли?
     
  7. parovoZZ

    parovoZZ Гуру

    Ну, понятно.
     
  8. Igor68

    Igor68 Гуру

    Доброго времени суток! Продолжаю работу... но простите за пояснения. Может и излишнее.
    Ещё раз простите! Но:
    bin.zip
    stst1.zip
    stst2.zip
    Собственно тут указанное выше(ранее) - вырезка. Что собственно - допустим первая программа (на основе test1) читает данные к примеру с web-камеры... ну допустим покадрово и записывает их с предварительной обработкой или без... и записывает в разделяемую память. Соответственно программа (на основе test2) читает эти данные из разделяемой памяти и что-то делает. Так же и другие программы (несколько) тоже на основе test2 что-то делают с извлекаемыми данными. Требуется только изменить требуемый размер:
    Код (C++):
    char         SEMAPHORE_NAME[256];            // "/test_named_semaphore"
    char         SHARED_MEMORY_OBJECT_NAME[256];     // "test_shared_memory"
    u_int64_t    SHARED_MEMORY_OBJECT_SIZE;
    ...
    ...
    _SshMemCreate(&SHARED_MEMORY_OBJECT_NAME[0], &SEMAPHORE_NAME[0], 256, &sshm);
    256 - это я для теста выбрал размер. Для картинки соответственно другой. Главное все программы при доступе не будут мешать друг другу.
    Удачи! Это очень выгодно разделять задачу на несколько программ!
    Причём не только одна программа может производить запись, а каждая. Всё зависит от задачи.
    И простите если, что не так... точнее не требуется.
     

    Вложения:

    • bin.zip
      Размер файла:
      16,5 КБ
      Просмотров:
      371
    • stst1.zip
      Размер файла:
      4,6 КБ
      Просмотров:
      328
    • stst2.zip
      Размер файла:
      4,6 КБ
      Просмотров:
      413
  9. Igor68

    Igor68 Гуру

    Доброго времени суток!!!
    Перед тем как продолжить что-то своё, решил испытать элементы "кластера" на MPI пока только пару малин. По wifi как и задумано ранее. и сразу ряд вопросов:
    --- формирование связи с применением id_rsa.pub. Всё получается, кроме того, что можно подключаться по SSH с одной малины(MASTER) к другой(SLAVE)... но не наоборот. От SLAVE запрашивается пароль. Хоть и делал аналогично и от SLAVE в MASTER переносил ключи. (Простите в этой области я ниже нуба). Хотя может так и должно?
    --- запуск программы MPI (процессы на разных малинах) с предварительным переносом копий программ в другие малины. Компиляция применяя MPICH.
    Вот скрипт который переносит программу на указанные узлы:
    Код (Bash):
    #!/bin/bash
    #

    #путь для запуска
    pwork="/home/httpd/ramdisk"
    fwork=$1
    pfwork="$pwork/$fwork"
    echo "$pfwork"
    #тут копируем файлы на узлы
    url="192.168.7.1"
    scp -r $fwork $url:$pfwork
    url="192.168.7.2"
    scp -r $fwork $url:$pfwork
    #переходим в корень пользователя и запускаем
    cd ~
    mpirun -f ~/mpi.hosts -n 10  $pfwork
    на 10 процессов. По понятным причинам рабочая область в RAMDISKе. Это шаблон и входным параметром является имя файла запускаемой программы. Всё конечно работает, только время подключения(копирования и запуска). Да и копирование в собственный адрес 192.168.7.1 требует пароля (я на это не обращаю внимания - можно переделать).
    Должно запускаться только из корня (без настройки путей и т.п.)?
    - Возможно ли запускать не копии одной программы, а совсем разные проекты, но с единым
    - взаимодействием по MPI?
    Радует конечно то, что можно запустить параллельно скрипты на разных хостах например df -h
    Код (Text):
    www-data@pi01:~$ mpirun -f ~/mpi.hosts df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/root        15G  5.2G  8.9G  37% /
    devtmpfs        458M     0  458M   0% /dev
    tmpfs           462M     0  462M   0% /dev/shm
    tmpfs           462M  6.6M  456M   2% /run
    tmpfs           5.0M  4.0K  5.0M   1% /run/lock
    tmpfs           462M     0  462M   0% /sys/fs/cgroup
    /dev/mmcblk0p1   63M   21M   42M  34% /boot
    /dev/ram0       3.9M  1.7M  2.2M  44% /mnt/ram0
    tmpfs            93M     0   93M   0% /run/user/1002
    tmpfs            93M     0   93M   0% /run/user/1000
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/root        30G  4.3G   24G  16% /
    devtmpfs        458M     0  458M   0% /dev
    tmpfs           462M     0  462M   0% /dev/shm
    tmpfs           462M  6.3M  456M   2% /run
    tmpfs           5.0M  4.0K  5.0M   1% /run/lock
    tmpfs           462M     0  462M   0% /sys/fs/cgroup
    /dev/mmcblk0p1   63M   21M   42M  34% /boot
    /dev/ram0       3.9M   55K  3.9M   2% /mnt/ram0
    tmpfs            93M     0   93M   0% /run/user/1001
    tmpfs            93M     0   93M   0% /run/user/1000
    www-data@pi01:~$
    тут информация от двух малин.
    Если есть возможность запускать разные программы на разных малинах с едиой системой взаимодействия, то не потребуется городить велосипед. Например одна малина с камерой, дальномером и приводами, а остальные работают по обработке и управлению.
    И интересно было бы иметь взаимодействие между хостами, когда из более 2-х "напрямую", а не через "МАСТЕР"
    С глубоким уважением!
    Заранее спасибо!
     
  10. Igor68

    Igor68 Гуру

    ...вот для уточнения... Этот вопрос:
    о запуске нескольких(двух на примере) разных программ с единым обменом - очень меня волнует. ОЧЕНЬ!
    пробую:
    Код (Bash):
    #!/bin/bash

    ./startmpi cpi &
    ./startmpi test4_mpi &
    где startmpi - это скрипт из прошлого сообщения.
    Глупо наверное. первая программа - cpi это вычисление числа пи, только я "завернул" её внутри цикла в коде Си. Вторя программа это:
    Код (C++):
    //main.c
    #include <stdio.h>
    #include "mpi.h"
    #define MAX 100
    int main(int argc, char **argv)
    {
       int rank, size, n, i, ibeg, iend;
       MPI_Init(&argc, &argv);
       MPI_Comm_size(MPI_COMM_WORLD, &size);
       MPI_Comm_rank(MPI_COMM_WORLD, &rank);
       n=(MAX-1)/size+1;
       ibeg=rank*n+1;
       iend=(rank+1)*n;
       for(i=ibeg; i<=((iend>MAX)?MAX:iend); i++)
          printf ("process %d, %d^2=%d\n", rank, i, i*i);
       MPI_Finalize();
       //return 0;
    }
     
    И то же в бесконечном цикле. В обоих циклах есть sleep(1) ожидание секунду.
    есть даже вывод в консоли:
    process 9, 91^2=8281
    process 9, 92^2=8464
    process 9, 93^2=8649
    process 9, 94^2=8836
    process 9, 95^2=9025
    process 9, 96^2=9216
    process 9, 97^2=9409
    process 9, 98^2=9604
    process 9, 99^2=9801
    process 9, 100^2=10000
    process 5, 51^2=2601
    process 5, 52^2=2704
    process 5, 53^2=2809
    process 5, 54^2=2916
    process 5, 55^2=3025
    process 5, 56^2=3136
    process 5, 57^2=3249
    process 5, 58^2=3364
    process 5, 59^2=3481
    process 5, 60^2=3600
    process 7, 71^2=5041
    process 7, 72^2=5184
    process 7, 73^2=5329
    process 7, 74^2=5476
    process 7, 75^2=5625
    process 7, 76^2=5776
    process 7, 77^2=5929
    process 7, 78^2=6084
    process 7, 79^2=6241
    process 7, 80^2=6400
    process 4, 41^2=1681
    process 4, 42^2=1764
    process 4, 43^2=1849
    process 4, 44^2=1936
    process 4, 45^2=2025
    process 4, 46^2=2116
    process 4, 47^2=2209
    process 4, 48^2=2304
    process 4, 49^2=2401
    process 4, 50^2=2500
    process 2, 21^2=441
    process 2, 22^2=484
    process 2, 23^2=529
    process 2, 24^2=576
    process 2, 25^2=625
    process 2, 26^2=676
    process 2, 27^2=729
    process 2, 28^2=784
    process 2, 29^2=841
    process 2, 30^2=900
    process 6, 61^2=3721
    process 6, 62^2=3844
    process 6, 63^2=3969
    process 6, 64^2=4096
    process 6, 65^2=4225
    process 6, 66^2=4356
    process 6, 67^2=4489
    process 6, 68^2=4624
    process 6, 69^2=4761
    process 6, 70^2=4900
    process 8, 81^2=6561
    process 8, 82^2=6724
    process 8, 83^2=6889
    process 8, 84^2=7056
    process 8, 85^2=7225
    process 8, 86^2=7396
    process 8, 87^2=7569
    process 8, 88^2=7744
    process 8, 89^2=7921
    process 8, 90^2=8100
    process 0, 1^2=1
    process 0, 2^2=4
    process 0, 3^2=9
    process 0, 4^2=16
    process 0, 5^2=25
    process 0, 6^2=36
    process 0, 7^2=49
    process 0, 8^2=64
    process 0, 9^2=81
    process 0, 10^2=100
    process 3, 31^2=961
    process 3, 32^2=1024
    process 3, 33^2=1089
    process 3, 34^2=1156
    process 3, 35^2=1225
    process 3, 36^2=1296
    process 3, 37^2=1369
    process 3, 38^2=1444
    process 3, 39^2=1521
    process 3, 40^2=1600
    process 9, 91^2=8281
    process 9, 92^2=8464
    process 9, 93^2=8649
    process 9, 94^2=8836
    process 9, 95^2=9025
    process 9, 96^2=9216
    process 9, 97^2=9409
    process 9, 98^2=9604
    process 9, 99^2=9801
    process 9, 100^2=10000
    process 1, 11^2=121
    process 1, 12^2=144
    process 1, 13^2=169
    process 1, 14^2=196
    process 1, 15^2=225
    process 1, 16^2=256
    process 1, 17^2=289
    process 1, 18^2=324
    process 1, 19^2=361
    process 1, 20^2=400
    process 5, 51^2=2601
    process 5, 52^2=2704
    process 5, 53^2=2809
    process 5, 54^2=2916
    process 5, 55^2=3025
    process 5, 56^2=3136
    process 5, 57^2=3249
    process 5, 58^2=3364
    process 5, 59^2=3481
    process 5, 60^2=3600
    process 7, 71^2=5041
    process 7, 72^2=5184
    process 7, 73^2=5329
    process 7, 74^2=5476
    process 7, 75^2=5625
    process 7, 76^2=5776
    process 7, 77^2=5929
    process 7, 78^2=6084
    process 7, 79^2=6241
    process 7, 80^2=6400
    Process 4 of 10 is on pi01
    Process 6 of 10 is on pi01
    Process 8 of 10 is on pi01
    Process 2 of 10 is on pi01
    Process 4 of 10 is on pi01
    Process 6 of 10 is on pi01
    Process 2 of 10 is on pi01
    Process 8 of 10 is on pi01
    process 0, 1^2=1
    process 0, 2^2=4
    process 0, 3^2=9
    process 0, 4^2=16
    process 0, 5^2=25
    process 0, 6^2=36
    process 0, 7^2=49
    process 0, 8^2=64
    process 0, 9^2=81
    process 0, 10^2=100
    process 4, 41^2=1681
    process 4, 42^2=1764
    process 4, 43^2=1849
    process 4, 44^2=1936
    process 4, 45^2=2025
    process 4, 46^2=2116
    process 4, 47^2=2209
    process 4, 48^2=2304
    process 4, 49^2=2401
    process 4, 50^2=2500
    Process 3 of 10 is on pi02
    Process 7 of 10 is on pi02
    process 6, 61^2=3721
    process 6, 62^2=3844
    process 6, 63^2=3969
    process 6, 64^2=4096
    process 6, 65^2=4225
    process 6, 66^2=4356
    process 6, 67^2=4489
    process 6, 68^2=4624
    process 6, 69^2=4761
    process 6, 70^2=4900
    Process 5 of 10 is on pi02
    Process 9 of 10 is on pi02
    process 1, 11^2=121
    process 1, 12^2=144
    process 1, 13^2=169
    process 1, 14^2=196
    process 1, 15^2=225
    process 1, 16^2=256
    process 1, 17^2=289
    process 1, 18^2=324
    process 1, 19^2=361
    process 1, 20^2=400
    Process 1 of 10 is on pi02
    Process 9 of 10 is on pi02
    process 3, 31^2=961
    process 3, 32^2=1024
    process 3, 33^2=1089
    process 3, 34^2=1156
    process 3, 35^2=1225
    process 3, 36^2=1296
    process 3, 37^2=1369
    process 3, 38^2=1444
    process 3, 39^2=1521
    process 3, 40^2=1600
    process 8, 81^2=6561
    process 8, 82^2=6724
    process 8, 83^2=6889
    process 8, 84^2=7056
    process 8, 85^2=7225
    process 8, 86^2=7396
    process 8, 87^2=7569
    process 8, 88^2=7744
    process 8, 89^2=7921
    process 8, 90^2=8100
    process 2, 21^2=441
    process 2, 22^2=484
    process 2, 23^2=529
    process 2, 24^2=576
    process 2, 25^2=625
    process 2, 26^2=676
    process 2, 27^2=729
    process 2, 28^2=784
    process 2, 29^2=841
    process 2, 30^2=900
    Process 0 of 10 is on pi01
    Process 7 of 10 is on pi02
    Process 0 of 10 is on pi01
    Process 1 of 10 is on pi02
    process 9, 91^2=8281
    process 9, 92^2=8464
    process 9, 93^2=8649
    process 9, 94^2=8836
    process 9, 95^2=9025
    process 9, 96^2=9216
    process 9, 97^2=9409
    process 9, 98^2=9604
    process 9, 99^2=9801
    process 9, 100^2=10000
    Process 3 of 10 is on pi02
    Process 5 of 10 is on pi02
    process 5, 51^2=2601
    process 5, 52^2=2704
    process 5, 53^2=2809
    process 5, 54^2=2916
    process 5, 55^2=3025
    process 5, 56^2=3136
    process 5, 57^2=3249
    process 5, 58^2=3364
    process 5, 59^2=3481
    process 5, 60^2=3600
    process 7, 71^2=5041
    process 7, 72^2=5184
    process 7, 73^2=5329
    process 7, 74^2=5476
    process 7, 75^2=5625
    process 7, 76^2=5776
    process 7, 77^2=5929
    process 7, 78^2=6084
    process 7, 79^2=6241
    process 7, 80^2=6400
    pi is approximately 3.14159265358987083160968722950201, Error is 0.00000000000007771561172376095783
    wall clock time = 0.093781
    pi is approximately 3.14159265358987083160968722950201, Error is 0.00000000000007771561172376095783
    wall clock time = 0.093969
    process 4, 41^2=1681
    process 4, 42^2=1764
    process 4, 43^2=1849
    Тут вроде как работают оба, но думаю без совместного обмена.
    Подскажите как быть с этим. Или делать велосипед.
     
  11. Igor68

    Igor68 Гуру

    ...вот ковыряясь выяснил, что из одной MPI сессии у меня получается запустить совсем разные программы, если их имена совпадают на элементах кластера. Это совсем другое... в прошлом сообщении я отрывал MPI сессию для каждой программы отдельно. Вот опыты:
    two2.zip
    Собственно это две одинаковые программы с несколько разным содержимым. И если выйдет производить обмен данными, то можно строить распределённую систему управления (или что-то ещё) на неоднородном коде. Простите, но напомню, что механизм MPI задуман для распараллеливания вычислений, распределяя нагрузку не только на разные процессоры, но и на разные компьютеры в сети.
    Если кто знаком с этим, и если не сложно пожалуйста поделитесь опытом!
    Заранее спасибо.
     

    Вложения:

    • two2.zip
      Размер файла:
      6,4 КБ
      Просмотров:
      387
  12. Igor68

    Igor68 Гуру

    Кстати про /dev/shm не использовал потому как ранее не доверял, а скорее не догадывался... а скорее всего не знал. Теперь использую как RAM-диск. Думаю это правильно и не надо делать лишний mount типа:
    Код (Bash):
    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides: A ramdisk to save intermittent data
    # Required-Start:
    # Required-Stop:
    # X-Start-Before:
    # X-Stop-After:
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: create a ramdisk
    # Description: create a ramdisk with 64MB and mount it to /mnt/ram0
    ### END INIT INFO
    ramdev="/dev/ram1"
    shmdev="/dev/shm/shmdisk"
    size=3
    blocksize=2048
    ((rrsize = size * blocksize))
    #
    function fhelp()
    {
        echo ""
        echo "{start|stop|restart}                     обычные СТАРТ,СТОП и РЕСТАРТ рамдиска испоьзуя $ramdev"
        echo "{shmstart|shmstop|shmrestart}            СТАРТ,СТОП и РЕСТАРТ рамдиска испоьзуя $tmpdev"
        echo "{tmpfsstart|tmpfsstop|tmpfsrestart}      СТАРТ,СТОП и РЕСТАРТ рамдиска испоьзуя tmpfs"
        echo ""
    }

    case "$1" in
        #/dev/ramX
            start)
                if [ ! -e /mnt/defdisk ]; then
                        mkdir /mnt/defdisk
                fi
            mke2fs -m 0 $ramdev
                mount $ramdev /mnt/defdisk
            chmod 777 /mnt/defdisk
        ;;
            stop)
            umount -v /mnt/defdisk
        ;;
        restart)
            umount -v /mnt/defdisk
            if [ ! -e /mnt/defdisk ]; then
                            mkdir /mnt/defdisk
                    fi
            mke2fs -m 0 $ramdev
                    mount $ramdev /mnt/defdisk
            chmod 777 /mnt/defdisk
            ;;
        #/dev/shm/shmram
        shmstart)
                if [ ! -e /mnt/defdisk ]; then
                        mkdir /mnt/defdisk
                fi
            if [ ! -e "$shmdev" ]; then
                        mkdir "$shmdev"
                fi
            mount $shmdev /mnt/defdisk -o rsize=$rrsize
            dd if=/dev/zero of=/mnt/defdisk count=$size bs=$blocksize
            mke2fs -m 0 -F /mnt/defdisk
            chmod 777 /mnt/defdisk
        ;;
            shmstop)
            umount -v /mnt/defdisk
            rmdir $shmdev
        ;;
        shmrestart)
            umount -v /mnt/defdisk
            rmdir $shmdev
            if [ ! -e /mnt/defdisk ]; then
                            mkdir /mnt/defdisk
                    fi
            if [ ! -e "$shmdev" ]; then
                        mkdir "$shmdev"
                fi
            mount $shmdev /mnt/defdisk -o rsize=$rrsize
            dd if=/dev/zero of=/mnt/defdisk count=$size bs=$blocksize
            mke2fs -m 0 -F /mnt/defdisk
            chmod 777 /mnt/defdisk
            ;;
        #tmpfs
        tmpfsstart)
                if [ ! -e /mnt/defdisk ]; then
                        mkdir /mnt/defdisk
                fi
            mount -t tmpfs tmpfs /mnt/defdisk/ -o rsize=$rrsize
            dd if=/dev/zero of=/mnt/defdisk count=$size bs=$blocksize
            mke2fs -m 0 -F /mnt/defdisk
            chmod 777 /mnt/defdisk
        ;;
            tmpfsstop)
            umount -v /mnt/defdisk
        ;;
        tmpfsrestart)
            umount -v /mnt/defdisk
            if [ ! -e /mnt/defdisk ]; then
                            mkdir /mnt/defdisk
                    fi
            mount -t tmpfs tmpfs /mnt/defdisk/ -o rsize=$rrsize
            dd if=/dev/zero of=/mnt/defdisk count=$size bs=$blocksize
            mke2fs -m 0 -F /mnt/defdisk
            chmod 777 /mnt/defdisk
            ;;
        help)
            fhelp
        ;;
            *)
                echo $"Usage: $0 {<p>start|stop|<p>restart|help}"
            exit 1
    esac
    exit 0
    ну и понятно, что в /etc/rc.local (в других версиях путь иначе - в moxa к примеру /etc/init.d/rc.local):
    Код (Bash):
    #ram disk
    #/etc/init.d/ramdisk
    /etc/init.d/ramdisk2 shmstart
     
    теперь просто делаю указав путь(вот к примеру в скрипте):
    Код (Bash):
    _file_res="/dev/shm/anshttp.dat"
    _dfile="/dev/shm/sndhttp.dat"
    Уважаемые знатоки это нормально?
    Спасибо!
     
  13. Mitrandir

    Mitrandir Гуру

    Так вроде как shm для другого используется..
     
  14. Igor68

    Igor68 Гуру

    /dev/shm shared memory для чего именно? Подсмотрел у segnetics... там разделяемая память используется для взаимодействия данных между разными процессами... вплоть до разных проектов. Стал дальше смотреть... а данные (именованные) в файлах. Вот и решил воспользоваться готовым каталогом в RAM. Тем более посмотрел, что он есть во всех Linux-ах и с одинаковыми правами доступа.
     
  15. Mitrandir

    Mitrandir Гуру

    Вот именно.
     
  16. Mitrandir

    Mitrandir Гуру

    Чем tmpfs не устраивает ?
     
  17. Igor68

    Igor68 Гуру

    вот посмотрите:
    Код (Text):
    www-data@Moxa:~$ df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/root                 8192      6764      1428  83% /
    /dev/ram3                 1003         9       943   1% /dev
    /dev/ram0                  499        24       450   5% /var
    /dev/mtdblock3            6144      3304      2840  54% /tmp
    /dev/mtdblock3        15607264  12026548   2787912  81% /home
    /dev/mtdblock3            6144      3304      2840  54% /etc
    tmpfs                     4516         0      4516   0% /dev/shm
    /dev/mmc1             15607264  12026548   2787912  81% /var/sd
    tmpfs                     4516         0      4516   0% /mnt/defdisk
    /dev/mmc1             15607264  12026548   2787912  81% /home
    /dev/mmc1             15607264  12026548   2787912  81% /root
    tmpfs                     4516         0      4516   0% /home/httpd/ramdisk
    /dev/mmc1             15607264  12026548   2787912  81% /usr
    /dev/mmc1             15607264  12026548   2787912  81% /lib
    www-data@Moxa:~$
    и вот:
    Код (Text):
    igor@debian-i:~/coding/bash/nsite4$ df
    Файловая система                                       1K-блоков Использовано Доступно Использовано% Cмонтировано в
    rootfs                                                 288370016    234246952 39474644           86% /
    udev                                                       10240            0    10240            0% /dev
    tmpfs                                                     399112          964   398148            1% /run
    /dev/disk/by-uuid/90d540ef-9e50-4d16-ad46-931292ef4ca7 288370016    234246952 39474644           86% /
    tmpfs                                                       5120            0     5120            0% /run/lock
    tmpfs                                                    1544100        26648  1517452            2% /run/shm
    igor@debian-i:~/coding/bash/nsite4$
    все вроде как tmpfs
     
  18. parovoZZ

    parovoZZ Гуру

    Хакнул ПЛК?
     
  19. Igor68

    Igor68 Гуру

    Нет... у них там примеры применения взаимодействия "внешних" проектов на Си совместно с SMLogix. Там прошит Debian на TRIM5, SHM2G(i), SHM4... и запускается при включении окружение. Есть доступ по ssh,ftp и др. Обычный Linux... а их HMI через /dev/shm разрешено использовать совместно с программами на C/C++. Эти ребята именно это сами и показывают... и подсказывают как. Дают выбор делать FBD программы и Си... но взаимодействовать с сенсорным дисплеем через их окружение. Кстати если в FBD не применять Modbus, то его можно применить на Си... ну или какой-то иной/свой протокол (к примеру TenzoM, которого там нет).
     
  20. parovoZZ

    parovoZZ Гуру

    Что-то не понял... В овене на ST можно работать с модбасом. А здесь прямо внутри плк можно писать си программы?