[lxc-devel] [PATCH v2] have systemd service call lxc-autostart via script

Dwight Engen dwight.engen at oracle.com
Thu May 1 21:17:52 UTC 2014


- reuse the sysvinit script to ensure that if the lxc is configured to use
  a bridge setup by libvirt, the bridge will be available before starting
  the container

- made the sysvinit script check for the existance of ifconfig, and fall
  back to ip link list if available

- made the lxc service also dependant on the network.target

- autoconfized the paths in the service file and sysvinit script

Reported-by: CDR <venefax at gmail.com>
Signed-off-by: Dwight Engen <dwight.engen at oracle.com>
---
v2: rename script lxc-autostart to lxc-autostart-helper to avoid confusion

 .gitignore                         |  3 ++
 config/init/systemd/Makefile.am    | 14 ++++++-
 config/init/systemd/lxc.service    | 17 --------
 config/init/systemd/lxc.service.in | 17 ++++++++
 config/init/sysvinit/lxc           | 66 ------------------------------
 config/init/sysvinit/lxc.in        | 82 ++++++++++++++++++++++++++++++++++++++
 configure.ac                       |  2 +
 lxc.spec.in                        |  1 +
 8 files changed, 117 insertions(+), 85 deletions(-)
 delete mode 100644 config/init/systemd/lxc.service
 create mode 100644 config/init/systemd/lxc.service.in
 delete mode 100755 config/init/sysvinit/lxc
 create mode 100755 config/init/sysvinit/lxc.in

diff --git a/.gitignore b/.gitignore
index 8145f81..2b478cd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -111,6 +111,9 @@ config/missing
 config/libtool.m4
 config/lt*.m4
 config/bash/lxc
+config/init/systemd/lxc-autostart-helper
+config/init/systemd/lxc.service
+config/init/sysvinit/lxc
 
 doc/*.1
 doc/*.5
diff --git a/config/init/systemd/Makefile.am b/config/init/systemd/Makefile.am
index de5ee50..fc374c5 100644
--- a/config/init/systemd/Makefile.am
+++ b/config/init/systemd/Makefile.am
@@ -5,7 +5,17 @@ EXTRA_DIST = \
 if INIT_SCRIPT_SYSTEMD
 SYSTEMD_UNIT_DIR = $(prefix)/lib/systemd/system
 
-install-systemd: lxc.service lxc-devsetup
+lxc-autostart-helper: ../sysvinit/lxc.in $(top_builddir)/config.status
+	$(AM_V_GEN)sed                                          \
+	    -e 's|[@]SYSCONFDIR[@]|$(sysconfdir)|g'             \
+	    -e 's|[@]LOCALSTATEDIR[@]|$(localstatedir)|g'       \
+	    -e 's|[@]BINDIR[@]|$(bindir)|g'                     \
+	    < $< > $@-t &&                                      \
+	    chmod a+x $@-t &&                                   \
+	    mv $@-t $@
+BUILT_SOURCES = lxc-autostart-helper
+
+install-systemd: lxc.service lxc-devsetup lxc-autostart-helper
 	$(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR)
 	$(INSTALL_DATA) lxc.service $(DESTDIR)$(SYSTEMD_UNIT_DIR)/
 
@@ -13,7 +23,7 @@ uninstall-systemd:
 	rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/lxc.service
 	rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || :
 
-pkglibexec_SCRIPTS = lxc-devsetup
+pkglibexec_SCRIPTS = lxc-devsetup lxc-autostart-helper
 
 install-data-local: install-systemd
 uninstall-local: uninstall-systemd
diff --git a/config/init/systemd/lxc.service b/config/init/systemd/lxc.service
deleted file mode 100644
index aa20b91..0000000
--- a/config/init/systemd/lxc.service
+++ /dev/null
@@ -1,17 +0,0 @@
-[Unit]
-Description=LXC Container Initialization and Autoboot Code
-After=syslog.target
-
-[Service]
-Type=oneshot
-RemainAfterExit=yes
-ExecStartPre=/usr/libexec/lxc/lxc-devsetup
-ExecStart=/usr/libexec/lxc/lxc-startup start
-ExecStop=/usr/libexec/lxc/lxc-startup stop
-# Environment=BOOTUP=serial
-# Environment=CONSOLETYPE=serial
-StandardOutput=syslog
-StandardError=syslog
-
-[Install]
-WantedBy=multi-user.target
diff --git a/config/init/systemd/lxc.service.in b/config/init/systemd/lxc.service.in
new file mode 100644
index 0000000..5f155b6
--- /dev/null
+++ b/config/init/systemd/lxc.service.in
@@ -0,0 +1,17 @@
+[Unit]
+Description=LXC Container Initialization and Autoboot Code
+After=syslog.target network.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStartPre=@libexecdir@/lxc/lxc-devsetup
+ExecStart=@libexecdir@/lxc/lxc-autostart-helper start
+ExecStop=@libexecdir@/lxc/lxc-autostart-helper stop
+# Environment=BOOTUP=serial
+# Environment=CONSOLETYPE=serial
+StandardOutput=syslog
+StandardError=syslog
+
+[Install]
+WantedBy=multi-user.target
diff --git a/config/init/sysvinit/lxc b/config/init/sysvinit/lxc
deleted file mode 100755
index 5ab3c46..0000000
--- a/config/init/sysvinit/lxc
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/bin/sh
-#
-# lxc Start/Stop LXC autoboot containers
-#
-# chkconfig: 345 99 01
-# description: Starts/Stops all LXC containers configured for autostart.
-#
-### BEGIN INIT INFO
-# Provides: lxc
-# Default-Start: 3 4 5
-# Default-Stop: 0 1 6
-# Short-Description: Bring up/down LXC autostart containers
-# Description: Bring up/down LXC autostart containers
-### END INIT INFO
-
-# Source function library.
-. /etc/init.d/functions
-
-# Check for needed utility program
-[ -x /usr/bin/lxc-autostart ] || exit 1
-
-# If libvirtd is providing the bridge, it might not be
-# immediately available, so wait a bit for it before starting
-# up the containers or else any that use the bridge will fail
-# to start
-wait_for_bridge()
-{
-    [ -f /etc/lxc/default.conf ] || { return 0; }
-
-    BRNAME=`grep '^[ 	]*lxc.network.link' /etc/lxc/default.conf | sed 's/^.*=[ 	]*//'`
-    if [ -z "$BRNAME" ]; then
-	return 0
-    fi
-
-    for try in `seq 1 30`; do
-	ifconfig -a |grep "^$BRNAME" >/dev/null 2>&1
-	if [ $? = 0 ]; then
-	    return
-	fi
-	sleep 1
-    done
-}
-
-# See how we were called.
-case "$1" in
-  start)
-	[ ! -f /var/lock/subsys/lxc ] || { exit 0; }
-
-	# Start containers
-	wait_for_bridge
-	action $"Starting LXC containers: " /usr/bin/lxc-autostart
-	touch /var/lock/subsys/lxc
-	;;
-  stop)
-	action $"Stopping LXC containers: " /usr/bin/lxc-autostart -a -A -s
-	rm -f /var/lock/subsys/lxc
-	;;
-  restart|reload|force-reload)
-	$0 stop
-	$0 start
-	;;
-  *)
-	echo $"Usage: $0 {start|stop|restart|reload|force-reload}"
-	exit 2
-esac
-exit $?
diff --git a/config/init/sysvinit/lxc.in b/config/init/sysvinit/lxc.in
new file mode 100755
index 0000000..b1a725c
--- /dev/null
+++ b/config/init/sysvinit/lxc.in
@@ -0,0 +1,82 @@
+#!/bin/sh
+#
+# lxc Start/Stop LXC autoboot containers
+#
+# chkconfig: 345 99 01
+# description: Starts/Stops all LXC containers configured for autostart.
+#
+### BEGIN INIT INFO
+# Provides: lxc
+# Default-Start: 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Bring up/down LXC autostart containers
+# Description: Bring up/down LXC autostart containers
+### END INIT INFO
+
+sysconfdir="@SYSCONFDIR@"
+bindir="@BINDIR@"
+localstatedir="@LOCALSTATEDIR@"
+
+# Source function library.
+test ! -r "$sysconfdir"/rc.d/init.d/functions ||
+        . "$sysconfdir"/rc.d/init.d/functions
+
+# Check for needed utility program
+[ -x "$bindir"/lxc-autostart ] || exit 1
+
+# If libvirtd is providing the bridge, it might not be
+# immediately available, so wait a bit for it before starting
+# up the containers or else any that use the bridge will fail
+# to start
+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
+}
+
+# See how we were called.
+case "$1" in
+  start)
+	[ ! -f "$localstatedir"/lock/subsys/lxc ] || { exit 0; }
+
+	# Start containers
+	wait_for_bridge
+	action $"Starting LXC containers: " "$bindir"/lxc-autostart
+	touch "$localstatedir"/lock/subsys/lxc
+	;;
+  stop)
+	action $"Stopping LXC containers: " "$bindir"/lxc-autostart -a -A -s
+	rm -f "$localstatedir"/lock/subsys/lxc
+	;;
+  restart|reload|force-reload)
+	$0 stop
+	$0 start
+	;;
+  *)
+	echo $"Usage: $0 {start|stop|restart|reload|force-reload}"
+	exit 2
+esac
+exit $?
diff --git a/configure.ac b/configure.ac
index 474e354..6e0d8df 100644
--- a/configure.ac
+++ b/configure.ac
@@ -565,7 +565,9 @@ AC_CONFIG_FILES([
 	config/bash/lxc
 	config/init/Makefile
 	config/init/sysvinit/Makefile
+	config/init/sysvinit/lxc
 	config/init/systemd/Makefile
+	config/init/systemd/lxc.service
 	config/init/upstart/Makefile
 	config/etc/Makefile
 	config/templates/Makefile
diff --git a/lxc.spec.in b/lxc.spec.in
index 5c9fdc8..c33e153 100644
--- a/lxc.spec.in
+++ b/lxc.spec.in
@@ -156,6 +156,7 @@ rm -rf %{buildroot}
 %attr(4111,root,root) %{_libexecdir}/%{name}/lxc-user-nic
 %if %{with_systemd}
 %attr(555,root,root) %{_libexecdir}/%{name}/lxc-devsetup
+%attr(555,root,root) %{_libexecdir}/%{name}/lxc-autostart-helper
 %endif
 
 %if %{with_python}
-- 
1.9.0



More information about the lxc-devel mailing list