OSBoy notes.

Записки обо всём...

Принт-сервер p910nd на OpenWrt

Всё началось с того, что у нас в офисе во время грозы погорела куча сетевого оборудования, в том числе сдох принт-сервер D-Link DPR-1061, к которому у нас были подключены два usb-принтера: МФУ (А3 формата) Xerox WorkCentre 5020 и рулонный плоттер HP designjet 111 Roll. Произошло всё в моё отсутствие, пока я был в отпуске... Ну и заказали без разбору новый "принт-сервер"... Эдакую коробочку "AGESTAR LB4-G", которая, как оказалось, мало того, что всего с одним USB-портом, так и вообще даже не принт сервер собственно... а, так называемый, USB-сервер или сетевой USB-адаптер, весьма глючный и неудобный в эксплуатации, в общем редкостная хрень, которую можно использовать разве что в качестве USB-удлинителя, если у Вас дома принтер и компьютер стоят в разных комнатах.
Тут я и вспомнил про свою старую-добрую коробочку TP-Link TL-MR3020, пылящуюся без дела на полке (с уже установленной OpenWrt). К слову сказать, если бы начальство не пожадничало, и вместо роутера TP-LINK TL-WR841N купило, скажем, модель TL-WR1043ND (с USB разъёмом), то можно было бы вообще использовать его же и в качестве принт-сервера...

Настройка сервера
Итак, для использования роутера в качестве принт-сервера, установим на него пакет p910nd - это маленький демон, не имеющий своей очереди печати, а направляющий задачи непосредственно на принтеры. Система печати клиентского компьютера подключается к нему по TCP порту 910n, где n=0,1,2... для принтеров lp0, lp1, lp2... соответственно.

Устанавливаем необходимые пакеты:

opkg update
opkg install kmod-usb-printer p910nd

Подключаем наши принтеры через USB-хаб и проверяем, что они определились системой:

dmesg | grep print
[ 1445.760000] usblp 1-1.2:1.1: usblp0: USB Bidirectional printer dev 4 if 1 alt 0 proto 2 vid 0x0924 pid 0x4271
[ 1454.770000] usblp 1-1.3:1.0: usblp1: USB Bidirectional printer dev 5 if 0 alt 0 proto 2 vid 0x03F0 pid 0x0314
ls -la /dev/usb | grep lp
crw-r--r-- 1 root root 180, 0 Jul 26 11:00 lp0
crw-r--r-- 1 root root 180, 1 Jul 26 11:01 lp1

Посмотреть текущую конфигурацию p910nd можно с помощью команды:

uci show p910nd

Для настройки конфигурации принт-сервера открываем файл /etc/config/p910nd и приводим его примерно к такому содержанию:

config p910nd 'lp0'
	option device '/dev/usb/lp0'
	option port '0'
	option bidirectional '1'
	option enabled '1

config p910nd 'lp1'
	option device '/dev/usb/lp1'
	option port '1'
	option bidirectional '1'
	option enabled '1'

Здесь мы настроили две секции: для принтеров lp0 и lp1 соответственно. Запускаем демона p910nd и добавляем его в автозапуск:

/etc/init.d/p910nd start
/etc/init.d/p910nd enable

Для управления настройками демона из панели управления luci устанавливаем соответствующий пакет:

opkg install luci-app-p910nd

После чего в Luci станут доступны настройки конфигурации p910nd на вкладке: Services > p910nd - Printer Server.

Настройка фаервола
В фаерволе разрешаем входящие соединения на TCP порты 9100, 9101. Для этого в файл /etc/config/firewall добавляем строки:

config rule
        option name             network-printing
        option src              lan
        option proto            tcp
        option dest_port        '9100 9101'
        option family           ipv4
        option target           ACCEPT

Применяем изменения:

/etc/init.d/firewall restart

Настройка правил udev
Всё вышеописанное хорошо работает, однако есть один нюанс: если подключить принтеры в другой последовательности, система определяет их уже под другими именами (lp0, lp1 и т.д.). Отсюда возникают неудобства: приходится включать принтеры строго в определённом порядке, чтобы они соответственно определились системой. Чтобы избавиться от этих неудобств, нужно как-то зафиксировать определённые имена устройств за каждым принтером. В моём случае, на версии прошивки 15.05 Chaos Calmer, используется менеджер процессов procd (в качестве замены hotplug2) - я пока не нашёл внятного описания его возможностей, в том числе, может ли он управлять именами устройств... Достаточно простым решением стало - установка пакета udev и настройка его правил.

Устанавливаем udev:

opkg update
opkg install udev

Создаём файл с нашими правилами для udev:

touch /etc/udev/rules.d/10-local.rules

Для того, чтобы узнать подробные параметры подключенных принтеров, воспользуемся командой udevadm info для принтеров lp0 и lp1 соответственно:

udevadm info -a -n usb/lp0
udevadm info -a -n usb/lp1

В выводе этих команд смотрим, какие параметры можно использовать как условия - в данном случае я буду использовать SUBSYSTEMS, DRIVERS, и самое главное: ATTRS{product}. Добавляем в файл /etc/udev/rules.d/10-local.rules следующие строки:

SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{product}=="WorkCentre 5016/5020", SYMLINK+="xerox5020"
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{product}=="HP Designjet 111 Roll", SYMLINK+="hpdj111roll"

Где значения SUBSYSTEMS, DRIVERS и ATTRS{product} взяты из результатов вывода udevadm info для каждого принтера. В данном примере у нас для каждого принтера будет создаваться символическая ссылка с соответствующим фиксированным именем. Таким образом, в конфиге p910nd мы можем указывать не пути к файлам устройств, а к ссылкам на них.
Поэтому, приводим файл /etc/config/p910nd к следующему виду:

config p910nd 'printer1'
	option device '/dev/xerox5020'
	option port '0'
	option bidirectional '1'
	option enabled '1'

config p910nd 'printer2'
	option device '/dev/hpdj111roll'
	option port '1'
	option bidirectional '1'
	option enabled '1'

Протестируем наши правила для udev. Для этого, сначала найдём путь к файлу устройства соответствующего принтера в директории /sys:

find /sys | grep lp0$
 /sys/devices/platform/ehci-platform/usb1/1-1/1-1.2/1-1.2:1.1/usbmisc/lp0
 /sys/class/usbmisc/lp0

и затем выполним команду:

udevadm test /sys/class/usbmisc/lp0

Среди многочисленного вывода команды видим строку:

node_symlink: creating symlink '/dev/xerox5020' to 'usb/lp0'

Значит всё в порядке, ссылка на файл устройства принтера создалась. Можем в этом убедиться:

ls -la /dev | grep lp

То же самое можно проделать для второго принтера.

Теперь создадим init-скрипт для udev:

touch /etc/init.d/udevd
chmod +x /etc/init.d/udevd

И приведём его к следующему виду:

#!/bin/sh /etc/rc.common
#Init script for udevd

START=30

start() {
    #----------- START the UDEV daemon --------------
    # Путь может отличаться в разных версиях openwrt,
    # например: /usr/sbin/udevd
    /sbin/udevd --daemon &
    sleep 5 && udevadm trigger
    }

stop() {
    killall udevd
    }

Запускаем udevd и добавляем его в автозапуск:

/etc/init.d/udevd start
/etc/init.d/udevd enable

На этом с настройкой принт-сервера всё. Теперь нам всё равно, под каким именем определится принтер - lp0, lp1, или другим... Символические ссылки, созданные udev в любом случае будут указывать на нужное устройство.

Настройка клиентов

Windows XP

  • Открываем "Принтеры и факсы";
  • Жмём "Установка принтера";
  • В "Мастере установки" выбираем: "Локальный принтер", снимаем галку "Автоматическое определение и установка PnP принтера";
  • Далее выбираем: "Создать новый порт", тип порта: "Standard TCP/IP Port";
  • Вводим IP-адрес принт-сервера и имя порта (какое нам нравится);
  • Выбираем тип устройства "Особое", жмём кнопку "Параметры";
  • Указываем номер порта, который слушает принт-сервер для данного принтера (9100, 9101 и т.д.), проверяем, что "ипользуемый протокол" выбран "Raw";
  • Далее устанавливаем драйвер принтера, либо выбираем ранее установленный.


Windows 7

  • Открываем "Устройства и принтеры";
  • Жмём "Установка принтера";
  • Выбираем "Добавить локальный принтер";
  • Выбираем "создать новый порт", тип порта: "Standard TCP/IP Port";
  • Указываем IP-адрес принт-сервера, имя порта (на своё усмотрение), Снимаем галку "Опросить принтер и выбрать драйвер автоматически";
  • На следующем шаге компьютер попытается определить автоматически номер порта, это займёт некоторое время и, вероятнее всего, закончится неудачей (но можно не беспокоиться, это нормально);
  • В появившемся следующем окне выбираем тип устройства "Особое" и жмём "Параметры";
  • Указываем номер порта, который слушает принт-сервер для данного принтера (9100, 9101 и т.д.), проверяем, что указан протокол: "Raw";
  • Далее устанавливаем драйвер принтера, либо выбираем ранее установленный.

 

Полезные ссылки:

OpenWrt wiki - p910nd Printer Server
OpenWrt wiki - Настройка Принт-сервера на примере TL-WR842ND и HP LJ 1020 с использованием p910nd
OpenWrt wiki - p910nd
Настройка udev rules в Linux
OpenWrt Forum - devices showing up with always same name / need help with udev

Теги : openwrt, p910nd, принт-сервер

Комментариев: 4

Dima
#Ответить
Отличная статья!!!
Скажите, а на ВВ можно такое сделать?
Пытался сделать но после такой команды dmesg | grep print тихо.
Главное стоит и работает но только 1 принтер. Хотел 2 завести.
OSBoy
#Ответить
Не буду утверждать, т.к. нет BB под рукой, но думаю, что должно всё завестись, если все необходимые пакеты есть в репозитории.
Попробуйте вместо dmesg | grep print , сразу после подключения принтера выполнить dmesg | grep usb . Может они у Вас как-то по-иному определяются?
Модули ядра необходимые загружены?
lsmod | grep usb - что выдаёт? usblp есть в списке?
Vasyl
#Ответить
Большущее спасибо! Единственная статья со всех интернетов, после которой запустилось все с пол-пинка. Очень важны правила файервола, чувствовал, что дело именно в них, но заработало все именно после Вашего примера. Принтер HP LaserJet 11002?, система OpenWrt 18.06.4, r7808-ef686b7292. В нем, кстати, еще раньше отключил распознавание USB диска, поскольку это GDI-принтер. Короче, работает все отлично!
Александр
#Ответить
Огромное спасибо! Заработало и на версии 17.01

Добавить комментарий

Отменить