Печать в Linux выглядит обманчиво просто: ткнул lp, лист выехал. Но за этим стоит сетевой сервер со своим протоколом, очередями и драйверами, и когда лист НЕ выезжает, администратор должен понимать, где именно застряло задание. В этом уроке разберём архитектуру CUPS изнутри: что такое демон cupsd, зачем ему веб-интерфейс на порту 631, как устроены очереди и задания, какими командами ими рулить, где лежит конфигурация и как читать логи, когда печать встала. Заодно поясню, почему старые команды lpr и lpq до сих пор работают, хотя LPD как сервер давно мёртв.

Как это работает
CUPS (Common Unix Printing System) - это не просто утилита, а полноценный сетевой сервер печати. Центр всего - демон cupsd. Когда вы отправляете задание, оно не идёт напрямую на принтер: клиент по сети (даже если это localhost) стучится к cupsd, тот ставит задание в очередь, прогоняет его через цепочку фильтров и только потом отдаёт на устройство через бэкенд. Принтер при этом может быть локальным по USB, сетевым по IP или вообще общим на другом сервере.
Главная идея современного CUPS (версия 2.x) - всё общение идёт по IPP, Internet Printing Protocol. Это HTTP-подобный протокол, который и работает поверх HTTP на TCP-порту 631. Поэтому веб-интерфейс администрирования и сам протокол печати живут на одном порту - откройте в браузере адрес самой машины с двоеточием 631 и попадёте в панель управления. Современные принтеры умеют IPP Everywhere и AirPrint, и тогда драйвер вообще не нужен: принтер сам сообщает свои возможности, а CUPS говорит с ним напрямую. Это важный сдвиг 2026 года - классические PPD-драйверы объявлены устаревшими, ставка сделана на драйверless-печать.
Очередь (queue) - ключевое понятие. Каждый настроенный принтер - это именованная очередь. У очереди два независимых состояния. Первое: принимает она новые задания или нет (accepting/rejecting). Второе: обрабатывает ли она их прямо сейчас (enabled/disabled). Это разные вещи: очередь может принимать задания, но стоять на паузе - они копятся, но не печатаются. Понимание этой пары спасает при диагностике: задание есть, а печати нет именно потому, что очередь disabled.
Внутри обработки задание проходит через фильтры. Фильтр - это программа, которая конвертирует один формат в другой: PDF в растр, растр в язык конкретного принтера. CUPS выстраивает конвейер фильтров автоматически, ориентируясь на MIME-тип входных данных и возможности устройства. В конце цепочки стоит бэкенд (usb, ipp, socket, lpd) - он-то и пихает байты в железо.
Команды и примеры
Сначала убедимся, что демон жив. Управление через systemd одинаково в обоих семействах, отличаются только имена пакетов.
Код: Выделить всё
# проверить и запустить демон
systemctl status cups
systemctl enable --now cups
# Debian/Ubuntu - установка
apt install cups cups-client
# RHEL/Fedora - установка
dnf install cups
Код: Выделить всё
lpstat -p -d # список принтеров и принтер по умолчанию
lpstat -t # полный дамп: устройства, очереди, задания
lpstat -a # кто принимает задания
lpstat -o # активные задания во всех очередях
Код: Выделить всё
# System V стиль
lp -d office report.pdf # на принтер office
lp -n 2 -o sides=two-sided-long-edge file.pdf
echo "test" | lp # печать из stdin
# BSD стиль
lpr -P office report.pdf
lpr -#2 file.pdf # две копии
Посмотреть очередь и удалить задание:
Код: Выделить всё
lpq -P office # BSD: что в очереди office
lpstat -o office # то же в System V стиле, с ID заданий
# отменить задание по ID (например office-42)
cancel office-42 # System V
lprm 42 # BSD
cancel -a office # снести ВСЕ задания очереди office
Код: Выделить всё
cupsdisable office # пауза: задания копятся, не печатаются
cupsenable office # возобновить печать
reject office # перестать принимать новые задания
accept office # снова принимать
lpadmin -d office # сделать office принтером по умолчанию
- Путают enabled и accepting. Если lpstat показывает, что задания есть, но ничего не печатается - почти всегда очередь в состоянии disabled. Лечится cupsenable, а не перезагрузкой.
- После сбоя печати CUPS сам ставит очередь на паузу и НЕ снимает её автоматически, пока вы не разберётесь. Разобрались с принтером - не забудьте cupsenable, иначе будете ждать вечно.
- Брандмауэр режет порт 631. Сетевую печать и веб-интерфейс с других машин не видно - откройте 631/tcp (и 631/udp для обнаружения) в nftables/firewalld.
- Веб-интерфейс просит логин и отвергает обычного пользователя. Админ-доступ в CUPS требует членства в группе lpadmin (Debian/Ubuntu) или sys/wheel по конфигу (RHEL).
- Тащат древний демон lpd. В 2026 отдельный LPD-сервер не нужен: CUPS сам принимает протокол LPD как один из бэкендов и слушает его при необходимости. Команды lpr/lpq/lprm - это просто BSD-совместимый интерфейс к cupsd, а не признак живого lpd.
- Логи смотрят не там. Полезное лежит в /var/log/cups/error_log, а уровень детализации задаётся директивой LogLevel в cupsd.conf - на warn вы половины не увидите, ставьте debug для разбора.
- Ставят PPD-драйвер на современный принтер. Для IPP Everywhere драйвер вреден: проще добавить принтер как драйверless (everywhere) и не воевать с конвертацией форматов.
- Шаг 1. Установите CUPS и убедитесь, что демон активен: systemctl enable --now cups, затем systemctl status cups.
- Шаг 2. Создайте виртуальный принтер в файл, чтобы тренироваться без железа: lpadmin -p lab -E -v file:/tmp/lab.prn -m everywhere (или укажите PPD). Проверьте: lpstat -p.
- Шаг 3. Откройте в браузере адрес машины с :631, найдите раздел Printers и посмотрите свою очередь lab.
- Шаг 4. Отправьте задание: echo "Hello CUPS" | lp -d lab. Посмотрите очередь через lpstat -o.
- Шаг 5. Поставьте очередь на паузу cupsdisable lab, отправьте ещё одно задание и убедитесь через lpq, что оно висит, а не печатается.
- Шаг 6. Снимите паузу cupsenable lab, удалите оставшиеся задания через cancel -a lab.
- Шаг 7. Поднимите LogLevel до debug в /etc/cups/cupsd.conf, перезапустите cups и найдите следы вашего задания в /var/log/cups/error_log.
- На каком TCP-порту работает CUPS и почему веб-интерфейс и сам протокол печати делят один порт?
- Чем отличаются состояния очереди accepting и enabled? Какая команда меняет каждое из них?
- Чем отличаются семейства команд lp/lpstat/cancel и lpr/lpq/lprm и почему оба работают в одной системе?
- Какой файл содержит основную конфигурацию демона и где искать журнал ошибок печати?
- Что значит драйверless-печать (IPP Everywhere) и почему в 2026 она предпочтительнее установки PPD-драйвера?
- Почему наличие команд lpr и lpq не означает, что в системе запущен отдельный демон LPD?