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

Stéphane Graber stgraber at ubuntu.com
Fri Jan 3 19:50:16 UTC 2014


On Thu, Jan 02, 2014 at 11:09:25AM -0600, Serge Hallyn 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
> 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>

I don't think the current proposal is appropriate.

At least in Ubuntu and Debian, we typically want more than one init
script to be installed. The way things work in Debian based distros is
that init scripts for all supported init daemons are installed and only
the relevant ones are used at boot time and by the user (with the
"service" command).

As a result, I'd expect an LXC package build on Debian or Ubuntu to
include the upstart jobs, sysvinit script and systemd unit in their
usual locations.

> 
> > ---
> >  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

-- 
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: 836 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140103/c4cc49b9/attachment.pgp>


More information about the lxc-devel mailing list