маю принтер (лазерний brother hl-2040); він був підключений по usb до рутера (d-link dir-835) з прошивкою openwrt і «прозорим» драйвером p910nd; достатньо було на будь-якому комп’ютері в домашній мережі встановити драйвер принтера, вказати ip рутера як адресу мережевого принтера — і можна друкувати.
so far so good, але ось я замінив рутер на linksys ea8300, і поки що граюся з фабричною прошивкою, котра призначена для «нормальних користувачів» — тих, хто тицяє галочки веб-інтерфейсу і не полізе по ssh встановлювати щось таке, чого не передбачив виробник. я майже чую, як служба підтримки не приховує зневаги: «што? принтер на usb? йди купи собі нормальний принтер з wifi, голожопенко!»
але я маю сервер з debian, і тут відкривається вибір:
- той самий p910nd на debian, або…
- …сервер друку по-дорослому?
чому драйвер p910nd «прозорий»? тому що це не сервер друку: немає черги чи якогось адміністрування завдань — клієнтський драйвер неначе напряму спілкується з принтером. навіть не знаю, що буде, якщо декілька користувачів захочуть щось надрукувати одночасно. коротше кажучи, захотілося налаштувати правильний сервер друку «в горнятках» (cups), а в ідеалі — без драйверів на клієнтських пристроях.
зразу зізнаюся, що «з наскоку» не вийшло, тож цей допис — спроба задокументувати, щоби розібратися, що пішло не так і як зробити правильно.
підключення принтера
тут все просто: принтер в порт usb сервера, lsusb
повинен показати пристрій:
> lsusb
...
Bus 004 Device 003: ID 04f9:0028 Brother Industries, Ltd Printer
...
не знаю, чи це потрібно, але lsusb -t
показує трохи точніше, до якого порту підключено принтер (хоча відповідність нумерації зовнішнім портам — під величезним питанням):
> lsusb -t
...
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
|__ Port 2: Dev 3, If 0, Class=Printer, Driver=, 12M
...
на цьому етапі система повинна була би побачити принтер на порті usb і задіяти драйвер usblp
… але з тексту вище (driver=) видно, що в мене щось пішло не так. ядро звітує про якусь помилку:
# dmesg | grep usblp
...
[6058722.788649] usblp 4-2:1.0: usblp0: USB Bidirectional printer dev 3 if 0 alt 0 proto 2 vid 0x04F9 pid 0x0028
[6058727.794263] usblp0: removed
[6058728.803658] usblp: can't set desired altsetting 0 on interface 0
можливо, після моєї першої спроби налаштувати cups. «пересмикнув» кабель — принтер підключився: тепер lsusb
звітує, що драйвер задіяно:
> lsusb -t
...
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
|__ Port 2: Dev 4, If 0, Class=Printer, Driver=usblp, 12M
dmesg
теж заспокоюює:
# dmesg | grep usblp
після цього в системі з’являється файл пристрою /dev/usb/lp0
:
# ls /dev/usb/*
/dev/usb/lp0
встановлення cups
далі я керуюся офіційною підказкою debian. по-перше, встановив cups (але не повний набір task-print-server
— це проблема?):
# apt-get update && apt-get install cups cups-client
я також підглянув, який драйвер рекомендовано для мого принтера, завантажив відповідний файл ppd та закинув до /etc/cups/ppd
.
> ls -l /etc/cups/ppd
...
-rw-r--r-- 1 root root 13505 May 6 13:48 Brother-HL-2040-hl1250.ppd
перевірка, чи запущено сервіс cups:
> systemctl status cups
● cups.service - CUPS Scheduler
Loaded: loaded (/lib/systemd/system/cups.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-05-06 13:53:28 EDT; 5h 6min ago
Docs: man:cupsd(8)
Main PID: 9802 (cupsd)
Tasks: 1 (limit: 4915)
Memory: 1.4M
CPU: 140ms
CGroup: /system.slice/cups.service
└─9802 /usr/sbin/cupsd -l
веб-інтерфейс cups
на цьому етапі інструкція зі встановлення cups згадує веб-інтерфейс для адміністрування, доступний за адресою localhost:631/admin — але «засідка» в тому, що мій сервер не просто «безголовий» (без монітора), ба навіть не має іксів (графічного сервера), і запустити якогось вогнелиса на самому сервері не можу… а віддалене адміністрування за замовчуванням відключене. замість порпатися в /etc/cups/
, безпечніше, мабуть, скористатися cupsctl
:
# cupsctl --remote-admin --remote-any --share-printers
…і після цього можна «постукати» з сусідньої машини в локальній мережі на порт 631.
налаштування сервера cups
маючи доступ до адмінконсолі cups по https, пробую додати свій принтер (сервер запитає логін/пароль) — so far so good, бачу brother hl-2040 в переліку локальних друкарок: додається і налаштовується… і навіть тестова сторінка друкується.
налаштування друку на клієнтській машині (linux)
зненацька, мій manjaro побачив принтер в мережі без жодних танців з бубном — навіть адресу сервера не довелося вказувать — лише завантажити той самий драйвер (ppd) з openprinting.org, що і на сервері.
спроба друку з файлу pdf, втім, не проходить: драйвер на клієнті каже «sending data to printer», але згодом сервер відповідає «filter failed». журнал cups (/var/log/cups/error_log
) на сервері:
# less +G /var/log/cups/error_log
...
D [06/May/2020:22:35:37 -0400] [Job 15] ================================================
D [06/May/2020:22:35:37 -0400] [Job 15] File: /var/spool/cups/d00015-001
D [06/May/2020:22:35:37 -0400] [Job 15] ================================================
D [06/May/2020:22:35:37 -0400] [Job 15] Cannot process \"/var/spool/cups/d00015-001\": Unknown filetype.
D [06/May/2020:22:35:37 -0400] [Job 15] Process is dying with \"Could not print file /var/spool/cups/d00015-001
D [06/May/2020:22:35:37 -0400] [Job 15] \", exit stat 2
D [06/May/2020:22:35:37 -0400] [Job 15] Cleaning up...
D [06/May/2020:22:35:37 -0400] [Job 15] PID 14997 (/usr/lib/cups/filter/foomatic-rip) stopped with status 2.
...
вікі arch linux натякає, що проблема може виникати через недовстановлені залежності для cups: ghostscript та foomatic… але я перевіряю — вони є:
# dpkg -l | grep "ghostscript\|cups-filters"
ii cups-filters 1.11.6-3+deb9u1 amd64 OpenPrinting CUPS Filters - Main Package
ii cups-filters-core-drivers 1.11.6-3+deb9u1 amd64 OpenPrinting CUPS Filters - PPD-less printing
ii ghostscript 9.26a~dfsg-0+deb9u6 amd64 interpreter for the PostScript language and for PDF
поліз до тенет, і за три години нагуглив та перечитав море згадок подібної проблеми («foomatic-rip stopped with status 2»), найчастіше з абсолютно різними пропозиціями щодо розв’язку… у відчаї, я перечепився через таке: «everyone who sees this problem: you can avoid it by only performing job transformation at the server. do this by setting the client queues to „raw“» (тиць).
…гхм? на клієнтській машинці в налаштуваннях принтера я замінив драйвер (такий, як на сервері, рекомендований для brother hl-2040) загальним — generic > ipp everywhere printer (використовується для бездрайверного друку), і…
…зненацька — все працює!
бонус!
перевірив, і таки так — тепер воно друкує навіть зі смартфонів у локальній мережі. отак випадково я собі налаштував отой «бездрайверний» друк вдома.