Firs

Подключаем старый UPS Powercom на DSM 6.1-15047

Recommended Posts

Есть у меня старенький UPS Powercom IMP-425AP. Давно хотел его подключить к Synology, но дело осложнялось тем, что он является устройством типа USB to Serial, и официально не поддерживается.

В интернете гуглится статья на эту тему, по адресу: https://forum.synology.com/enu/viewtopic.php?f=39&t=17658

Но статья давно устарела, т.к. там идёт речь о DSM 3.0-1337

 

Сразу предупреждаю, я не очень "грамотный" пользователь *nux систем, но, собрав по крупицам некоторую информацию, я всё же смог подключить свой UPS Powercom IMP-425AP к DSM 6.1-15047

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

 

И так, наш UPS в системе определяется как:

Bus 002 Device 004: ID 0d9f:0002 Powercom Co., Ltd Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)

(С таким ID 0d9f:0002 есть целая серия старых IMP-*25AP)

 

Для DSM 6.1-15047 я использую загрузчик Jun's Loader v1.02b

Вначале мы воспользуемся советами, описанными в этой статье: https://xpenology.com/forum/topic/7187-how-to-build-and-inject-missing-drivers-in-jun-loader-102a/

 

Качаем исходный код ядра: https://sourceforge.net/projects/dsgpl/files/Synology%20NAS%20GPL%20Source/15047branch/bromolow-source/linux-3.10.x.txz/download

Synology 3615xs построен на архитектуре bromolow, нам нужна версия 15047 (я использую эту версию, т.к. в ней работает нужный мне VirtualBox)

 

Устанавливаем плагин debian-chroot ( https://synocommunity.com/package/debian-chroot ) из раздела сообщества.

Запускаем chroot:

/var/packages/debian-chroot/scripts/start-stop-status chroot

Ставим пакеты

apt-get update
apt-get upgrade
apt-get install locales
dpkg-reconfigure locales
dpkg-reconfigure tzdata
apt-get install mc make gcc build-essential kernel-wedge libncurses5 libncurses5-dev libelf-dev binutils-dev kexec-tools makedumpfile fakeroot linux-kernel* lzma

Создаём рабочий каталог «/volume1/@appstore/debian-chroot/var/chroottarget/test/»

Распаковываем в каталог /volume1/@appstore/debian-chroot/var/chroottarget/test/ исходники ядра linux-3.10.x.txz

Заходим в каталог linux-3.10.x и запускаем

cp synoconfigs/bromolow .config
Делаем резервную копию конфигурации
make ARCH="x86_64" oldconfig
Настраиваем конфигурацию
make ARCH="x86_64" menuconfig

Выбираем «М» напротив драйвера Device Drivers/USB support/USB Serial Converter support/USB Cypress M8 USB Serial Driver

Cypress.thumb.gif.7027c5e52b90d97f337fb6a19fe53810.gif

Сохраняем конфигурацию и компилируем модули
make ARCH="x86_64" modules
Копируем скомпилированные модули cypress_m8.ko, usbcore.ko, usbserial.ko в рабочий каталог synology /lib/modules/
Не забываем проверять/выставлять права файлам: chmod 644

 

Дальше переходим к работе с пакетом NUT. Это нужно, чтобы скомпилировать модуль powercom

Цитата

powercom.c производится переопределение types[type].name=KIN даже если в настройках задан type=IMP для UPS Powercom IMP-425AP и подобных, что приводит к ошибочному определению battery.charge: 0.0 Также, неправильно отображаются частота и напряжение сети.)

Информацию по исправлению драйвера я нашёл тут:

http://forum.pcm.ru/viewtopic.php?f=3&t=2627

Качаем исходники NUT 2.4.1 http://pkgs.fedoraproject.org/repo/extras/nut/nut-2.4.1.tar.gz/609ebaf2123fc7171d25a6c742dd7d66/nut-2.4.1.tar.gz
Распаковываем их в каталог /volume1/@appstore/debian-chroot/var/chroottarget/test/
В каталоге /volume1/@appstore/debian-chroot/var/chroottarget/test/nut-2.4.1 создаём файл патча «patch-nut» с содержимым: 
--- drivers/powercom.c	2009-02-17 12:20:48.000000000 +0300
+++ drivers/powercom.c	2010-03-02 15:48:25.354735038 +0300
@@ -852,21 +852,30 @@

	/* setup flow control */
	types[type].flowControl.setup_flow_control();
-	if (!strncmp(types[type].name, "BNT",3) || !strcmp(types[type].name, "KIN") || !strcmp(types[type].name, "IMP")){
+	if (getval("type") == NULL){
		if (!ups_getinfo()) return;
		if (raw_data[UPSVERSION]==0xFF){
			types[type].name="IMP";
-			model=IMPmodels[raw_data[MODELNUMBER]/16];
		}
		if (raw_data[MODELNAME]==0x42){
			if (!strcmp(types[type].name, "BNT-other"))
				types[type].name="BNT-other";
			else
				types[type].name="BNT";
-			model=BNTmodels[raw_data[MODELNUMBER]/16];
		}
		if (raw_data[MODELNAME]==0x4B){
			types[type].name="KIN";
+		}
+	}
+	if (!strncmp(types[type].name, "BNT",3) || !strcmp(types[type].name, "KIN") || !strcmp(types[type].name, "IMP")){
+		if (!ups_getinfo()) return;
+		if (!strcmp(types[type].name, "IMP")){
+			model=IMPmodels[raw_data[MODELNUMBER]/16];
+		}
+		if (!strncmp(types[type].name, "BNT",3)){
+			model=BNTmodels[raw_data[MODELNUMBER]/16];
+		}
+		if (!strcmp(types[type].name, "KIN")){
			model=KINmodels[raw_data[MODELNUMBER]/16];
		}
		linevoltage=voltages[raw_data[MODELNUMBER]%16];

Применяем патч:

patch -p0 -l <patch-nut
В драйвере powercom по умолчанию включена самопроверка батарей при каждом старте драйвера. Настройки или возможности отключения этой проверки – нет.
Метод устранения этой особенности я подсмотрел здесь: http://forum.lissyara.su/viewtopic.php?t=17735&start=25

Если Вам это не актуально, можете данный шаг пропустить.

В файле: /volume1/@appstore/debian-chroot/var/chroottarget/test/nut-2.4.1/drivers/powercom.c

находим строчки:

...
        upsdebugx(1,"Detected: %s , %dV",modelname,linevoltage);
                if (ser_send_char (upsfd, BATTERY_TEST) != 1) {
                        upslogx(LOG_NOTICE, "writing error");
                        dstate_datastale();
                        return;
                }
...
и комментируем лишнее:
...
         upsdebugx(1,"Detected: %s , %dV",modelname,linevoltage);
                /*if (ser_send_char (upsfd, BATTERY_TEST) != 1) {
                        upslogx(LOG_NOTICE, "writing error");
                        dstate_datastale();
                        return;
                }*/
...
Компилируем NUT (пути для конфигов и т.д. выставляем такие же, как у synology):
./configure --with-user=root --with-group=root --prefix=/usr/syno/etc/ups  --sysconfdir=/usr/syno/etc/ups --datadir=/usr/syno/share
make
Копируем скомпилированный файл powercom из каталога  /volume1/@appstore/debian-chroot/var/chroottarget/test/nut-2.4.1/drivers/  в рабочий каталог synology /bin
Не забываем проверять/выставлять права файлам: chmod 644

 

Теперь нужно добавить скомпилированные драйвера, в загрузчик Jun's Loader v1.02b.

Используем osfmount (под windows), чтобы извлечь «extra.lzma» (сжатый файл cpio) из synoboot.img (находится «extra.lzma» на втором разделе FAT). 
Osfmount часто используют для редактирования файла grub.cfg в synoboot.img. 

(«extra.lzma» - содержит дополнительные драйвера *.ko, которые стартуют при загрузке)


Скопируем «extra.lzma» в /volume1/@appstore/debian-chroot/var/chroottarget/test/extra-drv
Для распаковки «extra.lzma» выполним команду: 
lzma -d extra.lzma
Далее, извлекаем файлы из «extra»:
cpio -idv <extra
После чего файл «extra.lzma» можно удалить.

В распакованный каталог …/usr/lib/modules/ копируем скомпилированные модули cypress_m8.ko, usbcore.ko, usbserial.ko, а в /etc редактируем файл rc.modules 
В конце списка EXTRA_MODULES добавляем свои три драйвера, без *.ko
rc.modules выглядит примерно так:
EXTRA_MODULES="mii mdio libphy atl1 atl1e atl1c alx uio ipg jme skge sky2 ptp_pch pch_gbe qla3xxx qlcnic qlge netxen_nic sfc e1000 pcnet32 vmxnet3 bnx2 libcrc32c bnx2x cnic e1000e igb ixgbe r8101 r8168 r8169 tg3 usbnet ax88179_178a button evdev ohci-hcd cypress_m8 usbcore usbserial"
DISK_MODULES="BusLogic vmw_pvscsi megaraid_mm megaraid_mbox megaraid scsi_transport_spi mptbase mptscsih mptspi mptsas mptctl ata_piix megaraid_sas mpt2sas mpt3sas"
EXTRA_FIRMWARES="bnx2/bnx2-rv2p-09ax-6.0.17.fw bnx2/bnx2-rv2p-09-6.0.17.fw bnx2/bnx2-rv2p-06-6.0.15.fw tigon/tg3_tso5.bin tigon/tg3_tso.bin tigon/tg3.bin"
Дальше, внутри каталога, /volume1/@appstore/debian-chroot/var/chroottarget/test/extra-drv,

создаём новый файл cpio, и сжимаем его lzma. Полученный, новый «extra.lzma» записывается в каталог уровнем выше.

Выполняем команду:
(find . -name modprobe && find . \! -name modprobe) | cpio --owner root:root -oH newc | lzma -8 > ../extra.lzma
Полученный файл «extra.lzma», при помощи osfmount, записываем обратно в образ synoboot.img.

 

Теперь произведём настройку DSM 6.1

Выполняем:

insmod /lib/modules/cypress_m8.ko
mknod /dev/ttyUSB0 c 188 0
chmod 644 /dev/ttyUSB0

Настраиваем скорость порта:

stty -F /dev/ttyUSB0 speed 1200 cs8 raw

(Дальнейшая настройка подсмотрена тут: https://xpenology.com/forum/topic/4413-dsm-52-5592-update-4-amp-serial-apc-ups/#comment-38621)

 

Редактируем файл: /etc/rc

Добавляем в KERNEL_MODULES драйвера «usblp cypress_m8 usbserial»:
        if [ $KERNEL_VCODE -ge $(KernelVersionCode "4.4") ]; then
                KERNEL_MODULES="usblp cypress_m8 usbserial llc p8022 psnap usbcore quota_tree quota_v2 crc-ccitt crc-itu-t zlib_inflate dm-bufio dm-snapshot"
        else
                KERNEL_MODULES="usblp cypress_m8 usbserial llc p8022 psnap usbcore quota_tree quota_v2 crc-ccitt crc-itu-t zlib_inflate dm-snapshot"
        fi
В конце файла, перед exit 0 добавляем строку запуска службы UPS:
/usr/syno/etc/rc.sysv/ups-usb.sh start
В файле /usr/syno/etc/rc.sysv/ups-usb.sh правим строку
StartAllDrv() {
        local DRV_LIST="usbhid-ups blazer_usb bcmxcp_usb richcomm_usb tripplite_usb"
на
StartAllDrv() {
        local DRV_LIST="powercom usbhid-ups blazer_usb bcmxcp_usb richcomm_usb tripplite_usb"
Редактируем файл /usr/syno/etc/ups/ups.conf
 [ups]
        driver = powercom
        port = /dev/ttyUSB0
        type = IMP
Загружаем файл https://github.com/networkupstools/nut/raw/master/data/cmdvartab

и копируем его в каталог /usr/syno/share/

На этом всё.
После перезагрузки, UPS должен автоматически появиться в GUI:

P.S. Посмотреть более подробный статус UPS можно командой: upsc ups
admin@serv01:~$ upsc ups
battery.charge: 100.0
driver.name: powercom
driver.parameter.pollinterval: 5
driver.parameter.port: /dev/ttyUSB0
driver.parameter.type: IMP
driver.version: 2.4.1
driver.version.internal: 0.12
input.frequency: 50.00
input.voltage: 226.0
input.voltage.nominal: 220
output.frequency: 50.00
output.voltage: 226.0
ups.load: 12.0
ups.mfr: PowerCom
ups.model: IMP-425AP
ups.model.type: IMP
ups.serial: Unknown
ups.status: OL

 

IMP-425AP.png

Edited by Firs
  • Like 6

Share this post


Link to post
Share on other sites
3 часа назад, Lordbl4 сказал:

после установки обновлений драйвера не слетят?

Уверен что всё слетит. Придётся сохранить скомпилированные драйвера и конфиги, чтобы после обновления их "подсунуть" обратно.

Share this post


Link to post
Share on other sites

Небольшое дополнение.

Чтобы при отключении/включении USB кабеля не приходилось вручную перезапускать службы, можно немного дополнить настройки:

 

Создаём файл /usr/lib/udev/rules.d/99-usb-serial.rules:

SUBSYSTEMS=="tty", ATTRS{manufacturer}=="POWERCOM CO., LTD.", ATTRS{product}=="USB to Serial", KERNEL=="ttyUSB[0123]", SYMLINK+="powercom"

Конец файла /usr/lib/udev/script/tty-util.sh приводим к следующему виду:

case $action in
        add)
                add_handler
                /usr/syno/etc/rc.sysv/ups-usb.sh start
                ;;
        remove)
                remove_handler
                upsdrvctl stop
                ;;
        *)
                ;;
Esac

Редактируем файл /usr/syno/etc/ups/ups.conf (заменяем порт на /dev/powercom)

 [ups]
        driver = powercom
        port = /dev/powercom
        type = IMP

В конце файла /etc/rc, перед exit 0 добавляем создание симлинка:

#Запуск UPS
ln -s /dev/ttyUSB0 /dev/powercom
/usr/syno/etc/rc.sysv/ups-usb.sh start

exit 0

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.