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

Dwight Engen dwight.engen at oracle.com
Mon Jan 6 17:08:49 UTC 2014


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?

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



More information about the lxc-devel mailing list