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

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

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now