1. 程式人生 > >鳥哥的Linux私房菜(伺服器)- 第十六章、檔案伺服器之二: SAMBA 伺服器

鳥哥的Linux私房菜(伺服器)- 第十六章、檔案伺服器之二: SAMBA 伺服器

時至今日,印表機的網路功能已經很強悍了!甚至也有支援無線網路的印表機,因此每臺印表機都可以獨立作為各個 PC 的獨自的印表機,老實說也沒有必要進行 Samba 的網路印表機伺服器啦!但畢竟還是有些比較舊型的機種, 或者買不起有內建網路的印表機時,那麼 Samba 的印表機伺服器還是有存在的價值囉。

在 Linux 底下進行列印的服務很多,不過我們這裡要介紹的僅有目前較廣為流行的 CUPS (Common Unix Printing System) 這一個。 詳細的 CUPS 安裝設定方法我們已經在基礎篇第三版第二十一章 CUPS 當中提過,所以這裡我們不再詳細說明,僅介紹大致的處理流程就是了。如果你需要較早期的 LPRng 列印系統的話, 建議可以參考底下的資料喔:

Tips:
在這個小節中,鳥哥假設你的印表機並不是網路印表機,而是使用 USB 介面連線的印表機格式。如果你的印表機真的有支援網路, 那建議直接參考印表機手冊來設定即可,不需要安裝 Samba 印表機。因為某些廠牌的印表機網路卡有特殊的功能, 例如 HP 的網絡卡通常還支援某些特殊的列印功能 (雙面、多頁列印等),這些功能透過伺服器重新分享時,可能會遺失!
鳥哥的圖示
  • 0. 假設條件

既然要分享印表機,就得要有印表機啊!鳥哥使用對 Linux 支援度較高的 HP LaserJet P2015dn 這部印表機為例, 不使用網路功能,單純使用 USB 連線到 Samba 伺服器上。

  • CUPS 連線到 USB 印表機,並且開放非本機的 IP 來源使用此印表機;
  • 使用 CUPS 內建的印表機驅動程式;
  • 前往 HP 印表機官網取得 Windows 作業系統的驅動程式;

  • 1. 安裝印表機與確定印表機的聯機正常

再次說明,並不是所有的印表機都被 Linux 所支援的,所以當你想要連結一部印表機到 Linux 系統上頭時, 請務必到http://www.openprinting.org/printers 上頭去看看是否有被支援喔! 如果沒有被支援,那就換一部印表機吧!不要進行垂死的掙扎了...

如果你的印表機埠為使用 USB 或者是平行串列埠的話,那麼當你連線上印表機後, 可以利用底下的方式測試看看是否成功的連線上了:

[[email protected] ~]# lsusb
Bus 001 Device 002: ID 03f0:3817 Hewlett-Packard LaserJet P2015 series
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
[[email protected] ~]# ll /dev/usb/lp0
crw-rw----. 1 root lp 180, 0 Jul 29 13:55 /dev/usb/lp0
# 看得出來,已經有個 lp0 的印表機囉!測試列印一下吧!

[[email protected] ~]# echo "Hello printer" > /dev/usb/lp0

如果印表機有響應,這表示 OK 的啦!你可以進行底下的工作了。

  • 2. 設定 CUPS 與印表機的聯機

預設 CUPS 都會開啟,不過,因為我們安裝的是『 basic server 』的模式,所以 CUPS 預設並沒有被安裝起來。 所以這裡要安裝且重新設定與啟動才行。本章節 CUPS 的設定原則是這樣的:

  • 我需要讓 192.168.100.0/24 這個網域可以使用印表機
  • 我需要讓 192.168.100.0/24 及 127.0.0.0/8 可以管理 CUPS 系統

然後開始這樣做:

[[email protected] ~]# yum groupinstall "Print Server"
[[email protected] ~]# vim /etc/cups/cupsd.conf
# 1. 讓監聽的介面開放在所有介面!
# Listen localhost:631  <==約在第 18 行左右,改成如下:
Listen 0.0.0.0:631

# 2. 讓內部網域能夠進行 CUPS 的瀏覽與管控
<Location />        <==約在 32 行左右,新增能夠讓內網其他 IP 瀏覽者
  Order allow,deny
  Allow From 127.0.0.0/8
  Allow From 192.168.100.0/24
</Location>

<Location /admin>       <==約在 39 行左右,新增能夠管理 CUPS 者
  Encryption Required   <==因為這裡的關係,所以可能會用 https://IP 喔!
  Order allow,deny
  Allow From 127.0.0.0/8
  Allow From 192.168.100.0/24
</Location>

設定完畢後就可以開始來啟動 cups 系統,可以這樣做:

[[email protected] ~]# /etc/init.d/cups start
[[email protected] ~]# chkconfig cups on
[[email protected] ~]# netstat -tunlp | grep 'cups'
tcp     0  0  0.0.0.0:631         0.0.0.0:*      LISTEN      1851/cupsd
udp     0  0  0.0.0.0:631         0.0.0.0:*                  1851/cupsd

那個 631 的埠口就是 CUPS 所啟動的啦!要注意的是,開放介面得要給 0.0.0.0 才對呦!然後我們可以開始設定印表機了! 由於 CUPS 支援很多不同的印表機埠,每種埠都不一樣,常見的有:

  • USB 埠: usb:/dev/usb/lp0
  • 網路印表機: ipp://ip/印表機型號
  • 網路芳鄰印表機: smb://user:[email protected]/printer

之所以要加上 192.168.100.0/24 可以控制伺服器 CUPS 的原因在於...鳥哥的伺服器沒有 X 視窗啦! 所以需要透過平時的工作機連上伺服器才行啊!此時,將 CUPS 開放在區網內可以控制的功能就很重要啦! 此外,因為鳥哥的主機所在環境問題,這部 192.168.100.254 還有一個介面為 192.168.1.100,鳥哥在 cupsd.conf 裡面也加入這個網段了 (上面的範例中並沒有特別強調),所以底下的圖示你會看到很多 192.168.1.100 的 IP ,不要害怕!那是正常的! ^_^!好了,請開啟瀏覽器,在網址列輸入: https://192.168.100.254:631 (底下則是 192.168.1.100)

用 CUPS 設定 USB 印表機
圖 16.2-1、用 CUPS 設定 USB 印表機

如上圖所示,由於我們使用的是 https 這個需要憑證的聯機模式,因此就會出現這個不受信任的網站訊息。 沒關係,你直接按下『我瞭解安全風險』後,再選擇『新增例外網站』即可出現如下圖示:

用 CUPS 設定 USB 印表機
圖 16.2-2、用 CUPS 設定 USB 印表機

如果這部主機真的是你的,那麼就選擇箭頭 2 所指的那個『永久儲存』吧!最後按下箭頭 3 所指的『確認安全例外』即可!如果一切順利,就會出現如下的 CUPS 設定圖示:

用 CUPS 設定 USB 印表機
圖 16.2-3、用 CUPS 設定 USB 印表機

在上頭的歡迎圖示當中,由於我們是想要建立印表機,因此點選箭頭(1)所指的那個按鈕進入印表機功能,然後點選 (2)來建立印表機吧!

用 CUPS 設定 USB 印表機
圖 16.2-4、用 CUPS 設定 USB 印表機

這一版比較有趣的地方,是會先讓你輸入賬號與密碼才進行後續的動作哩!所以這裡請輸入 root 的帳密吧!

用 CUPS 設定 USB 印表機
圖 16.2-5、用 CUPS 設定 USB 印表機

在上面的圖示中,你應該要選擇的是我們這部本機的 USB 印表機裝置才對。該裝置是由 HAL 服務所自動偵測到的, 如果你沒有看到任何 USB 的印表機,那可能就得要查詢一下印表機電源是否正確的開啟了! 點選他吧!

用 CUPS 設定 USB 印表機
圖 16.2-6、用 CUPS 設定 USB 印表機

建立印表機時,最重要的是那個列印佇列 (上面方框中的第一個,名稱的那個玩意兒),在這裡鳥哥使用 CUPS 預設幫我捉到的檔名。 這個名稱很重要,是未來分享出的印表機名字囉!至於位置與描述就隨便你填囉。由於我們是想要做成列印伺服器,所以『share this printer 』當然要勾選!當你按下『繼續』後,就會出現如下圖示:

用 CUPS 設定 USB 印表機
圖 16.2-7、用 CUPS 設定 USB 印表機

接下來 CUPS 會幫你選擇一個相對較佳的驅動程式,基本上,使用 CUPS 幫你捉到的預設驅動程式應該就 OK 了! 選完後請按下『加入印表機』按鈕吧!

用 CUPS 設定 USB 印表機
圖 16.2-8、用 CUPS 設定 USB 印表機

看你還有沒有要修改其他的預設引數,如果沒有的話,就按下圖 16.2-8 的『Set Default Options』按鈕吧! 如果一切沒有問題,你的印表機就設定妥當了。如果想要查閱印表機的詳細資訊,那可以點選 Printer 的專案!如下圖所示:

用 CUPS 設定 USB 印表機
圖 16.2-9、用 CUPS 設定 USB 印表機

如果都正常沒問題,那麼你的系統已經有一部印表機被 CUPS 所管理,且這部印表機在網路的網址為:

  • http://伺服器IP:631/printers/印表機佇列名稱
  • http://192.168.100.254:631/printers/HP_LaserJet_P2015_Series

接下來看看如何將它連結到咱們的 Samba 伺服器中吧!

  • 3. 在 smb.conf 當中加入印表機的支援 (Optional)

開始告訴 Samba 將這部印表機給他分享出去吧!你需要這樣處理:

[[email protected] ~]# vim /etc/samba/smb.conf
[global]
        # 得要修改 load printers 的設定,然後新增幾個資料
        load printers = yes
        cups options  = raw       <==可支援來自 Windows 使用者的列印作業
        printcap name = cups
        printing      = cups      <==與上面這兩個在告知使用 CUPS 列印系統

[printers]                        <==印表機一定要寫 printers 喔!
        comment = All Printers
        path    = /var/spool/samba<==預設把來自 samba 的列印作業暫時放置的佇列
        browseable = no           <==不被外人所瀏覽啦!有許可權才可瀏覽
        guest ok   = no           <==與底下兩個都不許訪客來源與寫入(非檔案系統)
        writable   = no
        printable  = yes          <==允許列印很重要的一項工作!

[[email protected] ~]# testparm  <==若有錯誤,請自行處理一下
[[email protected] ~]# /etc/init.d/smb restart
[[email protected] ~]# /etc/init.d/nmb restart

基本上透過這樣的設定你的 Samba 就能夠順利的提供印表機的服務了!不過可惜的是,Windows 客戶端依舊得要安裝印表機的驅動程式才能夠使用 Samba 所提供的印表機,此時真是麻煩兼討厭啊~有沒有可能讓 Samba 主動的提供驅動程式給使用者,這樣一來客戶端就不需要額外去找驅動程式囉!是可以的,透過 Samba 3.x 即可處理!就這麼巧, CentOS 的 Samba 就是 3.x 呢!所以我們可以透過底下的方式來處理。

  • 4. 讓 Samba 主動提供驅動程式給 Windows 使用者使用

另外,或許你會想,印表機的型號這麼多,那麼 Linux 該如何提供這些印表機的驅動程式啊?豈不麻煩? 還好啦, CUPS 主要是透過利用 Postscript 的列印語言與印表機溝通的,因此客戶端只要取得 postscript 的驅動程式他們就能夠使用咱們的 Samba 伺服器所提供的印表機了!如此一來, 不論印表機的型號為何,只要他們能夠支援 Postscript 的列印格式,OK 搞定!而且 CUPS 官網本身就有提供 CUPS 的 Postscript 驅動程式囉!可以到底下的連結去下載:

很棒的是,因為我們是 CentOS 6.x 有支援 rpm 軟體封裝的系統,因此可以直接下載 cups-windows-6.0-1.i386.rpm 這個檔案即可,直接安裝這個 rpm 檔案就能夠取得 cups 對 Windows 的印表機驅動程式了。 這個檔案安裝完畢之後,會將驅動程式放置於 /usr/share/cups/drivers/ 裡頭呦! 不過你得要注意的是,除了這個驅動程式外,要支援 Windows 2000 以後出產的 Windows 版本, 你還得到 Windows XP 底下的目錄去下載幾個 32 位支援的檔案:

  • Win XP 32 位:C:\WINDOWS\system32\spool\drivers\w32x86\3

將該目錄下里面的 PS 開頭的檔案通通下載下來,應該有四個檔案的,請將他複製成為檔名小寫的檔案,並且放置到你 Samba 伺服器上的 /usr/share/cups/drivers/ 目錄下,該目錄內放置的這就是基本的驅動程式說! 在鳥哥的這個目錄底下至少含有這幾個檔案就是了:

[[email protected] ~]# ll /usr/share/cups/drivers
-rw-r--r-- 1 root root    803  4月 20  2006 cups6.inf
-rw-r--r-- 1 root root     72  4月 20  2006 cups6.ini
-rw-r--r-- 1 root root  12568  4月 20  2006 cupsps6.dll
-rw-r--r-- 1 root root  13672  4月 20  2006 cupsui6.dll  <==上面為 cups 提供
-rw-r--r-- 1 root root 129024  3月 24 13:29 ps5ui.dll    <==底下為 Win XP 提供
-rw-r--r-- 1 root root 455168  3月 24 13:29 pscript5.dll
-rw-r--r-- 1 root root  27568  3月 24 13:29 pscript.hlp
-rw-r--r-- 1 root root 792644  3月 24 13:29 pscript.ntf

上述的檔案鳥哥將他打包成為一個檔案了,你可以在底下的連結下載:

不過你得注意,這個檔案內的 Windows 資料是由 32 位的 Windows XP 上面捉來的,所以對於 Windows 98/ME 是沒有作用的。同時,對於 64 位的其他較晚期的 Windows 7 等系統可能就得要重新處理了! 你得自行上網查閱相關的資料下載方式喔。接下來我們必須要在 smb.conf 裡面增加一筆新的分享資料,這個分享資料必須是 [print$] 名稱才行!有點類似這樣啦:

[[email protected] ~]# vim /etc/samba/smb.conf
[global]
....(設定保留原本資料)....
[homes]
....(設定保留原本資料)....
[printers]
....(設定保留原本資料)....
[print$]
        comment    = Printer drivers
        path       = /etc/samba/drivers  <==存放印表機驅動程式的目錄
        browseable = yes
        guest ok   = no
        read only  = yes
        write list = root                <==這個驅動程式的管理員
[project]
....(設定保留原本資料)....

[[email protected] ~]# mkdir /etc/samba/drivers
[[email protected] ~]# chcon -t samba_share_t /etc/samba/drivers
# 由於預設的 CUPS 僅有 root 能管理,因此我們以 root 作為印表機管理員;
# 同時 SELinux 的型別也要修訂如上的方式!那 root 就得要加入 samba 的支援才行:
[[email protected] ~]# pdbedit -a -u root

[[email protected] ~]# testparm                 <==測試語法
[[email protected] ~]# /etc/init.d/smb restart  <==重新啟動

[[email protected] ~]# smbclient -L //127.0.0.1 -U root
Enter root's password:  <==輸入 root 在 samba 的密碼先
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.5.4-68.el6_0.2]

        Sharename       Type      Comment
        ---------       ----      -------
        print$          Disk      Printer drivers
        project         Disk      smbuser's project
        HP_LaserJet_P2015_Series Printer   HP LaserJet P2015 Series
        IPC$            IPC       IPC Service (This is vbird's samba server)
        root            Disk      Home Directories
# 瞧!有看到一部印表機以及驅動程式所在的分享資料囉!

現在我們要告知 Samba 說,我們的 CUPS 可提供 Windows 客戶端的驅動程式,所以使用者不需要自行設定他們的驅動程式哩! 要由 cups 告知 Samba 是由 cupsaddsmb 這個指令來搞定的,整個指令的執行很簡單的:

[[email protected] ~]# cupsaddsmb [-H SAMBA 伺服器名] [-h CUPS 伺服器名] \
>   -a -v [-U 使用者賬號]
選項與引數:
-H :後續接的是 Samba 伺服器名,本機的話可以直接用 localhost 即可;
-h :後續接的為 CUPS 的伺服器名,同樣的可使用 localhost 即可;
-a :自動搜尋出所有可用的 CUPS 印表機;
-v :列出更多的資訊;
-U :印表機管理員

# 利用前面的說明將印表機驅動程式掛上 SAMBA (注意 CUPS 管理員預設是 root)
[[email protected] ~]# cupsaddsmb -H localhost -U root -a -v
Password for root required to access localhost via SAMBA: <==root 在 SAMBA 密碼
# 這裡會閃過很多的訊息,說明已經安裝了某些資訊,底下鳥哥僅列出簡單的訊息而已。
Running command: smbclient //localhost/print$ -N -A /tmp/cupsbrdBaE -c 'mkdir 
W32X86;put /tmp/cupsu13OSU W32X86/HP_LaserJet_P2015_Series.ppd;...

[[email protected] ~]# ll /etc/samba/drivers
drwxr-xr-x. 3 root root 4096 Jul 29 15:15 W32X86  <==這就是驅動程式目錄

最後在驅動程式的存放目錄會多出一個 W32X86 的目錄,你可以查詢一下該目錄的內容, 那就是預計要給客戶端使用的驅動程式啦!這樣就搞定了!不過,為了將所有的資料通通驅動, 建議你將 CUPS 及 SAMBA 通通重新啟動吧!

[[email protected] ~]# /etc/init.d/cups restart
[[email protected] ~]# /etc/init.d/smb restart
[[email protected] ~]# /etc/init.d/nmb restart
  • 5. 一些問題的克服:

如果一切順利的話,你在 Windows 客戶端應該可以順利的連線到印表機囉! 開心吧!不過,如果你曾經印錯資料,那麼該如何進入 Linux 的 Samba 主機將該資料移除呢? 你最好知道底下的幾個指令,關於這些指令的進階用法則請自行給他 man 看看了:

# 1. 列出所有可用的印表機狀態
[[email protected] ~]# lpstat -a
HP_LaserJet_P2015_Series accepting requests since Fri 29 Jul 2011 02:55:28 PM CST

# 2. 查詢目前預設印表機的的工作情況
[[email protected] ~]# lpq
hpljp2015dn 已就緒
沒有專案
# 列出印表機的工作,若有列印作業存在時 (例如關掉印表機再印測試頁),會如下所示:
hpljp2015dn 已就緒並正在列印
等級    擁有人  工作    檔案                            總計  大小
active  root    2       Test Page                       17408 byte

# 3. 刪除所有的工作專案喔!
[[email protected] ~]# lprm -
# 加上那個減號 (-) 代表移除所有等待中的列印作業!

列印作業就是這樣進行的啦!趕緊試看看吧!接下來探討一下相關的防火牆與安全性的討論!