Эпопея установки DAHDI 2.11.1 на ядре 4.12.12 в GENTOO

Dec 04, 2017 16:32


После попытки загрузиться с нового ядра возврат к старому привел к сбою DAHDI.

Необходимо подгрузить модуль
modprobe wct4xxp
Убедится, что модуль погрузился
lsmod | grep dahdi
Проверить что все ОК утилитами
dahdi_tool
dahdi_hardware
Заново дать права на доступ к каналам платы для Астериска.
chmod 666 /dev/dahdi/*
Запустить Астериск и убедиться что модуль подгрузился и все ОК.
/etc/init.d/dahdi start
/etc/init.d/asterisk start
dahdi show status
T2XXP (PCI) Card 0 Span 1 OK 0 0 0 CCS HDB3 CRC4 0 db (CSU)/0-133 feet (DSX-1) или же
module load chan_dahdi.so

Без прав на файлы получал ошибку

CLI> module load chan_dahdi.so

Unable to load module chan_dahdi.so
Command 'module load chan_dahdi.so' failed.
[2017-11-08 19:08:05] WARNING[21825]: pbx.c:5833 ast_register_application2: Already have an application 'DAHDISendKeypadFacility'
[2017-11-08 19:08:05] WARNING[21825]: pbx.c:5833 ast_register_application2: Already have an application 'DAHDISendCallreroutingFacility'
[2017-11-08 19:08:05] ERROR[21825]: chan_dahdi.c:17921 process_dahdi: Unable to open /dev/dahdi/ctl to set toneduration at line 20.
srv-atsCLI> module unload chan_dahdi.so
Unable to unload resource chan_dahdi.so
Command 'module unload chan_dahdi.so' failed.
[2017-11-08 19:08:26] WARNING[21825]: loader.c:533 ast_unload_resource: Unload failed, 'chan_dahdi.so' is not loaded.
srv-atsCLI> module unload chan_dahdi.so

Вот почему как минимум на следующий день стали скидываться права на этот файл-устройство?

CLI> dahdi show status
No DAHDI found. Unable to open /dev/dahdi/ctl: Permission denied
Command 'dahdi show status' failed.

ls -l /dev/dahdi/ctl
crw------- 1 root root 196, 0 ноя 22 00:54 /dev/dahdi/ctl

chmod 666 /dev/dahdi/ctl

CLI> dahdi show status
Description Alarms IRQ bpviol CRC Fra Codi Options LBO
T2XXP (PCI) Card 0 Span 1 OK 0 0 37384 CCS HDB3 CRC4 0 db (CSU)/0-133 feet (DSX-1)
T2XXP (PCI) Card 0 Span 2 UNCONFI 0 0 0 CAS Unk 0 db (CSU)/0-133 feet (DSX-1)

Восстановление прав на DAHDI

chown --recursive asterisk:asterisk /dev/dahdi
chmod --recursive u=rwX,g=rX,o= /dev/dahdi или chmod 640 /dev/dahdi/*
chown --recursive asterisk:asterisk /dev/dahdi && chmod 640 /dev/dahdi/*

Прописать в /etc/udev/rules.d/50-dahdi.rules

# DAHDI devices with ownership/permissions for running as non-root
SUBSYSTEM=="dahdi", OWNER="asterisk", GROUP="asterisk", MODE="0660"

Эпопея с установкой DAHDI

Компиляция на ядрах старше 4.11, в частности на 4.12.12 не проходит из-за ряда ошибок, которые возникли из-за изменений в них.

Целый ряд попыток установить делал правкой ебилда и прямым указанием необходимых патчей.
Скачивал патчи из Багтрекера DAHDI: https://issues.asterisk.org/jira/browse/DAHLIN-356?jql=project%20%3D%20DAHLIN
в папку /usr/portage/net-misc/dahdi/files
https://issues.asterisk.org/jira/secure/attachment/56083/dev_attrs_groups-v3.patch
https://issues.asterisk.org/jira/secure/attachment/55523/0001-signal_pending-is-now-in-linux-sched-signal.h-includ.patch
https://issues.asterisk.org/jira/secure/attachment/55524/0002-atomic_read-refcount_read.patch
Добавлял в ебилд dahdi-2.11.1.ebuild

PATCHES=("${FILESDIR}/0001-signal_pending-is-now-in-linux-sched-signal.h-includ.patch"
        "${FILESDIR}/0002-atomic_read-refcount_read.patch"
        "${FILESDIR}/dev_attrs_groups-v3.patch" )

echo "=net-misc/dahdi-2.11.1 ~amd64" >> /etc/portage/package.accept_keywords && ebuild /usr/portage/net-misc/dahdi/dahdi-2.11.1.ebuild manifest && emerge -av =net-misc/dahdi-2.11.1

Но все равно получал в итоге ошибки error: implicit declaration of function и touch_softlockup_watchdoghttps://gist.github.com/Realmagnum/3e80379f0baf2c0da2041c0af00b6e44

[01m [K/var/tmp/portage/net-misc/dahdi-2.11.1/work/dahdi-linux-2.11.1/drivers/dahdi/opvxa1200/base.c: [m [K In function ‘ [01m [Kwctdm_hardware_init [m [K’:
[01m [K/var/tmp/portage/net-misc/dahdi-2.11.1/work/dahdi-linux-2.11.1/drivers/dahdi/opvxa1200/base.c:2596:3: [m [K  [01;31m [Kerror:  [m [Kimplicit declaration of function ‘ [01m [K touch_softlockup_watchdog [m [K’ [ [01;31m [K-Werror=implicit-function-declaration [m [K]
   [01;31m [Ktouch_softlockup_watchdog [m [K();  // avoid showing CPU softlock message
   [01;31m [K^~~~~~~~~~~~~~~~~~~~~~~~~ [m [K
 if [ "-pg" = "-pg" ]; then if [ /var/tmp/portage/net-misc/dahdi-2.11.1/work/dahdi-linux-2.11.1/drivers/dahdi/ap400/ap400_drv.o != "scripts/mod/empty.o" ]; then ./scripts/recordmcount  "/var/tmp/portage/net-misc/dahdi-2.11.1/work/dahdi-linux-2.11.1/drivers/dahdi/ap400/ap400_drv.o"; fi; fi;
cc1: some warnings being treated as errors
make[3]: *** [scripts/Makefile.build:303: /var/tmp/portage/net-misc/dahdi-2.11.1/work/dahdi-linux-2.11.1/drivers/dahdi/opvxa1200/base.o] Error 1
make[2]: *** [scripts/Makefile.build:561: /var/tmp/portage/net-misc/dahdi-2.11.1/work/dahdi-linux-2.11.1/drivers/dahdi/opvxa1200] Error 2
make[2]: *** Waiting for unfinished jobs....

Условия У вас не должны отличаются значения ядра в выводе команды uname -r и реальным ядром системы в /usr/src/linux/.config и должен быть правильный eselect kernel list и скачаны emerge gentoo-sources.

Успешная компиляция DAHDI 2.11.1 на ядре 4.12.12

Если ебилд написан под EAPI=6, то он умеет стандартный механизм user-патчинга: кладешь патч в директорию /etc/portage/patches/net-misc/dahdi и он применится.

Ебилд штатный для dahdi уже существует, просто достаточно в /etc/portage/patches/ накидать патчей и юзать штатный ебилд.
mkdir -p /etc/portage/patches/net-misc/dahdi && cd /etc/portage/patches/net-misc/dahdi && wget https://issues.asterisk.org/jira/secure/attachment/56083/dev_attrs_groups-v3.patch && wget https://issues.asterisk.org/jira/secure/attachment/55523/0001-signal_pending-is-now-in-linux-sched-signal.h-includ.patch && wget https://issues.asterisk.org/jira/secure/attachment/55524/0002-atomic_read-refcount_read.patch && echo "\n=net-misc/dahdi-2.11.1 ~amd64" >> /etc/portage/package.accept_keywords && emerge -av =net-misc/dahdi-2.11.1

Логика поиска ошибок компиляции в DAHDI (Спасибо Владимиру Смирнову)

Ищешь все error в temp-логах emerge.log и видишь: error: implicit declaration of function и touch_softlockup_watchdog
Идешь в сырцы проекта - видишь, что это в модуле и в проекте в общем нигде нет объявлений, только вызовы.
Значит это внешнее.
Так как это модуль ядра - то из ядра.
Лезешь в сорцы ядра /usr/src/linux и ищешь, где оно там и видишь, что объявление в ./include/linux/nmi.h
Если указан SOFTLOCKUP_DETECTOR, то оно из него берется, если не указан, то функция не делает ничего.
Даже если выключить softlockup_detector модуль не собирается, значит в общем инклюд где-то пропал.
простой способ проверить - заинклюдить этот linux/nmi.h
делаешь cp drivers/dahdi/opvxa1200/base.c{,.bak}
ручками правишь, добавляешь хедер и делаешь дифф
diff -u drivers/dahdi/opvxa1200/base.c{.bak,} » /etc/portage/patches/net-misc/dahdi/0003-nmi-header.patch
на ядре 4.14 еще нужно дальше патчить, там потом снова упадет с ошибкой

0003-smirnov_nmi-header_kernel.4.13_dahdi.2.11.1.patch

--- a/drivers/dahdi/opvxa1200/base.c 2017-12-04 10:03:20.620236834 +0100
+++ b/drivers/dahdi/opvxa1200/base.c 2017-12-04 10:03:48.228236372 +0100
@@ -102,6 +102,7 @@
#include
#include
#include
+#include
#include "proslic.h"

/* MiaoLin debug start */

у диффа формат простой:
заголовки это --, +++ @@
первый символ - пробел если это "не менялось", значит оно там УЖЕ БЫЛО
+ - добавилось
- - удалилось
-u - unified diff, он берет 3 строки до изменения и три строки после
в эти "3 строки после" попадает и инклюд, пустая строка и комментарий

команда патч принимает патч в СТАНДАРТНЫЙ ВВОД
т.е. patch < file-name-with-diff.patch
или cat file-name-with-diff.patch|patch

Установка из исходников ветки next

https://github.com/asterisk/dahdi-linux/tree/next

cd /usr/src &&
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz &&
tar xvfz dahdi-linux-complete-current.tar.gz &&
rm -f dahdi-linux-complete-current.tar.gz &&
cd dahdi-linux-complete-* &&
make all &&
make install

Дописал в /etc/dahdi/modules dahdi_echocan_mg2

В /etc/dahdi/system.conf echocanceller=mg2,1-15,17-31

Командой dahdi_cfg -vvvvv проверил /etc/init.d/dahdi restart modprobe wct4xxp rasterisk module load chan_dahdi.so

Инструкция как ставить oslec

(http://www.rowetel.com/?page_id=454)
Замена oslec на mg2 из-за ошибки
DAHDI_ATTACH_ECHOCAN failed on channel
https://www.mikeslab.net/?p=317

Источник: https://gist.github.com/Realmagnum/6b4a665e44184b4f5407e752ecfc1dde

dahdi, linux, aster, #include, gentoo

Previous post Next post
Up