2007年8月15日

Unix/Windows 通用 print server

知道怎麼做的話,其實要架是很簡單的。但問題是之前從未在 Linux 下處理列印過,真正做起來,走了許多冤枉路。過程也就不提了,總之,最終成果是將原有的一台 Debian server 接上 usb 連結的雷射印表機,在區域網路上同時有 Linux/Windows 的情況下列印。

採取的架構是 cups + samba. CUPS 是 the common unix printing system,可以直接分享列印服務給其他 Unix like 的機器。而與 Windows 的接軌,就要靠 samba。首先必須先讓印表機在 Linux 下正常動作。就我的例子而言, HP LaserJet 1000 需要由網路上下載 open source 的驅動程式,並且另行下載 firmware,搭配 udev 或者是 hotplug,讓主機在印表機連結的時候,自動上傳 firmware,印表機才能正確工作。

安裝 HP LaserJet 1000

先不要接上印表機。LaserJet 1000 需要的驅動程式名為 foo2zjs,頗為好裝,照著網頁做就沒問題。裝完後印表機先接好電,再連結 USB。用 usb_printerid,後頭接 device 位置,通常是 /dev/usb/lp0,來確認 firmware 有沒有正確的 upload 了。FWVER 後頭有接版本名稱就是正常。

若有問題,可以看一下 /etc/hotplug/usb/hplj1000 這個 script。我把 DEV=""這行 mark 掉,省去自動搜尋的麻煩。

CUPS 設定

啟動 CUPS,這東西的方便之處就是直接連結 http://localhost:631/ 就可以進入網頁操作介面,可是我的 server 只有文字介面,用 lynx 看又有點麻煩,所以還先進去 /etc/cups/cupsd.conf 改了一下設定檔,讓其他台也可以連。改掉的內容包括 Listen 127.0.0.1:631 改成 Listen 0.0.0.0:631,以及全部設 Allow all 諸如此類。進入 admin 介面後,應該可以看到印表機已經自動偵測到了,直接加入即可。basic server settings 裡頭有些預設的設定可以直接勾選,我選了 Share published printers connected to this system 還有 Allow remote administration,允許所有在 LAN 上的使用者都可以直接列印。

Linux Client 設定

把 cups 網頁介面上某印表機的網址複製,然後開頭改成 ipp,就是這台印表機的分享位置。例如我的是 ipp://192.168.1.1:631/printers/hp_LaserJet_1000_USB_1,直接加入即可。

Samba 設定

在此我碰到最大的問題是 Windows 上的使用者名稱與 Linux 上不相同,我不想一個個輸入 smbpasswd 中,而且還有密碼同步問題,可見不是正確解法。最後才發現有 map to guest = Bad User 這種設法,亦即當使用者輸入的帳號在系統中不存在,就當成 guest。正是我要的功能。目前 smb.conf 設定如下:

[global]
workgroup = MSHOME
server string = %h server
map to guest = Bad User
log level = 1
syslog = 0
log file = /var/log/samba/log.%m
max log size = 1000
ldap ssl = no
panic action = /usr/share/samba/panic-action %d
invalid users = root
printer admin = @lpadmin
create mask = 0644
printing = cups
print command =
lpq command = %p
lprm command =

[homes]
comment = Home Directories
valid users = %S
read only = No
browseable = No

[printers]
comment = Generic dot-matrix printer entry
path = /var/spool/samba
guest ok = Yes
printable = Yes
use client driver = Yes
browseable = No

[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
write list = @lpadmin
guest ok = Yes
設完以後重新啟動 samba,應該可以從任一 Windows client 那邊看到分享出來的印表機。接下來若某使用者 foo 在 Linux 端是 lpadmin 群組的一份子,那在 Windows 下用 foo 連結印表機後,選內容 -> 進階 -> 新增驅動程式,另外在內容的其他頁面中,也可以新增其他作業系統例如 Win NT, 98 等等用的驅動程式,如此可以讓 Windows client 連結後自動下載安裝,不需要另外尋找。這部份功能我還沒確實試出,但應該是可行的。

1 則留言 :