Настраиваем печать в Linux

Итак задача:
Есть разнородная сеть, состоящая из нескольких виндовых машин, и нескольких линуксовых. К нескольким виндовым машинам и нескольким линуксовым подключены принтеры. Как настроить это все хозяйство, чтобы печать работала со всех машин на все принтеры максимально прозрачно?
Понятное дело, что в винде просто подключаем принтер, ставим драйвера, расшариваем принтер для доступа к нему по сети и все. Удаленные виндовые драйвера подключаем при помощи встроенных виндовых средств.
Под линуксом:
На тех машинах, к которым подключены принтеры, устанавливаем CUPS. Далее настраиваем принтер через его веб-интерфейс (PPD файлики используем либо встроенные, либо с http://linuxprinting.org). Возможно еще потребуется поставить hpijs.
Далее ставим галочку “Расшарить принтеры” все в том же веб-интерфейсе.
На тех, машинах, которые должны видеть чужие принтеры, тоже ставим CUPS и ставим галочку “Подключать расшаренные принтеры”.
Если машины находятся в разных сетях, придется поправить Access-лист на хосте с принтером и указать

BrowsePoll <CupsServerHostName>

на тех машинах, которые должны подключать удаленные принтеры.
Кстати сакральное знание, которого нету в доках: @LOCAL у CUPS’а значит “любая локальная подсеть, то есть подсеть заданная для любого интерфейса, кроме ppp”.
В итоге и на хостах с принтерами, и на хостах без них, в вебинтерфейсе мы должны видеть все принтеры (которые подключены к линуксовым хостам).
Теперь подключение виндовых принтеров к линуксу: на одном из CUPS’ов подключаем удаленный принтер, указав ему URI “smb://windowHost/printerShare”. Естественно должна стоять поддержка Samb’ы. И этот хост расшаривает подключенный принтер остальным линуксовым хостам средствами CUPS’а.
А вот обратно всё хитрее.
Во-первых, ставим самбу. У нее должен быть подключен CUPS:

[global]
    load printers = yes
    printing =  cups
    printcap name = cups


И должны быть 2 хитрых шары:

[printers]
    path = /var/spool/samba
    guest ok = yes
    browseable = no
    printable = yes
    printer admin = @lpadmin
[print$]
   comment = Printer Drivers
   path = /var/lib/samba/printers
   browseable = no
   read only = yes
   guest ok = yes
   write list = @lpadmin


В качестве группы администраторов я использовал lpadmin – это группа, которая используется для администрирования CUPS’а. Эта группа обязательно должна иметь права на запись в каталог /var/lib/samba/printers.
Далее возможны 2 варианта: либо вы пробуете подключить в винде принтер расшаренный в самбе, винда просит диск с драйвером, устанавливает его локально и автоматически заливает на самбу драйвера (после чего все остальные виндовые машины могут подключать принтер, забирая дрова прямо с самбы), либо вам придется заливать дрова на самбу самому.
Как залить дрова на самбу.
Подключаем принтер к какой-нибудь виндовой машине (по сети через самбу) и устанавливаем его драйвера. На виндовой же машине расшариваем этот принтер. Затем на линуксовом хосте говорим:

$ rpcclient <имя виндовой машины> -c 'getdriver "<имя принтера>"'

Получаем что-то вроде:

[Windows NT x86]
Printer Driver Info 3:
        Version: [3]
        Driver Name: [HP LaserJet P2015 Series PCL 5e]
        Architecture: [Windows NT x86]
        Driver Path: [\\\\POSTMAN\\print$\\W32X86\\3\\UNIDRV.DLL]
        Datafile: [\\\\POSTMAN\\print$\\W32X86\\3\\HPC20155.GPD]
        Configfile: [\\\\POSTMAN\\print$\\W32X86\\3\\UNIDRVUI.DLL]
        Helpfile: [\\\\POSTMAN\\print$\\W32X86\\3\\UNIDRV.HLP]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpzui43e.dll]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hppdvq01.dll]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpz5r43e.dll]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpcdmc32.dll]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hplj1xxx.exp]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpzsm43e.gpd]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpzst43e.dll]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\HPC2015W.HTML]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\HPC2015W.SWF]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\HPC2015W.XML]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpzev43e.dll]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpzhl43e.cab]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\STDNAMES.GPD]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpc20155.xml]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpc2015b.ini]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpzsc43e.dtd]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpzls43e.dll]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\hpzss43e.dll]
        Dependentfiles: [\\\\POSTMAN\\print$\\W32X86\\3\\UNIRES.DLL]
        Monitorname: []
        Defaultdatatype: []


После этого вытаскиваем с этой виндовой машины все файлики, которые она нам выдала (если не заметили – все имена, это пути к файлам в виндовой нотации \\хост\шара\имяфайла). Кладем эти файлики в каталог /var/lib/samba/printers/W32X86/ (либо руками, либо через самбу, у нас же этот каталог расшарен под именем “Print$”).
Теперь самое страшное: создаем запись об этом драйвере:

$ rpcclient localhost -c 'adddriver "Windows NT x86" "HP LaserJet P2015 Series PCL 5e:UNIDRV.DLL:HPC20155.GPD:UNIDRVUI.DLL:UNIDRV.HLP:NULL:RAW:hpzui43e.dll,hppdvq01.dll,hpz5r43e.dll,hpcdmc32.dll,hplj1xxx.exp,hpzsm43e.gpd,hpzst43e.dll,HPC2015W.HTML,HPC2015W.SWF,HPC2015W.XML,hpzev43e.dll,hpzhl43e.cab,STDNAMES.GPD,hpc20155.xml,hpc2015b.ini,hpzsc43e.dtd,hpzls43e.dll,hpzss43e.dll,UNIRES.DLL" 3'

(Здесь устанавливаем все на localhost и текуший юзер входит в группу lpadmin. Если надо логиниться под другим юзером – используйте ключик -U. Ну и естественно, не забываем, что самба использует свою собственную базу паролей, которая управляется командой smbpasswd.)
Что там написано: первый параметр – это архитектура, для которой задается драйвер, для 2000/XP на x86 это “Windows NT x86”.
Второй параметр, это опции, разделенные двоеточием. Первая опция – имя драйвера (любая строка), дальше 4 опции – имена первых четырех файлов в той выдаче, которую мы получили от винды, затем две опции NULL и RAW, и в конце одной опцией через запятую имена всех файлов, которые были указаны как Dependentfiles все в той же выдаче. Ну и третий параметр – это версия. Для 2000/XP пишем “3”.
Должны получить что-то вроде

Printer Driver HP LaserJet P2015 Series PCL 5e successfully installed.

После этого команда

$ rpcclient localhost -c 'setdriver "<ИмяПринтера>" "<Имя драйвера>"'

Должна нам сказать что-то вроде

Succesfully set Printer1 to driver HP LaserJet P2015 Series PCL 5e.

Единственное место, где про все это написано нормально.
PS На каждом шаге могут возникать малоадекватные ошибки. В первую очередь стоит смотреть в лог самбы – вполне может быть, что кому-то не хватает каких-то прав.

3 thoughts on “Настраиваем печать в Linux”

  1. Огромнейшее спасибо за этот сверхценный пост! Были трудности с подключением мастдайных принтеров к линуксовой машине. Обязательно попробую!
    Ещё раз спасибо!

  2. О, отличный пост! Давно теоретический вопрос возникал – а как же отдавать драйвер виндовым машинам? Хотя, быть может, виндовым машинам можно просто сказать использовать postscript драйвер, а уж cups сам разберется?

    1. Можно, есть для этого драйвер CUPS win (на оффсайте CUPS) или PS от Adobe. Единственный минус постскрипта – не будет возможности тонкого управления принтером. Там всякие режимы печати и прочая специфика. Но в любом случае логика остается та же. Положить эти драйвера в самбу и прописать соответствие между принтером и драйверами. Хотя для этих драйверов есть какие-то скрипты, которые все действия делают автоматом. Но опять же, у меня эти скрипты работать отказались, из-за того, что с правами не все было впорядке, а когда стал руками делать – тогда и понял, на чем все спотыкается.

Leave a Reply to Anonymous Cancel reply

Your email address will not be published. Required fields are marked *