Я знаю, что могу назначить статический IP вручную, используя /etc/network/interfaces
.
Я также знаю, что я могу прочитать MAC-адрес контейнера LXC (например, ища lxc.network.hwaddr
запись в /var/lib/lxc/<container-name>/config
и назначать IP на основе записей dhcp-host=<mac-addr>,10.0.3.3
в /etc/dnsmasq.d/<some file>
.
В файле, который /etc/default/lxc-net
я прочитал
# Uncomment the next line if you'd like to use a conf-file for the lxcbr0
# dnsmasq. For instance, you can use 'dhcp-host=mail1,10.0.3.100' to have
# container 'mail1' always get ip address 10.0.3.100.
#LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
Это будет соответствовать моим потребностям; к сожалению, это не имеет никакого эффекта.
lxc-net
не поможет, если вы не удалите мост lxcbr0. Смотри мой ответ.Ответы:
Я столкнулся с этим недавно, и я думаю, что нашел простое решение. Я (только) проверил это на Ubuntu 14.04.
Во-первых, раскомментируйте эту строку / etc / default / lxc-net:
В /etc/lxc/dnsmasq.conf определите файл dhcp-hosts:
Затем добавьте записи в /etc/lxc/dnsmasq-hosts.conf следующим образом:
Осторожно: изменения вступят в силу после перезапуска lxc-net (который перезапускает dnsmasq):
После этого вы можете изменить /etc/lxc/dnsmasq-hosts.conf и отправить сигнал SIGHUP в dnsmasq:
Так что да, вам нужно перезапустить lxc-net, но только один раз. Надеюсь это поможет.
источник
killall -s SIGHUP dnsmasq
. Я согласен, что просто «SIGHUP-ing» dnsmasq более эффективен, чем перезапуск всего демона (особенно, если он не работает без исправления его сценариев выскочки).lxc-net
необходим только для того, чтобы позволить dnsmasq использовать конфигурацию из /etc/lxc/dnsmasq.conf (и этот фрагмент информации присутствует в/etc/default/lxc-net
неизвестном дляdnsmasq
). Если вы установили его раньше, достаточно еще одного SIGHUP.kill -HUP $(cat /var/run/lxc/dnsmasq.pid)
если вы не хотите устанавливатьkillall
или перезагружать другиеdnsmasq
экземплярыРаботает нормально в Ubuntu 14.04.1
Раскомментируйте эту строку
/etc/default/lxc-net
остановите все контейнеры, перезапустите lxc-net:
Настройте IP-адреса в
/etc/lxc/dnsmasq.conf
где
{NAME}
имя вашего контейнера LXC:источник
/var/lib/lxc/<container-name>/rootfs/etc/network/interfaces
файла и назначения статического IP-адреса для контейнера.Ответ Tombart работает, если вы достаточно терпеливы, чтобы дождаться обновления DNS, и вы готовы перезапустить контейнер (гость) после этого.
Далее следует рецепт, который требует, чтобы все остальные, возможно, работающие контейнеры lxc были закрыты . Если вы не можете себе этого позволить, то я не вижу способа заставить новую конфигурацию dnsmasq. (Для некоторой причины сигнализация HUP к pid dnsmasq, найденному в,
/run/lxc/dnsmasq.pid
тоже не работает.)Поэтому, если вы хотите, чтобы что-то работало мгновенно, а другие контейнеры lxc не запущены, следуйте моему ответу.
$name
это имя узла, для которого мы хотим сбросить назначение, и$internalif
это имя мостового адаптера LXC. Вы можете получить значение$internalif
с, например,augtool -L -A --transform "Shellvars incl /etc/default/lxc-net" get "/files/etc/default/lxc-net/LXC_BRIDGE" | sed -En 's/\/.* = (.*)/\1/p'
если вы устанавливаете,augeas-tools
но обычно это простоlxcbr0
.К сожалению,
/etc/init/lxc-net.conf
в Ubuntu 14.04 есть ошибка (функция?), Которая предотвращает перезагрузку,dnsmasq
если мостовое устройство не отключено для хоста.источник
Это решение работает путем исправления сценариев lxc upstart. Он разбивает сложную задачу по созданию моста lxcbr0 и запуску
dnsmasq
в два отдельных задания. Теперь вам не нужно перезагружать весьlxc-net
мост, чтобы просто перезагрузитьdnsmasq
- перезагрузкаsudo service restart lxc-dnsmasq
достаточна и не требует выключения моста.sudo service lxc-net stop
и убедитесь, что нет моста lxcbr0 (или эквивалентного)./etc/init/lxc-net.conf
следующим содержимым:,
/etc/init/lxc-dnsmasq
со следующим содержимым:,
источник
Вот простой скрипт на python, который выпускает LXC dnsmasq rent. Вы можете запустить его с хост-машины или подделать из другого контейнера - да, это работает !:
Перечисленным выше условием является библиотека scapy python:
После запуска вы должны увидеть в системном журнале что-то вроде:
Для подтверждения просто проверьте, если запись удалена из
/var/lib/misc/dnsmasq.lxcbr0.leases
. Сам контейнер будет сохранять IP-адрес, поэтому его следует остановить перед запуском любого нового контейнера, который должен повторно использовать IP-адрес.источник
Я понимаю, что мой ответ опоздал на несколько лет, но, возможно, он поможет кому-то еще. Проблема заключалась в том, что вы редактировали код, специфичный для пакета (
write_lxc_net
функции) LXC Ubuntu, который предназначался для записи в другое место назначения в виде строки, а не для обработки внутри самогоlxc-net
скрипта!В результате процесс dnsmasq не получил файл конфигурации, который вы пытались пропустить, и у вас, как вы говорите, не было никакого эффекта.
Вместо этого вы хотите установить эту переменную в верхней части скрипта, среди остальных:
источник