Иван Коробко
Оптимизация сетевой печати
Любой сервер печати должен обеспечивать быструю и надежную печать. Для достижения поставленной цели займемся оптимизацией драйверов.
В крупных сетях используются так называемые серверы печати (print server), которые представляют собой компьютеры под управлением операционной системы семейства Windows Server 2K, на которых установлено до нескольких десятков принтеров.
Во время настройки таких серверов системные администраторы испытывают проблемы, связанные с неустойчивой работой драйверов. Большинство администраторов решает эту проблему подбором стабильно работающего драйвера с удовлетворительной производительностью.
Многочисленные эксперименты показали, что на стабильность работы драйвера сильно влияет его графическое оформление: в inf-файле, отвечающем за установку драйвера, осуществляется установка дополнительных компонентов. Удалив из INF-файла все лишнее, можно получить стабильно работающий драйвер, причем без потери функционала, например, возможности двухсторонней печати при ее аппаратной поддержке.
Объединение множества inf-файлов в один дает возможность объединить несколько драйверов в один – универсальный.
PS или PCL
В настоящее время активно используется два типа драйверов:
- PCL (Printer Command Language) – разработан компанией HP.
- PS (Post Script) – создан Джоном Уорноком и Чаком Гешке из Adobe в начале 80-х годов.
Кроме того, PS выгодно отличается от PCL следующим:
- увеличение скорости и надежности печати;
- поддержка большого количества шрифтов разных типов;
- кэширование шрифтов и изображения;
- поддержка цветоделения в самом контроллере;
- получение высокого качества печати при использовании векторной графики и векторных шрифтов.
Основным недостатком PS-драйверов является необходимость их аппаратной поддержки печатающим устройством, что сказывается на цене принтера.
Эмуляция PS – не самый лучший выход, поскольку значительно падает скорость печати. Однако большинство лазерных принтеров, например HP1200, поддерживают PS.
PPD-файл
PPD-файл (см. рис. 1) представляет собой текстовый файл, который можно открыть обычным блокнотом (notepad.exe). Этот файл является, если так можно выразиться, переводчиком, который делает понятным для принтера язык PostScript.
Рисунок 1. PPD-файлы
Во время установки драйверов PPD-файлы копируются в папку %WinDir%\system32\spool\drivers\w32x86\3. Обратите внимание на последний подкаталог. В зависимости от версии PS он может изменяться. Поскольку в настоящее время используется PS версии 3, то название подкаталога соответствующее – 3 (см. рис. 1).
Большая ошибка считать, что PostScript-драйвер для каждого принтера свой. Он один – стандартный, универсальный. Его достаточно один раз установить в операционной системе и использовать для всех принтеров, назначая только PPD-файл.
У читателя возникнет закономерный вопрос: в чем же разница в принтерах? Ответ очень прост: в PPD-файлах.
Рассмотрим кратко структуру драйвера:
- INF-файл. Ядро инсталлятора, в котором описано, какие драйверы присутствуют в нем, для каких операционных систем он подходит, какие изменения необходимо сделать в реестре, какие библиотеки зарегистрировать и, наконец, список файлов, участвующий в установке драйвера;
- CАВ-файл, в котором находится PS (включая PPD) или PCL-драйвер;
- Различные библиотеки графического оформления драйвера.
Для создания инсталлятора можно пойти по одному из путей: взять какой-либо PS-драйвер и «урезать» его, либо, изучив структуру INF-файла создать новый файл, заимствовав необходимые библиотеки из имеющегося драйвера.
Структура INF-файла
Любой INF-файл представляет собой тестовый файл в формате ASCII, состоящий из нескольких разделов. Каждый из них предназначен для выполнения определенной задачи. Имена разделов обычно заключены в квадратные скобки. Элементы раздела – ключи и значения, соединенные знаком равенства. В разделе может присутствовать несколько значений.
Кроме того, в состав элемента может входить комментарий, который отделяется от ключей и значений точкой с запятой (см. листинг 1).
Листинг. 1. Структура INF-файла
[section]
key1 = value1 ; comment
key2 = value2
Разделы INF-файла
Любой INF-файл имеет ряд обязательных разделов, которые считываются в первую очередь. По их содержимому определяется тип INF-файла, определяются константы и т. д. Поскольку рассматривается INF-файл драйвера, то разделы зарезервированы для этого типа драйверов.
К ним относятся следующие стандартные разделы:
- [Version] – идентифицирует INF и класс устанавливаемого устройства;
- [Manufacturer] – идентифицирует производителя устройства. Каждый INF-файл должен иметь по крайней мере один такой раздел;
- [Strings] – определяются значения констант, используемых в пределах файла.
- [DestinationDirs] – описывается местоположение драйвера на локальном компьютере.
- [SourceDisksNames] – описание установочного диска с драйверами;
- [SourceDisksFiles] – список файлов драйвера.
Рассмотрим каждый из них подробнее.
Раздел [Version]
Раздел [Version] состоит из ряда ключей. Полный их список можно найти на сайте Microsoft [1].
В данном случае рассмотрим лишь минимум необходимых (см. листинг 2).
Листинг 2. Структура раздела [VERSION]
[Version]
Signature="signature-name"
Class=class-name
ClassGuid={nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}
CatalogFile=filename.cat
DriverVer=mm/dd/yyyy[,w.x.y.z]
В приведенном листинге с помощью параметра Signature описывается операционная система, для которой создан INF-файл. Значение параметра указывается в знаках доллара ($) с двух сторон и может быть следующим:
- $Windows 95$ – для Windows 9x;
- $WINDOWS NT$ – для Windows 2k;
- $CHICAGO$ – для всех видов операционных систем.
Поскольку в настоящее время Windows 9x снята с поддержки, то обычно указывается значение $CHICAGO$.
Второй и третий параметр указывают на класс устанавливаемого устройства. В таблице приведен список широко используемых устройств и соответствующие им значения параметров Class и ClassGuid (полный список классов и соответствующих им идентификаторов безопасности приведен в [2]).
Значение четвертого параметра – файл с расширением CAT, который содержит в себе сам драйвер, включая PPD-файл.
Забегая вперед заметим, что САT-файл не указывается в списке устанавливаемых файлов в разделах [SourceDisksFiles] or [CopyFiles]. Последний параметр – DriverVer, значение которого дата создания INF-файла.
Классы часто используемых типов устройств
Тип устройства
|
Класс устройства (Class)
|
Идентификатор безопасности (ClassGuid)
|
CD/DVD
|
CDROM
|
{4d36e965-e325-11ce-bfc1-08002be10318}
|
Видеоадаптер
|
Display
|
{4d36e968-e325-11ce-bfc1-08002be10318}
|
IEEE 1394-контроллер
|
1394
|
{6bdd1fc1-810f-11d0-bec7-08002be2092f}
|
Сканеры и камеры
|
Image
|
{6bdd1fc6-810f-11d0-bec7-08002be2092f}
|
Клавиатура
|
Keyboard
|
{4d36e96b-e325-11ce-bfc1-08002be10318}
|
Монитор
|
Monitor
|
{4d36e96e-e325-11ce-bfc1-08002be10318}
|
Мышь
|
Mouse
|
{4d36e96f-e325-11ce-bfc1-08002be10318}
|
Сетевая карта
|
Net
|
{4d36e972-e325-11ce-bfc1-08002be10318}
|
COM и LPT-порты
|
Ports
|
{4d36e979-e325-11ce-bfc1-08002be10318}
|
Звуковая карта
|
Sound
|
{4d36e97c-e325-11ce-bfc1-08002be10318}
|
SCSI и RAID-контроллеры
|
SCSIAdapter
|
{50dd5230-ba8a-11d1-bf5d-0000f805f530}
|
USB
|
USB
|
{36fc9e60-c465-11cf-8056-444553540000}
|
Принтер
|
Printer
|
{4d36e979-e325-11ce-bfc1-08002be10318}
|
Замечание. GUID – уникальный 128-битный идентификатор безопасности. Все жизненно важные объекты домена или операционной системы имеют фиксированные идентификаторы безопасности. Например, папка «Мой компьютер» на любом компьютере имеет идентификатор {20D04FE0-3AEA-1069-A2D8-08002B30309D}. Существует также GUID, которые генерируются случайным образом на основе текущего времени.
Таким образом, суммируя полученную информацию и учитывая, что необходимо создать INF-файл для установки принтера, получаем следующий раздел [Version] (см. листинг 3). Поскольку создается универсальный драйвер, то все файлы будут располагаться в одном каталоге с INF-файлом, а из CAT-файла будут заимствованы лишь некоторые файлы. Поэтому параметр CatalogFile не используется в листинге 3.
Листинг 3. Раздел [Verison] для установки принтера
[Version]
Signature="$CHICAGO$"
Class=Printer
ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318}
DriverVer=09/31/2008
Раздел [Manufacturer]
В разделе [Manufacturer] назначается производитель устройства, отображаемый при установке драйвера (см. рис. 2). Название производителя может быть произвольным: русским или английским. Для того чтобы устанавливаемый драйвер было легко найти, рекомендуется его поместить в начало списка, использовав в качестве первого символа спецзнак – звездочку или восклицательный знак. При сортировке все русские названия идут после английских.
Рисунок 2. Присвоение значений без подстановки
Существует два способа присвоения значений: с помощью подстановки и без нее. На рис. 2 проиллюстрирован второй способ. Способ с подстановкой рассмотрен далее.
Определив название производителей, необходимо определить список оборудования. Для этого необходимо создать одноименный раздел [infotec], в котором будут созданы ключи и соответствующие им значения.
Имя ключа совпадает с названием оборудования, а значение состоит из нескольких частей, которые между собой разделены запятыми. Первая часть – название раздела, в котором будут указаны инсталлируемые файлы. Второй – уникальный идентификатор устройства, который назначается производителем.
Раздел [Strings]
В этом разделе, который обычно расположен в конце файла, назначаются константы. Название ключа – переменная, которая будет фигурировать в файле. Значение ключа – соответственно, – подставляемое значение (см. рис. 3). В приведенном примере параметра BrandName присваивается значение Lexmark.
Рисунок 3. Присвоение значений методом подстановки
Раздел [DestinationDirs]
В этом разделе присутствуют ключи, в которых описывается местоположение драйвера на локальном компьютере. Шаблон ключа следующий:
file-list-section = dir[,subdir]
где file-list-section название секции. По умолчанию – DefaultDestDir; dir и subdir папки, в которые необходимо скопировать данные.
Листинг 4. Раздел [DestinationDirs]
[DestinationDirs]
DefaultDestDir=66000
Раздел [SourceDisksNames]
Название раздела [SourceDisksNames] является общим для всех типов операционных систем. В случае создания одного INF-файла для разных операционных систем, в зависимости от ее типа, название раздела может меняться:
- [SourceDisksNames.x86] – платформа Intel 80x86, 32-bit;
- [SourceDisksNames.ia64] – платформа x86, 64-bit;
- [SourceDisksNames.amd64] – архитектура процессора, разработаная AMD, 64-bit.
В этом разделе располагаются ключи, построенные по следующему шаблону:
Для Windows 2000:
diskid = disk-description[,[tag-or-cab-file],[unused,path][,flags]]
Для Windows XP и старше:
diskid = disk-description[,[tag-or-cab-file],[unused,path],[flags][,tag-file]]
где disk-description (обязательный параметр) – описание диска. Описание остальных параметров выходит за рамки этой статьи.
Полное описание всех параметров приведено на официальном сайте компании Microsoft [3].
Для обеспечения работоспособности драйвера в разделе [SourceDisksNames] необходимо создать всего один ключ (см. листинг. 5).
Листинг 5. Раздел [SourceDisksNames]
[SourceDisksNames]
1 = "HP",,,""
Раздел [SourceDisksFiles]
В этом разделе перечисляются все файлы дистрибутива, за исключением CAT-файла.
Шаблон ключа в разделе [SourceDisksFiles]:
filename = diskid[,[ subdir][, size]]
где:
- filename – имя файла (обязательный параметр);
- diskid – идентификатор диска (любое число);
- subdir – подкаталог, в котором находится файл в дистрибутиве;
- size – его размер.
Приведем раздел [SourceDisksFiles] для установки PS-драйвера для HP1200 в листинге 6.
Листинг 6. Раздел [SourceDisksFiles]
[SourceDisksFiles]
HP1200.ppd = 1
В данном случае – это PPD-файл HP1200.PPD. Остальная часть драйверы входит в состав операционной системы.
Если до этого драйвера не были установлены, то инсталлятор будет их искать в каталоге с INF-файлом.
- PS5UI.DLL;
- PSCRIPT5.DLL;
- PSCRIPT.HLP;
- PSCRIPT.NTF.
Все эти файлы можно найти в любом PS-драйвере. Они находятся в CAT-файле, описанном в параметре CatalogFile раздела [Version].
INF-файл для HP1200 PS
Теперь, когда описаны все необходимые ингредиенты INF-файла, рассмотрим файл инсталлятора Post Script драйверов для принтера HP-1200.
Создание TCP/IP-порта
Для установки сетевого принтера необходимо создать TCP/IP-порт и подключить к нему сетевой принтер. Все действия осуществляются на выделенном сервере. Кроме того, к USB-принтеру должен быть подключен Jet Direct, позволяющий его подключить к сети с настроенным интерфейсом и известным IP-адресом, который необходим для создания TCP/IP-порта.
Для создания сетевого порта на сервере, к которому будет подключен принтер, существует два способа. Если необходимо создать несколько портов одновременно, то рекомендуется войти в свойства сервера печати и создать пул портов. Для этого необходимо войти в папку «Принтеры», расположенную в панели управления выбрать «Файл -> Свойства сервера». В появившемся диалоговом окне необходимо перейти во вкладку порты и нажмите кнопку «Добавить порт…» (см. рис. 4), в выведенном окне требуется выбрать тип порта: в данном случае – «Standard TCP/IP port».
Рисунок 4. Вызов свойств сервера
Для создания порта необходимо нажать на кнопку «Новый порт…». В появившемся диалоговом окне, необходимо указать IP-адрес нового порта. Имя порта назначается автоматически. Им является IP-адрес с префиксом «IP_». Назначаемое имя администратор может изменить по своему усмотрению (см. рис. 5).
Рисунок 5. Создание TCP/IP-порта
Установка принтера на сервере
Для создания принтера на сервере необходимо запустить «Мастер установки принтеров». Для этого необходимо в папке «Принтеры и факсы», расположенные в «Пуск -> Настройка -> Панель Управления», нажать на кнопку установка принтера (см. рис. 6).
Рисунок 6. Запуск мастера установки принтеров
Работа мастера состоит из нескольких шагов. На первом шаге необходимо указать порт, к которому будет присоединен принтер. Как уже отмечалось, для реализации сетевой печати требуется выбрать TCP/IP-порт. Создание порта описано в разделе «Создание TCP/IP-порта».
На втором шаге мастера начинается процесс установки драйвера. Для удобства восприятия приведем блок-схему работы этого мастера (см. рис. 7). Для установки драйверов мастеру необходимо указать местоположение INF-файла. По идентификаторам Class и ClassGuid (см. таблицу) в разделе [Version], система определяет, что этот файл – инсталлятор драйвера принтера. Если INF-файл создан корректно, то на экране появляется диалоговое окно, содержащее список оборудования.
Рисунок 7. Структура INF-файла
Замечание:
- Во время работы мастера администратор не увидит раздел, созданный в разделе [Manufacture]. Она будет видна только при повторной установке драйверов (рис. 2 и рис. 3).
- Необходимо наличие ключа Provider с произвольным значением в разделе [Version]. При отсутствии этого параметра во время установки возникает ошибка (см. рис. 8); драйверы не устанавливаются.
Далее, необходимо задать имя создаваемого принтера. По умолчанию предлагается имя, заданное в INF-файле (строка 11). Затем дается возможность предоставить к нему сетевой доступ. Поскольку создаваемый принтер сетевой, то необходимо указать сетевое имя, например, HP1200. На следующем шаге (см. рис. 9) можно указать размещение и комментарий. В качестве комментария рекомендуется указывать название подразделения, в котором физически находится сетевой принтер.
Затем выводится суммарная информация по устанавливаемому принтеру. На следующем шаге осуществляется копирование необходимых файлов (см. рис. 7) и создание принтера в папке «Принтеры и факсы». На этом установка принтера закончена.
Рисунок 8. Ошибка при отсутствии ключа Provider в разделе [Version]
Рисунок 9. Предоставление сетевого доступа к сетевому принтеру
Создание INF-файла с несколькими принтерами
Для создания INF-файла для нескольких принтеров, необходимо в разделе [FIRM] (см. рис. 7) создать несколько строк по образцу строки 11. Шаблон строки следующий: название ключа – отображаемое имя принтера. Его значение – имя инсталляционного раздела, в котором указан PPD (до запятой) и уникальный идентификатор, который можно взять из дистрибутива.
Разделы, соответствующие указанному принтеру, также создаются копированием с последующим переименованием имен PPD-файлов. В разделе SourceDisksFiles добавляются в существующий список PPD-файлы. В листинге 7 приведен INF-файл, с помощью которого можно установить три PS-драйвера для HP1200, HP4100 и HP2727.
Листинг 7. Мультидрайверный INF-файл
[Version]
Signature="$Windows NT$"
ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318}
Class=Printer
Provider="temp"
[Manufacturer]
%Company%=firm
[firm]
"Hewlett-Packard 1200" = HP1200.PPD,HP1200_PS_PPD
"Hewlett-Packard 4100" = HP4100.PPD,HP4100_PS_PPD
"Hewlett-Packard 2727" = HP2727.PPD,HP2727_PS_PPD
[HP1200.PPD]
CopyFiles=@HP1200.PPD,PSCRIPT_NT ; PPD-файл.
DataSection=PSCRIPT_DATA ; раздел PSCRIPT
DataFile=HP1200.PPD
Include=NTPRINT.INF ; инсталляция NTPRINT.INF.
Needs=PSCRIPT.OEM ; инсталляция PSCRIPT.
[HP4100.PPD]
CopyFiles=@HP4100.PPD,PSCRIPT_NT
DataSection=PSCRIPT_DATA
DataFile=HP4100.PPD
Include=NTPRINT.INF
Needs=PSCRIPT.OEM
[HP2727.PPD]
CopyFiles=@HP2727.PPD,PSCRIPT_NT
DataSection=PSCRIPT_DATA
DataFile=HP2727.PPD
Include=NTPRINT.INF
Needs=PSCRIPT.OEM
[DestinationDirs]
DefaultDestDir=66000
[SourceDisksNames.x86]
1 = "HP",,,""
[SourceDisksFiles.x86]
HP1200.ppd = 1,,,,,,,11,3
HP4100.ppd = 1,,,,,,,11,3
HP2727.ppd = 1,,,,,,,11,3
[Strings]
Company = "*Island Printers"
Таким образом, в состав дистрибутива входят:
- PS5UI.DLL;
- PSCRIPT5.DLL;
- PSCRIPT.HLP;
- PSCRIPT.NTF;
- HP1200.PPD;
- HP2727.PPD;
- HP4100.PPD.
Заключение
Итак, в результате всех манипуляций получим универсальный PS-драйвер для 3 принтеров, количество которых может меняться в зависимости от нужд системного администратора. Созданный драйвер не содержит в себе никаких графических надстроек и характеризуется стабильной работой. В завершение – совет: при создании своего драйвера не пишите INF-файл с нуля, а возьмите готовые. Это позволит сэкономить массу времени.
- INF Version Section – http://msdn.microsoft.com/en-us/library/ms794526.aspx.
- System-Supplied Device Setup Classes – http://msdn.microsoft.com/en-us/library/ms791134.aspx.
- INF SourceDisksNames Section – http://msdn.microsoft.com/en-us/library/ms794354.aspx.