Проброс WiFi в LXC контейнер

2017-05-01

Я уже писал про LXC-контейнеры и относительно успешный опыт их использования в домашних условиях. Трудятся они до сих пор на Cubieboard2 с двумя ядрами и на гигабайте ОЗУ.

Понадобилось мне тут “отдать” подключенный по USB WiFi-свисток в контейнер. Изучение вопроса показало, что нужно разрешить их в cgroups вроде вот такого:

lxc.cgroup.devices.allow: c 166:* rwm

Ну и дополнительно - сделать mount на устройство в конфиге. Так, если у вас какой-нибудь модем-конвертер, бла бла - пишем вот такое:

lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file

И устройство /dev/ttyACM0 магическим образом доступно внутри контейнера.

Так вот с сетевыми интерфейсами всё не совсем так. Сетевую карту (проводную) можно пробросить вот так:

lxc.network.type=phys lxc.network.link=eth3 lxc.network.name=eth1

Так, сетевая карта eth3 будет в контейнере и там к ней можно будет обращаться по имени eth1.

Засада в том, что для WiFi это не работает. И вот здесь написано, почему. Одновременно с этим, пользователи сообщают, что команда вида:

lxc-device -n my_container add wlan0

прекрасно работает. Правда контейнер должен уже работать.

Решение получилось далеко не очень “чистым” - делаем простой шелл скрипт:

#!/bin/sh lxc-wait -n my_container -s RUNNING lxc-device -n my_container add wlan0

В первой строке - дожидаемся, когда контейнер перейдет в состояние “запущен”. Во второй - отдаем устройство. Теперь достаточно прописать в rc.local строку:

/usr/local/bin_lxc_wifi.sh &

Очень важно поставить “&” в конце строки - чтобы скрипт работал в “бэкграунде”.

Когда скрипт запущен - контейнер при старте подхватит устройство. Если забыть запустить скрипт, то контейнер во время загрузки системы “залипнет” в ожидании интерфейса, если конечно он там сконфигурирован.

Да, кстати правила iptables отлично работают в отдельном привелигерованном контейнере без приседаний с виртуализацией модуля ядра (выкуси, OpenVZ!).

Теперь есть ощущение завершенности проекта - сервисы разделены по контейнерам, которые в свою очередь разделены на логические группы. Ну и “посреди гостинной не торчат водопроводные трубы”.


В массы

В трубу