sudo service lxc-net restart does not reload dnsmasq when there is a container running
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
lxc (Ubuntu) |
Fix Released
|
Low
|
Unassigned |
Bug Description
I know, that I can assign static IP manually, using /etc/network/
I also know, that I can read the MAC address of the LXC container (e.g. by looking for lxc.network.hwaddr entry in /var/lib/
In the file /etc/default/
# Uncomment the next line if you'd like to use a conf-file for the lxcbr0
# dnsmasq. For instance, you can use 'dhcp-host=
# container 'mail1' always get ip address 10.0.3.100.
#LXC_DHCP_
That would suit my needs; unfortunately doing so has no effect - at least not until the next computer reboot.
I would expect that `sudo service lxc-net restart` forces the dnsmasq to reload - unfortunately it never works.
To reproduce:
On Ubuntu Trusty 14.04 64bit,
1. install package lxc,
2. create a container (e.g. sudo lxc-create -n mycontainer -t ubuntu -- -r trusty)
3. start it (sudo lxc-start -d -n mycontainer)
4. create another container (e.g. sudo lxc-create -n my2ndcontainer -t ubuntu -- -r trusty)
5. edit /etc/default/
6. edit /etc/lxc/
7. sudo service lxc-net restart
8. start the 2nd container (sudo lxc-start -d -n my2ndcontainer)
The steps 2 and 3 are optional.
The 2nd container never gets the ip 10.0.3.142, but it keeps the assigned dynamic IP
Walkaround 1:
Turn off the computer and test again tomorrow.
Walkaround 2 (more serious, but works only if steps 2 and 3 are skipped):
name=my2ndcontainer
sudo lxc-stop -n $name >/dev/null
sudo service lxc-net stop >/dev/null
if [ -d /sys/class/
sudo brctl delbr $internalif >/dev/null #Why? See below.
fi
sudo rm /var/lib/
sudo service lxc-net start >/dev/null
sudo lxc-start -d -n $name >/dev/null
sleep 5
Unfortunately, there is a bug (feature?) in the /etc/init/
After consulting with Serge Hallyn, the original author of the upstart script that governs creation of the lxc-net bridge, I came up with the following solution:
1. Turn off all lxc containers and the lxc-net (sudo service lxc-net stop) lxc-net. conf lxc-net. conf with the following contents:
2. Remove (or move away) the file /etc/init/
3. Create the file /etc/init/
description "lxc network"
author "Serge Hallyn <email address hidden>"
start on starting lxc
stop on stopped lxc
env USE_LXC_ BRIDGE= "true" "255.255. 255.0" "10.0.3. 0/24"
env LXC_BRIDGE="lxcbr0"
env LXC_ADDR="10.0.3.1"
env LXC_NETMASK=
env LXC_NETWORK=
env varrun="/run/lxc"
env LXC_DOMAIN=""
pre-start script
[ -f /etc/default/lxc ] && . /etc/default/lxc
[ "x$USE_LXC_BRIDGE" = "xtrue" ] || { stop; exit 0; }
use_ iptables_ lock="- w" lock="" net/${LXC_ BRIDGE} ]; then /network_ up ]; then
iptables -w -L -n > /dev/null 2>&1 || use_iptables_
cleanup() {
# dnsmasq failed to start, clean up the bridge
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p udp --dport 67 -j ACCEPT
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p tcp --dport 67 -j ACCEPT
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p udp --dport 53 -j ACCEPT
iptables $use_iptables_lock -D INPUT -i ${LXC_BRIDGE} -p tcp --dport 53 -j ACCEPT
iptables $use_iptables_lock -D FORWARD -i ${LXC_BRIDGE} -j ACCEPT
iptables $use_iptables_lock -D FORWARD -o ${LXC_BRIDGE} -j ACCEPT
iptables $use_iptables_lock -t nat -D POSTROUTING -s ${LXC_NETWORK} ! -d ${LXC_NETWORK} -j MASQUERADE || true
iptables $use_iptables_lock -t mangle -D POSTROUTING -o ${LXC_BRIDGE} -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
ifconfig ${LXC_BRIDGE} down || true
brctl delbr ${LXC_BRIDGE} || true
}
if [ -d /sys/class/
if [ ! -f ${varrun}
# bridge exists, but we didn't start it
stop;
fi
exit 0;
fi
# set up the lxc network net/ipv4/ ip_forward
brctl addbr ${LXC_BRIDGE} || { echo "Missing bridge support in kernel"; stop; exit 0; }
echo 1 > /proc/sys/
mkdir -p ${varrun}
ifconfig ${LXC_BRIDGE} ${LXC_ADDR} netmask ${LXC_NETMASK} up
iptables $use_iptables_lock -I INPUT -i ${LXC_BRIDGE} -p udp --dport 67 -j ACCEPT
iptables $use_iptables_lock -I INPUT -i ${LXC_BRIDGE} -p tcp --dport 67 -j ACCEPT
iptables $use_iptables_lock -I INPUT -i ${LXC_BRIDGE} -p udp --dport 53 -j ACCEPT
iptables $use_iptables_lock -I INPUT -i ${LXC_BRIDGE} -p tcp --dport 53 -j ACCEPT
iptables $use_iptables_lock -I FORWARD -i ${LXC_BRIDGE} -j ACCEPT
iptables $use_iptables_lock -I FORWARD -o ${LXC_BRIDGE} -j ACCEPT
iptables $use_iptables_lock -t nat -A POSTROUTING -s ${LXC_NETWORK} ! -d ${LXC_NETWORK} -j MASQUERADE
iptables $use_iptables_lock -t mangle -A POSTROUTING -o ${LXC_BRIDGE} -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
touch ${varrun} /network_ up
end script
post-stop script /network_ up" ] || exit 0;
[ -f /etc/default/lxc ] && . /etc/default/lxc
[ -f "${varrun}
# if $LXC_BRIDGE has attached interfaces, don't shut it down
ls ...