Принт-сервер 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
Комментариев: 4