Итак задача:
Есть разнородная сеть, состоящая из нескольких виндовых машин, и нескольких линуксовых. К нескольким виндовым машинам и нескольким линуксовым подключены принтеры. Как настроить это все хозяйство, чтобы печать работала со всех машин на все принтеры максимально прозрачно?
Понятное дело, что в винде просто подключаем принтер, ставим драйвера, расшариваем принтер для доступа к нему по сети и все. Удаленные виндовые драйвера подключаем при помощи встроенных виндовых средств.
Под линуксом:
На тех машинах, к которым подключены принтеры, устанавливаем 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 На каждом шаге могут возникать малоадекватные ошибки. В первую очередь стоит смотреть в лог самбы – вполне может быть, что кому-то не хватает каких-то прав.
Огромнейшее спасибо за этот сверхценный пост! Были трудности с подключением мастдайных принтеров к линуксовой машине. Обязательно попробую!
Ещё раз спасибо!
О, отличный пост! Давно теоретический вопрос возникал – а как же отдавать драйвер виндовым машинам? Хотя, быть может, виндовым машинам можно просто сказать использовать postscript драйвер, а уж cups сам разберется?
Можно, есть для этого драйвер CUPS win (на оффсайте CUPS) или PS от Adobe. Единственный минус постскрипта – не будет возможности тонкого управления принтером. Там всякие режимы печати и прочая специфика. Но в любом случае логика остается та же. Положить эти драйвера в самбу и прописать соответствие между принтером и драйверами. Хотя для этих драйверов есть какие-то скрипты, которые все действия делают автоматом. Но опять же, у меня эти скрипты работать отказались, из-за того, что с правами не все было впорядке, а когда стал руками делать – тогда и понял, на чем все спотыкается.