LINUX.ORG.RU

Сообщения vgovseychuk

 

Приклеить цифровую подпись к файлу

Форум — Security

Привет, ЛОР!

Подписываю файл стандартным способом: Создаю ключи:

openssl genrsa -F4 -out priv_key.key 2048
openssl req -batch -new -x509 -key priv_key.key -out cert.crt
openssl x509 -in cert.crt -pubkey -noout > pub_key.pub

Создаю подпись файла:

openssl dgst -sha256 -sign priv_key.key -out file1.sha256 file1

Проверяю файл:

openssl dgst -sha256 -verify pub_key.pub -signature file1.sha256 file1

Но вот что раздражает: файла всегда два(файл и его подпись), следовательно, при замене файлов теряется «атомарность» операции. Хочется, чтобы подпись была приклеена к файлу.

Можно приклеить через cat, но тогда при проверке приходится все равно расклеивать один файл в два. Есть ли встроенные механизмы для подобного в openssl или какие-то другие пути создания/проверки подписи?

 , ,

vgovseychuk ()

ARM toolchain для Ubuntu 16

Форум — Development

Привет, дорогой ЛОР!

Подскажи, пожалуйста, как кошерно установить на Ubuntu 16 ARM тулчейны с GCC версией >=6.0? На данный момент через apt install доступны:

  • arm-linux-gnueabihf- gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4)
  • arm-none-eabi- gcc version 4.9.3 20150529 (prerelease) (15:4.9.3+svn231177-1)

Качать, насколько я понимаю, отсюда: https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/ и https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads

 , ,

vgovseychuk ()

Выбор легковесного web интерфейса

Форум — Development

Привет, ЛОР!

Появилось желание повозиться в веб-интерфейсом для слабых железок, но не знаю, с какой стороны подступиться. Если вкратце, то нужен легковесный и не сильно уродливый интерфейс. Раньше работал с OpenWRT и там был LuCi, который меня полностью устраивал. Теперь же начал возиться с Yocto и нужно прикручивать что-то новое. Передо мной встал выбор:

  • Делать свой велосипед, который скорее всего получится ужасным внешне и внутренне;
  • Выдрать с корнями LuCi/JuCi из OpenWRT;
  • Найти что-то новое.

Помогите советом. Что выбрать, почему это надо выбрать, с чего начать/что почитать по выбранному пункту?

 , ,

vgovseychuk ()

Межпроцессное взаимодействие С и Lua

Форум — Development

Салют, ЛОР!

Как лучше всего считать значение переменной из проги на С и присвоить его переменной в скрипте LUA.

Смысл действа в следующем:
Есть фронтенд, который вызывает функцию из LUA-скрипта (раз в секунду)
Функция LUA должна забрать значение X (в рандомный момент времени)
Значение X вычисляется демон-процессом на C (раз в несколько секунд)

Через файл в тупую передавать не хочется, поэтому хочу спросить знатоков LUA о том, как правильно это сделать.

Сэнкс ин эдванс!

 , ,

vgovseychuk ()

Где-то течет, а где - хз!

Форум — Development

Салют, ЛОР!

На железке течет память. Не могу понять, из-за чего именно.
В /tmp/ нет никаких больших файлов.
top/htop говорят, что все ок.

Вот вывод free:

              total  used  free  shared buffer
Mem:          125576 81820 43756 436    0
-/+ buffers:         81820 43756
Swap:         0      0     0

Динамика следующая(занято Кб):

  • день 1: 33500
  • день 2: 40800
  • день 5: 62200
  • день 6: 71500
  • день 7: 80000

Как можно задетектить утечку?

 

vgovseychuk ()

udev+ttyACM

Форум — Admin

Салют, ЛОР!

Есть два стула 3G-модема одной марки.
Назовем их #А и #B. #A - намертво привинчен, #B - опционально подключаем.
В системе определяются по 7 портов на модем: с ttyACM0 по ttyACM6 и с ttyACM7 по ttyACM13.
Если #B воткнут перед стартом системы, то ttyACM0-ttyACM6 принадлежат #B. Если не воткнут, то это порты модема #А.

Но вот незадача, моя маленькая утилитка должна работать только с #A. Каким образом через udev(или каким иным путем) переименовать эти 14 портов, чтобы они были привязаны к конкретному девайсу?

Заранее благодарствую!

 , , ,

vgovseychuk ()

Проверка TCP-соединения, C

Форум — Development

Привет, ЛОР.

Что-то не могу найти инфу по проверке TCP-соединения клиентом.

Смысл такой:
Клиент подключается к серверу и ждет от него инфу (ждет бесконечно и ничего без команды сервера не делает, главное для него - не пропустить сообщение от сервера)
В какой-то момент связь с сервером теряется/сервер зависает/сервер рвет соединение/меняются сетевые настройки или происходит еще что-то плохое.
Пока что в основной петле Epoll я проверяю приходящие данные на клиентском сокете:

    while(1)
    {
        numOfNewEvents = epoll_wait(epollFD, epollEventArray, MAX_EPOLL_EVENTS, EPOLL_RUN_TIMEOUT);

        for(i = 0; i < numOfNewEvents; i++) 
        {
            eventSource = epollEventArray[i].data.fd;

            ...

            // Что-то пришло на сокет(всегда ли, случись что, оно будет приходить?)
            if(eventSource == clientSocket) 
            {
                numOfReadBytes = recv(eventSource, dataBuffer, MAX_TCP_BUF_SIZE, 0);
                if(numOfReadBytes > 0)
                {
                    // Приехал пакет. Что-то делаем с ним
                }
                else
                {
                    // Разрыв соединения. Пытаемся до посинения переподключиться, сообщаем юзеру и т.д.
                }
            }

            ...

        }      
    }

Ну и собственно вопрос: для всех ли случаев подойдет такая обработка?
Некоторые из возможных вариантов развития событий(тут может быть куча вариантов):

  • Сеть пропала, после восстановилась
  • Сеть пропала, сервер вырубился, сеть восстановилась
  • Сервер вырубился, потом включился
  • Сеть пропала, сервер перезагрузился, сеть восстановилась
  • Сеть пропала, сервер закрыл соединение, сеть восстановилась
  • Админ сменил ориентацию и поменял нам IP

 , , ,

vgovseychuk ()

Inotify не замечает изменения файла

Форум — Development

Привет, ЛОР!

Я тут второй день пытаюсь заставить Линух(OpenWRT) отслеживать изменения в файле.

В документации сказано, что inotify умеет в отслеживание файлов. Однако, у меня не замечает изменений. Код следующий:

#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <sys/inotify.h>
#include "log.h"

#define EPOLL_RUN_TIMEOUT       -1
#define MAX_EPOLL_EVENTS        10
#define MAX_INOTIFY_BUF_SIZE    1024

int main(int argc, char **argv)
{
    int result;
    // inotify для отслеживания изменения /etc/config/myprog
    int inotifyFD = inotify_init();
    if(inotifyFD < 0)
    {
        LOG("Couldn't initialize inotify\n");
    }

    int inotifyWatch = inotify_add_watch(inotifyFD, "/etc/config/myprog", IN_MODIFY); 
    if (inotifyWatch < 0)
    {
        printf("Couldn't add watch to /etc/config/myprog\n");
    }
    char inotifyBuf[1024];

    // epoll для отслеживания срабатывания inotify
    struct epoll_event epollConfig;
    struct epoll_event epollEvent[MAX_EPOLL_EVENTS];
    int epollFD = epoll_create(sizeof(inotifyFD));

    epollConfig.events = EPOLLIN | EPOLLET | EPOLLOUT;
    epollConfig.data.fd = inotifyFD;
    // add our listening socket into epoll
    result = epoll_ctl(epollFD, EPOLL_CTL_ADD, inotifyFD, &epollConfig);
    if(result < 0)
    {
        LOG("Error while inotify epoll regisration\n");
    }


    while (1) 
    {
        result = epoll_wait(epollFD, epollEvent, MAX_EPOLL_EVENTS, EPOLL_RUN_TIMEOUT);
        read(inotifyFD, &inotifyBuf, MAX_INOTIFY_BUF_SIZE);
        LOG("config modified!\n");
    }
    return 0;
}

PS: если я меняю /etc/config/myprog на /etc/config/ , то все работает, но, как и ожидаемо, ловит изменения всех файлов в директории.

PPS: меняю файл просто командой echo '123' >> /etc/config/myprog

 ,

vgovseychuk ()

Подключение <linux/ ... .h> при компиляции через командную строку.

Форум — Development

Привет, ЛОР!

Прости за нубский вопрос, но как заставить компилироваться мой хеллоуворлд, использующий <linux/list.h> ?

P.S.Компилятор GCC

 , , ,

vgovseychuk ()

Вкладки в LuCi

Форум — Development

Привет, ЛОР!

Вопрос по веб интерфейсу OpenWRT.

Есть у меня пакет (package/utils/mypack)

К нему есть приложение для LuCi (feeds/luci/applications/luci-app-mypack)

У пакета есть конфиг /etc/config/mypack с определенными настройками:

config mypack
	option block1_op1 ""
	option block1_op2 ""
	option block1_op3 ""
	option block2_op1 ""
	option block2_op2 ""
	option block2_op3 ""
	...
	option blockN_opN ""
Сейчас у меня все options в одной section в model/cbi/mypack.lua , но при этом разбиты на вкладки для удобства юзера:
...
m = Map("mypack", translate("MyPack"), translate("Test Package"))

s = m:section(TypedSection, "mypack", translate("mypack settings"))

s:tab("block1", translate("block1"))
s:tab("block2", translate("block2"))
...
s:tab("blockN", translate("blockN"))

--- block1 settings ---
block1_op1 = s:taboption("block1", ListValue, "block1_op1", translate("Opt1"))
  block1_op1:value("0")
  block1_op1:value("1")

block1_op2 = s:taboption("block1", ListValue, "block1_op2", translate("Opt2"))
  block1_op2:value("0")
  block1_op2:value("1")

...

--- blockN settings ---
blockN_opN = s:taboption("blockN", ListValue, "blockN_opN", translate("OptN"))
  blockN_opN:value("0")
  blockN_opN:value("1")

С этим не очень удобно кое-где работать, поэтому я хочу разбить /etc/config/mypack по секциям следующим образом:
config mypack block1
	option op1 ""
	option op2 ""
	option op3 ""
config mypack block2
	option op1 ""
	option op2 ""
	option op3 ""
	...
config mypack blockN
	option opN ""
И при этом оставить вкладки в интерфейсе. Не могу найти в документации, как это сделать.

Спасибо!

 , ,

vgovseychuk ()

Отключение автозагрузки при сборке OpenWRT

Форум — General

Привет, ЛОР!

Вот тут написано, как отключить автозагрузку сервисов.

В директории /etc/rc.d/ есть симлинки на /etc/init.d/ и в зависимости от того, стартует ли сервис при загрузке или нет, они присутствуют или отсутствуют.

Я пытаюсь собрать систему, в которой все редко используемые сервисы были бы отключены. Но вот с чем не могу разобраться: какой файл содержит настройки этого всего(что загружать, а что нет)?

 , ,

vgovseychuk ()

Организация разработки OpenWRT / выпрямление рук

Форум — Development

Привет, ЛОР!

Меня перестала устраивать разработка в топорном, студенческом стиле.

Работаю я с OpenWRT как с основой для системы. В процессе меняются конфиги(основной и ядра), ищутся баги, допиливаются драйвера, новые пакеты, скрипты и прочее.

И все это происходит очень тупо (собрал - не то - полез в код - на месте исправил - залез в menuconfig/kernel_menuconfig - пересобрал - работает - забыл).

Директория с собранным проектом весит 11Гб и менять что-то в нем, как это делаю сейчас, глупо и непродуктивно. Чистый же проект OpenWRT весит 46Мб, но естественно, в нем нет большинства исходников - всё скачивается в процессе сборки. Я пытаюсь настроить процесс сборки так, чтобы можно было изменять только этот маленький проект, бэкапить его, переносить и т.д, и чтобы каждый раз при сборке он давал одни и те же образы на выходе по одной команде.

Господа специалисты, поделитесь опытом разработки и инфой:

Как поменять конфиги по умолчанию(основной и ядра), чтобы не лазить в ГУЙ?

Как изменять/патчить драйвера, скрипты, конфиги, которые скачиваются при сборке и т.д?

Спасибо!

 , , , ,

vgovseychuk ()

Сборка OpenWRT c новым ядром

Форум — General

Привет, ЛОР!

Поймал я одну багу на Chaos Calmer(ядро 3.18), связанную с ethernet. Причину вот уже недели 2 ищу и найти не могу. Думал, косяк в драйвере эзера, но походу где-то глубже, на уровне приоритетов процессов, шедулера, обработки прерываний. Пришел я к такому выводу, когда накатил транк с ядром 4.1. На нем все работает с таким же драйвером эзера.

В общем, думаю поменять ядро. Возможно ли это сделать, не связываясь с транком (Берем Chaos Calmer и пересаживаем ему ядро 4.4, допустим)?

 , , , ,

vgovseychuk ()

Ограничение скорости Ethernet Bridge

Форум — Development

Всем привет!

Завел я на своей кастомной плате OpenWRT. На плате 2 Ethernet 100Мбит, объединенные в мост. Все работает на малых скоростях, но как только начинаю тестировать скорость передачи по мосту или перекачивать большие файлы, вся система умирает.

Тестировал iperf3:

  • 10Мбит/полный дуплекс - норм, TCP и UDP по 9,5Мбит дают.
  • 100Мбит/полный дуплекс - UDP прокачивает 95Мбит/с, TCP кладет систему
  • 100Мбит/полудуплекс - UDP прокачивает 95Мбит/с, TCP - 75Мбит

На больших скоростях загруз проца почти 100 (95% обработка sirq)

Здоровенный лог падения приложу, если надо, но суть в том, что переполняется очередь отправки:

WARNING: CPU: 0 PID: 0 at net/sched/sch_generic.c:303 dev_watchdog+0x198/0x224()
NETDEV WATCHDOG: eth0 (fec): transmit queue 0 timed out
Отсюда вопрос: как можно притормаживать Ethernet(из юзерспейса или в драйвере), чтобы избежать переполнения очереди?

P.S. Как я понял, проблема эта давняя, но нигде не могу найти нормального решения. Размеры очереди и обрезку кадров в драйвере менял - не помогло. Спасает только ограничение скорости да изменение дуплексности, но 10 Мбит или полудуплекс не хочется оставлять(плата тянет где-то 30Мбит).

 , , ,

vgovseychuk ()

U-Boot + OpenWRT: Обновление из-под Linux

Форум — Development

Салют!

Может быть, не в тот раздел пишу, так что ругайтесь, если что.

Занимаюсь портированием OpenWRT на свою плату. После долгих изысканий остановился на следующей структуре системы:

------------------------------------------------------------------
       |bootloader|boot_env|  fdt  |  kernel  |       root       |
 MTD   |    3M    |  256k  |  128k |    5M    |        -         |
------------------------------------------------------------------
                                              |rootfs|rootfs_data|
 UBI                                          |  40M |     -     |
------------------------------------------------------------------
Загрузочная команда следующая (у меня mx28 + NAND):
nand read 0x41000000 fdt ${filesize_fdt} ; 		
nand read 0x42000000 kernel ${filesize_kernel}; 
bootm 0x42000000 - 0x41000000
Все работает, все ОК. Однако, для обновления прошивки я сейчас захожу в U-Boot и запускаю следующий скрипт:
tftp 0x42000000 my_board.dtb ;       /* Дерево устройств */
nand erase.part fdt ;
nand write 0x42000000 fdt ${filesize} ;
tftp 0x42000000 openwrt-mxs-uImage ; /* Ядро */
nand erase.part kernel ;
nand write 0x42000000 kernel ${filesize} ;
tftp 0x42000000 rootfs.ubifs ;       /* Корневая ФС */
nand erase.part root ;
ubi part root ;
ubi create rootfs 0x2A00000 ;
ubi create rootfs_data ;
ubi write 0x42000000 rootfs ${filesize} ; 
Вопрос в следующем: как обновлять прошивку (целиком или по частям) из-под работающего Линукса?

 , , ,

vgovseychuk ()

UBIFS + Factory Reset (overlay)

Форум — Development

Салют!

Господа, поделитесь опытом настройки OverlayFS или подскажите, что у меня не так. Почитал про каскадно-объединенное монтирование и заинтересовался этой темой. Круто же делать Factory Reset, не снося при этом всю систему, а лишь потерев overlay. В качестве эксперимента выбрал OpenWRT. В данной ОС присутствует поддержка UBIFS(что круто для NAND с ее бэдблоками) и OverlayFS. Поставил все галки в менюконфиг:

CONFIG_MTD_NAND=y
CONFIG_MTD_UBI=y
CONFIG_UBIFS_FS=y
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
CONFIG_UBIFS_FS_LZO=y
CONFIG_UBIFS_FS_ZLIB=y
CONFIG_UBIFS_FS_XZ=y
CONFIG_OVERLAY_FS=y
Затем с помощью mkfs.ubifs сделал образ. В бутлоадере установил bootargs:
console=ttyAPP4,115200 rootfstype=ubifs ubi.mtd=5 root=ubi0:rootfs rw mtdparts=gpmi-nand:10m(bootloader)ro,256k(environment),128k(fdt),5m(kernel),40m(test)ro,100m(rootfs),-(rootfs_data)
Заливаем на плату, смотрим лог:
...
[    1.134122] 7 cmdlinepart partitions found on MTD device gpmi-nand
[    1.140343] Creating 7 MTD partitions on "gpmi-nand":
[    1.145561] 0x000000000000-0x000000a00000 : "bootloader"
[    1.153670] 0x000000a00000-0x000000a40000 : "environment"
[    1.161652] 0x000000a40000-0x000000a60000 : "fdt"
[    1.168998] 0x000000a60000-0x000000f60000 : "kernel"
[    1.176687] 0x000000f60000-0x000003760000 : "backupfs"
[    1.184829] 0x000003760000-0x000009b60000 : "rootfs"
[    1.193124] mtd: device 5 (rootfs) set to be root filesystem
[    1.198907] 0x000009b60000-0x000010000000 : "rootfs_data"
...
[    1.394409] ubi0: attaching mtd5
[    1.667582] random: nonblocking pool is initialized
[    2.470717] ubi0: scanning is finished
[    2.496300] ubi0: attached mtd5 (name "rootfs", size 100 MiB)
[    2.502217] ubi0: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
[    2.509126] ubi0: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
[    2.516023] ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
[    2.523097] ubi0: good PEBs: 800, bad PEBs: 0, corrupted PEBs: 0
[    2.529133] ubi0: user volume: 1, internal volumes: 1, max. volumes count: 128
[    2.536456] ubi0: max/mean erase counter: 2/1, WL threshold: 4096, image sequence number: 0
[    2.544911] ubi0: available PEBs: 0, total reserved PEBs: 800, PEBs reserved for bad PEB handling: 40
[    2.554302] hctosys: unable to open rtc device (rtc0)
[    2.566705] ubi0: background thread "ubi_bgt0d" started, PID 398
[    2.576833] UBIFS (ubi0:0): background thread "ubifs_bgt0_0" started, PID 400
[    2.755247] UBIFS (ubi0:0): UBIFS: mounted UBI device 0, volume 0, name "rootfs"
[    2.762823] UBIFS (ubi0:0): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
[    2.772864] UBIFS (ubi0:0): FS size: 94597120 bytes (90 MiB, 745 LEBs), journal size 9023488 bytes (8 MiB, 72 LEBs)
[    2.783403] UBIFS (ubi0:0): reserved for root: 0 bytes (0 KiB)
[    2.789282] UBIFS (ubi0:0): media format: w4/r0 (latest is w4/r0), UUID 17C375ED-CDDF-48C4-8838-65C460D470B7, small LPT model
[    2.804563] VFS: Mounted root (ubifs filesystem) on device 0:11.
[    2.811284] Freeing unused kernel memory: 132K (c03e1000 - c0402000)
[    3.236962] init: Console is alive
...
[    4.249978] init: - preinit -
Press the [f] key and hit [enter] to enter failsafe mode
Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level
[    7.769877] mount_root: loading kmods from internal overlay
[    7.857823] blk_update_request: I/O error, dev mtdblock0, sector 0
[    7.869474] blk_update_request: I/O error, dev mtdblock0, sector 0
[    7.875708] Buffer I/O error on dev mtdblock0, logical block 0, async page read
[    8.069201] block: attempting to load /etc/config/fstab
[    8.091549] block: extroot: not configured
[    8.097882] mount_root: no usable overlay filesystem found, using tmpfs overlay
And as result overlay is mounted at ram(/tmp). But I expected, that it was in /overlay. 
И в итоге этот гад монтируется в RAM. При перезагрузке все сделанные изменения слетают.
root@OpenWrt:/# mount
ubi0:rootfs on /rom type ubifs (rw,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
devpts on /rom/dev/pts type devpts (rw,nosuid,noexec,noatime,mode=600)
overlayfs:/tmp/root on / type overlay (rw,noatime,lowerdir=/,upperdir=/tmp/root/upper,workdir=/tmp/root/work)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,mode=600)
debugfs on /sys/kernel/debug type debugfs (rw,noatime)
root@OpenWrt:/# df -h
Filesystem                Size      Used Available Use% Mounted on
ubi0:rootfs              82.8M      2.8M     80.0M   3% /rom
overlayfs:/tmp/root      82.8M      2.8M     80.0M   3% /
Получается, оверлей работает, но не так, как надо(

 , , ,

vgovseychuk ()

LuCi+GPIO HelloWorld

Форум — Development

Салют!

Пытаюсь дернуть ногой из LuCi, что-то вроде:

echo N > /sys/class/gpio/export 
echo out > /sys/class/gpio/gpioN/direction 
echo 1 > /sys/class/gpio/gpioN/value
echo 0 > /sys/class/gpio/gpioN/value
В люси хочу просто переключатель или выпадающее меню вкл/выкл?

Насколько я понял, для простейшего модуля ЛюСи нужно 2 файла: .../controller/ledblink.lua (код ниже) и .../model/cbi/ledblink.lua

module("luci.controller.ledblink", package.seeall)
function index()
	entry({"admin", "services", "ledblink"}, cbi("ledblink"), _("Led Blink"), 60).index = true
end

Что писать в .../model/cbi/ledblink.lua ? В сети есть пара примеров, но не один не заработал. Пункт меню появляется, но на странице пусто.

Также буду благодарен, если посоветуете книжки/статейки по теме.

 , , , ,

vgovseychuk ()

RSS подписка на новые темы