USB Printing in VE

From OpenVZ Virtuozzo Containers Wiki
Jump to: navigation, search

This howto tries to cover the "device" configuration for printing with a USB printer in a Container. Please refer to your specific distro for required printing packages. Please note that ownership/permission/devices are referred to my system and you have to adapt to YOUR configuration: they are reported only as an EXAMPLE.

  • Install usbutils in both HN and VE.
  • In a shell on HN type lsusb and you'll get the list fo the usb devices on your system:
 Bus 002 Device 006: ID 0dda:2026 Integrated Circuit Solution, Inc. USB2.0 Card Reader
 Bus 002 Device 005: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
 Bus 002 Device 003: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
 Bus 002 Device 001: ID 1d6b:0002  
 Bus 008 Device 005: ID 04b8:0005 Seiko Epson Corp. Stylus Printer
 Bus 008 Device 001: ID 1d6b:0001  
 Bus 007 Device 002: ID 046d:c044 Logitech, Inc. 
 Bus 007 Device 001: ID 1d6b:0001  
 Bus 006 Device 002: ID 051d:0002 American Power Conversion Uninterruptible Power Supply 
 Bus 006 Device 001: ID 1d6b:0001  
 Bus 001 Device 001: ID 1d6b:0002  
 Bus 005 Device 001: ID 1d6b:0001  
 Bus 004 Device 001: ID 1d6b:0001  
 Bus 003 Device 001: ID 1d6b:0001 
  • Now examine the output of your command and you'll see two important lines: one for your printer and one for the usb port at which is attached, in my case:
 Bus 008 Device 005: ID 04b8:0005 Seiko Epson Corp. Stylus Printer
 Bus 008 Device 001: ID 1d6b:0001
  • In /dev directory in HN you should have:
    • a symlink to your usb printer: lrwxrwxrwx 1 root root 7 Nov 28 14:14 usblp0 -> usb/lp0
    • a usb directory
    • a printer inside the /dev/usb directory: crw-rw---- 1 root lp 180, 0 Nov 28 14:14 lp0
    • a bus/usb directory
    • many directories in bus/usb: named with the bus number that you got with the first lsusb command. In this example the relevant one is 008
    • in the numbered subdirectory 1 file for every usb device attached to this bus, the first one is the usb port:
      • crw-rw-r-- 1 root usb 189, 896 Nov 24 16:16 001
      • crw-rw-r-- 1 root usb 189, 900 Nov 28 14:14 005
  • Now that you have an idea of the general structure of your usb devices you have to replicate them on your VE.
    • enter your VE: vzctl enter VE_NUMBER
    • create in /dev (if not present) the usb directory
    • create in /dev/usb the printer device typing: mknod lp0 c 180 0
      • give the correct ownership/permission to the new created device typing:
        • chown root:lp lp0
        • chmod 660 lp0
        • check with ls -l lp0 if the new device is IDENTICAL to the one in HN --> crw-rw---- 1 root lp 180, 0 Nov 27 13:51 lp0
    • go back to /dev and create a symlink to the printer device: ln -s /dev/usb/lp0 /dev/usblp0
    • create all the needed directories:
      • mkdir /dev/bus
      • mkdir /dev/bus/usb
      • mkdir /dev/bus/usb/008
    • switch to /dev/bus/usb/008 directory and create there the needed devices: one for the usb port and one for the printer
      • mknod 001 c 189 896
      • mknod 005 c 189 900
    • assign ownership/permissions:
      • chown root:usb *
      • chmod 664 *
      • check everything: ls -l should give the same results as in HN:
      • crw-rw-r-- 1 root usb 189, 896 Nov 27 13:29 001
      • crw-rw-r-- 1 root usb 189, 900 Nov 27 13:30 005
  • Doublecheck everything!
  • Now edit your VE_NUMBER.conf adding this line: DEVICES="c:180:0:rw c:189:896:rw c:189:900:rw"
    • These are the devices replicated in the VE with mknod.
  • Almost there: restart your VE and enter it.
  • In VE type: lsusb and you should see the two devices created before:
 Bus 008 Device 005: ID 04b8:0005 Seiko Epson Corp. Stylus Printer
 Bus 008 Device 001: ID 1d6b:0001
  • If not RECHECK everything.
  • Start cups and access it via your browser
  • You should be able to see the printer attached to the usb port

Sample bash shell script for compute vzctl command for dynamically assigning some devices to one VZ

Be care, the command vzctl set xxx --devices "dddd" --devnodes "nnnn" --save will reassign the entire list of devices shared to one VZ, even suppressing some already presents.

 #!/bin/bash
 VZ=1234
 DEVICES="[bB]luetooth|[pP]rinter"
 
 VZDEV=""
 VZNOD=""
 
 while read A B C D E;do
   if [[ "$E" =~ (${DEVICES}) ]] ;then
       BUS=${B#0} DEV=${D%:}
       BUS=${B#0} DEV=${DEV#0}
       DEV=${DEV#0}
       VZDEV="$VZDEV c:189:$(((BUS-1)*128+DEV-1)):rw"
       VZNOD="$VZNOD bus/usb/$B/${D}rw"
       fi
   done < <(lsusb)
 
 printf "DEVICES=\"%s\"\n" "${VZDEV# }"
 printf "DEVNODES=\"%s\"\n" "${VZNOD# }"
 printf "vzctl set %d --devices '%s' --devnodes '%s' --save\n" $VZ "${VZDEV# }" "${VZNOD# }"