Печать в Linux с железными нервами
Yuri N. Looshnya
December 2000
Часть 1
В первой части данной статьи мы поговорим об
обеспечении доступа к локальному принтеру
(установленному на Linux) всем Linux-пользователям,
т.е. совместное использование принтера в среде
Linux. Во второй части речь пойдет о доступе
к Linux-принтеру в Windows-среде.
Я очень надеюсь на то, что вы уже успешно установили,
по крайней мере, один принтер на вашей
Linux-системе и что он работает нормально.
Если вы этого не сделали, то почему бы это не
сделать сейчас? Большинство "сегодняшних"
Linux-дистрибутивов поставляется с
прекрасными дружественными утилитами для
конфигурирования принтера (к примеру,
printtool, которая поставляется с
Red Hat Linux,
а также с совместимыми/базирующимися с/на этим/этом
дистрибутивом/дистрибутиве).
Если вы используете релиз Linux'а, в котором
нет такой утилиты, то изучите документацию,
которая специфична для вашего дистрибутива
в поисках того, как установить принтер
на вашу систему.
Введение в lpd [Line Printer Daemon]
Хотя многие дистрибутивы предлагают альтернативные
принтер-интерфейсы, но наиболее распространенным
все же является
lpd [Line Printer Daemon].
Он был получен из
Berkeley Software Distribution
[BSD] демона с таким же названием.
lpd ждет, пока понадобятся услуги
принтер-сервисов. Когда посылаются запросы на
принтер-сервис, lpd приводится в действие.
Он записывает выходной файл печати во временную область
/var/spool/lpd. Затем он посылает эти пакеты
на указанный принтер в печать. Если lpd принимает
дополнительные запросы на печать прежде, чем
закончена печать предыдущего пакета, тогда он
создает очередь печати, список файлов,
которые ожидают своей очереди.
Так как различные принтеры имеют
различные характеристики, возникает вполне
естественный вопрос: как lpd узнает, как
печатать тот или иной файл? Ответ находится
в
/etc/printcap, конфигурационном файле lpd.
В этом файле вы найдете одну или несколько строк,
которые являются блоками конфигурации.
Каждая строка определяет специфичность принтера
и обеспечивает следующую информацию: как принтер
связан с компьютером, какой фильтр должен
использоваться и т.д. Использование фильтра
зависит от той или иной марки (модели)
принтера. Фильтр определяет характеристики
и возможности принтера.
Помните, что lpd - это сетевой сервис.
Этот факт остается фактом даже если вы используете
Linux как автономное, однопользовательское
автоматизированное рабочее место.
Когда приложение нуждается в lpd-услугах, оно
направляет запрос через TCP/IP. Таким образом,
если локальное приложение может запрашивать услуги
от локальной копии lpd, то любое другое приложение
в сети может делать то же самое. Если вы
сконфигурируете сервер и клиентов правильно,
сетевой "принтинг" станет полностью
прозрачным для пользователя.
Создание локального принтера, доступного для
сетевого использования
Прежде, чем мы продолжим, я разъясню вам некоторые
термины, которые будут использоваться в дальнейшем.
Термин
сервер относится к Linux-системе, на
которой будет установлен принтер. Термин
клиент
будет относится к ПК, который будет иметь
доступ к принтеру по сети. К примеру,
в сети из четырех машин (название машин:
elk, serg, ika, hotbird)
elk - это машина,
на которой установлен принтер. Следовательно,
elk - это сервер. ika, serg и hotbird будут
иметь доступ к сетевому принтеру и смогут
печатать на него (они клиенты).
Чтобы сделать локальный принтер доступным
для сетевого использования, следуйте
ниже перечисленным указаниям:
На сервере вы должны создать
учетные записи
[user accounts] для всех пользователей,
которые будут иметь доступ к принтеру. Также
необходимо создать конфигурационный файл
/etc/hosts.lpd. Этот файл будет содержать
аллиасы или IP-адреса всех рабочих станций,
которым будет доступен принтер.
На каждой клиентской машине вам нужно будет
добавить строку в
/etc/printcap, которая будет
определять характеристики принтера и указывать,
где расположен принтер. Для этого вы можете
использовать утилиту, которая поставляется
с вашим дистрибутивом специально для конфигурирования
принтера/принтеров (это может быть уже упомянутая выше
утилита
printtool) или же прописать эти строки
на всех машинах вручную (что мало привлекательно,
но если вы "заядлый клавишник", тогда...).
Шаг 1. Подготовка принт-сервера для
сетевого доступа
Сначала уделим пристальное внимание компьютеру,
на котором установлен принтер,
т.е. ПК с именем elk (далее принт-сервер).
Чтобы продолжать наше путешествие по принтингу,
удостоверьтесь, что принтер работает нормально
с машины, на которой он установлен (в данном случае
elk). Теперь удостоверьтесь, что каждый пользователь,
который впоследствии будет коннектиться к принтеру,
имеет учетную запись на принт-сервере.
Если вы планируете использовать
NFS [Network
File System], удостоверьтесь, что аккаунты
(учетные записи) имеют:
имя пользователя,
универсальный идентификатор пользователя [UID],
primary group membership и primary group numerical
[GID]
Войдите на принт-сервер как суперпользователь [root] и откройте
текстовый редактор (какой вам больше нравится, мне, например,
Vi). Создайте новый файл. В этом файле наберите
аллиасы всех машин, которые будут иметь доступ к
принтеру. Например, если вы создаете файл
на машине
elk и хотите дать доступ к принтеру пользователям
ika, serg и hotbird, тогда в этом файле
следует сделать такую запись:
ika
serg
hotbird
Чтобы использовать эти учетные записи, все машины
в вашей сети должны иметь
/etc/hosts-файлы,
которые перечисляют эти аллиасы и их
соответствующие IP-адреса, а также
доменные имена:
192.168.1.10elk.mydomain.netelk
192.168.1.11ika.mydomain.netika
192.168.1.12serg.mydomain.netserg
192.168.1.13hotbird.mydomain.nethotbird
Если вы не установили ваши
/etc/hosts-файлы таким
образом, вы можете использовать просто IP-адреса
для каждой клиента вместо аллиасов:
192.168.1.11
192.168.1.12
192.168.1.13
Теперь можно сохранить этот файл и выйти из
текстового редактора.
Примечание автора
В некоторой "древней" документации по данного
класса проблемах, вы могли натолкнуться на
то, что надлежащий конфигурационный файл
называется
/etc/hosts.equiv.
НЕ_СОЗДАВАЙТЕ_И_НЕ_ИСПОЛЬЗУЙТЕ_ФАЙЛ_С_ТАКИМ_ИМЕНЕМ!
Это очень большая дырка в безопасности вашей
системы. В основном, в
/etc/hosts.equiv перечисляются
машины, которые должны иметь полностью неограниченный доступ
к серверу. Предоставление такого доступа
НЕ_ОЧЕНЬ_ХОРОШАЯ_ИДЕЯ,
даже на маленькой сети, где каждый доверяет друг
другу, и кто-то вряд ли станет вредить друг другу.
Но бывают ведь и несчастные случаи... В больших сетях,
особенно там, где есть доступ в Internet, использование
/etc/hosts.equiv - это открытое приглашение
к бедствию.
Вместо этого, используйте
hosts.lpd,
который был разработан для конфигурирования доступа
к сетевому принтеру, но не влечет за собой таких
"рисковых зарисовок", которым вы можете быть
подвергнуты при использовании
hosts.equiv.
Шаг 2. Установка клиентов
Вы должны знать, как с помощью конфигурационной
утилиты для установки принтера установить
его, а также открыть доступ к нему для
клиентских машин. Если вы используете Red Hat
или Red Hat-совместимую систему, лучшим
решением для этого будет
printtool. Другие
дистрибутивы предлагают также альтернативу
printtool'у. Хотя данная статья и расчитана
на использование именно утилиты printtool,
вам вряд ли будет (после ее прочтения) тяжело
разобраться и с другими утилитами подобного
рода (если вы столкнетесь с какими-либо проблемами
при использовании других утилит, рекомендую вам
почитать документацию, которая обязательно должна
идти вместе с утилитой/утилитами на вашем дистрибутиве).
Войдите в систему как
root и запустите конфигурационную
утилиту для принтера. При использовании printtool
наберите
/usr/sbin/printtool [ENTER]
Вы увидите
Red Hat Linux Print System Manager.
Кликните на
Add, чтобы создать новую конфигурацию
для принтера. Дальше вы увидите диалоговое окно
Printer Entry. Щелкните на
Remove Unix (lpd) Queue
и дальше на
ОК. Вы увидите диалоговое окно
Edit Remove Unix (lpd) Queue Entry.
В поле
Names наберите одно или несколько имен
для принтера, разделяя при этом их вертикальными
линиями (|). Если используемая вами утилита
предложила имя для принтера, вы можете использовать его.
В области
Spool примите предложенное имя директории.
Обратите внимание на то, что каждый клиент будет
иметь свой локальный принт-spool для удаленного принтера.
В поле
Remote Host наберите IP-адрес компьютера,
к которому присоединен принтер.
В поле
Remote Queue наберите
имя очереди для
сетевого принтера (remote printer's queue).
Если только один принтер имеется в сети,
наберите
lp. Если в файле
/etc/printcap
содержится больше чем один принтер, тогда откройте этот
файл и определите названия запросов для принтеров
(типа lp0, lp1, lp2).
Нажмите
Input Filter и выберите марку (модель)
принтера из предложенного списка. Если вашего принтера
нет в списке, но он работает с PostScript'ом,
выберите
PostScript Printer. Нажмите
OK для
выхода из списка принтеров.
Нажмите
ОК чтобы подтвердить установки для
сетевого принтера, которые будут сохранены
в новых строках, добавленных в файл
/etc/printcap. Если вы используете не
Red Hat'овскую утилиту printtool, то удостовертесь,
что внесенные вами изменения сохранены.
Кликните
Tests в меню и выберите
Print PostScript
(данное деяние распечатает тестовую страницу).
Что делать, если принтер не работает?
Сначала убедитесь, что принтер правильно работает
на принт-сервере (и работает ли вообще?).
Затем перепроверьте вашу работу с
/etc/hosts.lpd
(смотрите Шаг 1). Правильно ли вы ввели название
машины, на котором установлен принт-сервер,
его IP-адрес? Проверьте установки на клиентской
машине. Чтобы печатать на сетевой принтер,
учетные записи на машине-клиенте и на принт-сервере
должны быть идентичными. Если есть какие-то
несоответствия в этих записях, устраните их.
Для изменения информации об учетной записи
того или иного пользователя, используйте прекрасную утилиту
LinuxConf.
Теперь повторите вышеупомянутые шаги на всех
клиентских машинах в вашей сети. Если вы сталкиваетесь
с проблемами печати от одного из клиентов,
то, как правило, ошибки кроются в учетной
записи пользователя на сервере или в файле
/etc/hosts.lpd.
Конкретное рассмотрение /etc/printcap
Если вы хотите узнать больше о том, как выполняется
печать на сетевой принтер при помощи lpd,
обратите внимание на строку, которую
создала конфигурационная утилита printtool.
Вряд ли стоит ее изменять, тем более в том случае,
если вы не знаете, что делаете. Некоторые из
конфигурационных утилит для принтера (в частности
printtool) имеют особенные, собственные правила
синтаксиса, и ваш принтер может не работать,
если вы вручную делаете изменения и нарушаете
эти правила. Если вам хочется кое-что изменить
в конфигурации вашего принтера, запустите эту
утилиту снова. Ниже приводится пример записи
в
/etc/printcap, при котором печать с клиентской машины
на сетевой принтер проходит успешно:
lp|elk|deskjet:\
:sd=/var/spool/lpd/lp:\
:mx=#0:\
:sh:\
:rm=192.168.100.34:\
:rp=lp:\
:if=/var/spool/lpd/lp/filter:
Это не место для диссертации по структуре
/etc/printcap, но есть все же некоторые моменты,
на которых я бы хотел остановить свое внимание.
Строка должна быть выражена на одиночной линии,
иначе они будут практически нечитабельны.
Вы можете разбивать строки, вставляя слэши влево
\.
Если принтер не работает, удостоверьтесь
в правильности слэшей. Все они должны иметь
левый наклон (кроме, конечно, последней строки).
Двоеточия разграничивают различные части строк
Первая строка содержит название принтера
и обеспечивает аллиасы в списке, которые отделены
вертикальной линией
Некоторые переменные
yes/no, on/off - булевы
переменные. Они включены автоматически, если
присутствуют в файле
Другие переменные есть переменными назначения
и требуют знаков
"=" (например, sd=/var/spool/lpd/lp).
Другие переменные - числовые - требуют
наличия числового оператора
(#), так как
в
mx=#0
Принтер, который назван lp - принтер по умолчанию.
Дополнительные принтеры будут иметь
имена
lp0, lp1, lp2 ...
Переменная
sd определяет месторасположение
директории для принт-spool'а. Хотя строка и
обращается к сетевому принтеру, spool расположен
на локальной территории
(/var/spool/lpd/lp)
Переменная
mx определяет максимально допустимый
размер (в блоках) файла, который может быть
напечатан. Чтобы не делать никаких ограничений
для файлов разных размеров, используйте
mx=#0
Переменная
sh (если присутствует) подавляет
печать заголовков. Заголовок указывает имя задания
и источник распечатки. Если вы конфигурируете
принтер для использования в большой сети,
вам может пригодиться данная переменная.
Переменная
rm определяет местоположение сетевого
принтера. Вы можете использовать аллиас
(типа
elk) или IP-адрес
(типа 192.168.1.10)
Переменная rp определяет имя очереди сетевого
принтера. Здесь нужно установить ту переменную,
которая установлена на принт-сервере в
файле
/etc/printcap. Если на принт-сервере в
этом файле переменная установлена под именем
lp0, тогда на клиентской нужно установить
идентичное название для нее (переменной).
Переменная
if определяет месторасположение
фильтра принтера, который будет использоваться
в рассматриваемом принтере.
Заключение
В следующей части данной серии мы поговорим
о доступе к сетевому Линукс-принтеру
из Windows-среды. Для этого вам понадобиться
(хорошо документированный, кстати) пакет Самба.
Часть 2
В первой части мы познакомились
с работой принтера под управлением
Linux'а. В этой части мы узнаем,
как сделать доступной печать
из Linux'а для Windows-ПК (Windows 95/98/NT/2000).
Итак, предполагается, что вы успешно
установили и сконфигурировали Samb'у.
Если нет, тогда рекомендую вам прочитать
SAMBA-HOWTO а также
man samba.
Конфигурирование Самбы для совместного
использования локальных принтеров
Чтобы продолжить, удостовертесь, что
Samba запущена правильно, т.е. Windows-
пользователи могут видеть Samba-сервер,
а также свои домашине директории на
Linux-сервере в сетевом окружении
(Network Neighborhood). Дальше я расскажу
как модифицировать
/etc/smb.conf так,
чтобы Windows-пользователи могли видеть
принтер, который установлен ("приаттачен")
на Samba-сервере.
Перед началом модификации (изменения)
/etc/smb.conf
удостоверьтесь, что ваш принтер правильно работает
под Linux (извините за повторение, но
это немаловажное условие для продолжения
нашего путешествия по принтингу).
Все работает нормально? Продолжаем.
Проинсталлируйте этот же принтер на Windows-ПК.
Для этого вам понадобится инсталляционный диск
с программным обеспечением для принтера под
Windows. Если у вас его нет - не впадайте в панику.
Windows предложит вам "родную" поддержку
для многих принтеров, так что вы можете
избежать проблемы неимения инсталляционного диска.
Для установки принтера кликните на
Start>Printers>
двойной клик на Add Printer.
В появившемся окне
Add Printer-мастера следуйте
появляющимся на экране подсказкам и инструкциям
до тех пор, пока не появится окно, где вам предложат
набрать имя для нового принтера.
Внимание: запишите точное название принтера,
при этом не забывайте о регистре букв.
Для примера,
принтер марки Epson Stylus 740 в Windows будет прописан как
EPSON Stylus COLOR 740.
После окончания инсталляции перезагрузите
Windows. На Samba-сервер залогинтесь как
root, вызoвите текстовый редактор
и откройте
/etc/smb.conf. В секции
[global]
найдите линию, которая начинается с
printcap name
Если Вы хотите сделать все локальные принтеры доступными пользователям Windows,
расскоментируйте эту линию и следующую или добавьте их в этот файл если
их там нет:
printcap name = /etc/printcap
load printers = yes
Ну а если вы хотите сделать доступными не_все_принтеры,
тогда не стоит снимать знак #
с вышеперечисленных строк (или добавлять их).
Обратите внимание, что Samba предполагает,
что вы используете заданную по умолчанию систему печати
на большинстве Linux-систем, которая получена из BSD.
Если вы используете разные системы печати, тогда
измените настройки по умолчанию. Для этого
нужно найти строку, которая начинается с
printing и изменить установленную вашим
Linux-дистрибутивом по умолчанию систему печати BSD.
Здесь есть из чего выбрать -
sysv, plp, lprng, aix, hpux, и qnx.
Если вы не уверены, какую из этих
систем печати использует ваш дистрибутив,
рекомендую вам почитать документацию
[Printing-Howto, etc.] - но в большинстве случаев
это все-таки
bsd.
Теперь переходим к более конкретным действиям.
Для того чтобы все локальные принтеры были доступны,
т.е. все принтеры, которые перечислены в
/etc/printcap добавляем в сервис
[printers]
файла
/etc/smb.conf нижеприведенные строки:
[printers]
writable = no
path = /tmp
printable = yes
Чтобы сделать доступ только к одному из
локальных принтеров, добавим строку
auto services в секцию
[global]
файла
/etc/smb.conf. Эта строка определяет
имя принтера, как указано в
/etc/printcap.
Только указанный принтер в
/etc/printcap
будет доступен пользователям посредством
сети. Нижеприведенная строка сделает
принтер, установленный по умолчанию
(lp) доступным другим пользователям:
auto services = lp
Также необходимо дать определение
принтеру.
Для этого в секцию
[services]
файла
/etc/smb.conf (в конец секции)
добавьте следующие строки:
[lp]
printable = yes
comment = Epson Stylus (Color)
public = yes
writable = no
browseable = yes
printer driver=EPSON Stylus COLOR 740
Вышезаписанные строки определяют принтер (lp).
Это название (имя) должно соответствовать названию (имени),
которое мы записали в строку
auto services,
и это должно также соответствовать названию (имени)
принтера как определено в
/etc/printcap. Обратите внимание,
что строка, где нужно ввести (выбрать) название драйвера принтера
требует, чтобы Вы ввели информацию принтера ТОЧНО,
т.е. так, как это сделано в Windows
(здесь,
EPSON Stylus COLOR 740, и не забывайте
о регистре букв).
Теперь можно сохранить
/etc/smb.conf, выйти из
текстового эдитора и перезапустить Samba.
Это можно сделать с помощью строки:
/etc/init.d/rc.d/smb restart [ENTER]
Проверка правильности инсталляции
Теперь проверим правильность инсталляции
нашего принтера. Для этого нужно войти в
сеть на Windows-ПК (с именем пользователя
и паролем, который администратор прописал).
Затем кликните дважды на
сетевом окружении
[Network Neighborhood] и посмотрите виден ли
Samba-принтер. Если у вас все правильно настроено,
то, естественно, принтер будет виден. Если же нет,
тогда рекомендую вам почитать
Printing-HOWTO,
SMB-HOWTO и другую литературу на эту тему (бывает, что принтер
не виден или не работает из-за специфических проблем,
описание которых выходит за рамки данной статьи).
Когда вы кликните правой клавишей мыши
на принтере и выберете
Install, вы увидите
диалоговое окно установки принтера
[Printer Setup].
Поскольку название (имя) принтера определено в пути
так, как его понимает Windows
(EPSON Stylus COLOR 740),
то вам не придется путешествовать по длинному списку
марок принтеров и моделей, чтобы начать инсталляционный процесс.
Однако, вам еще может понадобиться
инсталляционный диск с программным обеспечением
для принтера (как правило, такие диски
поставляются совместно с принтером), если ваш
принтер уж очень древний и его нет в списке
поддерживаемых принтеров Windows.
Расположение драйвера принтера
Опция Samb'ы под названием
printer
driver location
позволяет вам определить месторасположение
программного драйвера принтера.
Хотя и возможно использовать данную опцию принтера
и связанные файлы от общедоступного каталога Linux,
эта опция не работает с многими драйверами принтеров,
и Вы можете
нарушать лицензию издателя,
делая программное обеспечение, доступное по сети.
Поиск неисправностей: проблемы при печати
Если принтер работает нормально из под Linux'а (локально),
но не доступен другим пользователям посредством
Samb'ы, тогда залогинтесь как
root и с помощью любого
текстового редактора откройте
/etc/smb.conf.
Тщательно проверьте все записи в этом файле.
Запустите
testparm /etc/smb.conf и изучите
ошибки, которые будут выведены на экран. Убедитесь,
что
/dev/null перезаписываем всеми пользователями
(сделать это можно с помощью команды
ls -l /dev/null. Затем
посмотрите на правильность записи доступа для пользователей).
Samba использует
/dev/null чтобы отказать от ненужного
вывода на печать. Если доступ устроен так, что
/dev/null не перезаписываем всеми пользователями
(у него отсутствуют права на
writable), тогда как root
наберите:
chmod a+w /dev/null [ENTER]
Если ваш PostScript-принтер вместо графики выдает
"не_совсем_графику", тогда в
/etc/smb.conf добавьте строку
postscript = yes
Данная статья является предверием FAQ'a по Samb'е (более подробно
читайте на LinuxRSP). Сам FAQ увидит свет, я надеюсь, к концу этого года.
В присланных мне письмах "борцов с Samb'ой" очень много вопросов
возникает при подключении принтера в среде Linux так, чтобы
на него могли выполнять печать Windows-пользователи.
Именно поэтому я решил уделить данной теме отдельный материал.