Всё началось с того, что у нас в офисе во время грозы погорела куча сетевого оборудования, в том числе сдох принт-сервер 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
Losst — Настройка udev rules в Linux
OpenWrt Forum — devices showing up with always same name / need help with udev