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

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 придётся повторить.
Итог
Старичок печатает с айфона и мака, и комп под столом для этого больше не нужен) А как печатать на него прямо из телеграма, я рассказал вот тут.
