Хочу поделиться найденным решением по пробросу принтера HP LaserJet 1000 в контейнер, созданый при помощи LXD.
Немного предыстории
Есть домашний сервер на базе старого ноутбука Acer Aspire 5520G, который используется для всяких экспериментов. На нем была установлена Ubuntu 14.04 и создано несколько контейнеров при помощи LXC, один из которых использовался как принт-сервер.
Проброс принтера был осуществлен путем добавления в файл конфигурации гостя следующих строк:
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
Все работало отлично, но захотелось обновиться до Ubuntu 16.04 и попробовать LXD.
Оказалось, что старые файлы конфигурации не работают и нужно искать новое решение. Вот им-то и хочу поделиться.
Приступаем к пробросу
Итак, Ubuntu 16.04+LXD установлены, контейнер на базе той же Ubuntu 16.04 создан, приступаем к пробросу.
Для начала выясним, куда подключен принтер на хосте:
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, другими словами, ему соответствует unix-char файл /dev/bus/usb/003/002
Выясним, кто является его владельцем и с какими правами:
root@aspire-5520g:~# ls -l /dev/bus/usb/003/002
crw-rw-r-- 1 root lp 189, 257 Июл 15 16:02 /dev/bus/usb/003/002
Файл принадлежит пользователю root и группе lp, права на файл 0664. Данная информация пригодится нам в будущем.
Выясним, какой числовой идентификатор у группы lp:
root@aspire-5520g:~# cat /etc/group | egrep lp
lp:x:7:
Группа lp имеет числовой идентификатор 7.
Теперь выясним, кто является владельцем и с какими правами, файла lp0:
root@aspire-5520g:~# ls -l /dev/usb/lp0
crw-rw---- 1 root lp 180, 0 Июл 15 16:02 /dev/usb/lp0
Файл принадлежит пользователю root и группе lp с правами 0660.
Пробросим принтер в контейнер
На самом деле, все оказалось не сильно и сложно. В моем случае контейнер называется print, а устройство я решил назвать lj1000. Для проброса нужно выполнить несколько простых манипуляций:
root@aspire-5520g:~# lxc config device add print lj1000 unix-char path=/dev/bus/usb/003/002 mode=0664 gid=7
Устройство lj1000 добавляется к print
root@aspire-5520g:~# lxc config device add print lp0 unix-char path=/dev/usb/lp0 gid=7
Устройство lp0 добавляется к print
Первая команда осуществляет проброс unix-char устройства с правами 0664 и принадлежащего группе 7 (lp), вторая команда осуществляет проброс устройства lp0 с правами по умолчанию (0660) и принадлежащего той же группе 7.
Вот и все. Проброс устройства осуществлен. Далее необходимо установить принтер в контейнере:
root@aspire-5520g:~# lxc exec print -- apt update && apt upgrade -y && apt install hplip -y
root@aspire-5520g:~# lxc exec print -- hp-setup -i
Здесь просто следуем инструкции установщика. Результатом должна стать распечатанная пробная страница печати.
Вот и все, вот таким способом пробрасывается принтер внутрь контейнера созданного при помощи LXD. Думаю, что любое другое устройство пробрасывается подобным способом.
Всем спасибо за внимание.
Автор: cyber-punk