11.7. 疑難排解

下列章節涵蓋印表機硬體和軟體最常遭遇的問題,以及解決或避免這些問題的方式。

11.7.1. 沒有標準印表機語言模式支援的印表機

不支援任何常用印表機語言並僅能以特殊控制序列處理的印表機稱為 GDI 印表機。這些印表機僅可在製造廠商針對其開發驅動程式的作業系統版本上使用。GDI 是 Microsoft 為繪圖設備所開發的程式設計介面。實際問題不在於程式設計介面,而是 GDI 印表機僅可使用對應印表機型號的專用印表機語言處理。

部分印表機可切換到 GDI 模式或標準印表機語言來操作。部分製造廠商提供其 GDI 印表機的專用驅動程式。專用印表機驅動程式的壞處在於不保證可與安裝的列印系統搭配使用,且不保證適用於各種硬體平台。相反的,支援標準印表機語言的印表機不需依賴特殊的列印系統版本或特殊硬體平台。

除了不需花費時間嘗試使專用 Linux 驅動程式運作,也不需花費更多成本購買支援的印表機。 如此可一次解決所有驅動程式問題、減少安裝與設定特殊驅動程式軟體以及取得列印系統中新開發所需的驅動程式更新的需要。

11.7.2. PostScript 印表機沒有可用的 PPD 檔案

如果 manufacturer-PPDs 套件不包含任何適用於 PostScript 印表機的 PPD 檔案,應該可以使用印表機製造廠商驅動程式光碟中的 PPD 檔案,或從印表機製造廠商的網頁下載適合的 PPD 檔案。

如果 PPD 檔案以壓縮保存檔 (.zip) 或自解壓縮保存檔 (.exe) 形式提供,請以 unzip 解壓縮。首先,檢閱 PPD 檔案的授權條款。然後使用 cupstestppd 公用程式檢查 PPD 檔案是否符合 "Adobe PostScript Printer Description File Format Specification 版本 4.3"。如果公用程式傳回 "FAIL",表示 PPD 檔案的錯誤很嚴重,可能會導致重大問題。應該要減少 cupstestppd 所報告的問題點。 若有需要,請詢問印表機製造廠商以取得適合的 PPD 檔案。

11.7.3. 並列埠

最安全的方法是將印表機直接連接到第一並列埠,並在 BIOS 中選取下列並列埠設定值:

  • I/O address:378 (hexadecimal)

  • Interrupt:irrelevant

  • Mode:Normal, SPP, or Output Only

  • DMA:disabled

如果沒有這些設定值,印表機無法在並列埠上定址,請依照 BIOS 中的設定值,以 0x378 的格式在 /etc/modprobe.conf 中明確輸入 I/O 位址。如果有兩個並列埠,I/O 位址分別設為 378278 (十六進位),請以 0x378,0x278 格式輸入。

如果沒有使用中斷 7,可以使用 範例 11.1, "/etc/modprobe.conf:第一並列埠的中斷模式" 中所示的項目啟用。在啟用中斷模式之前,請檢查檔案 /proc/interrupts 以了解哪些中斷已經在使用中。只會顯示目前正在使用中的中斷。這可能因為作用中的硬體元件而有變化。其他任何設備都不能使用並列埠的中斷。如果您不確定,請以 irq=none 使用輪詢模式。

範例 11.1. /etc/modprobe.conf:第一並列埠的中斷模式

alias parport_lowlevel parport_pc
options parport_pc io=0x378 irq=7

11.7.4. 網路印表機連線方式

查明網路問題

將印表機直接連接到電腦。基於測試因素,請將印表機設為本地印表機。如果可以,問題便與網路相關。

檢查 TCP/IP 網路

TCP/IP 網路和名稱解析必須可作用。

檢查遠端 lpd

使用以下指令來測試是否可在主機上建立到 lpd (連接埠 515) 的 TCP 連線:

netcat -z host 515 && echo ok || echo failed

如果無法建立到 lpd 的連線,可能是 lpd 不在作用中,或是有基本網路問題。

以使用者 root 的身分,使用以下指令來查詢 (可能很長) 遠端 主機佇列 的狀態報告,假使對應的 lpd 在作用中且主機接受查詢:

echo -e "\004queue" \
  | netcat -w 2 -p 722 host 515

如果 lpd 沒有回應,它可能不在作用中,或是有基本網路問題。如果 lpd 有回應,回應應該會顯示主機上的佇列為何無法列印。如果您收到像 範例 11.2, "來自 lpd 的錯誤訊息" 中的回應,問題可能是因為遠端 lpd 所造成。

範例 11.2. 來自 lpd 的錯誤訊息

lpd: your host does not have line printer access
lpd: queue does not exist
printer: spooling disabled
printer: printing disabled
檢查遠端 cupsd

根據預設,CUPS 網路伺服器應該每隔三十秒在 UDP 連接埠 631 上廣播其佇列。同時,可使用以下指令來測試網路中是否有 CUPS 網路伺服器。

netcat -u -l -p 631 & PID=$! ; sleep 40 ; kill $PID

如果廣播 CUPS 網路伺服器存在,輸出將如 範例 11.3, "來自 CUPS 網路伺服器的廣播" 中所示。

範例 11.3. 來自 CUPS 網路伺服器的廣播

ipp://host.domain:631/printers/queue

可使用以下指令來測試是否可建立到主機cupsd (連接埠 631) 的 TCP 連線:

netcat -z host 631 && echo ok || echo failed

如果無法建立對 cupsd 的連線,則 cupsd 可能不是作用中或可能有基本的網路問題。假設對應的 cupsd 是作用中的,而且主機可以接受查詢,則 lpstat -h host -l -t 會傳回在 主機 上所有佇列的狀態報告。

此指令可用來測試 主機 上的 佇列 是否可接受由單一換行字元組成的列印工作。應該不會印出任何資料。可能會退出一張空白頁。

echo -en "\r" \
  | lp -d queue -h host
網路列印或列印伺服器盒疑難排解

在列印伺服器盒中執行的暫存序列器在執行大量列印工作時,有時會造成問題。因為這是列印伺服器盒中的暫存序列器所造成,您無法解決此問題。處理方式是,透過 TCP 插槽將印表機直接連接到列印伺服器盒,以規避列印伺服器盒中的暫存序列器。請參閱 節 11.4.2, "網路印表機"

利用此方法,可減少列印伺服器盒在不同資料格式之間的轉換問題 (TCP/IP 網路和本地印表機連線)。若要使用此方法,您必須知道列印伺服器盒上的TCP 連接埠。如果印表機連接到列印伺服器盒且電源開啟,此 TCP 連接埠通常可在列印伺服器盒電源開啟一段時間之後,以 nmap 套件的 nmap 公用程式決定。例如,nmap IP 位址 會傳送列印伺服器盒的以下輸出:

Port       State       Service
23/tcp     open        telnet
80/tcp     open        http
515/tcp    open        printer
631/tcp    open        cups
9100/tcp   open        jetdirect

此輸出表示連接到列印伺服器盒的印表機可透過連接埠 9100 上的 TCP 插槽定址。根據預設,nmap 僅會檢查幾個 /usr/share/nmap/nmap-services 中所列出一般熟知的連接埠。若要檢查所有可能的連接埠,請使用指令 nmap -p來源連接埠-目的連接埠 IP 位址。這可能會花費一些時間。如需進一步資訊,請參閱 nmap man 頁面。

輸入以下指令

echo -en "\rHello\r\f" | netcat -w 1 IP-address port
cat file | netcat -w 1 IP-address port

將字元字串或檔案直接傳送到對應連接埠以測試印表機是否可在此連接埠上定址。

11.7.5. 列印成品損毀而無錯誤訊息

對列印系統而言,在 CUPS 後端完成資料至接收者 (印表機) 的資料傳輸時,列印工作便完成。如果接收者的進一步處理失敗 (例如,如果印表機無法列印印表機特定資料),列印系統並不知道。如果印表機無法列印印表機特定資料,請選取更適用於印表機的不同 PPD 檔案。

11.7.6. 停用佇列

如果到接收者的資料傳輸在數次嘗試之後完全失敗,CUPS 後端 (如 usbsocket) 會向列印系統報告錯誤 (向 cupsd)。後端會決定在報告資料傳輸失敗之前,是否要繼續嘗試以及要嘗試幾次是合理的。因為進一步的嘗試可能徒勞無功,cupsd 會停用對應佇列的列印。除去問題的起因之後,系統管理者必須以指令 /usr/bin/enable 重新啟動列印。

11.7.7. CUPS 瀏覽:刪除列印工作

如果 CUPS 網路伺服器透過瀏覽向用戶端主機廣播它的佇列,而且在用戶端主機上有適合的本地 cupsd 在作用中,用戶端 cupsd 會從應用程式接收列印工作,並將它們轉送給伺服器上的 cupsd。當 cupsd 接收列印工作時,會被指定新的工作號碼。因此,用戶端主機上的工作號碼和伺服器上的工作號碼不同。因為列印工作通常會立刻轉送,所以無法以用戶端主機上的工作號碼來刪除,因為用戶端 cupsd 一旦將列印工作轉送給伺服器 cupsd,便認為列印工作已完成。

若要刪除伺服器上的列印工作,假使伺服器尚未完成列印工作 (也就是,傳送給印表機),請使用像 lpstat -h print-server -o 這類的指令來決定伺服器上的工作編號。使用此工作號碼,伺服器上的列印工作便可刪除:

cancel -h print-server queue-jobnnumber

11.7.8. 損毀的列印工作與資料傳輸錯誤

如果您在列印程序中將印表機電源關閉再打開,或是關機再重新啟動電腦,列印工作仍然在佇列中,而且會繼續列印。必須以 cancel 將損毀的列印工作從佇列中移除。

如果列印工作損毀,或是主機和印表機之間的通訊發生問題,印表機會印出數頁含有不明字元的紙張,因為它無法正確地處理資料。若要處理這個問題,請遵循下列步驟:

  1. 若要停止列印,請從噴墨印表機取出所有紙張,或是打開雷射印表機的紙匣。高品質的印表機會有按鈕可取消目前的列印成品。

  2. 列印工作可能仍在佇列中,因為只有將工作完全傳送到印表機之後,才會移除。使用 lpstat -olpstat -h 列印伺服器 -o 檢查目前列印中的佇列。以 cancel 佇列-工作編號 (或 cancel -h 列印伺服器 佇列-工作編號) 刪除列印工作。

  3. 即使列印工作已從佇列刪除,部份資料可能仍會傳送到印表機。請檢查對應佇列的 CUPS 後端程序是否仍在執行中,並將它終止。例如,對於連接到並列埠的印表機,可使用指令 fuser -k /dev/lp0 來終止仍然在存取印表機 (更精確的說是並列埠) 的所有程序。

  4. 將印表機關閉一段時間以完全重設印表機。然後裝入紙張並開啟印表機電源。

11.7.9. 除錯 CUPS 列印系統

使用以下標準程序以找出 CUPS 列印系統中的問題:

  1. 設定 /etc/cups/cupsd.conf 中的 LogLevel debug

  2. 停止 cupsd

  3. 移除 /var/log/cups/error_log* 以避免必須搜尋很大的記錄檔。

  4. 啟動 cupsd

  5. 重覆造成問題的動作。

  6. 檢查 /var/log/cups/error_log* 中的訊息以辨識問題的起因。

11.7.10. 如需詳細資訊

許多特定問題的解決方法在「SUSE 支援資料庫」(http://portal.suse.com/) 中都有說明。請用關鍵字搜尋找出相關文章。