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
- a symlink to your usb printer:
- 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
- give the correct ownership/permission to the new created device typing:
- 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
- enter your VE:
- 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 VZEdit
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# }"