Задать вопрос
@cyber-punk

Как пробросить USB-принтер в LXD контейнер?

До этого пользовался LXC контейнерами на ubuntu 14.04, там прописывал в файле конфигурации проброс принтера в виде:
lxc.cgroup.devices.allow = c 189:* rwm
lxc.mount.entry = /dev/bus/usb/003 dev/bus/usb/003 none bind,optional,create=dir
lxc.mount.entry = /dev/usb/lp0 dev/usb/lp0 none bind,optional,create=file


Как произвести проброс (в данном случае принтера, но не суть, похожим способом, думаю, можно пробросить и другие устройства), при помощи LXD?
  • Вопрос задан
  • 1459 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@cyber-punk Автор вопроса
Окончательное решение найдено!
Получилось пробросить, установить и заставить печатать принтер 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.
Всем спасибо за внимание!!!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы