[lxc-devel] [PATCH 2/2] add lxc-autostart support for sysv init systems
Serge Hallyn
serge.hallyn at ubuntu.com
Thu Jan 2 17:09:25 UTC 2014
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>
> ---
> 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
More information about the lxc-devel
mailing list