Печать

Добавление и использование принтеров в системе

Статья включает:

Обзор систем печати
Печать с помощью утилиты lpr
Интерфейс пользователя
Каталоги спулинга
Управление доступом
Менеджер сети
Параметры принтера: файл /etc/printcap
Примеры содержимого файла /etc/printcap
Удаленная печать на принтере, находящемся в другой сети
Удаленная печать на TCP/IP-принтере с использованием утилиты lpr
Печать с помощью утилиты spooler
Настройка spooler
Печать с использованием USB принтера
Удаленная печать по протоколу Qnet
Удаленная печать по протоколу TCP/IP
Конфигурационные файлы для утилиты spooler
Использование утилиты lpr
Использование программного обеспечения NCFTP
Использование программного обеспечения SAMBA
Устранение неполадок
Сообщения об ошибках в программах семейства lpr
Устранение неисправностей при удаленной печати

Обзор систем печати

Самый простой способ напечатать файл – это послать его непосредственно на принтер. Например, если принтер подключен к параллельному порту компьютера, то для вывода на печать нужно просто ввести строку:

cat файл > /dev/par

Однако при таком способе возникают некоторые проблемы:

При печати лучше всего использовать функцию спулинга (spooling). При использовании функции спулинга задание на печать помещается в очередь, ожидая момента, когда принтер будет в состоянии его напечатать.

В ЗОСРВ «Нейтрино» существуют два различных механизма спулинга печати:

Вы можете использовать любой из способов, либо тот и другой в зависимости от начальных настроек вашей машины и сети. Далее перечислены некоторые особенности подключения принтера.

Еще одно отличие состоит в том, что сервис lpd управляет всеми определенными в конфигурационном файле принтерами, в то время как программа spooler управляет только одним принтером, однако несколько экземпляров этой программы может работать одновременно.

Печать с помощью утилиты lpr

Система печати lpr поддерживает:

Для работы через систему печати lpr необходимо иметь:


Note: Для настройки системы lpr нужно войти в систему под учетной записью root.

Интерфейс пользователя

В систему стандартной печати входят следующие основные файлы и команды (рис. 1):

14_1.png
Рисунок 1. Печать с помощью утилит семейства lpr

lpd — сервис принтера

Программа lpd, которая обычно запускается на этапе загрузки системы из файла /etc/rс.d/rc.local (см. раздел Управление запуском ЗОСРВ «Нейтрино»), выполняет роль главного сервера координации и управления очередью спулера, параметры которой заданы в файле /etc/printcap. При запуске программы lpd происходит однократный просмотр базы данных /etc/printcap и перезапуск всех принтеров, для которых назначены задания на печать. При нормальной работе программа lpd принимает запросы на обслуживание сокета в домене Интернета (со спецификацией обслуживания "printer") при запросах на доступ к принтеру.

Для обработки запроса сервис принтера порождает копию собственного процесса, при этом в главном процессе продолжается анализ появления новых запросов. Для синхронизации сервисов используются простые текстовые файлы в качестве блокировки. Родительский процесс сервиса использует файл /usr/spool/output/lpd.lock, а дочерний процесс — файл .lock в каталоге спулинга принтера в соответствии с записью в файле printcap.

Взаимодействие клиентов с программой lpd происходит посредством обычного транзактного протокола. Аутентификация удаленных клиентов осуществляется на основе схемы "привилегированного порта" ("privileged port"), см. подраздел "Управление доступом" далее в этой статье.

lpr — запустить задание на печать

С помощью команды lpr задание на печать ставится в локальную очередь, после чего локальному сервису lpd отправляется уведомление о том, что новое задание ожидает запуск в спулинге. Сервис либо отправляет задание для печати на локальный принтер, либо (в случае удаленной печати) делает попытку перенаправления задания на соответствующую машину. Если невозможно открыть принтер или отсутствует доступ к удаленной машине, задание остается в очереди до тех пор, пока не будет возможности его выполнить.

lprq — показать очередь принтера

Программа lprq работает рекурсивно от конца к началу, отображая очередь заданий для машины с заданным принтером, а затем очереди машин, которые направляют задания на данный принтер. Имеется два формата отображения выходной информации:

lprrm — удалить задания из очереди

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


Note: Из очереди можно удалить только собственные задания на печать.

lprc — программа управления принтером

Программа lprc используется для управления системой печати lpr. Для каждого принтера, заданного в файле /etc/printcap, команда lprc может:

Программа lprc предоставляет пользователю root возможность локального управления принтерами. Далее приведен список основных команд программы и их назначение.

start
разрешает печать и передает программе lpd запрос на запуск заданий на печать.
abort
немедленно завершает работу активного сервиса спулера на локальной машине, а затем запрещает печать (тем самым предотвращая запуск командой lpr новых сервисов). Обычно эта команда используется для принудительного перезапуска зависшего сервиса принтера (например, в случае, когда команда lprq сообщает, что сервис запущен, но ничего не происходит).

Команда abort не удаляет из очереди спулера каких-либо заданий на печать, для этого существует команда lprrm.
enable
disable
команды включают или выключают работу локальной очереди спулера для того, чтобы через команду lpr нельзя было поместить в очередь спулера новые задания.

Например, вы можете использовать команду disable при тестировании новых фильтров принтера, поскольку при этом разрешается печать пользователю root, но запрещается для всех остальных пользователей. Другая распространенная ситуация применения этой команды — запретить пользователям помещать задания в очередь, если ожидается недоступность принтера в течение длительного времени.
restart
обычным пользователям разрешается перезапустить сервисы печати, когда от программы lprq поступает сообщение об отсутствии запущенных сервисов.
stop
команда останавливает сервис печати после завершения текущего задания. Эта команда также запрещает печать. Использование этой команды является самым правильным способом отключения принтера для проведения техобслуживания. Имейте в виду, что при остановке принтера этой командой пользователи по-прежнему имеют возможность посылать задания в очередь спулера.
topq
команда перемещает выбранные задания в начало очереди печати. Эта команда может использоваться для продвижения на печать приоритетных заданий (программа lpr помещает задания в очередь в порядке их поступления).

Каталоги спулинга

Каждый узел, с которого может производиться печать, должен иметь каталог спулинга, в котором сохраняются файлы для печати. По умолчанию для этого каталога назначается путь /usr/spool/output/lpd (этот путь может быть изменен в файле /etc/printcap). Если этот каталог не существует, его нужно создать для всех узлов.


Note: Сервис lpd не работает без каталога спулинга и не выдает никаких сообщений об этом. Поэтому весьма полезно при отладке проблем с принтером запускать работу системного журнала (см. описание утилиты syslogd). Тогда вы сможете прочесть сообщения об ошибках в файле /var/log/syslog.

Управление доступом

В системе управления принтером организуются защищенные области спулинга, чтобы пользователь не мог изменить относящиеся к принтеру учетные данные или удалить файлы для печати, кроме собственных. Правила, которые соблюдаются при этом, перечислены далее:

Менеджер сети

Если вы хотите печатать на удаленном принтере, то в ЗОСРВ «Нейтрино» необходимо запустить сетевой менеджер io-pkt-*. Этот сервис загружает разделяемые объекты (библиотеки DLL), которые обеспечивают поддержку требуемых протоколов и драйверов устройств.

Например, чтобы загрузить полный стек протоколов TCP/IP и драйвер адаптеров Gigabit Ethernet производства Intel ( devnp-e1000.so), нужно ввести следующую команду:

io-pkt-v4 -de1000


Note: Чтобы использовать стек TCP/IP таким образом, возможно, потребуется задать конфигурацию своего сетевого интерфейса с указанием типа и номера сетевой интерфейсной платы (NIC), IP-адреса и сетевой маски интерфейса TCP/IP. Более подробные сведения об этом приведены в разделе Сетевой стек и протоколы TCP/IP.

Параметры принтера: файл /etc/printcap

До начала печати на узлах должна присутствовать информация о конкретном используемом принтере (как минимум, должно быть известно, где находится принтер). Описание принтера на каждом узле хранится в файле /etc/printcap. В базе данных /etc/printcap для каждого принтера имеется одна или несколько записей.


Note: Этот файл отсутствует после первоначальной установки ЗОСРВ «Нейтрино», поэтому при необходимости его нужно создать вручную.

В данном разделе приводится описание основных полей файла. Сведения об остальных полях приведены в руководстве /etc/printcap.

Типовые начальные установки

Вот как выглядит типичный файл /etc/printcap, который вы можете модифицировать:

lpt1|tpptr|printer in Docs department: \ :lp=/dev/par1: \ :sd=/usr/spool/output/lpt1: \ :lf=/usr/adm/lpd-errs: \ :mx#0: \ :sh:

Каждая запись в файле /etc/printcap описывает принтер. Комментарии начинаются с символа (#). Запись состоит из некоторого числа полей, разделенных символами двоеточия (:). В приведенном примере каждое поле размещено на отдельной строке, но все поля можно располагать и на одной строке при условии, что они начинаются и заканчиваются двоеточием.

Далее приводятся пояснения, касающиеся каждой строки вышеприведенной записи:

lpt1|tpptr|printer in Docs department:\
Перечисляются известные имена принтера. Имена разделяются символом вертикальной черты (|). Самое последнее имя — это длинное имя, полностью идентифицирующее принтер; только в нем допускается использование пробелов. Записи могут размещаться на нескольких строках. Для указания продолжения на следующей строке используется символ обратной косой черты (), при этом он должен быть последним символом на переносимой строке. Для удобства чтения можно включать пустые поля.
:lp=/dev/par1:\
Имя устройства, которое открывается для вывода (имя по умолчанию /dev/lp).
:sd=/usr/spool/output/lpt1:\
Каталог спулинга (путь по умолчанию /usr/spool/output/lpd). Для каждого принтера должен быть определен отдельный каталог спулинга. При его отсутствии задание на печать будет передаваться на другие принтеры в зависимости от того, какой из них будет запущен сервисом раньше. Каталог спулинга принято называть таким же именем, что и соответствующий ему принтер.

Note: Перед печатью убедитесь в том, что каталог спулинга существует.

:lf=/usr/adtn/lpd-errs:\
Файл для сохранения выводимых сообщений об ошибках печати (по умолчанию сообщения об ошибках выводятся на консоль).

Note: Иногда сообщения об ошибках, которые посылаются на стандартное устройство для вывода ошибок, не сохраняются в файле отчетов. Настоятельно рекомендуется использовать программу-сервис для формирования системных журнальных записей syslogd.

:mx#0:\
Удалить принимаемые по умолчанию ограничения на размер буфера для спулинга.
:sh:
Подавить печать пакетного заголовка (burst header) — страницы, на которой приводится список идентификаторов пользователей и информация о задании на печать.

Принтеры на последовательных портах

При подключении принтера через последовательный порт необходимо установить соответствующую скорость и режимы терминала. Далее приводится пример, где заданы параметры принтера DecWriter III, подключенного локально к последовательному порту с пропускной способностью 1200 бод.

lp|LA-180 DecWriter III: \ :lp=/dev/lp:br#1200:fs#06320: \ :tr=\f:of=/usr/lib/lpf:lf=/usr/adm/lpd-errs:

Здесь:

lp
имя файла, который нужно открыть для вывода;
br
скорость передачи данных по линии терминала tty;
fs
флаги, которые устанавливают параметры: CRMOD, без проверки четности, XTABS;
tr=
печатать символ подачи страницы (formfeed) при пустой очереди. Это удобно, когда в принтер вставлена рулонная бумага. Тогда по завершении задания на печать можно просто оторвать бумагу вместо того, чтобы отключать принтер от линии и вручную подавать бумагу;
of=/usr/lib/lpf
использовать для печати файлов программу фильтрации с именем lpf (см. раздел "Фильтры" далее в этой статье);
lf=/usr/adm/lpd-errs
выводить все сообщения об ошибках в файл /usr/adm/lpd-errs, а не на консоль.

Удаленные принтеры

Для принтеров, которые подключены к удаленным хостам, запись lp следует оставить пустой. Например, приводимая далее запись в файле /etc/printcap направляет вывод на принтер lp, подключенный к машине ucbvax.

lp|default line printer:\ :lp=:rm=ucbvax:rp=lp:sd=/usr/spool/vaxlpd:

Поле rm задает имя удаленной машины, соединение с которой нужно установить. Это имя должно быть известным именем хоста для компьютера в сети. Поле rp указывает, что имя удаленного принтера — lp (в данном случае это можно не указывать, поскольку такое значение устанавливается по умолчанию). Поле sd определяет, что в качестве каталога спулинга задается /usr/spool/vaxlpd, а не задаваемый по умолчанию каталог /usr/spool/output/lpd.

Фильтры

Фильтры используются для управления взаимозависимостями устройств и функциями учета.

выходные фильтры.
Применяются, когда не нужен учет или когда через фильтр должны пропускаться все текстовые данные. Выходной фильтр не годится для ведения учета, потому что его запуск происходит однократно, через него фильтруются все текстовые файлы, он не пропускает имена зарегистрированных пользователей и не идентифицирует начало или конец задания.
входные фильтры.
Запускаются для каждого печатаемого файла и выдают учетную информацию, если присутствует поле af в записи для принтера файла printcap. Если такое поле присутствует как во входном, так и выходном фильтрах, то выходной фильтр используется только для печати заглавной страницы (banner page). После этого выходной фильтр останавливается, давая возможность работать входным фильтрам.
другие фильтры.
Служат для преобразования файлов из одного формата в другой. Например:

va|varian|Benson-Varian: \ :lp=/dev/va0:sd=/usr/spool/vad:of=/usr/lib/vpf: \ :tf=/usr/lib/rvcat:mx#2000:pl#58:px=2112:py=1700:tr=\f:

Поле tf определяет, что файл /usr/lib/rvcat используется в качестве фильтра при печати с выходным форматом troff. Этот фильтр необходим для установки устройства в режим печати текста при работе с текстовыми файлами и в режим плоттера при печати файлов типа troff или растровых изображений. Обратите внимание на то, что запись pl определяет размер страницы 58 строк при размере бумаги 8,5 x 11 дюймов (т.е. 21 x 27 см).

Для разрешения ведения учета нужно добавить фильтр af в записи varian, например, таким образом:

va|varian|Benson-Varian: \ :lp=/dev/va0:sd=/usr/spool/vad:of=/usr/lib/vpf: \ :if=/usr/lib/vpf:tf=/usr/lib/rvcat:af=/usr/adm/vaacct: \ :mx#2000:pl#58:px=2112:py=1700:tr=\f:


Note: В состав ЗОСРВ «Нейтрино» не входят фильтры печати. Эти фильтры нужно либо перенести из другой ОС типа UNIX, либо написать самостоятельно. Если вы не хотите это делать, то можно использовать систему спулинга, в которой имеются драйверы печати для конкретных семейств наиболее популярных принтеров. (cм. раздел, касающийся утилиты spooler)

Фильтры вызываются сервисом lpd. Стандартными входными данными для фильтров являются данные для печати, стандартным выходом — принтер. Стандартные сообщения об ошибках добавляются в файл lf, который является журналом ошибок (в качестве альтернативы можно использовать систему syslogd). При отсутствии ошибок фильтр должен возвращать код 0, при необходимости перепечатки — код 1, а при необходимости снятия задания на печать — код 2.

Когда утилита lprrm посылает сигнал SIGINT процессу lpd, который управляет печатью, сигнал SIGINT посылается всем фильтрам и их потомкам. Этот сигнал может перехватываться фильтрами, для которых необходимо выполнить операции очистки (например, удаление временных файлов).

Аргументы, передаваемые из программы lpd фильтру, зависят от типа фильтра:

Примеры содержимого файла /etc/printcap

В этом разделе приводится несколько примеров, показывающих, как задаются описания принтеров. См. также описание файла /etc/printcap.

USB принтер

При подключении USB-принтера к компьютеру и запуске USB стека и devu-prn, как было описано в разделе Устройства USB, необходимо, чтобы содержимое файла /etc/printcap было следующим:

hpps: \ :lp=/dev/usbpar0 :sd=/usr/spool/output/hpps

Данный файл устанавливает имя hpps для USB-принтера, идентифицирует файл для открытия /dev/usbpar0 (или любого другого устройства, созданного devu-prn), идентифицирует каталог спулинга /usr/spool/output/hpps.

Для доступа к принтеру необходимо установить lpr -Phpps или задать значение hpps переменной окружения PRINTER.


Note: Необходимо убедиться, что каталог спулинга существует.

Единственный разделяемый принтер

Пусть имеются два узла: node1 и node2, при этом в узле node1 имеется принтер, присоединенный к /dev/par1 (рис. 2).

Тогда файл /etc/printcap на узле node1 должен быть таким:

lpt1: \ :lp=/dev/par1:

14_2.png
Рисунок 2. Единственный принтер

В файле просто задается имя lpt1 для принтера, присоединенного к /dev/par1. Нет необходимости описывать что-нибудь еще, поскольку установки по умолчанию выполняют все необходимое. Для получения доступа к принтеру с узла node1 нужно выдать команду lpr -Plpt1 или установить для переменной окружения PRINTER значение lpt1.


Note: Убедитесь в том, что существует каталог спулинга и что для узла node2 в файле /etc/hosts.lpd имеется запись, указывающая на узел node1.

Файл /etc/printcap на узле node2 должен быть таким:

rlpt1: \ :rm=node1:rp=lpt1:lp=:

В этом файле определяется, что удаленному хосту с принтером, имеющим имя lpt1, соответствует узел node1. Имя локального принтера (rlpt1) используется локальными клиентами и может быть аналогичным имени удаленного принтера lpt1.

Следует проверить, что в файле /etc/hosts имеется запись для узла node1.

Несколько принтеров

Теперь добавим к узлу node1 другой принтер, на этот раз он подключается к /dev/par2 (рис. 3).

14_3.png
Рисунок 3. Несколько принтеров

Нужно быть внимательным при определении нескольких принтеров, поскольку предлагаемые по умолчанию параметры не подходят для всех принтеров. Например, используйте поле sd для задания каждому принтеру уникального каталога спулинга.

Файл /etc/printcap на узле node1 имеет следующее содержимое:

lpt1: \ :lp=/dev/par1:sd=/usr/spool/output/lpt1: lpt2: \ :lp=/dev/par2:sd=/usr/spool/output/lpt2:

В приведенном описании определяются следующие принтеры:

Проверьте, чтобы в файле /etc/hosts.lpd на узле node1 имелась запись для узла node2.

Для того чтобы обращаться в удаленном режиме к этим принтерам с узла node2, нужно на узле node2 в файле /etc/printcap создать такие записи:

lpt1: \ :rm=node1:rp=lpt1:sd=/usr/spool/output/lpt1:lp=: lpt2: \ :rm=node1:rp=lpt2:sd=/usr/spool/output/lpt2:lp=:

Таким образом, были определены два принтера, которые размещаются на узле node1 с именами, которые можно использовать на узле node2. Проверьте, чтобы в файле /etc/hosts имелась запись для узла node1.

Локальные и удаленные принтеры

Рассмотрим что нужно сделать, если мы захотим переместить один из двух принтеров (например, lpt2) с узла node1 на узел node2 (рис. 4).

14_4.png
Рисунок 4. Локальный и удаленный принтеры

На обоих узлах нужно изменить содержимое файла /etc/printcap. Аналогичным образом нужно изменить содержимое файла /etc/printcap на любом другом узле, с которого нужно производить печать. Конкретные изменения для каждого узла таковы:

Проверьте, чтобы на каждом узле в файле /etc/hosts имелись бы записи для узлов node1 и node2. Также необходимо проверить наличие записей на узлах node1 и node2 в файле /etc/hosts.lpd для каждого узла, с которого могут использоваться принтеры.

Если вы произведете настройки своей сети для выполнения удаленной печати в соответствии с приведенными примерами, то вы сможете послать файл, находящийся в каталоге /tmp/test на узле node2, на принтер, подключенный к узлу node1, с помощью такой команды:

lpr -h -Plpt1 /tmp/test

В этом случае происходит следующее.

  1. вы вводите команду lpr для выполнения печати файла на удаленном принтере;

  2. утилита lpr отправляет запрос службе печати;

  3. сервис lpd на узле node2 принимает запрос, создает копию своего процесса для обслуживания запроса на печать и создает подкаталог спулинга для хранения печатаемых файлов;

  4. порожденный процесс сервиса lpd помещает в спулер задание на печать в виде двух файлов: собственно печатаемый файл данных и заголовочный файл, содержащий информацию о задании на печать (она может быть отпечатана в виде отдельной титульной страницы);

  5. порожденный процесс сервиса lpd производит обработку заданий на печать, помещенных в спулер, в порядке их поступления и начинает передачу пакетов данных с заданиями на печать удаленному сервису lpd;

  6. сервис lpd на узле node1 принимает пакеты данных как запросы на печать, проверяет, от разрешенного ли узла поступил запрос, затем порождает копию своего процесса для обслуживания запроса и создает подкаталог спулинга для хранения печатаемых файлов (если запрос поступает от неразрешенного узла, то в адрес источника запроса отсылается сообщение об отказе);

  7. порожденный процесс сервиса lpd принимает пакеты данных, помещая в очередь спулера сформированное задание на печать, после чего задания на печать пересылаются на указанный принтер в порядке их поступления.

Удаленная печать на принтере, находящемся в другой сети

С помощью протокола TCP/IP и утилиты lpr можно выполнять печать файла на удаленном принтере, присоединенном к серверу другой сети. Нужно просто сделать соответствующую настройку сетевого узла ЗОСРВ «Нейтрино» для удаленной печати, а удаленный сервер настроить на работу по протоколу TCP/IP и на обработку принтеров, совместимых с требованиями утилиты lpr.

Например, пусть необходимо напечатать PostScript-файл /root/junk.ps с некоторого узла сети ЗОСРВ «Нейтрино», но единственный доступный PostScript-принтер (windows_printer) присоединен к серверу Windows с IP-адресом 10.2.1.8.

Вначале нужно убедиться, что Windows-сервер сконфигурирован для печати через протокол TCP/IP и что принтер совместим с утилитой lpr. После этого, войдя под учетной записью root с узла сети ЗОСРВ «Нейтрино», нужно выполнить следующие действия.

  1. добавьте в файл /etc/printcap описание принтера в следующем виде:

    rlpt4: \ :rm=windows_server:lp=:rp=windows_printer: \ :sd=/usr/spool/output/lpd/rlpt4:

  2. в файле /etc/hosts добавьте новую строку такого вида:

    10.2.1.8 windows_server

  3. создайте каталог спулинга:

    mkdir /usr/spool/output/lpd/rlpt4

  4. запустите утилиту lpd.

Для запуска печати PostScript-файла на принтере введите следующую команду:

lpr -Prlpt4 junk.ps

Удаленная печать на TCP/IP-принтере с использованием утилиты lpr

Принтер, имеющий возможность работать напрямую через протокол TCP/IP, для выполнения печати не требует подключения к какому-либо компьютеру. Все запросы принтер обрабатывает самостоятельно. Поэтому для работы с таким принтером необходимо проделать все те же шаги по настройке, что описаны выше, со следующими небольшими изменениями.

  1. в файле /etc/hosts узла, с которого будет производиться печать, нужно добавить запись с именем и IP-адресом удаленного принтера, например:

    10.2.0.4 tcpip_printer

  2. в файле /etc/printcap на том же узле нужно добавить запись с описанием принтера:

    rlpt2: \ :rm=tcpip_printer:rp=/ps:sd=/usr/spool/output/lpd/rlpt2:

В этом примере видно, что tcpip_printer используется в качестве имени удаленной машины (в данном случае роль машины выполняет непосредственно принтер), а каталог спулинга определен как /usr/spool/output/lpd/rlpt2. Обратите внимание на то, что удаленный принтер определен как /ps. В некоторых сетях это имя назначается принтерам, которые могут работать с файлами формата PostScript. Нужно отыскать то имя, которое необходимо для работы с принтером в требуемом формате. Для работы с разными форматами печатаемых файлов могут требоваться разные имена (например, для печати PostScript-файлов и обычных текстовых файлов).

Еще раз проверьте, что создан каталог спулинга. Следуйте процедуре, описанной в разделе "Локальные и удаленные принтеры" ранее в этой статье, и тогда вы сможете выполнить печать на удаленном принтере с помощью команды:

lpr -Prlpt2 /root/junk.ps

По этой команде PostScript-файл с именем /root/junk.ps посылается на принтер с именем tcpip_printer, имеющий IP-адрес 10.2.0.4.


Note: В приведенном примере мы выбрали простой вариант отправки PostScript-файла на PostScript-принтер. Это легко реализовать, поскольку форматирование встроено в текст PostScript-файла. Иногда может потребоваться фильтрация содержимого файла, отправленного для печати с помощью утилиты lpr. Для принтера можно определить фильтр посредством добавления соответствующей записи в файл /etc/printcap (более подробно об этом см. в разделе "Фильтры" ранее в этой статье).

Печать с помощью утилиты spooler

В качестве альтернативы стандартному механизму печати с использованием UNIX-подобного семейства программ lp* в ЗОСРВ «Нейтрино» служит утилита spooler. Она применяется в приложениях оконного окружения Photon для печати. Для преобразования выходного оконного окружения (draw-stream) оболочки Photon (phs) в формат, воспринимаемый принтером, используется специальный фильтр.

Настройка spooler

Утилита spooler обычно запускается программой распознавания устройств (enumerator) при старте ЗОСРВ «Нейтрино» (см. раздел Управление запуском ЗОСРВ «Нейтрино»). Утилита управляет работой одного принтера, однако можно запускать более одного экземпляра утилиты spooler.

После запуска утилиты spooler (вручную или на системном уровне) происходит следующее (рис. 5):

14_5.png
Рисунок 5. Печать с помощью утилиты spooler

В каталоге /etc/printers хранятся файлы общей конфигурации для наиболее часто используемых типов принтеров, в том числе перечисленные в таблице ниже.

Принтер Файл конфигурации Фильтр
Canon bjc.cfg phs-to-bjc
Epson epson.cfg phs-to-escp2
Epson IJS epijс.cfg phs-to-ijs
Hewlett-Packard pcl.cfg phs-to-pcl
PostScript ps.cfg phs-to-ps

Существует также специальный фильтр phs-to-bmp, с помощью которого файл оконного окружения оболочки Photon преобразуется в формат BMP. В файлах конфигурации определяются возможные установки принтера и установки по умолчанию, а также, какой из фильтров подходит для данного принтера.

Когда производится печать из приложения оболочки Photon, то файл для печати отправляется в каталог спулинга /dev/printers/имя_принтера/spool. Приложение оболочки Photon может построить другой файл конфигурации для выбранного принтера в зависимости от введенной дополнительной информации.

Если уже имеется файл, формат которого правильно воспринимается принтером или для которого существует фильтр, то печать можно производить путем копирования файла в каталог спулинга для необработанных данных:

cp мой_файл /dev/printers/имя_принтера/raw

Когда программа spooler обнаруживает задание на печать в каталоге /dev/printers/имя_принтера/raw, файл задания копируется в каталог спулинга /var/spool/printers/имя_принтера.хост, после чего запускается соответствующий фильтр, с помощью которого происходит подготовка файла и отправка его на принтер.

Обычно файл спулера для печати сохраняется в каталоге на диске, затем эта информация о местонахождении файла передается фильтру. Если нужно сэкономить дисковую память, то при вызове программы spooler можно использовать ключ -F для отключения буферизации файлов для печати в каталоге спулинга. При наличии этого ключа программа spooler посылает фрагменты печатаемого файла непосредственно в буфер FIFO для печати по частям. Фильтр получает эти данные из буфера FIFO, и после обработки происходит печать фрагмента. После освобождения буфера spooler загружает в буфер следующий фрагмент файла и т.д. до окончания печати всего файла.

Если в приложении оболочки Photon вызывается команда предварительного просмотра печати (print preview), то в этом случае файл отправляется для обработки утилитой preview. Если необходимо просмотреть очередь печати или выполнить управление ею, то нужно запустить из командной строки команду prjobs или из меню запуска (Launch) выбрать пункт меню UtilitiesPrint Manager.

Печать с использованием USB принтера

При подключении USB принтера к компьютеру и запуске USB-стека и devu-prn, как описано в подразделе «USB-устройство» раздела «Подключение оборудования», необходимо запустить дополнительно spooler для управления (например, в /etc/rc.d/rc.local).


Note: ЗОСРВ «Нейтрино» не может обнаруживать (детектировать) USB принтеры.

Для установки USB принтера необходимо выполнить следующее:

Удаленная печать по протоколу Qnet

Для печати через сеть Qnet необходимо отправить файл в каталог /net/имя_узла/dev/printers/имя_принтера/spool. Программа spooler для принтера должна быть запущена на узле с именем имя_узла.

Удаленная печать по протоколу TCP/IP

Для настройки печати с использованием программы spooler на удаленном принтере необходимо перенаправить задание на печать программе lpr. Такая возможность обеспечивается тем, что задание на печать пересылается на принтер фильтром. Поэтому необходимо просто указать имя удаленного принтера в командной строке фильтра в файле конфигурации, используемом программой spooler.

Для того чтобы освоить такую возможность, попробуйте сначала организовать работу удаленного принтера через программу lpr (см. раздел "Удаленная печать на TCP/IP-принтере с использованием утилиты lpr" ранее в этой статье). После этого выполните следующее.

  1. скопируйте файл конфигурации принтера, который вы хотите использовать (в данном случае это принтер PostScript):

    cp /etc/printers/ps.cfg /etc/printers/test.cfg

  2. в файле test.cfg найдите командную строку фильтра, которая выглядит приблизительно так:

    Filter = phs:$d:phs-to-ps Filter = raw:$d:cat

    Командные строки фильтра имеют формат:

    источник:приемник:фильтр

    Командная строка фильтра phs указывает фильтру обработать файлы с расширением .phs посредством фильтра с именем phs-to-ps прежде, чем отправить их по адресу назначения, указанному программой spooler. Команда фильтра raw предназначена для утилит, которые на выходе дают уже корректно форматированный для печати результат.

  3. измените командную строку фильтра phs с такого вида:

    Filter = phs:$d:phs-to-ps

    на такой:

    Filter = phs:ps:phs-to-ps

  4. добавьте строку такого вида, чтобы все PostScript-файлы после фильтра посылались на удаленный принтер rlpt2:

    Filter ps:$d:lpr -Prlpt2

    Эти действия приведут к изменению задаваемого спулером адреса назначения на значение ps, так что после преобразования .phs-файла фильтром phs-to-ps в формат ps файл будет отправлен на ps-фильтр. Благодаря добавленной строке ps-фильтра, файлы отправляются для обработки в программу lpr, в качестве ключа которой указано выполнение печати на удаленном принтере (точно такая же ситуация была описана в разделе "Удаленная печать на TCP/IP-принтере с использованием утилиты lpr" ранее в этой статье).

    Возможно, вам интересно узнать, что произошло с адресом назначения ($d), передаваемым программой spooler. Этот адрес отброшен, потому что программа lpr (в отличие от фильтра phs-to-ps) не возвращает задание фильтру, а сама завершает все необходимые действия.

  5. и наконец, запустите новый экземпляр программы spooler, указав в качестве параметра путь к вашему новому файлу конфигурации (в нашем случае /etc/printers/test.cfg) и имя необходимого принтера (в нашем случае rlpt2). Строка запуска будет выглядеть так:

    spooler -d /dev/null -с /etc/printers/test.cfg -n rlpt2 &

    С помощью ключа -n определяется имя принтера, которое появляется в диалоге печати приложения оболочки Photon.

  6. если вы хотите, чтобы программа spooler запускалась таким же образом при загрузке машины, то добавьте описанную выше команду в файл /etc/rс.d/rc.local. Более подробно об этом см. раздел Управление запуском ЗОСРВ «Нейтрино».

Теперь можно печатать PostScript-файлы на удаленном TCP/IP-принтере либо из приложений оболочки Photon, либо из командной строки.

Далее приводятся примеры файлов конфигурации для печати с использованием программ lpr, SAMBA и NCFTP.

Конфигурационные файлы для утилиты spooler

В данном разделе приводятся примеры конфигурационных файлов, которые используются для удаленной печати с помощью утилиты lpr и программного обеспечения SAMBA и NCFTP.


Note: Программное обеспечение SAMBA и NCFTP можно найти в архивных хранилищах сторонних разработчиков.

Использование утилиты lpr

PNPCMD=POSTSCRIPT #---------------------------------------------------------------------- # # Указанные далее макросы разворачиваются для строки команд фильтра: # $d — устройство (Device); # $m — id модели/производителя PnP; # $n — имя принтера; # $s — имя каталога спулера (Spooldir); # $$ — реальный символ $. # #---------------------------------------------------------------------- FileVersion = 2 # имя_принтера — это имя, которое вы задали в файле /etc/printcap. Filter = ps:$d:lpr -Pимя_принтера Filter = phs:ps:phs-to-ps Supported Resolution = 300 * 300, 600 * 600, 1200 * 1200 Supported PaperSize = 8500 * 11000 : Letter, 8500 * 14000 : Legal Supported Orientation = 0 : Portrait, 1 : Landscape Supported Intensity = 0 : Min, 100 : Max Supported InkType = 1 : "B&W", 3 : "Color (CMY)", 4 : "Color (CMYK)" Resolution = 600 * 600 PaperSize = 8500 * 11000 : Letter Orientation = 0 : Portrait Intensity = 50 InkType = 4 : "Color (CMYK)" NonPrintable = 500:Left, 500:Top, 500:Right, 500:Bottom #---------------------------------------------------------------------- if PNPID=HEWLETT-PACKARDHP_850DDE PNPSTR=MFG:HEWLETT-PACKARD;MDL:HP 8500;CLS:PRINTER;CMD:POSTSCRIPT; Supported PaperSize = 8500 * 11000 : Letter, 8500 * 14000 : Legal, 7250 * 10500 : Exec, 11000 * 17000 : B, 8262 * 11692 : A4, 5846 * 8262 : A5, 7000 * 9875 : B5, 11692 * 16524 : A3 #---------------------------------------------------------------------- if PNPID=HEWLETT-PACKARDHP_25A854 PNPSTR=MFG:HEWLETT-PACKARD;MDL:HP 2500C;CLS:PRINTER;CMD:PCL,MLC,PML,POSTSCRIPT; Supported PaperSize = 8500 * 11000 : Letter, 8500 * 14000 : Legal, 7250 * 10500 : Exec, 11000 * 17000 : B, 8262 * 11692 : A4, 5846 * 8262 : A5, 7000 * 9875 : B5, 11692 * 16524 : A3 #----------------------------------------------------------------------

Использование программного обеспечения NCFTP

PNPCMD=POSTSCRIPT #---------------------------------------------------------------------- # # Указанные далее макросы разворачиваются для строки команд фильтра: # $d — устройство; # $m — id модели/производителя PnP; # $n — имя принтера; # $s — имя каталога спулера (Spooldir); # $$ — реальный символ $. # #---------------------------------------------------------------------- FileVersion = 2 # x.x.x.x is the IP address of the printer # prt0 is the port used on the printer (in this case, port zero). Filter = ps:$d:ncftpput -V -E x.x.x.x /prt0 Filter = phs:ps:phs-to-ps Supported Resolution = 300 * 300, 600 * 600, 1200 * 1200 Supported PaperSize = 8500 * 11000 : Letter, 8500 * 14000 : Legal Supported Orientation = 0 : Portrait, 1 : Landscape Supported Intensity = 0 : Min, 100 : Max Supported InkType = 1 : "B&W", 3 : "Color (CMY)", 4 : "Color (CMYK)" Resolution = 600 * 600 PaperSize = 8500 * 11000 : Letter Orientation = 0 : Portrait Intensity = 50 InkType = 4 : "Color (CMYK)" NonPrintable = 500:Left, 500:Top, 500:Right, 500:Bottom #---------------------------------------------------------------------- if PNPID=HEWLETT-PACKARDHP_850DDE PNPSTR=MFG:HEWLETT-PACKARD;MDL:HP 8500;CLS:PRINTER;CMD:POSTSCRIPT; Supported PaperSize = 8500 * 11000 : Letter, 8500 * 14000 : Legal, 7250 * 10500 : Exec, 11000 * 17000 : B, 8262 * 11692 : A4, 5846 * 8262 : A5, 7000 * 9875 : B5, 11692 * 16524 : A3 #---------------------------------------------------------------------- if PNPID=HEWLETT-PACKARDHP_25A854 PNPSTR=MFG:HEWLETT-PACKARD;MDL:HP 2500C;CLS:PRINTER;CMD:PCL,MLC,PML,POSTSCRIPT; Supported PaperSize = 8500 * 11000 : Letter, 8500 * 14000 : Legal, 7250 * 10500 : Exec, 11000 * 17000 : B, 8262 * 11692 : A4, 5846 * 8262 : A5, 7000 * 9875 : B5, 11692 * 16524 : A3 #----------------------------------------------------------------------

Использование программного обеспечения SAMBA

PNPCMD=POSTSCRIPT #---------------------------------------------------------------------- # # Указанные далее макросы разворачиваются для строки команд фильтра: # $d — устройство (Device); # $m — id модели/производителя PnP; # $n — имя принтера; # $s — имя каталога спулера (Spooldir); # $$ — реальный символ $. # #---------------------------------------------------------------------- FileVersion = 2 # Для получения доступа к разделяемому принтеру SAMBA нужно, чтобы # для smbspool была бы установлена переменная окружения DEVICE_URI. # # Формат для команды smb, используемый с smbspool, # который определяется в DEVICE_URI # Если не требуется имя пользователя и пароль: # — DEVICE_URI = "smb://сервер/принтер" # — DEVICE_URI = "smb://рабочая_группа/сервер/принтер" # Если требуется имя пользователя и пароль: # — DEVICE_URI = "smb://имя_пользователя:пароль@сервер/принтер" # — DEVICE_URI = # "smb://имя_пользователя:пароль@рабочая_группа/сервер/принтер" # # где имя_пользователя = имя пользователя в SAMBA # пароль = пароль в SAMBA # рабочая_группа = рабочая группа в SAMBA # сервер = имя сервера в SAMBA # принтер= имя разделяемого принтера в SAMBA # # Использование переменной окружения DEVICE_URI дает возможность # сделать так, чтобы для smbspool происходил автоматический поиск # значения, если оно не включено в командную строку. # Filter = ps:$d:smbspool 1 NULL none 1 1 Filter = phs:ps:phs-to-ps Supported Resolution = 300 * 300, 600 * 600, 1200 * 1200 Supported PaperSize = 8500 * 11000 : Letter, 8500 * 14000 : Legal Supported Orientation = 0 : Portrait, 1 : Landscape Supported Intensity = 0 : Min, 100 : Max Supported InkType = 1 : "B&W", 3 : "Color (CMY)", 4 : "Color (CMYK)" Resolution = 600 * 600 PaperSize = 8500 * 11000 : Letter Orientation = 0 : Portrait Intensity = 50 InkType = 4 : "Color (CMYK)" NonPrintable = 500:Left, 500:Top, 500:Right, 500:Bottom #---------------------------------------------------------------------- if PNPID=HEWLETT-PACKARDHP_850DDE PNPSTR=MFG:HEWLETT-PACKARD;MDL:HP 8500;CLS:PRINTER;CMD:POSTSCRIPT; Supported PaperSize = 8500 * 11000 : Letter, 8500 * 14000 : Legal, 7250 * 10500 : Exec, 11000 * 17000 : B, 8262 * 11692 : A4, 5846 * 8262 : A5, 7000 * 9875 : B5, 11692 * 16524 : A3 #---------------------------------------------------------------------- if PNPID=HEWLETT-PACKARDHP_25A854 PNPSTR=MFG:HEWLETT-PACKARD;MDL:HP 2500C;CLS:PRINTER;CMD:PCL,MLC,PML,POSTSCRIPT; Supported PaperSize = 8500 * 11000 : Letter, 8500 * 14000 : Legal, 7250 * 10500 : Exec, 11000 * 17000 : B, 8262 * 11692 : A4, 5846 * 8262 : A5, 7000 * 9875 : B5, 11692 * 16524 : A3 #----------------------------------------------------------------------

Устранение неполадок

Далее приводятся способы решения типовых проблем, с которыми может столкнуться потребитель.

Сообщения об ошибках в программах семейства lpr

Приводимые далее описания сообщений об ошибках, генерируемые утилитами печати семейства lp*, помогут вам в разрешении возникающих в процессе печати проблем.

Сообщения об ошибках утилиты lpr

lpr: имя_файла: copyfile is too large
Отправленный на печать файл имеет больший размер, чем заданный максимальный размер файла для принтера. Этот размер определен параметром mx в соответствующей записи файла /etc/printcap.
lpr: принтер: unknown printer
Неизвестный принтер. Принтер не найден в базе данных /etc/printcap, возможно, из-за пропущенной или неправильной записи.
lpr: принтер: jobs queued, but cannot start daemon
Задание поставлено в очередь, но невозможно запустить сервис. Не удалось подключиться к сервису lpd на локальной машине, возможно, из-за зависания сервера принтера или из-за отсутствия ответа от сервера. Суперпользователь может перезапустить сервис lpd с помощью команды:

/usr/bin/lpd

Проверить состояние сервиса главного принтера можно с помощью команды:

sin -P lpd

Если пользователь утилиты lpr не является root, а идентификатор группы не относится к категории daemon, то проверку можно выполнить с помощью команды:

ls -lg /usr/bin/lpr
lpr: принтер: printer queue is disabled
Отключена работа очереди принтера. Данное сообщение означает, что работа очереди была отключена командой lprc disable (см. раздел "lprc — программа управления принтером" ранее в этой статье), чтобы программа lpr не могла помещать файлы в очередь. Обычно такая операция выполняется перед тем, как принтер отключается на длительное время. Суперпользователь может снова включить принтер с помощью утилиты lprc.

Сообщения об ошибках утилиты lprq

waiting for printer to become ready (offline?)
Ожидание готовности принтера. Сервис не может открыть печатающее устройство. Это может быть вызвано несколькими причинами (например, принтер отключен, кончилась или замята бумага). Конкретная причина выясняется по значению кода ошибки, возвращаемого системным драйвером принтера. Некоторые принтеры не могут передать информацию, позволяющую определить точную причину проблемы (отключен принтер или произошел другой отказ). Это особенно свойственно принтерам, подключаемым через последовательный порт.

Другой возможной причиной появления такого сообщения является то, что устройство было открыто в эксклюзивном режиме каким-то другим процессом, например, выходным фильтром. Все что можно сделать в этом случае — аварийно завершить мешающую программу и перезапустить принтер с помощью утилиты lprc.
printer is ready and printing
Принтер готов и печатает. Программа lprq проверяет, существует ли процесс сервиса для принтера, и выдает текущий статус файла, находящегося в каталоге спулинга. Если сервис не отвечает, то пользователь с учетной записью root может воспользоваться программой lprc для аварийного завершения текущего сервиса и для запуска его нового экземпляра.
waiting for host to come up
Ожидание появления хоста. Это означает, что сервис пытается соединиться с удаленной машиной host для того, чтобы послать файлы из локальной очереди. Если удаленная машина работает, то, вероятнее всего, что зависла или заблокирована программа lpd на удаленной машине. В этом случае ее нужно перезапустить.
sending to host
Отправка файлов хосту. Файлы в настоящий момент отправляются на удаленный хост. Если этого не происходит, то пользователь с учетной записью root должен воспользоваться программой lprc для аварийного завершения и перезапуска локального сервиса.
Warning: printer is down
Предупреждение: принтер отключен. Данный принтер был помечен программой lprc как недоступный.
Warning: no daemon present
Предупреждение: отсутствует сервис. Процесс lpd (сервис), заданный в файле блокировки данного каталога и следящий за очередью спулера, не существует. Обычно такое происходит при неожиданной блокировке сервиса. Для диагностики проблемы проверьте записи в журнальном файле с сообщениями об ошибках для данного принтера и в системном журнальном файле syslog. Для перезапуска сервиса lpd введите команду:

lprc restart printer
no space on remote; waiting for queue to drain
Нет свободного места на удаленной машине; ожидание очистки очереди. Это сообщение означает, что недостаточно места на диске удаленной машины. Если файл имеет достаточно большой размер, то на удаленной машине всегда будет не хватать места (даже после освобождения очереди). Решением проблемы является перемещение очереди спулера или освобождение дискового пространства на удаленной машине.

Сообщение об ошибках утилиты lprrm

lprrm: принтер: cannot restart printer daemon
Невозможно перезапустить сервис принтера. Этот случай аналогичен ситуации, когда от программы lpr поступает сообщение о невозможности запуска сервиса.

Сообщения об ошибках утилиты lprc

couldn't start printer
Невозможно запустить принтер. Этот случай аналогичен ситуации, когда от программы lpr поступает сообщение о невозможности запуска сервиса.
cannot examine spool directory Невозможно проверить каталог спулинга. Ошибочные сообщения, начинающиеся со слова cannot (невозможно), обычно являются следствием неправильных прав доступа или режима защиты в отношении файла блокировки, каталога спулинга или программы lprc.

Сообщения об ошибках утилиты lpd

При работе утилиты lpd может выдаваться много различных сообщений, которые поступают в системный журнал программы syslogd. Большинство сообщений касаются файлов, которые нельзя открыть. Обычно это означает, что есть некорректности в файле /etc/printcap или в режимах защиты других файлов. Файлы могут быть недоступны, если к ним обращаются иными средствами (а не с помощью программы lpr).

В дополнение к сообщениям, генерируемым программой lpd, любой из фильтров, порождаемых lpd, может посылать сообщения в системный журнальный файл программы syslogd или в журнальный файл для сообщений об ошибках (файл, определенный в записи lf файла /etc/printcap). Если вы хотите диагностировать проблему, запустите программу syslogd.

Устранение неисправностей при удаленной печати

Если не работает печать отправленного файла, то вы можете получить сообщение об ошибке от одной из утилит семейства lp*. Если же не появляется никаких сообщений об ошибках, то можно попробовать применить приводимые ниже действия.




Предыдущий раздел: перейти