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

Stéphane Graber stgraber at ubuntu.com
Thu May 1 20:06:02 UTC 2014


On Thu, May 01, 2014 at 03:33:58PM -0400, Dwight Engen wrote:
> - 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>
> ---
>  .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..77b1ceb 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
> +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..bbc7baa 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: ../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
> +
> +install-systemd: lxc.service lxc-devsetup lxc-autostart
>  	$(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
>  
>  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..2f293eb
> --- /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 start
> +ExecStop=@libexecdir@/lxc/lxc-autostart stop

^ That still seems wrong to me, lxc-autostart is a standard binary in BINDIR.

> +# 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..f4286c2 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
>  %endif
>  
>  %if %{with_python}
> -- 
> 1.9.0
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140501/03434d37/attachment.sig>


More information about the lxc-devel mailing list