Второе дыхание для Samsung ML-1615: AirPrint через LXC на Proxmox

Есть у меня дома лазерник Samsung ML-1615. Древний, 2005 года, но печатает исправно, тонер ещё есть, выкидывать жалко. Беда одна: подключается он только по USB. Который год он висел на компе под столом, и печать «с телефона» выглядела так: переслал себе файл, дошёл до компа, напечатал. Надоело! Решил сделать из него AirPrint-принтер на домашнем Proxmox. Идём под кат…

Схема

В двух словах: принтер воткнут по USB прямо в хост Proxmox. Рядом живёт маленький LXC-контейнер (512 МБ памяти хватает за глаза), ему пробрасывается USB, внутри крутится CUPS, а Avahi рассказывает всей сети, что тут есть принтер. iPhone и Mac видят его как самый обычный AirPrint.

Схема пути задания печати: iPhone и Mac по mDNS и IPP на порт 631, далее CUPS и splix внутри LXC-контейнера на хосте Proxmox, проброшенный /dev/bus/usb и принтер Samsung ML-1615
Путь задания печати: от кнопки на телефоне до бумаги

ML-1615 внутри опознаётся как ML-1610: движок и прошивка те же, корпус другой. Говорит он на SPL2/QPDL, фирменном языке Samsung, и драйвер для него в Linux ровно один: printer-driver-splix.

USB-проброс в LXC

Контейнер сделал privileged, чтобы не возиться с правами на устройство. В /etc/pve/lxc/<id>.conf дописываем:

lxc.cgroup2.devices.allow: c 189:* rwm
lxc.cgroup2.devices.allow: c 180:* rwm
lxc.mount.entry: /dev/bus/usb dev/bus/usb none bind,optional,create=dir
lxc.mount.entry: /dev/usb dev/usb none bind,optional,create=dir

Пробрасываю весь /dev/bus/usb целиком: переткнул принтер в другой порт, а конфиг трогать не надо. И проверьте, что на самом хосте Proxmox не стоит свой CUPS, а то он схватит принтер первым и контейнеру достанется «device busy».

Ставим CUPS

Пакеты внутри контейнера:

apt install cups cups-filters cups-filters-core-drivers \
    printer-driver-splix avahi-daemon avahi-utils dbus

cups-filters-core-drivers обязателен! Без него iPhone принтер в сети видит, а печатать на него молча отказывается.

В cupsd.conf разрешаем ходить из локалки и включаем публикацию через Avahi:

Listen 0.0.0.0:631
BrowseLocalProtocols dnssd
# + Allow @LOCAL в <Location /> и <Location /admin>

cupsctl --remote-admin --share-printers

И заводим саму очередь:

lpadmin -p ML1615 -E \
  -v "usb://Samsung/ML-1610?serial=<серийник>" \
  -m "drv:///splix-samsung.drv/ml1610.ppd" \
  -D "Samsung ML-1615 (AirPrint)" \
  -o printer-is-shared=true -o media=a4

media=a4 ставьте сразу, иначе очередь встанет на американский Letter и поля поплывут.

Пара мелочей

В LXC не стартует служба colord, а CUPS на каждом задании ходит к ней за цветовым профилем и ждёт секунд 25. Чёрно-белому принтеру цветовые профили до лампочки, так что просто глушим её:

systemctl mask colord

На хосте драйвер ядра usblp любит сам цепляться к принтеру и мешать CUPS. Отвязываем и закрепляем udev-правилом, чтобы не цеплялся снова после переподключения:

# руками, сразу
echo -n '1-1:1.0' > /sys/bus/usb/drivers/usblp/unbind

# /etc/udev/rules.d/99-no-usblp-ml1610.rules
ACTION=="bind", SUBSYSTEM=="usb", DRIVER=="usblp", \
  ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="3268", \
  RUN+="/bin/sh -c 'echo -n $kernel > /sys/bus/usb/drivers/usblp/unbind'"

Ещё драйвер splix объявляет двустороннюю печать, которой у этого принтера отродясь не было, и айфон потом предлагает печатать с двух сторон. Убираем лишнее из PPD:

# в /etc/cups/ppd/ML1615.ppd убрать:
# *Duplex DuplexNoTumble...
# *Duplex DuplexTumble...
# оставить только:
# *Duplex None/Off (1-Sided)

rm /var/cache/cups/ML1615.data /var/cache/cups/ML1615.strings
systemctl restart cups avahi-daemon

Если когда-нибудь переустановите драйвер через lpadmin -m, правку PPD придётся повторить.

Итог

Старичок печатает с айфона и мака, и комп под столом для этого больше не нужен) А как печатать на него прямо из телеграма, я рассказал вот тут.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *