Я знаю, что я могу назначить статический 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
Это соответствовало бы моим потребностям, к сожалению, это не имеет никакого эффекта.
В последнее время я столкнулся с этим, и я думаю, что нашел легкое решение. I (только) проверил его на Ubuntu 14.04.
Сначала раскомментируем эту строку / etc / default / lxc-net:
LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
В /etc/lxc/dnsmasq.conf , определите файл dhcp-hosts:
dhcp-hostsfile=/etc/lxc/dnsmasq-hosts.conf
Затем добавьте записи в /etc/lxc/dnsmasq-hosts.conf следующим образом:
mail,10.0.3.16
web,10.0.3.17
Остерегайтесь: изменения вступят в силу после перезапуска lxc-net (который перезапускает dnsmasq):
service lxc-net restart
После этого вы можете изменить /etc/lxc/dnsmasq-hosts.conf и отправить сигнал SIGHUP в dnsmasq:
[ f5]Итак, да, вам нужно перезапустить lxc-net, но только один раз. Надеюсь, это поможет.
Он отлично работает в Ubuntu 14.04.1
Раскомментировать эту строку /etc/default/lxc-net
#LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
остановить все контейнеры, перезапустить lxc-net:
service lxc-net restart
Настроить ip-адреса в /etc/lxc/dnsmasq.conf
dhcp-host={NAME},10.0.3.2
, где {NAME} - имя вашего контейнера LXC:
/var/lib/lxc/{NAME}
Ответ Tombart работает, если вы достаточно терпеливы, чтобы ждать обновления DNS. После этого вы готовы перезапустить контейнер (гость).
Далее следует рецепт, который требует, чтобы все остальные, возможно, запущенные контейнеры lxc были закрыты. Если вы не можете этого себе позволить, я не вижу возможности форсировать новую конфигурацию dnsmasq. (Для какой-либо передачи сигналов HAS в pd 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.
sudo lxc-stop -n $name >/dev/null
sudo service lxc-net stop >/dev/null
if [ -d /sys/class/net/$internalif ]; then
sudo brctl delbr $internalif >/dev/null #Why? See below.
fi
sudo rm /var/lib/misc/dnsmasq.$internalif.leases
sudo service lxc-net start >/dev/null
sudo lxc-start -d -n $name >/dev/null
sleep 5
К сожалению, в /etc/init/lxc-net.conf в Ubuntu 14.04 есть ошибка (функция?), которая предотвращает перезагрузку dnsmasq, если мостовое устройство не установлено для хоста.
Вот простой скрипт python, который выпускает LXC dnsmasq lease. Вы можете запустить его с хост-компьютера или подделать его из другого контейнера - да, что работает!:
#!/usr/bin/env python
from scapy.all import *
conf.checkIPaddr=False
leaseMAC = '00:16:3e:11:71:b0' #container MAC here
releaseIP='10.0.3.33' #container IP here
serverIP='10.0.3.1'
hostname='container-name-here'
rawMAC = leaseMAC.replace(':','').decode('hex')
send(IP(dst=serverIP) / \
UDP(sport=68,dport=67) / \
BOOTP(chaddr=rawMAC, ciaddr=releaseIP, xid=RandInt()) / \
DHCP(options=[('message-type','release'),('server_id',serverIP),('hostname',hostname), ('end')]))
Перцепция для выше - это scapy python library:
pip install scapy
После запуска вы должны увидеть в системном журнале что-то вроде:
dnsmasq-dhcp[3242]: DHCPRELEASE(lxcbr0) 10.0.3.33 00:16:3e:11:71:b0 container-name-here
Чтобы подтвердить, просто проверьте, удалена ли запись из /var/lib/misc/dnsmasq.lxcbr0.leases. Сам контейнер будет поддерживать IP-адрес, поэтому его следует остановить до запуска любого нового контейнера, который должен повторно использовать IP.
Я понимаю, что мой ответ - это годы, но, возможно, это помогает кому-то другому. Проблема заключалась в том, что вы отредактировали код, специфичный для пакета LXC Ubuntu (функция write_lxc_net), который должен был быть записан в другое место назначения в виде строки, не обработанной в самом скрипте lxc-net!
As В результате процесс dnsmasq не получил конфигурационный файл, который вы пытались передать ему, оставив «без эффекта», как вы говорите.
Вместо этого вы хотите установить эту переменную в верхней части скрипта, среди остальных:
#!/bin/sh -
distrosysconfdir="/etc/default"
varrun="/run/lxc"
varlib="/var/lib"
# These can be overridden in /etc/default/lxc
# or in /etc/default/lxc-net
USE_LXC_BRIDGE="true"
LXC_BRIDGE="lxcbr0"
LXC_BRIDGE_MAC="00:16:3e:00:00:00"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
LXC_DHCP_MAX="253"
LXC_DHCP_CONFILE="/etc/lxc/dnsmasq.conf" <-- Here for instance
LXC_DOMAIN=""