Package: lxc
Version: 1:1.0.6-6+deb8u2
Severity: important
Tags: newcomer patch

Dear Maintainer,

   * What led up to the situation?
While developing the LXC appliance for TurnKey GNU/Linux which is based on 
Debian Jessie, I discovered problems when trying to create containers using 
Ansible's lxc_container module. Specifically, Ansible was refusing to create a 
container because the lock file /var/lock/subsys/lxc was always set.
   * What exactly did you do (or not do) that was effective (or
     ineffective)?
Investigation showed that the lock file was being set whenever the lxc service 
was started and remained set as long as it was running. 'service lxc stop' 
would lear the lock file.

In all the versions of LXC that I've examined, in 
lxc/config/init/common/lxc-containers.in the lock is applied just before the 
containers are started, and removed at the end of the start sequence.

case "$1" in
    start)
        [ "x$LXC_AUTO" = "xtrue" ] || { exit 0; }

        [ ! -f "$lockdir"/lxc ] || { exit 0; }

        if [ -n "$BOOTGROUPS" ]; then
            BOOTGROUPS="-g $BOOTGROUPS"
        fi
        touch "$lockdir"/lxc
        # Start containers
        wait_for_bridge

        # Start autoboot containers first then the NULL group "onboot,".
        "$bindir"/lxc-autostart $OPTIONS $BOOTGROUPS
        rm -f "$lockdir"/lxc
    ;;

In the init scripts supplied by the Debian package, the lock is applied at the 
end of the start sequence and removed at the end of the stop sequence.

I moved the lines setting and clearing the lock in /etc/init.d/lxc to the 
corresponding locations.

case "$1" in
  start)
        [ ! -f "$localstatedir"/lock/subsys/lxc ] || { exit 0; }

        if [ -n "$BOOTGROUPS" ]
        then
                BOOTGROUPS="-g $BOOTGROUPS"
        fi

        touch "$localstatedir"/lock/subsys/lxc
        # Start containers
        wait_for_bridge
        # Start autoboot containers first then the NULL group "onboot,".
        log_daemon_msg "Starting LXC autoboot containers: "
        "$bindir"/lxc-autostart $OPTIONS $BOOTGROUPS
        rm -f "$localstatedir"/lock/subsys/lxc
        ;;

I then had to make the corresponding changes to the systemd file, 
/usr/lib/x86_64-linux-gnu/lxc/lxc-autostart-helper and run 'systemctl 
daemon-reload'.

   * What was the outcome of this action?
The result was that now the lock file is set before the containers are started 
and cleared at the end of the start sequence.

   * What outcome did you expect instead?
The resulting behavior is what I believe was intended by the upsteam developers 
and Ansible is now able to create and manage containers.

   * Patch
The following patch will implement the proposed changes.

diff --git a/init.d/lxc b/init.d/lxc
index 54e5dc2..d067e4b 100755
--- a/init.d/lxc
+++ b/init.d/lxc
@@ -104,12 +104,13 @@ case "$1" in
                BOOTGROUPS="-g $BOOTGROUPS"
        fi
 
+       touch "$localstatedir"/lock/subsys/lxc
        # Start containers
        wait_for_bridge
        # Start autoboot containers first then the NULL group "onboot,".
        log_daemon_msg "Starting LXC autoboot containers: "
        "$bindir"/lxc-autostart $OPTIONS $BOOTGROUPS
-       touch "$localstatedir"/lock/subsys/lxc
+       rm -f "$localstatedir"/lock/subsys/lxc
        ;;
   stop)
        if [ -n "$SHUTDOWNDELAY" ]
@@ -122,7 +123,6 @@ case "$1" in
        # parallelized...  Even 5 second timout may be too long.
        log_daemon_msg "Stopping LXC containers: "
        "$bindir"/lxc-autostart $STOPOPTS $SHUTDOWNDELAY
-       rm -f "$localstatedir"/lock/subsys/lxc
        ;;
   restart|reload|force-reload)
        $0 stop


-- System Information:
Debian Release: 8.2
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 3.16.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=C (charmap=ANSI_X3.4-1968) (ignored: LC_ALL 
set to C)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages lxc depends on:
ii  init-system-helpers  1.22
ii  libapparmor1         2.9.0-3
ii  libc6                2.19-18+deb8u1
ii  libcap2              1:2.24-8
ii  libseccomp2          2.1.1-1
ii  libselinux1          2.3-2
ii  multiarch-support    2.19-18+deb8u1
ii  python3              3.4.2-2

Versions of packages lxc recommends:
ii  debootstrap  1.0.67
ii  openssl      1.0.1k-3+deb8u2
ii  rsync        3.1.1-3

Versions of packages lxc suggests:
pn  lua5.2  <none>

-- Configuration Files:
/etc/init.d/lxc changed:
sysconfdir="/etc"
bindir="/usr/bin"
localstatedir="/var"
BOOTGROUPS="onboot,"
SHUTDOWNDELAY=5
OPTIONS=
STOPOPTS="-a -s"
test ! -r /lib/lsb/init-functions ||
        . /lib/lsb/init-functions
test ! -r "$sysconfdir"/sysconfig/lxc ||
        . "$sysconfdir"/sysconfig/lxc
[ -x "$bindir"/lxc-autostart ] || exit 1
wait_for_bridge()
{
    [ -f "$sysconfdir"/lxc/default.conf ] || { return 0; }
    which ifconfig >/dev/null 2>&1
    if [ $? = 0 ]; then
        cmd="ifconfig -a"
    else
        which ip >/dev/null 2>&1
        if [ $? = 0 ]; then
            cmd="ip link list"
        fi
    fi
    [ -n cmd ] || { return 0; }
    BRNAME=`grep '^[    ]*lxc.network.link' "$sysconfdir"/lxc/default.conf | 
sed 's/^.*=[       ]*//'`
    if [ -z "$BRNAME" ]; then
        return 0
    fi
    for try in `seq 1 30`; do
        eval $cmd |grep "^$BRNAME" >/dev/null 2>&1
        if [ $? = 0 ]; then
            return
        fi
        sleep 1
    done
}
mkdir -p /var/lock/subsys
case "$1" in
  start)
        [ ! -f "$localstatedir"/lock/subsys/lxc ] || { exit 0; }
        if [ -n "$BOOTGROUPS" ]
        then
                BOOTGROUPS="-g $BOOTGROUPS"
        fi
        touch "$localstatedir"/lock/subsys/lxc
        # Start containers
        wait_for_bridge
        # Start autoboot containers first then the NULL group "onboot,".
        log_daemon_msg "Starting LXC autoboot containers: "
        "$bindir"/lxc-autostart $OPTIONS $BOOTGROUPS
        rm -f "$localstatedir"/lock/subsys/lxc
        ;;
  stop)
        if [ -n "$SHUTDOWNDELAY" ]
        then
                SHUTDOWNDELAY="-t $SHUTDOWNDELAY"
        fi
        # The stop is serialized and can take excessive time.  We need to avoid
        # delaying the system shutdown / reboot as much as we can since it's not
        # parallelized...  Even 5 second timout may be too long.
        log_daemon_msg "Stopping LXC containers: "
        "$bindir"/lxc-autostart $STOPOPTS $SHUTDOWNDELAY
        ;;
  restart|reload|force-reload)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart|reload|force-reload}"
        exit 2
esac
exit $?

/etc/lxc/default.conf changed:
lxc.include = /etc/lxc/natbridge.conf


-- no debconf information

Reply via email to