Hi Daniel, On Thu, Jul 07, 2011 at 03:17:24PM +0100, Daniel P. Berrange wrote: > From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> > > This patch adds support for a systemd init service for libvirtd > and libvirt-guests. The libvirtd.service is *not* written to use > socket activation, since we want libvirtd to start on boot so it > can do guest auto-start. It seems this nevert got pushed. I't be great to have systemd support upstream so we don't reinvent the wheel on every distro that uses systemd. Cheers, -- Guido > > The libvirt-guests.service is pretty lame, just exec'ing the > original init script for now. Ideally we would factor out the > functionality, into some shared tool. > > Instead of > > ./configure --with-init-script=redhat > > You can now do > > ./configure --with-init-script=systemd > > Or better still: > > ./configure --with-init-script=systemd+redhat > > * configure.ac: Add systemd, and systemd+redhat options to > --with-init-script option > * daemon/Makefile.am: Install systemd services > * daemon/libvirtd.sysconf: Add note about unused env variable > with systemd > * daemon/libvirtd.service.in: libvirtd systemd service unit > * libvirt.spec.in: Add scripts to installing systemd services > and migrating from legacy init scripts > * tools/Makefile.am: Install systemd services > * tools/libvirt-guests.init.sh: Rename to tools/libvirt-guests.init.in > * tools/libvirt-guests.service.in: systemd service unit > --- > configure.ac | 32 +++++-- > daemon/.gitignore | 1 + > daemon/Makefile.am | 62 ++++++++++---- > daemon/libvirtd.service.in | 20 ++++ > daemon/libvirtd.sysconf | 3 + > libvirt.spec.in | 92 +++++++++++++++++++- > tools/Makefile.am | 63 +++++++++++--- > ...bvirt-guests.init.sh => libvirt-guests.init.in} | 0 > tools/libvirt-guests.service.in | 13 +++ > 9 files changed, 245 insertions(+), 41 deletions(-) > create mode 100644 daemon/libvirtd.service.in > rename tools/{libvirt-guests.init.sh => libvirt-guests.init.in} (100%) > create mode 100644 tools/libvirt-guests.service.in > > diff --git a/configure.ac b/configure.ac > index 13b4afb..d70e574 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -305,16 +305,30 @@ dnl init script flavor > dnl > AC_MSG_CHECKING([for init script flavor]) > AC_ARG_WITH([init-script], > - [AC_HELP_STRING([--with-init-script=@<:@redhat|auto|none@:>@], > + [AC_HELP_STRING([--with-init-script=@<:@redhat|systemd|systemd+redhat|upstart|auto|none@:>@], > [Style of init script to install @<:@default=auto@:>@])]) > -if test "x$with_init_script" = "x" || test "x$with_init_script" = "xauto"; then > - if test "$cross_compiling" = yes || test ! -f /etc/redhat-release; then > - with_init_script=none > - else > - with_init_script=redhat > - fi > -fi > -AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_RED_HAT], test x$with_init_script = xredhat) > +init_redhat=no > +init_systemd=no > +case "$with_init_script" in > + systemd+redhat) > + init_redhat=yes > + init_systemd=yes > + ;; > + systemd) > + init_systemd=yes > + ;; > + redhat) > + init_redhat=yes > + ;; > + *) > + if test "$cross_compiling" != yes && test -f /etc/redhat-release; then > + init_redhat=yes > + with_init_script=redhat > + fi > + ;; > +esac > +AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_RED_HAT], test "$init_redhat" = "yes") > +AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_SYSTEMD], test "$init_systemd" = "yes") > AC_MSG_RESULT($with_init_script) > > dnl RHEL-5 has a peculiar version of Xen, which requires some special casing > diff --git a/daemon/.gitignore b/daemon/.gitignore > index ab3d093..2873143 100644 > --- a/daemon/.gitignore > +++ b/daemon/.gitignore > @@ -7,6 +7,7 @@ Makefile.in > libvirt_qemud > libvirtd > libvirtd.init > +libvirtd.service > libvirtd*.logrotate > libvirtd.8 > libvirtd.8.in > diff --git a/daemon/Makefile.am b/daemon/Makefile.am > index 8ed29b8..abb5e1f 100644 > --- a/daemon/Makefile.am > +++ b/daemon/Makefile.am > @@ -180,13 +180,13 @@ probes.o: probes.d > CLEANFILES += probes.h probes.o > endif > > -install-data-local: install-init install-data-sasl install-data-polkit \ > +install-data-local: install-init install-systemd install-data-sasl install-data-polkit \ > install-logrotate > mkdir -p $(DESTDIR)$(localstatedir)/log/libvirt > mkdir -p $(DESTDIR)$(localstatedir)/run/libvirt > mkdir -p $(DESTDIR)$(localstatedir)/lib/libvirt > > -uninstall-local:: uninstall-init uninstall-data-sasl uninstall-data-polkit > +uninstall-local:: uninstall-init uninstall-systemd uninstall-data-sasl uninstall-data-polkit > rmdir $(DESTDIR)$(localstatedir)/log/libvirt || : > rmdir $(DESTDIR)$(localstatedir)/run/libvirt || : > rmdir $(DESTDIR)$(localstatedir)/lib/libvirt || : > @@ -244,20 +244,47 @@ install-logrotate: $(LOGROTATE_CONFS) > $(INSTALL_DATA) libvirtd.lxc.logrotate $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.lxc > $(INSTALL_DATA) libvirtd.uml.logrotate $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml > > +install-sysconfig: > + mkdir -p $(DESTDIR)$(sysconfdir)/sysconfig > + $(INSTALL_DATA) $(srcdir)/libvirtd.sysconf \ > + $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd > +uninstall-sysconfig: > + rm -f $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd > + > if LIBVIRT_INIT_SCRIPT_RED_HAT > -install-init: libvirtd.init > + > +BUILT_SOURCES += libvirtd.init > + > +install-init: install-sysconfig libvirtd.init > mkdir -p $(DESTDIR)$(sysconfdir)/rc.d/init.d > $(INSTALL_SCRIPT) libvirtd.init \ > $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd > - mkdir -p $(DESTDIR)$(sysconfdir)/sysconfig > - $(INSTALL_DATA) $(srcdir)/libvirtd.sysconf \ > - $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd > > +uninstall-init: uninstall-sysconfig > + rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd > +else > +install-init: > uninstall-init: > - rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd \ > - $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd > +endif # LIBVIRT_INIT_SCRIPT_RED_HAT > > -BUILT_SOURCES += libvirtd.init > + > +EXTRA_DIST += libvirtd.service.in > +if LIBVIRT_INIT_SCRIPT_SYSTEMD > + > +SYSTEMD_UNIT_DIR = /lib/systemd/system > +BUILT_SOURCES += libvirtd.service > + > +install-systemd: install-sysconfig libvirtd.service > + mkdir -p $(DESTDIR)$(SYSTEMD_UNIT_DIR) > + $(INSTALL_SCRIPT) libvirtd.service \ > + $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service > + > +uninstall-systemd: uninstall-sysconfig > + rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service > +else > +install-systemd: > +uninstall-systemd: > +endif # LIBVIRT_INIT_SCRIPT_SYSTEMD > > libvirtd.init: libvirtd.init.in $(top_builddir)/config.status > $(AM_V_GEN)sed \ > @@ -268,18 +295,21 @@ libvirtd.init: libvirtd.init.in $(top_builddir)/config.status > chmod a+x $@-t && \ > mv $@-t $@ > > +libvirtd.service: libvirtd.service.in $(top_builddir)/config.status > + $(AM_V_GEN)sed \ > + -e s!\@localstatedir\@!@localstatedir@!g \ > + -e s!\@sbindir\@!@sbindir@!g \ > + -e s!\@sysconfdir\@!@sysconfdir@!g \ > + < $< > $@-t && \ > + chmod a+x $@-t && \ > + mv $@-t $@ > + > + > check-local: > $(AM_V_GEN)if test -x '$(AUGPARSE)'; then \ > '$(AUGPARSE)' -I $(srcdir) $(srcdir)/test_libvirtd.aug; \ > fi > > -else > - > -install-init: > -uninstall-init: > -libvirtd.init: > - > -endif # LIBVIRT_INIT_SCRIPT_RED_HAT > > # This must be added last, since functions it provides/replaces > # are used by nearly every other library. > diff --git a/daemon/libvirtd.service.in b/daemon/libvirtd.service.in > new file mode 100644 > index 0000000..9661428 > --- /dev/null > +++ b/daemon/libvirtd.service.in > @@ -0,0 +1,20 @@ > +# NB we don't use socket activation. When libvirtd starts it will > +# spawn any virtual machines registered for autostart. We want this > +# to occur on every boot, regardless of whether any client connects > +# to a socket. Thus socket activation doesn't have any benefit > + > +[Unit] > +Description=Virtualization daemon > +After=syslog.target > +After=udev.target > +After=avahi.target > +After=dbus.target > +Before=libvirt-guests.service > + > +[Service] > +EnvironmentFile=-/etc/sysconfig/libvirtd > +ExecStart=@sbindir@/libvirtd $LIBVIRTD_ARGS > +ExecReload=/bin/kill -HUP $MAINPID > + > +[Install] > +WantedBy=multi-user.target > diff --git a/daemon/libvirtd.sysconf b/daemon/libvirtd.sysconf > index b730c5e..ab273c8 100644 > --- a/daemon/libvirtd.sysconf > +++ b/daemon/libvirtd.sysconf > @@ -1,4 +1,7 @@ > # Override the default config file > +# NOTE: This setting is no longer honoured if using > +# systemd. Set '--config /etc/libvirt/libvirtd.conf' > +# in LIBVIRTD_ARGS instead. > #LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf > > # Listen for TCP/IP connections > diff --git a/libvirt.spec.in b/libvirt.spec.in > index bf220f3..650f0bc 100644 > --- a/libvirt.spec.in > +++ b/libvirt.spec.in > @@ -77,6 +77,7 @@ > %define with_dtrace 0%{!?_without_dtrace:0} > %define with_cgconfig 0%{!?_without_cgconfig:0} > %define with_sanlock 0%{!?_without_sanlock:0} > +%define with_systemd 0%{!?_without_systemd:0} > > # Non-server/HV driver defaults which are always enabled > %define with_python 0%{!?_without_python:1} > @@ -107,6 +108,10 @@ > %define with_libxl 0 > %endif > > +%if 0%{?fedora} >= 15 > +%define with_systemd 1 > +%endif > + > # RHEL-5 has restricted QEMU to x86_64 only and is too old for LXC > %if 0%{?rhel} == 5 > %ifnarch x86_64 > @@ -313,7 +318,9 @@ Requires: libcgroup > > # All build-time requirements > BuildRequires: python-devel > - > +%if %{with_systemd} > +BuildRequires: systemd-units > +%endif > %if %{with_xen} > BuildRequires: xen-devel > %endif > @@ -455,6 +462,13 @@ BuildRequires: nfs-utils > # Fedora build root suckage > BuildRequires: gawk > > +%if %{with_systemd} > +Requires(post): systemd-units > +Requires(post): systemd-sysv > +Requires(preun): systemd-units > +Requires(postun): systemd-units > +%endif > + > %description > Libvirt is a C toolkit to interact with the virtualization capabilities > of recent versions of Linux (and other OSes). The main package includes > @@ -671,6 +685,13 @@ of recent versions of Linux (and other OSes). > %define with_packager --with-packager="%{who}, %{when}, %{where}" > %define with_packager_version --with-packager-version="%{release}" > > +%if %{with_systemd} > +# We use 'systemd+redhat', so if someone installs upstart or > +# legacy init scripts, they can still start libvirtd, etc > +%define init_scripts --with-init_script=systemd+redhat > +%else > +%define init_scripts --with-init_script=redhat > +%endif > > %configure %{?_without_xen} \ > %{?_without_qemu} \ > @@ -711,7 +732,7 @@ of recent versions of Linux (and other OSes). > %{with_packager_version} \ > --with-qemu-user=%{qemu_user} \ > --with-qemu-group=%{qemu_group} \ > - --with-init-script=redhat \ > + %{init_scripts} \ > --with-remote-pid-file=%{_localstatedir}/run/libvirtd.pid > make %{?_smp_mflags} > gzip -9 ChangeLog > @@ -719,7 +740,7 @@ gzip -9 ChangeLog > %install > rm -fr %{buildroot} > > -%makeinstall > +%makeinstall SYSTEMD_UNIT_DIR=%{?buildroot:%{buildroot}}%{_unitdir} > for i in domain-events/events-c dominfo domsuspend hellolibvirt openauth python xml/nwfilter systemtap > do > (cd examples/$i ; make clean ; rm -rf .deps .libs Makefile Makefile.in) > @@ -868,6 +889,13 @@ do > done > %endif > > +%if %{with_systemd} > +if [ $1 -eq 1 ] ; then > + # Initial installation > + /bin/systemctl enable libvirtd.service >/dev/null 2>&1 || : > + /bin/systemctl enable cgconfig.service >/dev/null 2>&1 || : > +fi > +%else > %if %{with_cgconfig} > if [ "$1" -eq "1" ]; then > /sbin/chkconfig cgconfig on > @@ -879,25 +907,64 @@ if [ "$1" -ge "1" ]; then > /sbin/service libvirtd condrestart > /dev/null 2>&1 > fi > %endif > +%endif > > %preun > %if %{with_libvirtd} > +%if %{with_systemd} > +if [ $1 -eq 0 ] ; then > + # Package removal, not upgrade > + /bin/systemctl --no-reload disable libvirtd.service > /dev/null 2>&1 || : > + /bin/systemctl stop libvirtd.service > /dev/null 2>&1 || : > +fi > +%else > if [ $1 = 0 ]; then > /sbin/service libvirtd stop 1>/dev/null 2>&1 > /sbin/chkconfig --del libvirtd > fi > %endif > +%endif > + > +%postun > +%if %{with_libvirtd} > +%if %{with_systemd} > +/bin/systemctl daemon-reload >/dev/null 2>&1 || : > +if [ $1 -ge 1 ] ; then > + # Package upgrade, not uninstall > + /bin/systemctl try-restart libvirtd.service >/dev/null 2>&1 || : > +fi > +%endif > +%endif > + > +%if %{with_libvirtd} > +%if %{with_systemd} > +%triggerun -- libvirt < 0.9.4 > +%{_bindir}/systemd-sysv-convert --save libvirtd >/dev/null 2>&1 ||: > + > +# If the package is allowed to autostart: > +/bin/systemctl --no-reload enable libvirtd.service >/dev/null 2>&1 ||: > + > +# Run these because the SysV package being removed won't do them > +/sbin/chkconfig --del libvirtd >/dev/null 2>&1 || : > +/bin/systemctl try-restart libvirtd.service >/dev/null 2>&1 || : > +%endif > +%endif > > %preun client > > +%if %{with_systemd} > +%else > if [ $1 = 0 ]; then > /sbin/chkconfig --del libvirt-guests > rm -f /var/lib/libvirt/libvirt-guests > fi > +%endif > > %post client > > /sbin/ldconfig > +%if %{with_systemd} > +%else > /sbin/chkconfig --add libvirt-guests > if [ $1 -ge 1 ]; then > level=$(/sbin/runlevel | /bin/cut -d ' ' -f 2) > @@ -907,9 +974,22 @@ if [ $1 -ge 1 ]; then > /sbin/service libvirt-guests start > /dev/null 2>&1 || true > fi > fi > +%endif > > %postun client -p /sbin/ldconfig > > +%if %{with_systemd} > +%triggerun client -- libvirt < 0.9.4 > +%{_bindir}/systemd-sysv-convert --save libvirt-guests >/dev/null 2>&1 ||: > + > +# If the package is allowed to autostart: > +/bin/systemctl --no-reload enable libvirt-guests.service >/dev/null 2>&1 ||: > + > +# Run these because the SysV package being removed won't do them > +/sbin/chkconfig --del libvirt-guests >/dev/null 2>&1 || : > +/bin/systemctl try-restart libvirt-guests.service >/dev/null 2>&1 || : > +%endif > + > %if %{with_libvirtd} > %files > %defattr(-, root, root) > @@ -927,6 +1007,9 @@ fi > %{_sysconfdir}/libvirt/nwfilter/*.xml > > %{_sysconfdir}/rc.d/init.d/libvirtd > +%if %{with_systemd} > +%{_unitdir}/libvirtd.service > +%endif > %doc daemon/libvirtd.upstart > %config(noreplace) %{_sysconfdir}/sysconfig/libvirtd > %config(noreplace) %{_sysconfdir}/libvirt/libvirtd.conf > @@ -1070,6 +1153,9 @@ fi > %{_datadir}/libvirt/cpu_map.xml > > %{_sysconfdir}/rc.d/init.d/libvirt-guests > +%if %{with_systemd} > +%{_unitdir}/libvirt-guests.service > +%endif > %config(noreplace) %{_sysconfdir}/sysconfig/libvirt-guests > %dir %attr(0755, root, root) %{_localstatedir}/lib/libvirt/ > > diff --git a/tools/Makefile.am b/tools/Makefile.am > index 62c275e..7537f81 100644 > --- a/tools/Makefile.am > +++ b/tools/Makefile.am > @@ -15,7 +15,6 @@ EXTRA_DIST = \ > virt-sanlock-cleanup.in \ > virt-sanlock-cleanup.8 \ > virsh.pod \ > - libvirt-guests.init.sh \ > libvirt-guests.sysconf > > bin_SCRIPTS = virt-xml-validate virt-pki-validate > @@ -145,22 +144,33 @@ install-data-local: install-init > > uninstall-local: uninstall-init > > +install-sysconfig: > + mkdir -p $(DESTDIR)$(sysconfdir)/sysconfig > + $(INSTALL_DATA) $(srcdir)/libvirt-guests.sysconf \ > + $(DESTDIR)$(sysconfdir)/sysconfig/libvirt-guests > + > +uninstall-sysconfig: > + rm -f $(DESTDIR)$(sysconfdir)/sysconfig/libvirt-guests > + > +EXTRA_DIST += libvirt-guests.init.in > + > if LIBVIRT_INIT_SCRIPT_RED_HAT > -install-init: libvirt-guests.init > +install-init: libvirt-guests.init install-sysconfig > mkdir -p $(DESTDIR)$(sysconfdir)/rc.d/init.d > $(INSTALL_SCRIPT) libvirt-guests.init \ > $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirt-guests > - mkdir -p $(DESTDIR)$(sysconfdir)/sysconfig > - $(INSTALL_DATA) $(srcdir)/libvirt-guests.sysconf \ > - $(DESTDIR)$(sysconfdir)/sysconfig/libvirt-guests > > -uninstall-init: > - rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirt-guests \ > - $(DESTDIR)$(sysconfdir)/sysconfig/libvirt-guests > +uninstall-init: install-sysconfig > + rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirt-guests > > BUILT_SOURCES += libvirt-guests.init > > -libvirt-guests.init: libvirt-guests.init.sh $(top_builddir)/config.status > +else > +install-init: > +uninstall-init: > +endif # LIBVIRT_INIT_SCRIPT_RED_HAT > + > +libvirt-guests.init: libvirt-guests.init.in $(top_builddir)/config.status > $(AM_V_GEN)sed \ > -e 's!\@PACKAGE\@!$(PACKAGE)!g' \ > -e 's!\@bindir\@!$(bindir)!g' \ > @@ -171,11 +181,38 @@ libvirt-guests.init: libvirt-guests.init.sh $(top_builddir)/config.status > < $< > $@-t && \ > chmod a+x $@-t && \ > mv $@-t $@ > + > + > + > +EXTRA_DIST += libvirt-guests.service.in > + > +if LIBVIRT_INIT_SCRIPT_SYSTEMD > +install-systemd: libvirt-guests.service install-sysconfig > + mkdir -p $(DESTDIR)$(sysconfdir)/rc.d/systemd.d > + $(INSTALL_SCRIPT) libvirt-guests.service \ > + $(DESTDIR)$(sysconfdir)/rc.d/systemd.d/libvirt-guests > + > +uninstall-systemd: install-sysconfig > + rm -f $(DESTDIR)$(sysconfdir)/rc.d/systemd.d/libvirt-guests > + > +BUILT_SOURCES += libvirt-guests.service > + > else > -install-init: > -uninstall-init: > -libvirt-guests.init: > -endif # LIBVIRT_INIT_SCRIPT_RED_HAT > +install-systemd: > +uninstall-systemd: > +endif # LIBVIRT_INIT_SCRIPT_SYSTEMD > + > +libvirt-guests.service: libvirt-guests.service.in $(top_builddir)/config.status > + $(AM_V_GEN)sed \ > + -e 's!\@PACKAGE\@!$(PACKAGE)!g' \ > + -e 's!\@bindir\@!$(bindir)!g' \ > + -e 's!\@localedir\@!$(localedir)!g' \ > + -e 's!\@localstatedir\@!$(localstatedir)!g' \ > + -e 's!\@sbindir\@!$(sbindir)!g' \ > + -e 's!\@sysconfdir\@!$(sysconfdir)!g' \ > + < $< > $@-t && \ > + chmod a+x $@-t && \ > + mv $@-t $@ > > > CLEANFILES = $(bin_SCRIPTS) > diff --git a/tools/libvirt-guests.init.sh b/tools/libvirt-guests.init.in > similarity index 100% > rename from tools/libvirt-guests.init.sh > rename to tools/libvirt-guests.init.in > diff --git a/tools/libvirt-guests.service.in b/tools/libvirt-guests.service.in > new file mode 100644 > index 0000000..123aecc > --- /dev/null > +++ b/tools/libvirt-guests.service.in > @@ -0,0 +1,13 @@ > +[Unit] > +Description=Suspend Active Libvirt Guests > +After=syslog.target network.target > + > +[Service] > +EnvironmentFile=-/etc/sysconfig/libvirt-guests > +# Hack just call traditional service until we factor > +# out the code > +ExecStart=/etc/init.d/libvirt-guests start > +ExecStop=/etc/init.d/libvirt-guests stop > + > +[Install] > +WantedBy=multi-user.target > \ No newline at end of file > -- > 1.7.6 > > -- > libvir-list mailing list > libvir-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/libvir-list > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list