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

Stéphane Graber stgraber at ubuntu.com
Mon Jan 6 17:16:04 UTC 2014


On Mon, Jan 06, 2014 at 12:08:49PM -0500, Dwight Engen wrote:
> On Mon, 6 Jan 2014 11:25:11 -0500
> Stéphane Graber <stgraber at ubuntu.com> wrote:
> 
> > On Mon, Jan 06, 2014 at 11:19:56AM -0500, Dwight Engen wrote:
> > > On Fri, 3 Jan 2014 15:07:01 -0500
> > > Stéphane Graber <stgraber at ubuntu.com> wrote:
> > > 
> > > > On Fri, Jan 03, 2014 at 02:00:25PM -0600, Serge Hallyn wrote:
> > > > > Quoting Stéphane Graber (stgraber at ubuntu.com):
> > > > > > 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.
> > > > > 
> > > > > Drat, I just pushed the commit.
> > > > > 
> > > > > So having
> > > > > 
> > > > > case $with_distro in
> > > > > 	ubuntu)
> > > > > 	init_script=upstart,systemd,sysv
> > > > > 	;;
> > > > > 
> > > > > and the rest geared to support that, could work here?
> > > > 
> > > > And the same for debian) but yes, that'd be fine I think.
> > > > 
> > > > I'm also wondering whether non-Debian distros actually have a
> > > > problem should they all be installed at once, if not, then maybe
> > > > we can do without the whole --init-script thing and always have
> > > > them all installed?
> > > 
> > > Yeah, Fedora packaging guidelines [1], [2] want either sysv or
> > > systemd, but not both ("Packagers MUST NOT include SysV initscripts
> > > in addition to systemd unit files, even in a separate
> > > $name-sysvinit subpackage as there are corner cases where the
> > > initscripts can override the systemd unit files."). So that is why
> > > I had only one of them being installed. I can see that it makes
> > > sense to install multiple if the distro supports it.
> > > 
> > > As far as the sysv initscript I provided running on multiple
> > > distros: It is pretty simple and I tried to make it generic, it has
> > > both chkconfig and LSB headers. I will admit that I did only test
> > > it on OracleLinux.
> > > 
> > > [1] https://fedoraproject.org/wiki/Packaging:SysVInitScript
> > > [2] https://fedoraproject.org/wiki/Packaging:Systemd
> > 
> > Weird policy but fair enough, can you then add support for a comma
> > separated list of init systems that Debian, Ubuntu and any similar
> > distro could use?
> 
> Sure, I can look into that. I think part of this is because systemd has
> some compatibility with sysv init scripts, so if you had both installed
> maybe it would start the service twice? Not sure how upstart handles
> that since I thought it had sysv init script compatibility too?

Upstart won't start any sysvinit script which has a matching upstart
job. I believe this is simply based on the name by default but some init
scripts also specifically look for upstart and exit 0 if it's found
(though we're trying to discourage that approach and instead have the
source lsb functions do that check centrally).

> 
> > > 
> > > > 
> > > > > 
> > > > > > > 
> > > > > > > > ---
> > > > > > > >  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
> > > > > 
> > > > > 
> > > > > 
> > > > > > _______________________________________________
> > > > > > 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/20140106/6e4f81ec/attachment-0001.pgp>


More information about the lxc-devel mailing list