[Из песочницы] Проброс USB-принтера в контейнер LXD
Хочу поделиться найденным решением по пробросу принтера HP LaserJet 1000 в контейнер, созданый при помощи LXD.
Есть домашний сервер на базе старого ноутбука Acer Aspire 5520G, который используется для всяких экспериментов. На нем была установлена Ubuntu 14.04 и создано несколько контейнеров при помощи LXC, один из которых использовался как принт-сервер.
Все работало отлично, но захотелось обновиться до Ubuntu 16.04 и попробовать LXD.
Итак, Ubuntu 16.04+LXD установлены, контейнер на базе той же Ubuntu 16.04 создан, приступаем к пробросу.
Для начала выясним, куда подключен принтер на хосте:
Принтер подключен на Bus 003 Device 002, другими словами, ему соответствует unix-char файл /dev/bus/usb/003/002
Выясним, кто является его владельцем и с какими правами:
Файл принадлежит пользователю root и группе lp, права на файл 0664. Данная информация пригодится нам в будущем.
Выясним, какой числовой идентификатор у группы lp:
Группа lp имеет числовой идентификатор 7.
Теперь выясним, кто является владельцем и с какими правами, файла lp0:
Файл принадлежит пользователю root и группе lp с правами 0660.
На самом деле, все оказалось не сильно и сложно. В моем случае контейнер называется print, а устройство я решил назвать lj1000. Для проброса нужно выполнить несколько простых манипуляций:
Первая команда осуществляет проброс unix-char устройства с правами 0664 и принадлежащего группе 7 (lp), вторая команда осуществляет проброс устройства lp0 с правами по умолчанию (0660) и принадлежащего той же группе 7.
Здесь просто следуем инструкции установщика. Результатом должна стать распечатанная пробная страница печати.
Немного предыстории
Есть домашний сервер на базе старого ноутбука 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. Думаю, что любое другое устройство пробрасывается подобным способом.
Всем спасибо за внимание.
Комментарии (3)
20 июля 2016 в 23:05
0↑
↓
Адреса устройств USB могут меняться при включении даже в тот же самый порт. Как Вы решаете эту проблему?Замечу также, что команда
getent group lp
предпочтительнее, чем
, так как оперирует NSS, а не только файлами и делает в точности то, что нужноcat /etc/group | egrep lp
21 июля 2016 в 00:44
0↑
↓
Но стоит помнить, что getent входит в libc-bin, которая может быть не всюду установлена. В том же контейнере её может не быть21 июля 2016 в 06:54 (комментарий был изменён)
0↑
↓
Адреса устройств меняются только в том случае, если вы пытаетесь переключить устройство в другой порт, или переподключить в тот же порт с малым промежутком времени. При переподключении в тот же порт с малым промежутком времени, можно написать правило в udev, закрепив принтер по серийному номеру.
При перезагрузке ни разу не наблюдал, чтобы устройство, которое подключено к одному и тому же порту меняло адрес. (Эксплуатирую данное решение не долго, но до этого, как и описывал, эксплуатировал решение на Ubuntu 14.04 и LXC 1.0, проблем не замечено)