About me

Monday 21 May 2018

Ubuntu下幾個Printer設定方式

      最近因為工作上的需求,所以開始在研究印表機的設定和行為,主要用GUI的方式有兩個,一個是使用『cups』,另一個則是使用你的桌面環境(desktop environments)的工具,像我的話就是用『gnome-control-center』裡面的『printer』工具來設定的。有時候你的環境沒有網路也沒有桌面環境的話,更進階有另外兩種方式可以設定你的印表機,一個是透過terminal上的『lpadmin』和ppd來加入你的印表機,令一個則是使用『udev-configure-printer』的工具。


      Ubuntu Support Printers

      Ununtu裡面所支援的印表機請參考:
      https://help.ubuntu.com/community/Printers


      IJS VS HPLIP

      因為這篇文裡面用的是HP的印表機,有用到HPLIP和IJS的東西,一開始我還蠻混亂的,所以就當筆記,寫一下這兩個東西的差別。

      HPLIP是給CUPS用的完整版 imaging and printing system,裡面已經有包含HPIJS了。
      而HPIJS則是HPLIP的子元件,提供了一些基本的列印功能,可以使用在CUPS, LPD, PPR和其他的spoolers上。

      其他的還有像是HPIJS提供了沒有postscript功能的印表機支援,也可以在沒有spoolers的環境上運作,無法提供IO。而HPLIP則提供了雙向(bi-directional)的IO溝通,並且可以掃描(scanning), photo card存取, 和toolbox的功能. 但是HPLIP則一定需要CUPS的spooler.



      新增印表機(cups web)

      首先介紹的是cups的網頁GUI設定方式,第一步需要先確定你的cups有沒有跑起來:

      systemctl status cups

      沒有的話,記得開起來:

      sudo systemctl start cups

      然後到網址:
      http://localhost:631/

      就可以看到如下的頁面:




      當然我沒有要細講這個GUI的功能,所以請簡單的按下『Adding Printers and Classes』->『Add Printer』

      下一步選擇偵測到的印表機:

 


      然後修改一些簡單的參數(名稱,描述和位置):




      最後確認,按下『Add Printer』:



      理論上就可以看到已經設定好了,看得出來用cups的介面還蠻簡單的:




      結束之後就可以試印看看了。


      新增印表機(gnome-control-center - Printers)

      啟動gnome-control-center,然後到『device』-> 『Printers』






      在下一步是『Additional Printer Settings』->『Add』->『Printer』,然後選擇你要安裝的印表機




      然後在修改一下參數:



      然後你就可以看到你的印表機系統已經幫你處理好了,透過這個系統工具也是蠻簡單的:



      結束之後就可以試印看看了。


      新增印表機(lpadmin)

      接下來這兩個就是要透過下命令的方式來加入你的印表機了


      顯示目前可用印表機的通道
      $ lpinfo -v
......
direct usb://HP/Officejet%20100%20Mobile%20L411?serial=MY52IF111T
direct hp:/usb/Officejet_100_Mobile_L411?serial=MY52IF111T
......


      顯示目前可用的drivers
      $ lpinfo -m | grep officejet_100
hplip:0/ppd/hplip/HP/hp-officejet_100_mobile_l411-hpijs.ppd HP Officejet 100 Mobile l411 hpijs, 3.17.7
drv:///hpcups.drv/hp-officejet_100_mobile_l411.ppd HP Officejet 100 Mobile l411, hpcups 3.17.7


      新增印表機

      理論上是使用『lpadm』來新增印表機,底下是會使用到的options:

      -p 'hp-officejet_100_mobile_l411' – 要被安裝印表機的名字
-v 'usb://HP/Officejet%20100%20Mobile%20L411?serial=MY52IF111T' – 這個印表機的位址
-m 'hplip:0/ppd/hplip/HP/hp-officejet_100_mobile_l411-hpijs.ppd' – ppd的位置
-L 'My Office' – 這個印表機的位置,可隨便填
-o 'Duplex=DuplexNoTumble' 
-o 'Quality=600GrayscaleK'
-o 'InputSlot=Default' – 上面這幾個 -o 都是印表機參數調整,選填
-E  – 加進去後順便啟動(Enable)這個印表機

      所以實際上要輸入的命令如下:

      $ lpadmin -p 'hp-officejet_100_mobile_l411' -m 'hplip:0/ppd/hplip/HP/hp-officejet_100_mobile_l411-hpijs.ppd' -v 'usb://HP/Officejet%20100%20Mobile%20L411?serial=MY52IF111T' -L 'My Office' -o 'Duplex=DuplexNoTumble' -o 'Quality=600GrayscaleK' -o 'InputSlot=Default' -E


      列舉印表機

      使用底下命令來列出剛剛安裝印表機資訊,這邊已經可以看到這台印表機已經被加上去了。

      $ lpstat -s
no system default destination
device for hp-officejet_100_mobile_l411: usb://HP/Officejet%20100%20Mobile%20L411?serial=MY52IF111T


      檢查印表機的組態檔
      sudo cat /etc/cups/printers.conf
      
        UUID urn:uuid:c87b10bb-868d-3e37-478c-dea8e5e32e67
        Info hp-officejet_100_mobile_l411
        Location My Office
        MakeModel HP Officejet 100 Mobile l411 hpijs, 3.17.7
        DeviceURI usb://HP/Officejet%20100%20Mobile%20L411?serial=MY52IF111T
        State Idle
        StateTime 1523520004
        ConfigTime 1523520004
        Type 8425500
        Accepting Yes
        Shared Yes
        JobSheets none none
        QuotaPeriod 0
        PageLimit 0
        KLimit 0
        OpPolicy default
        ErrorPolicy retry-job
        


      顯示或設定印表機參數

      這邊可以看到一些印表機的參數,當然也可以設定,列出來是要看一下剛剛的設定是否有設定進去

      $ lpoptions -l
PageSize/Media Size: *Letter A4 Photo Photo5x7 PhotoTearOff 3x5 5x8 A5 A6 A6TearOff B5JIS CDDVD80 CDDVD120 Env10 EnvC5 EnvC6 EnvDL EnvISOB5 EnvMonarch Executive FLSA Hagaki Legal Oufuku w558h774 w612h935 Custom.WIDTHxHEIGHT
PrintoutMode/Printout Mode: Draft Draft.Gray *Normal Normal.Gray High High.Gray Photo
InputSlot/Media Source: *Default PhotoTray Upper Lower CDDVDTray Envelope LargeCapacity Manual MPTray
Duplex/Double-Sided Printing: *DuplexNoTumble DuplexTumble None
DryTime/Additional Dry Time: *Zero Five Ten Fifteen Twenty TwentyFive Thirty
Quality/Resolution, Quality, Ink Type, Media Type: FromPrintoutMode 300ColorCMYK 300ColorCMYKFullBleed 300DraftColorCMYK 300DraftGrayscaleK 300FastDraftColorCMYK 300FastDraftGrayscaleK 300GrayscaleK 600ColorCMYK 600ColorCMYKFullBleed *600GrayscaleK 1200PhotoCMYK 1200PhotoCMYKFullBleed


      試印

      結束之後可以試印看看:

      echo "Hello Printer" | lpr -P hp-officejet_100_mobile_l411
      
      新增印表機(udev-configure-printer)

      首先,插進印表機後,看一下usb的資訊

      $lsusb
......
Bus 001 Device 028: ID 03f0:4912 Hewlett-Packard 
......

      然後因為我這台印表機是HP的,所以來用hplip的工具設定一下(下面的001:028就是剛剛lsusb列出來的Bus/Device資訊):

      sudo /usr/share/hplip/config_usb_printer.py 001:028

      查一下這個裝置在sysfs上面的路徑:

      $ udevadm info -q path -n /dev/usb/lp0
 /devices/pci0000\:00/0000\:00\:14.0/usb1/1-1/1-1.1

      然後在用udev的一個工具來新增印表機:

        $ sudo /lib/udev/udev-configure-printer add /devices/pci0000\:00/0000\:00\:14.0/usb1/1-1/1-1.1
      
      修改udev.rules來自動新增印表機

      剛剛講了幾種手動的方式去設定印表機,現在來講一下如何在插入USB時,就新增印表機,這部份主要是用udev的rules。

      看一下我系統裡面本來的設定:

      $ cat /lib/udev/rules.d/70-printers.rules

# Low-level USB device add trigger
ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:0701??:*", TAG+="udev-configure-printer", TAG+="systemd", PROGRAM="/bin/systemd-escape --template=udev-configure-printer@.service %p", ENV{SYSTEMD_WANTS}+="%c"

# Low-level USB device remove trigger
ACTION=="remove", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:0701*:*", RUN+="udev-configure-printer remove %p"


      發現ACTION『add』裡面沒有執行動作,所以在這邊加入一個動作『RUN』,但是我不想要去動到原本的rule,所以我新增了一個優先權比它大的rule,到時候會把原本的蓋過去:


      $ cat << EOF >/lib/udev/rules.d/71-hugh-printers.rules

# Low-level USB device add trigger
ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:0701??:*", TAG+="udev-configure-printer", TAG+="systemd", PROGRAM="/bin/systemd-escape --template=udev-configure-printer@.service %p", ENV{SYSTEMD_WANTS}+="%c" RUN+="udev-configure-printer add %p"

# Low-level USB device remove trigger ACTION=="remove", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:0701*:*", RUN+="udev-configure-printer remove %p"
  
EOF

      這邊會去用到剛剛所講解過的『udev-configure-printer』,意思就是只要kernel抓到這個device了以後,然後經過udev的rule匹配後,就會代參數的去呼叫『udev-configure-printer』,進而設定印表機。

      底下是一段udev ruler已經設定好了的狀況之下,插入印表機的log:


      kernel: usb 1-1.1: new high-speed USB device number 18 using xhci_hcd
      kernel: usb 1-1.1: New USB device found, idVendor=03f0, idProduct=4912
      kernel: usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
      kernel: usb 1-1.1: Product: Officejet 100 Mobile L411
      kernel: usb 1-1.1: Manufacturer: HP
      kernel: usb 1-1.1: SerialNumber: MY52IF111T
      kernel: usblp 1-1.1:1.0: usblp0: USB Bidirectional printer dev 18 if 0 alt 0 proto 2 vid 0x03F0 pid 0x4912

      kernel: usb-storage 1-1.1:1.2: USB Mass Storage device detected
      kernel: scsi host4: usb-storage 1-1.1:1.2
      root[11410]: loading HP Device 001 018
      # 上面這幾段代表Kenel已經抓到這個裝置了

      /hp-config_usb_printer[11414]: [11414]: error: Failed to create /root/.hplip
      /hp-config_usb_printer[11414]: io/hpmud/musb.c 2189: [11414] hpmud_make_usb_uri() bus=001 dev=018

      /hp-config_usb_printer[11414]: io/hpmud/musb.c 2287: hpmud_make_usb_uri() uri=hp:/
      usb/Officejet_100_Mobile_L411?serial=MY52IF111T bytes_read=51
      # 然後先呼叫hp-config_usb_printer來讀取一些設定

      # 然後底下就是『udev-configure-printer』真正的工作了,看得到設定完之後還會呼叫『udev-configure-printer』來新增印表機
      udev-configure-printer[11427]: add /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1
      udev-configure-printer[11427]: device devpath is /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1

      udev-configure-printer[11427]: MFG:HP MDL:Officejet 100 Mobile L411 SERN:MY52IF111T serial:MY52IF111T

      kernel: scsi 4:0:0:0: Direct-Access HP USB Mass Storage 1.00 PQ: 0 ANSI: 0
      kernel: sd 4:0:0:0: Attached scsi generic sg2 type 0
      kernel: sd 4:0:0:0: [sdc] Attached SCSI removable disk
      kernel: usblp0: removed
      kernel: usblp 1-1.1:1.0: usblp0: USB Bidirectional printer dev 18 if 0 alt 0 proto 2 vid 0x03F0 pid 0x4912

      udev-configure-printer[11427]: SERN fields match
      udev-configure-printer[11427]: URI match: hp:/usb/Officejet_100_Mobile_L411?serial=MY52IF111T

      udev-configure-printer[11427]: SERN fields match
      udev-configure-printer[11427]: URI match: usb://HP/Officejet%20100%20Mobile%20L411?serial=MY52IF111T

      udev-configure-printer[11427]: URI of detected printer: hp:/usb/Officejet_100_Mobile_L411?serial=MY52IF111T, normalized: officejet 100 mobile l411 serial my52if111t

      udev-configure-printer[11427]: URI of print queue: ipps://FX122f17.local:631/ipp/print, normalized: ipps fx122f17 local 631 ipp print

      udev-configure-printer[11427]: URI of detected printer: usb://HP/Officejet%20100%20Mobile%20L411?serial=MY52IF111T, normalized: officejet 100 mobile l411 serial my52if111t

      udev-configure-printer[11427]: About to add queue for hp:/usb/Officejet_100_Mobile_L411?serial=MY52IF111T

      udev-add-printer[11427]: add_queue: URIs=['hp:/usb/Officejet_100_Mobile_L411?serial=MY52IF111T', 'usb://HP/Officejet%20100%20Mobile%20L411?serial=MY52IF111T']

      udev-add-printer[11427]: PPD: drv:///hpcups.drv/hp-officejet_100_mobile_l411.ppd; Status: 0

      colord[1182]: failed to get session [pid 12647]: No data available
      dbus-daemon[2207]: Activating service name='org.fedoraproject.Config.Printing'
      dbus-daemon[2207]: Successfully activated service 'org.fedoraproject.Config.Printing'

      colord-sane[11526]: io/hpmud/musb.c 2101: Invalid usb_open: Permission denied
      colord-sane[11526]: io/hpmud/musb.c 2101: Invalid usb_open: Permission denied
      colord-sane[11526]: io/hpmud/musb.c 2101: Invalid usb_open: Permission denied
      org.fedoraproject.Config.Printing[2207]: /usr/share/system-config-printer/scp-dbus-service.py:26: PyGIWarning: Gdk was imported without specifying a version first. 
      Use gi.require_version('Gdk', '3.0') before import to ensure that the right version gets loaded.

      org.fedoraproject.Config.Printing[2207]: from gi.repository import Gdk
      org.fedoraproject.Config.Printing[2207]: /usr/share/system-config-printer/scp-dbus-service.py:27: PyGIWarning: Gtk was imported without specifying a version first. Use gi.require_version('Gtk', '3.0') before import to ensure that the right version gets loaded.

      org.fedoraproject.Config.Printing[2207]: from gi.repository import Gtk

      除錯

      如果新增印表機中間發生什麼問題的話,可以善用底下這幾個指令/log來找出問題到底在哪裡:
      1. syslog
      2. dmesg
      3. lpstat -p
      4. lpinfo -v
      5. lsusb -v
      6. /var/log/cups
      7. sudo journalctl -e



      
Ref 1. man lpstat 2. man lpadmin 3. man lpinfo 4. man lpoptions 5. man lp 6. man lpr 7. 12 CUPS lpadmin Command Examples to Setup Printers on Linux 8. https://blog.ostermiller.org/ubuntu-printer-install-command-line/ 9. https://en.wikipedia.org/wiki/CUPS 10. https://en.wikipedia.org/wiki/PostScript_Printer_Description 11. print-error-foomatic-rip-hplip-failed-864609 12. list-printers-ubuntu-command-line 13. print-from-command-line 14. Add Printer from Linux Console

No comments:

Post a Comment