Sé que puedo asignar IP estática manualmente, usando /etc/network/interfaces.
También sé que puedo leer la dirección MAC del contenedor LXC (por ejemplo, buscando la lxc.network.hwaddrentrada /var/lib/lxc/<container-name>/configy asignando la IP utilizando las entradas dhcp-host=<mac-addr>,10.0.3.3en /etc/dnsmasq.d/<some file>.
En el archivo /etc/default/lxc-netleí
# 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
Eso satisfaría mis necesidades; desafortunadamente hacerlo no tiene efecto.

lxc-netno ayuda si no quitas tu puente lxcbr0. Mira mi respuesta.Respuestas:
Me encontré con esto recientemente y creo que encontré una solución fácil. (Solo) lo probé en Ubuntu 14.04.
Primero, descomente esta línea / etc / default / lxc-net:
En /etc/lxc/dnsmasq.conf, defina un archivo dhcp-hosts:
Luego agregue entradas en /etc/lxc/dnsmasq-hosts.conf así:
Cuidado: los cambios se harán efectivos después de reiniciar lxc-net (que reinicia dnsmasq):
Luego puede modificar /etc/lxc/dnsmasq-hosts.conf y enviar la señal SIGHUP a dnsmasq:
Entonces sí, necesita reiniciar lxc-net, pero solo una vez. Espero que esto ayude.
fuente
killall -s SIGHUP dnsmasq. Estoy de acuerdo, que solo "SIGHUP-ing" dnsmasq es más eficiente que reiniciar todo el demonio (especialmente si no funciona sin parchear sus scripts de inicio).lxc-netsolo es necesario para que dnsmasq use la configuración de /etc/lxc/dnsmasq.conf (y esta información está presente en lo/etc/default/lxc-netque es desconocido para eldnsmasq). Si lo configuró antes, solo bastará con otro SIGHUP.kill -HUP $(cat /var/run/lxc/dnsmasq.pid)si no desea instalarkillallo volver a cargar otrasdnsmasqinstanciasFunciona bien en Ubuntu 14.04.1
Descomenta esta línea
/etc/default/lxc-netDetenga todos los contenedores, reinicie lxc-net:
Configurar direcciones IP en
/etc/lxc/dnsmasq.confdonde
{NAME}está el nombre de su contenedor LXC:fuente
/var/lib/lxc/<container-name>/rootfs/etc/network/interfacesarchivo y asignar una dirección IP estática al contenedor.La respuesta de Tombart funciona si tiene la paciencia suficiente para esperar la actualización de DNS Y está dispuesto a reiniciar el contenedor (el invitado) después.
Lo que sigue es la receta que requiere que todos los demás contenedores lxc que se estén ejecutando estén cerrados . Si no puede permitirse eso, entonces no veo forma de forzar una nueva configuración de dnsmasq. (Para algunos HUP de señalización razonable al pid de dnsmasq que se encuentra
/run/lxc/dnsmasq.pidtampoco funciona).Entonces, si desea tener algo que funcione instantáneamente y no hay otros contenedores lxc ejecutándose, siga mi respuesta.
$namees el nombre del nodo para el que queremos restablecer la asignación y$internalifes el nombre del adaptador puenteado de LXC. Puede obtener el valor de$internalifcon, por ejemplo,augtool -L -A --transform "Shellvars incl /etc/default/lxc-net" get "/files/etc/default/lxc-net/LXC_BRIDGE" | sed -En 's/\/.* = (.*)/\1/p'si instala,augeas-toolspero generalmente es justolxcbr0.Desafortunadamente, hay un error (¿característica?) En
/etc/init/lxc-net.confUbuntu 14.04 que impide la recarga adnsmasqmenos que el dispositivo puente esté inactivo para el host.fuente
Esta solución funciona parcheando los scripts de inicio lxc. Divide la compleja tarea de levantar el puente lxcbr0 y comenzar un
dnsmasqen dos trabajos separados. Ahora no necesita reiniciar todo ellxc-netpuente para volver a cargarlo: ladnsmasqrecargasudo service restart lxc-dnsmasqes suficiente y no requiere cerrar el puente.sudo service lxc-net stopy asegúrese de que no haya un puente lxcbr0 (o equivalente)./etc/init/lxc-net.confcon el siguiente contenido:.
/etc/init/lxc-dnsmasqcon los siguientes contenidos:.
fuente
Aquí hay una secuencia de comandos simple de Python que lanza el contrato de arrendamiento dnsmasq de LXC. Puede ejecutarlo desde la máquina host o falsificarlo desde otro contenedor, ¡sí, eso funciona !:
El requisito previo para lo anterior es la biblioteca de python scapy:
Una vez ejecutado, debería ver en el registro del sistema algo como:
Para confirmar, simplemente verifique si se eliminó la entrada de
/var/lib/misc/dnsmasq.lxcbr0.leases. El contenedor mismo mantendrá la IP, por lo que debe detenerse antes de comenzar cualquier contenedor nuevo que deba reutilizar la IP.fuente
Me doy cuenta de que mi respuesta lleva años de retraso, pero tal vez ayude a alguien más. ¡El problema fue que editó el código específico del paquete (
write_lxc_netfunción) Ubuntu LXC que estaba destinado a escribirse en otro destino como una cadena, no procesado dentro dellxc-netscript mismo!Como resultado, el proceso dnsmasq no recibió el archivo de configuración que intentó pasar, dejándolo "sin efecto", como usted dice.
En su lugar, desearía establecer esta variable cerca de la parte superior del script, entre el resto:
fuente