LINUX.ORG.RU

Сообщения vgovseychuk

 

Настройка DHCP клиентов через Ansible или аналог

Привет, ЛОР!

Есть сетка с линуксовыми железками, которые получают адреса по DHCP.

У каждой железки есть ее серийник, который известен DHCP серверу из DHCP option dhcp-client-identifier(но можно посмотреть и на другие варианты).

На эти железки нужно раскинуть настройки (часть настроек одинакова для всех, часть уникальна).

Настройки абсолютно разные: сеть, конфигфайлы, аппаратура со своими драйверами.

Я пока сделал велосипед из DHCP options, netconf и питона, но хотелки растут, поэтому ищу альтернативу.

Посмотрел на Ansible - вроде, подходит, но там хосты идентифицируются по IP или доменному имени. Подскажите, пожалуйста, можно ли как-то это подстроить под DHCP? Или, может, есть что-то похожее на Ansible, но с коробочной поддержкой описанной хотелки?

 ,

vgovseychuk
()

Xilinx XLWP Tool

Привет, ЛОР!

Ищу утилиту для прошивки ключей шифрования в BBRAM/eFuse Xilinx Ultrascale+

Утилита упоминается в xapp1319 и называется Xilinx Lightweight Provisioning (XLWP) Command Line Tool

 , , ,

vgovseychuk
()

Ноутбук не просыпается из suspend

Привет, ЛОР!

Есть пациент HP 15s-eq2xxx с Ryzen 5 5500u. Поставил Ubuntu 20.04.

После перевода в suspend уходит в сон и оттуда уже не возвращается. На клавиши и кнопку питания не реагирует, огоньком мигает. Приходится перезагружать.

В чем причина, как лечить?

 , ,

vgovseychuk
()

Dhcpcd: полученные от сервера опции

Привет, ЛОР!

Есть клиент dhcpcd, который отправляет запрос серверу для получения опции(option 43 / vendor_encapsulated_options).

Сервер успешно эту опцию возвращает.

Вопрос: где теперь можно найти значение этой принятой опции?

Если dhcpcd эту опцию никак не хранит, и из него нельзя ее достать, то посоветуйте, пожалуйста, dhcp клиента, который так может

 , , ,

vgovseychuk
()

Взять параметры netdev и передать их в драйвер

Привет, ЛОР!

Есть 2 драйвера: в одном netdev точеный, в другом маршрутизатор ...

В общем, ситуация следующая:

На ПЛИС реализованы 2 устройства(модуля):

  • Ethernet контроллер (со стандартным драйвером Xlilinx)
  • Кастомный маршрутизатор, который часть трафика гонит в некую микросхему мимо проца и линуха, а часть приходит собственно, в Ethernet контроллер.

Соответственно, нужно настраивать модуль маршрутизатора, исходя из настройки Ethernet контроллера, который в линухе имеет точку настройки в виде обычного netdev, например, eth0. Нужно взять у этого eth0 его айпишник и мак и передать их неким образом в маршрутизатор.

Вопрос: Можно ли это провернуть, не используя костыли в виде демонов, мониторящих eth0? Хочется сделать красиво, на уровне драйверов. Есть же всякие свитчи и прочие сетевые девайсы, которые могут требовать похожих решений.

Заранее спасибо!

 , , ,

vgovseychuk
()

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

Привет, ЛОР!

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

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

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

Подскажи, пожалуйста, как кошерно установить на 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 интерфейса

Привет, ЛОР!

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

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

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

 , ,

vgovseychuk
()

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

Салют, ЛОР!

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

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

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

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

 , ,

vgovseychuk
()

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

Салют, ЛОР!

На железке течет память. Не могу понять, из-за чего именно.
В /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

Салют, ЛОР!

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

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

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

 , , ,

vgovseychuk
()

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

Привет, ЛОР.

Что-то не могу найти инфу по проверке 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 не замечает изменения файла

Привет, ЛОР!

Я тут второй день пытаюсь заставить Линух(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> при компиляции через командную строку.

Привет, ЛОР!

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

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

 , , ,

vgovseychuk
()

Вкладки в LuCi

Привет, ЛОР!

Вопрос по веб интерфейсу 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

Привет, ЛОР!

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

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

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

 , ,

vgovseychuk
()

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

Привет, ЛОР!

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

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

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

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

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

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

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

Спасибо!

 , , , ,

vgovseychuk
()

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

Привет, ЛОР!

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

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

 , , , ,

vgovseychuk
()

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

Всем привет!

Завел я на своей кастомной плате 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

Салют!

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

Занимаюсь портированием 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
()

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