Окончательное решение найдено!
Получилось пробросить, установить и заставить печатать принтер HP LaserJet 1000 (win-принтер) из контейнера LXD.
Итак, за эталон берем конфиг от Ubuntu 14.04 на котором все работало и пытаемся сделать тоже самое, но в LXD.
Для проброса USB-принтер в LXD контейнер (в моем примере я использую принтер HP LaserJet 1000, контейнер предварительно развернут на базе Ubuntu 16.04 и называется "print") необходимо проделать следующее:
- Выяснить, куда подключен принтер
Для этого на хосте вводим lsusb
root@aspire-5520g:~# lsusb
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 0bda:8197 Realtek Semiconductor Corp. RTL8187B Wireless Adapter
Bus 001 Device 003: ID 5986:0102 Acer, Inc Crystal Eye Webcam
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 002: ID 03f0:0517 Hewlett-Packard LaserJet 1000
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Принтер подключен на Bus 003 Device 002.
- Проверить, в контейнере, а при необходимости доустановить, поддержку usbutils
Переходим в контейнер:
root@aspire-5520g:~# lxc exec print -- bash
root@print:~# lsusb
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 0bda:8197 Realtek Semiconductor Corp. RTL8187B Wireless Adapter
Bus 001 Device 003: ID 5986:0102 Acer, Inc Crystal Eye Webcam
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 002: ID 03f0:0517 Hewlett-Packard LaserJet 1000
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
В моем случае поддержка usbutils и поддержка принтеров HP, через hplip, уже установлена.
Для тех у кого не установлена, нужно в контейнере выполнить:
root@print:~# apt install usbutils hplip -y
- Далее на хосте нужно выполнить непосредственно проброс USB-принтера в LXD контейнер.
На предыдущих этапах мы выяснили, что принтер подключен на Bus 003 Device 002 на хосте.
Теперь необходимо выяснить кому принадлежат и с какими правами файлы устройств на хосте, а также цифровой идентификатор группы gid.
Для этого выполним:
root@aspire-5520g:~# ll /dev/bus/usb/003
итого 0
drwxr-xr-x 2 root root 80 Июл 14 21:00 ./
drwxr-xr-x 6 root root 120 Июл 14 21:00 ../
crw-rw-r-- 1 root root 189, 256 Июл 14 21:00 001
crw-rw-r-- 1 root lp 189, 257 Июл 15 10:56 002
Интересующая нас информация это файл 002, который представляет из себя char-устройство, владельцем которого является пользователь root и группа lp. Права у этого файла 0664.
Теперь выясним числовой идентификатор группы lp:
root@aspire-5520g:~# cat /etc/group | egrep lp
lp:x:7:
Числовой идентификатор группы 7.
Ну и наконец, выполним создание этих устройств в контейнере. Для этого выполним:
root@aspire-5520g:~# lxc config device add print lj1000 unix-char path=/dev/bus/usb/003/002 mode=0664 gid=7
Device lj1000 added to print
root@aspire-5520g:~# lxc config device add print lp0 unix-char path=/dev/usb/lp0 gid=7
Device lp0 added to print
(По умолчанию unix-char устройство создается с правами 0660, поэтому задание mode=0660 во второй комманде можно опустить)
root@aspire-5520g:~# lxc exec print -- hp-setup -i
Действуем согласно инструкции выводимой скриптом установки.
По завершении, скрипт предложит распечатать пробную страницу, соглашаемся и прыгаем от счастья по поводу успешного проброса принтера в контейнер LXD.
Ура товарищи!!!
Для добавления автозапуска контейнера после перезагрузки выполним:
root@aspire-5520g:~# lxc config set print boot.autostart true
root@aspire-5520g:~# lxc config set print boot.autostart.delay 5
Это позволит автоматически через 5 секунд после перезагрузки хоста запустить контейнер.
Единственная проблема с которой можно столкнуться - это нумерация устройства на шине, после передергивания USB шнура в другой порт или в тот же порт с небольшим промежутком времени, но это уже совсем другая история. В качестве наводки могу сказать, что можно привязать устройство к шине (при условии подключения в тот же порт USB) посредством серийного номера устройства и такой замечательной вещи, как udev.
Всем спасибо за внимание!!!