[lxc-devel] [PATCH 2/2] add lxc-autostart support for sysv init systems

Dwight Engen dwight.engen at oracle.com
Thu Jan 2 18:02:59 UTC 2014


On Thu, 2 Jan 2014 11:09:25 -0600
Serge Hallyn <serge.hallyn at ubuntu.com> wrote:

> Quoting Dwight Engen (dwight.engen at oracle.com):
> > This change updates the way init scripts get installed so that more
> > than one init system can be supported. Instead of installing the
> > systemd service file from the spec file, it should be installed at
> > make install time, so that someone compiling from source also gets
> > the unit file installed.
> > 
> > Update the plamo template to use a lock file not named just
> > /var/lock/subsys/lxc since the presence of that file is used by
> > sysv init rc file to know if it should run the K01lxc script. This
> > also makes it consistent with the other templates which use
> > /var/lock/subsys/lxc-$template-name.
> > 
> > Signed-off-by: Dwight Engen <dwight.engen at oracle.com>
> 
> I have no objection to this, but I'd appreciate Stéphane taking
> a closer look.  This might lead the way to putting the upstart
> scripts for ubuntu upstream as well, which would be a plus.  It

Yeah I left a placeholder in there for putting an upstart script in but
didn't actually pull the one from Ubuntu's dpkg stuff, as I wasn't sure
you wanted it in upstream or not.

> also can give us more reasonable and comprehensive testcases if
> we can know that common distros will have a certain amount of
> setup.
> 
> Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
> 
> > ---
> >  configure.ac           | 45 +++++++++++++++++++++++++++++++++++
> >  lxc.spec.in            | 27 +++++++++++++++------
> >  src/lxc/Makefile.am    | 44 +++++++++++++++++++++++++++++++++-
> >  src/lxc/lxc.sysvinit   | 64
> > ++++++++++++++++++++++++++++++++++++++++++++++++++
> > templates/lxc-plamo.in |  4 ++-- 5 files changed, 174
> > insertions(+), 10 deletions(-) create mode 100755
> > src/lxc/lxc.sysvinit
> > 
> > diff --git a/configure.ac b/configure.ac
> > index 4c5f002..2d24937 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -70,6 +70,50 @@ AC_MSG_RESULT([$with_distro])
> >  AM_CONDITIONAL([HAVE_DEBIAN], [test x"$with_distro" = "xdebian" -o
> > x"$with_distro" = "xubuntu"]) AM_CONDITIONAL([DISTRO_UBUNTU], [test
> > "x$with_distro" = "xubuntu"]) 
> > +# Check for init system type
> > +AC_MSG_CHECKING([for init system type])
> > +AC_ARG_WITH([init-script],
> > +	    [AC_HELP_STRING([--with-init-script@<:@=TYPE@:>@],
> > +			    [Type of init script to install: sysv,
> > systemd, upstart,
> > +			     distro, none
> > @<:@default=distro@:>@])],[],[with_init_script=distro]) +case
> > "$with_init_script" in
> > +	sysv)
> > +		init_script=sysv
> > +		;;
> > +	systemd)
> > +		init_script=systemd
> > +		;;
> > +	upstart)
> > +		init_script=upstart
> > +		;;
> > +	none)
> > +		;;
> > +	distro)
> > +		case $with_distro in
> > +			fedora)
> > +				init_script=systemd
> > +				;;
> > +			redhat|centos|oracle|oracleserver)
> > +				init_script=sysv
> > +				;;
> > +			ubuntu)
> > +				init_script=upstart
> > +				;;
> > +			*)
> > +				echo -n "Linux distribution init
> > system unknown, defaulting to sysv"
> > +				init_script=sysv
> > +				;;
> > +		esac
> > +		;;
> > +	*)
> > +		AC_MSG_ERROR([Unknown init system type
> > $with_init_script])
> > +		;;
> > +esac
> > +AM_CONDITIONAL([INIT_SCRIPT_SYSV], test "$init_script" = "sysv")
> > +AM_CONDITIONAL([INIT_SCRIPT_SYSTEMD], test "$init_script" =
> > "systemd") +AM_CONDITIONAL([INIT_SCRIPT_UPSTART], test
> > "$init_script" = "upstart") +AC_MSG_RESULT($init_script)
> > +
> >  # Allow disabling rpath
> >  AC_ARG_ENABLE([rpath],
> >  	[AC_HELP_STRING([--enable-rpath], [set rpath in
> > executables [default=no]])], @@ -610,6 +654,7 @@ cat << EOF
> >  Environment:
> >   - compiler: $CC
> >   - distribution: $with_distro
> > + - init script type: $init_script
> >   - rpath: $enable_rpath
> >   - GnuTLS: $enable_gnutls
> >  
> > diff --git a/lxc.spec.in b/lxc.spec.in
> > index 6814ad7..b977c8c 100644
> > --- a/lxc.spec.in
> > +++ b/lxc.spec.in
> > @@ -23,6 +23,17 @@
> >  %global with_python %{?_with_python: 1} %{?!_with_python: 0}
> >  %global with_lua %{?_with_lua: 1} %{?!_with_lua: 0}
> >  
> > +# Set with_systemd on distros that use it, so we can install the
> > service +# file, otherwise the sysvinit script will be installed
> > +%if 0%{?fedora} >= 14 || 0%{?rhel} >= 7 || 0%{?suse_version} >=
> > 1210 +%global with_systemd 1
> > +%define init_script systemd
> > +BuildRequires: systemd-units
> > +%else
> > +%global with_systemd 0
> > +%define init_script sysv
> > +%endif
> > +
> >  # RPM needs alpha/beta/rc in Release: not Version: to ensure smooth
> >  # package upgrades from alpha->beta->rc->release. For more info
> > see: #
> > http://fedoraproject.org/wiki/Packaging%3aNamingGuidelines#NonNumericRelease
> > @@ -94,7 +105,8 @@ PATH=$PATH:/usr/sbin:/sbin %configure $args \
> > %if %{with_python} --enable-python \
> >  %endif
> > -  --disable-rpath
> > +  --disable-rpath \
> > +  --with-init-script=%{init_script}
> >  make %{?_smp_mflags}
> >  
> >  %install
> > @@ -102,11 +114,6 @@ rm -rf %{buildroot}
> >  make install DESTDIR=%{buildroot}
> >  find %{buildroot} -type f -name '*.la' -exec rm -f {} ';'
> >  
> > -# Install some of our systemd stuff...
> > -install -d -m 755 %{buildroot}/lib/systemd/system
> > -install -c -m 644 src/lxc/lxc.service
> > %{buildroot}/lib/systemd/system -install -c -m 755
> > src/lxc/lxc-devsetup %{buildroot}/%{_libexecdir}/%{name} -
> >  %clean
> >  rm -rf %{buildroot}
> >  
> > @@ -136,7 +143,11 @@ rm -rf %{buildroot}
> >  %{_datadir}/lxc/*
> >  %config(noreplace) %{_sysconfdir}/lxc/*
> >  
> > -/lib/systemd/system/*
> > +%if %{with_systemd}
> > +%{_unitdir}/lxc.service
> > +%else
> > +%{_sysconfdir}/rc.d/init.d/lxc
> > +%endif
> >  
> >  %files libs
> >  %defattr(-,root,root)
> > @@ -147,7 +158,9 @@ rm -rf %{buildroot}
> >  %endif
> >  %{_localstatedir}/*
> >  %attr(4555,root,root) %{_libexecdir}/%{name}/lxc-init
> > +%if %{with_systemd}
> >  %attr(555,root,root) %{_libexecdir}/%{name}/lxc-devsetup
> > +%endif
> >  
> >  %if %{with_python}
> >  %{_libdir}/python3.3/site-packages/_lxc*
> > diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am
> > index 74b38e2..c54120a 100644
> > --- a/src/lxc/Makefile.am
> > +++ b/src/lxc/Makefile.am
> > @@ -154,7 +154,8 @@ EXTRA_DIST = \
> >  	lxc-devsetup \
> >  	lxc-ls \
> >  	lxc-top \
> > -	lxc.service
> > +	lxc.service \
> > +	lxc.sysvinit
> >  
> >  if ENABLE_PYTHON
> >  bin_SCRIPTS += lxc-device
> > @@ -197,6 +198,43 @@ bin_PROGRAMS = \
> >  pkglibexec_PROGRAMS = \
> >  	lxc-init
> >  
> > +if INIT_SCRIPT_SYSV
> > +install-init: lxc.sysvinit
> > +	$(MKDIR_P) $(DESTDIR)$(sysconfdir)/rc.d/init.d
> > +	$(INSTALL_SCRIPT) lxc.sysvinit
> > $(DESTDIR)$(sysconfdir)/rc.d/init.d/lxc +
> > +uninstall-init:
> > +	rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/lxc
> > +	rmdir $(DESTDIR)$(sysconfdir)/rc.d/init.d || :
> > +else
> > +install-init:
> > +uninstall-init:
> > +endif
> > +
> > +if INIT_SCRIPT_SYSTEMD
> > +SYSTEMD_UNIT_DIR = /usr/lib/systemd/system
> > +install-systemd: lxc.service lxc-devsetup
> > +	$(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR)
> > +	$(INSTALL_DATA) lxc.service $(DESTDIR)$(SYSTEMD_UNIT_DIR)/
> > +
> > +uninstall-systemd:
> > +	rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/lxc.service
> > +	rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || :
> > +pkglibexec_SCRIPTS = lxc-devsetup
> > +else
> > +install-systemd:
> > +uninstall-systemd:
> > +endif
> > +
> > +if INIT_SCRIPT_UPSTART
> > +# FIXME: install/uninstall upstart script here
> > +install-upstart:
> > +uninstall-upstart:
> > +else
> > +install-upstart:
> > +uninstall-upstart:
> > +endif
> > +
> >  AM_LDFLAGS = -Wl,-E
> >  if ENABLE_RPATH
> >  AM_LDFLAGS += -Wl,-rpath -Wl,$(libdir)
> > @@ -229,6 +267,10 @@ lxc_snapshot_SOURCES = lxc_snapshot.c
> >  lxc_usernsexec_SOURCES = lxc_usernsexec.c
> >  lxc_user_nic_SOURCES = lxc_user_nic.c network.c network.h
> >  
> > +install-data-local: install-init install-systemd install-upstart
> > +
> > +uninstall-local: uninstall-init uninstall-systemd uninstall-upstart
> > +
> >  install-exec-local: install-soPROGRAMS
> >  	mkdir -p $(DESTDIR)$(datadir)/lxc
> >  	install -c -m 644 lxc.functions $(DESTDIR)$(datadir)/lxc
> > diff --git a/src/lxc/lxc.sysvinit b/src/lxc/lxc.sysvinit
> > new file mode 100755
> > index 0000000..9128187
> > --- /dev/null
> > +++ b/src/lxc/lxc.sysvinit
> > @@ -0,0 +1,64 @@
> > +#!/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 |awk
> > '{print $3}'`
> > +    [ -n $BRNAME ] || { return 0; }
> > +
> > +    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
> > -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/templates/lxc-plamo.in b/templates/lxc-plamo.in
> > index 485f363..8705a05 100644
> > --- a/templates/lxc-plamo.in
> > +++ b/templates/lxc-plamo.in
> > @@ -145,7 +145,7 @@ install_plamo() {
> >        return 1
> >      fi
> >      return 0
> > -  ) 200> @LOCALSTATEDIR@/lock/subsys/lxc
> > +  ) 200> @LOCALSTATEDIR@/lock/subsys/lxc-plamo
> >  }
> >  
> >  configure_plamo() {
> > @@ -306,7 +306,7 @@ cleanup() {
> >      rm -rf --one-file-system $dlcache $rtcache || return 1
> >      echo "Done."
> >      return 0
> > -  ) 200> @LOCALSTATEDIR@/lock/subsys/lxc
> > +  ) 200> @LOCALSTATEDIR@/lock/subsys/lxc-plamo
> >  }
> >  
> >  usage() {
> > -- 
> > 1.8.3.1
> > 
> > _______________________________________________
> > lxc-devel mailing list
> > lxc-devel at lists.linuxcontainers.org
> > http://lists.linuxcontainers.org/listinfo/lxc-devel
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel



More information about the lxc-devel mailing list