Открыть сервис

Демон lpd

Демон lpd — это системный процесс (демон) в операционных системах семейства Unix, отвечающий за приём, постановку в очередь и отправку заданий на печать. Он является основным компонентом традиционной системы печати Line Printer Daemon (LPD), реализующей одноимённый протокол Line Printer Daemon (LPD, также известный как LPR). Демон lpd работает в фоновом режиме, прослушивая сетевые порты (обычно TCP-порт 515) и обрабатывая запросы от клиентских утилит, таких как lpr (отправка задания), lpq (просмотр очереди) и lprm (удаление задания).

История

Протокол LPD и демон lpd были разработаны в начале 1980-х годов в Калифорнийском университете в Беркли для операционной системы BSD Unix. Первоначальная реализация предназначалась для управления локальными принтерами, подключёнными через последовательный или параллельный порт. С развитием сетей протокол был расширен для поддержки удалённой печати через TCP/IP, что сделало его одним из первых стандартных механизмов сетевой печати в Unix-среде.

В 1990 году протокол LPD был стандартизирован в документе RFC 1179Line Printer Daemon Protocol»), который описал формат команд и ответов, а также процедуры передачи данных. Этот документ стал основой для множества реализаций, включая встроенные демоны в принтерах и серверах печати. Однако RFC 1179 не был принят в качестве полного стандарта (он имел статус «Informational»), что привело к появлению несовместимых расширений.

С середины 1990-х годов демон lpd начал вытесняться более современными системами печати, такими как CUPS (Common Unix Printing System), которая использует протокол IPP (Internet Printing Protocol) и предоставляет более широкие возможности, включая поддержку драйверов, аутентификацию и шифрование. Тем не менее, lpd остаётся распространённым в старых Unix-системах, встраиваемых устройствах и принтерах с поддержкой LPD.

Принцип работы

Демон lpd обычно запускается при загрузке системы из стартового скрипта (например, /etc/init.d/lpd или через systemd). Он может работать как автономный процесс или управляться суперсервером (inetd, xinetd). В режиме автономного демона lpd прослушивает TCP-порт 515 и ожидает входящих соединений.

Обработка задания на печать

  1. Приём задания: Клиентская утилита lpr подключается к демону lpd на локальном или удалённом хосте и передаёт управляющий файл (содержащий имя пользователя, имя задания, параметры печати) и собственно данные для печати (обычно в формате PostScript, PCL или plain text).
  2. Постановка в очередь: Демон lpd сохраняет полученные файлы в специальной директории (обычно /var/spool/lpd/<имя_очереди>), присваивая каждому заданию уникальный идентификатор. Задания упорядочиваются по времени поступления или по приоритету.
  3. Отправка на принтер: Когда принтер становится доступен, демон lpd извлекает задание из очереди и передаёт его на устройство. Для локального принтера данные отправляются через соответствующий порт (например, /dev/lp0). Для сетевого принтера демон может выступать в роли клиента, подключаясь к другому демону lpd на удалённом хосте.
  4. Уведомление: После завершения печати демон может отправить уведомление пользователю (через почту или системный журнал).

Протокол LPD (RFC 1179)

Протокол LPD использует простой текстовый формат команд. Каждая команда начинается с однобайтового кода, за которым следуют параметры и завершающий символ перевода строки. Основные команды:

  • \x01 (Receive Printer Job): Приём задания на печать.
  • \x02 (Receive Queue State): Запрос состояния очереди.
  • \x03 (Receive Queue State (short)): Сокращённый запрос состояния очереди.
  • \x04 (Remove Job): Удаление задания из очереди.

Демон lpd также поддерживает команды для управления очередью, такие как остановка, запуск и перезапуск печати.

Конфигурация

Файл конфигурации демона lpd обычно находится по пути /etc/printcap. Этот файл определяет очереди печати, их параметры и принтеры. Формат printcap основан на записях, разделённых двоеточиями, где каждая запись описывает одну очередь. Пример записи:

`` lp|local printer:\ :lp=/dev/lp0:\ :sd=/var/spool/lpd/lp:\ :lf=/var/log/lpd-errs:\ :sh: ``

Параметры включают:

  • lp — устройство принтера (например, /dev/lp0 для параллельного порта или :remote@host для сетевого принтера).
  • sdдиректория для хранения очереди.
  • lf — файл журнала ошибок.
  • sh — подавление заголовочной страницы.
  • rm и rp — для удалённой печати: имя хоста и имя очереди на удалённом сервере.

Недостатки и критика

Несмотря на широкое распространение, демон lpd и протокол LPD имеют ряд недостатков:

  • Отсутствие аутентификации и шифрования: Протокол LPD передаёт данные в открытом виде, что делает его уязвимым для перехвата и подмены заданий. В RFC 1179 не предусмотрены механизмы проверки подлинности.
  • Ограниченная поддержка форматов: Демон lpd обычно ожидает данные в формате, понятном принтеру (PostScript, PCL, ASCII). Современные системы печати требуют автоматического преобразования (фильтрации), что в lpd реализовано слабо или требует внешних утилит.
  • Сложность конфигурации: Файл printcap имеет неинтуитивный синтаксис, а настройка удалённой печати может быть затруднительной.
  • Отсутствие стандартизации: RFC 1179 не является полным стандартом, и разные реализации демона lpd могут иметь несовместимые расширения.
  • Проблемы с масштабированием: При большом количестве заданий демон lpd может работать неэффективно, особенно при одновременной работе нескольких клиентов.

Современное состояние

В современных дистрибутивах Linux и BSD-системах демон lpd обычно заменён на более функциональные системы, такие как CUPS (Common Unix Printing System). CUPS поддерживает протокол IPP, который обеспечивает шифрование, аутентификацию, гибкое управление драйверами и поддержку современных форматов. Однако CUPS может эмулировать работу LPD-сервера для совместимости со старыми клиентами.

В некоторых встраиваемых системах, маршрутизаторах и принтерах (например, от HP, Brother, Epson) демон lpd всё ещё используется как встроенный сервер печати. В таких устройствах он часто реализован в виде упрощённой версии, поддерживающей только базовые функции.

Альтернативы

  • CUPS — современная система печати, использующая IPP. Поддерживает фильтры, драйверы, веб-интерфейс и шифрование.
  • LPRng — улучшенная реализация протокола LPD с поддержкой аутентификации и более гибкой конфигурацией, но в настоящее время считается устаревшей.
  • Samba — для печати через Windows-сети (SMB/CIFS) может использоваться демон smbd, который также может эмулировать LPD.

Безопасность

В связи с отсутствием шифрования и аутентификации, использование демона lpd в открытых сетях (включая интернет) не рекомендуется. В современных системах доступ к порту 515 обычно ограничивается брандмауэром, а сам демон запускается только для локальных нужд или во внутренней сети. В некоторых реализациях (например, в LPRng) добавлена поддержка аутентификации через PAM (Pluggable Authentication Modules), но это не является стандартом.

Источники

  • RFC 1179 — Line Printer Daemon Protocol (1990).
  • W. Richard Stevens, «Unix Network Programming», Volume 1, 2nd Edition (1998).
  • Документация к BSD-системам (FreeBSD Handbook, раздел «Printing»).
  • Документация к CUPS (CUPS Software Administrators Manual).
  • Man-страницы: lpd(8), lpr(1), lpq(1), lprm(1), printcap(5).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →