diff --git a/.gitignore b/.gitignore index f1d1b9c6f8..6d725aa225 100644 --- a/.gitignore +++ b/.gitignore @@ -353,3 +353,8 @@ tools/xenstore/xenstore-watch docs/txt/misc/*.txt docs/txt/man/*.txt docs/figs/*.png + +tools/hotplug/Linux/systemd/*.conf +tools/hotplug/Linux/systemd/*.mount +tools/hotplug/Linux/systemd/*.socket +tools/hotplug/Linux/systemd/*.service diff --git a/Makefile b/Makefile index 41dabbf3bf..580df644bf 100644 --- a/Makefile +++ b/Makefile @@ -216,8 +216,12 @@ uninstall: rm -f $(D)$(CONFIG_DIR)/udev/rules.d/xen-backend.rules rm -f $(D)$(CONFIG_DIR)/udev/rules.d/xend.rules rm -f $(D)$(SYSCONFIG_DIR)/xendomains + rm -f $(D)$(SBINDIR)/xendomains rm -f $(D)$(SYSCONFIG_DIR)/xencommons - rm -rf $(D)/var/run/xen* $(D)/var/lib/xen* + rm -f $(D)$(XEN_SYSTEMD_DIR)/*.service + rm -f $(D)$(XEN_SYSTEMD_DIR)/*.mount + rm -f $(D)$(XEN_SYSTEMD_MODULES_LOAD)/*.conf + rm -rf $(D)$(XEN_RUN_DIR)* $(D)/var/lib/xen* make -C tools uninstall rm -rf $(D)/boot/tboot* diff --git a/README b/README index 7c27fbbf40..81bf938e3c 100644 --- a/README +++ b/README @@ -72,6 +72,7 @@ disabled at compile time: * cmake (if building vtpm stub domains) * markdown * figlet (for generating the traditional Xen start of day banner) + * systemd daemon development files Second, you need to acquire a suitable kernel for use in domain 0. If possible you should use a kernel provided by your OS distributor. If @@ -161,6 +162,21 @@ change take effect. [1] http://wiki.xen.org/wiki/XenStoreReference [2] http://wiki.xen.org/wiki/Xenstored +Systemd support +=============== + +If you have systemd development packages installed you can build binaries +with systemd support. Systemd support is enabled by default if you have +systemd development libraries present. If you want to force enable systemd to +ensure you build binaries with systemd support you can use the --enable-systemd +flag. Likewise if you want to force disable systemd you can use: + + ./configure --disable-systemd + +For more details refer to the xen xenstored systemd wiki page [3]. + +[3] http://wiki.xen.org/wiki/Xenstored#xenstored_systemd_support + Python Runtime Libraries ======================== diff --git a/config/Tools.mk.in b/config/Tools.mk.in index 748cc69c6b..974e28e892 100644 --- a/config/Tools.mk.in +++ b/config/Tools.mk.in @@ -63,6 +63,12 @@ CONFIG_BLKTAP2 := @blktap2@ CONFIG_VTPM := @vtpm@ CONFIG_QEMUU_EXTRA_ARGS:= @EXTRA_QEMUU_CONFIGURE_ARGS@ +CONFIG_SYSTEMD := @systemd@ +SYSTEMD_CFLAGS := @SYSTEMD_CFLAGS@ +SYSTEMD_LIBS := @SYSTEMD_LIBS@ +XEN_SYSTEMD_DIR := @SYSTEMD_DIR@ +XEN_SYSTEMD_MODULES_LOAD := @SYSTEMD_MODULES_LOAD@ + #System options ZLIB := @zlib@ CONFIG_LIBICONV := @libiconv@ diff --git a/m4/README.source b/m4/README.source index 8922ea0ddf..21850a65b3 100644 --- a/m4/README.source +++ b/m4/README.source @@ -26,3 +26,11 @@ Date: Mon Feb 3 15:59:18 2014 -0800 With the newly added glib.mk, some of the noinst_* variables need to use += in the evaluation to avoid multiple definition warnings from automake. + +systemd.m4 +========== + +systemd.m4 was contributed to by Luis R. Rodriguez , +its current home project can be found at: + +https://github.com/mcgrof/funk-systemd diff --git a/m4/systemd.m4 b/m4/systemd.m4 new file mode 100644 index 0000000000..760bbada34 --- /dev/null +++ b/m4/systemd.m4 @@ -0,0 +1,123 @@ +# systemd.m4 - Macros to check for and enable systemd -*- Autoconf -*- +# +# Copyright (C) 2014 Luis R. Rodriguez +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +dnl Some optional path options +AC_DEFUN([AX_SYSTEMD_OPTIONS], [ + AC_ARG_WITH(systemd, [ --with-systemd set directory for systemd service files], + SYSTEMD_DIR="$withval", SYSTEMD_DIR="") + AC_SUBST(SYSTEMD_DIR) + + AC_ARG_WITH(systemd, [ --with-systemd-modules-load set directory for systemd modules load files], + SYSTEMD_MODULES_LOAD="$withval", SYSTEMD_MODULES_LOAD="") + AC_SUBST(SYSTEMD_MODULES_LOAD) +]) + +AC_DEFUN([AX_ENABLE_SYSTEMD_OPTS], [ + AX_ARG_DEFAULT_ENABLE([systemd], [Disable systemd support]) + AX_SYSTEMD_OPTIONS() +]) + +AC_DEFUN([AX_ALLOW_SYSTEMD_OPTS], [ + AX_ARG_DEFAULT_DISABLE([systemd], [Enable systemd support]) + AX_SYSTEMD_OPTIONS() +]) + +AC_DEFUN([AX_CHECK_SYSTEMD_LIBS], [ + AC_CHECK_HEADER([systemd/sd-daemon.h], [ + AC_CHECK_LIB([systemd-daemon], [sd_listen_fds], [libsystemddaemon="y"]) + ]) + AS_IF([test "x$libsystemddaemon" = x], [ + AC_MSG_ERROR([Unable to find a suitable libsystemd-daemon library]) + ]) + + PKG_CHECK_MODULES([SYSTEMD], [libsystemd-daemon]) + dnl pkg-config older than 0.24 does not set these for + dnl PKG_CHECK_MODULES() worth also noting is that as of version 208 + dnl of systemd pkg-config --cflags currently yields no extra flags yet. + AC_SUBST([SYSTEMD_CFLAGS]) + AC_SUBST([SYSTEMD_LIBS]) + + AS_IF([test "x$SYSTEMD_DIR" = x], [ + dnl In order to use the line below we need to fix upstream systemd + dnl to properly ${prefix} for child variables in + dnl src/core/systemd.pc.in but this is a bit complex at the + dnl moment as they depend on another rootprefix, which can vary + dnl from prefix in practice. We provide our own definition as we + dnl *know* where systemd will dump this to, but this does limit + dnl us to stick to a non custom systemdsystemunitdir, to work + dnl around this we provide the additional configure option + dnl --with-systemd where you can specify the directory for the unit + dnl files. It would also be best to just extend the upstream + dnl pkg-config pkg.m4 with an AC_DEFUN() to do this neatly. + dnl SYSTEMD_DIR="`$PKG_CONFIG --define-variable=prefix=$PREFIX --variable=systemdsystemunitdir systemd`" + SYSTEMD_DIR="\$(prefix)/lib/systemd/system/" + ], []) + + AS_IF([test "x$SYSTEMD_DIR" = x], [ + AC_MSG_ERROR([SYSTEMD_DIR is unset]) + ], []) + + dnl There is no variable for this yet for some reason + AS_IF([test "x$SYSTEMD_MODULES_LOAD" = x], [ + SYSTEMD_MODULES_LOAD="\$(prefix)/lib/modules-load.d/" + ], []) + + AS_IF([test "x$SYSTEMD_MODULES_LOAD" = x], [ + AC_MSG_ERROR([SYSTEMD_MODULES_LOAD is unset]) + ], []) +]) + +AC_DEFUN([AX_CHECK_SYSTEMD], [ + dnl Respect user override to disable + AS_IF([test "x$enable_systemd" != "xno"], [ + AS_IF([test "x$systemd" = "xy" ], [ + AC_DEFINE([HAVE_SYSTEMD], [1], [Systemd available and enabled]) + systemd=y + AX_CHECK_SYSTEMD_LIBS() + ],[systemd=n]) + ],[systemd=n]) +]) + +AC_DEFUN([AX_CHECK_SYSTEMD_ENABLE_AVAILABLE], [ + AC_CHECK_HEADER([systemd/sd-daemon.h], [ + AC_CHECK_LIB([systemd-daemon], [sd_listen_fds], [systemd="y"]) + ]) +]) + +dnl Enables systemd by default and requires a --disable-systemd option flag +dnl to configure if you want to disable. +AC_DEFUN([AX_ENABLE_SYSTEMD], [ + AX_ENABLE_SYSTEMD_OPTS() + AX_CHECK_SYSTEMD() +]) + +dnl Systemd will be disabled by default and requires you to run configure with +dnl --enable-systemd to look for and enable systemd. +AC_DEFUN([AX_ALLOW_SYSTEMD], [ + AX_ALLOW_SYSTEMD_OPTS() + AX_CHECK_SYSTEMD() +]) + +dnl Systemd will be disabled by default but if your build system is detected +dnl to have systemd build libraries it will be enabled. You can always force +dnl disable with --disable-systemd +AC_DEFUN([AX_AVAILABLE_SYSTEMD], [ + AX_ALLOW_SYSTEMD_OPTS() + AX_CHECK_SYSTEMD_ENABLE_AVAILABLE() + AX_CHECK_SYSTEMD() +]) diff --git a/tools/config.h.in b/tools/config.h.in index 40f3d1cde7..2a0ae48a33 100644 --- a/tools/config.h.in +++ b/tools/config.h.in @@ -42,6 +42,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H +/* Systemd available and enabled */ +#undef HAVE_SYSTEMD + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_EVENTFD_H diff --git a/tools/configure b/tools/configure index 08d6a055e5..7c9bbca8a1 100755 --- a/tools/configure +++ b/tools/configure @@ -624,6 +624,11 @@ ac_includes_default="\ ac_subst_vars='LTLIBOBJS LIBOBJS +SYSTEMD_LIBS +SYSTEMD_CFLAGS +SYSTEMD_MODULES_LOAD +SYSTEMD_DIR +systemd libiconv PTYFUNCS_LIBS PTHREAD_LIBS @@ -791,6 +796,8 @@ with_system_seabios with_system_ovmf with_extra_qemuu_configure_args with_xenstored +enable_systemd +with_systemd ' ac_precious_vars='build_alias host_alias @@ -821,7 +828,9 @@ PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR glib_CFLAGS -glib_LIBS' +glib_LIBS +SYSTEMD_CFLAGS +SYSTEMD_LIBS' # Initialize some variables set by options. @@ -1453,6 +1462,7 @@ Optional Features: for Linux or NetBSD x86, otherwise off) --enable-rombios Enable ROMBIOS, (DEFAULT is on if qemu-traditional is enabled, otherwise off) + --enable-systemd Enable systemd support (default is DISABLED) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -1481,6 +1491,8 @@ Optional Packages: ocaml dependencies resolved we'll enable the C xenstored for you. If you ask for oxenstored we'll complain until you resolve those dependencies + --with-systemd set directory for systemd service files + --with-systemd-modules-load set directory for systemd modules load files Some influential environment variables: CC C compiler command @@ -1516,6 +1528,10 @@ Some influential environment variables: path overriding pkg-config's built-in search path glib_CFLAGS C compiler flags for glib, overriding pkg-config glib_LIBS linker flags for glib, overriding pkg-config + SYSTEMD_CFLAGS + C compiler flags for SYSTEMD, overriding pkg-config + SYSTEMD_LIBS + linker flags for SYSTEMD, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -2235,7 +2251,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_config_files="$ac_config_files ../config/Tools.mk hotplug/Linux/init.d/xencommons.in hotplug/Linux/init.d/sysconfig.xencommons" +ac_config_files="$ac_config_files ../config/Tools.mk hotplug/Linux/init.d/xencommons.in hotplug/Linux/init.d/sysconfig.xencommons hotplug/Linux/systemd/proc-xen.mount hotplug/Linux/systemd/var-lib-xenstored.mount hotplug/Linux/systemd/xenstored.socket hotplug/Linux/systemd/xenstored_ro.socket hotplug/Linux/systemd/xenstored.service hotplug/Linux/systemd/xenconsoled.service hotplug/Linux/systemd/xen-qemu-dom0-disk-backend.service hotplug/Linux/systemd/xendomains.service hotplug/Linux/systemd/xen-watchdog.service" ac_config_headers="$ac_config_headers config.h" @@ -3626,6 +3642,42 @@ esac +# systemd.m4 - Macros to check for and enable systemd -*- Autoconf -*- +# +# Copyright (C) 2014 Luis R. Rodriguez +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + + + + + + + + + + + + + + + + + test "x$prefix" = "xNONE" && prefix=$ac_default_prefix @@ -8333,6 +8385,293 @@ done fi # ! $rump + + + +# Check whether --enable-systemd was given. +if test "${enable_systemd+set}" = set; then : + enableval=$enable_systemd; +fi + + +if test "x$enable_systemd" = "xno"; then : + + ax_cv_systemd="n" + +elif test "x$enable_systemd" = "xyes"; then : + + ax_cv_systemd="y" + +elif test -z $ax_cv_systemd; then : + + ax_cv_systemd="n" + +fi +systemd=$ax_cv_systemd + + + + +# Check whether --with-systemd was given. +if test "${with_systemd+set}" = set; then : + withval=$with_systemd; SYSTEMD_DIR="$withval" +else + SYSTEMD_DIR="" +fi + + + + +# Check whether --with-systemd was given. +if test "${with_systemd+set}" = set; then : + withval=$with_systemd; SYSTEMD_MODULES_LOAD="$withval" +else + SYSTEMD_MODULES_LOAD="" +fi + + + + + + ac_fn_c_check_header_mongrel "$LINENO" "systemd/sd-daemon.h" "ac_cv_header_systemd_sd_daemon_h" "$ac_includes_default" +if test "x$ac_cv_header_systemd_sd_daemon_h" = xyes; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sd_listen_fds in -lsystemd-daemon" >&5 +$as_echo_n "checking for sd_listen_fds in -lsystemd-daemon... " >&6; } +if ${ac_cv_lib_systemd_daemon_sd_listen_fds+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsystemd-daemon $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sd_listen_fds (); +int +main () +{ +return sd_listen_fds (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_systemd_daemon_sd_listen_fds=yes +else + ac_cv_lib_systemd_daemon_sd_listen_fds=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_systemd_daemon_sd_listen_fds" >&5 +$as_echo "$ac_cv_lib_systemd_daemon_sd_listen_fds" >&6; } +if test "x$ac_cv_lib_systemd_daemon_sd_listen_fds" = xyes; then : + systemd="y" +fi + + +fi + + + + + if test "x$enable_systemd" != "xno"; then : + + if test "x$systemd" = "xy" ; then : + + +$as_echo "#define HAVE_SYSTEMD 1" >>confdefs.h + + systemd=y + + ac_fn_c_check_header_mongrel "$LINENO" "systemd/sd-daemon.h" "ac_cv_header_systemd_sd_daemon_h" "$ac_includes_default" +if test "x$ac_cv_header_systemd_sd_daemon_h" = xyes; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sd_listen_fds in -lsystemd-daemon" >&5 +$as_echo_n "checking for sd_listen_fds in -lsystemd-daemon... " >&6; } +if ${ac_cv_lib_systemd_daemon_sd_listen_fds+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsystemd-daemon $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sd_listen_fds (); +int +main () +{ +return sd_listen_fds (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_systemd_daemon_sd_listen_fds=yes +else + ac_cv_lib_systemd_daemon_sd_listen_fds=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_systemd_daemon_sd_listen_fds" >&5 +$as_echo "$ac_cv_lib_systemd_daemon_sd_listen_fds" >&6; } +if test "x$ac_cv_lib_systemd_daemon_sd_listen_fds" = xyes; then : + libsystemddaemon="y" +fi + + +fi + + + if test "x$libsystemddaemon" = x; then : + + as_fn_error $? "Unable to find a suitable libsystemd-daemon library" "$LINENO" 5 + +fi + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SYSTEMD" >&5 +$as_echo_n "checking for SYSTEMD... " >&6; } + +if test -n "$SYSTEMD_CFLAGS"; then + pkg_cv_SYSTEMD_CFLAGS="$SYSTEMD_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd-daemon\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libsystemd-daemon") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SYSTEMD_CFLAGS=`$PKG_CONFIG --cflags "libsystemd-daemon" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$SYSTEMD_LIBS"; then + pkg_cv_SYSTEMD_LIBS="$SYSTEMD_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd-daemon\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libsystemd-daemon") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SYSTEMD_LIBS=`$PKG_CONFIG --libs "libsystemd-daemon" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + SYSTEMD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsystemd-daemon" 2>&1` + else + SYSTEMD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsystemd-daemon" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$SYSTEMD_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (libsystemd-daemon) were not met: + +$SYSTEMD_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables SYSTEMD_CFLAGS +and SYSTEMD_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables SYSTEMD_CFLAGS +and SYSTEMD_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + SYSTEMD_CFLAGS=$pkg_cv_SYSTEMD_CFLAGS + SYSTEMD_LIBS=$pkg_cv_SYSTEMD_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + + + + if test "x$SYSTEMD_DIR" = x; then : + + SYSTEMD_DIR="\$(prefix)/lib/systemd/system/" + +fi + + if test "x$SYSTEMD_DIR" = x; then : + + as_fn_error $? "SYSTEMD_DIR is unset" "$LINENO" 5 + +fi + + if test "x$SYSTEMD_MODULES_LOAD" = x; then : + + SYSTEMD_MODULES_LOAD="\$(prefix)/lib/modules-load.d/" + +fi + + if test "x$SYSTEMD_MODULES_LOAD" = x; then : + + as_fn_error $? "SYSTEMD_MODULES_LOAD is unset" "$LINENO" 5 + +fi + + +else + systemd=n +fi + +else + systemd=n +fi + + cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -9028,6 +9367,15 @@ do "../config/Tools.mk") CONFIG_FILES="$CONFIG_FILES ../config/Tools.mk" ;; "hotplug/Linux/init.d/xencommons.in") CONFIG_FILES="$CONFIG_FILES hotplug/Linux/init.d/xencommons.in" ;; "hotplug/Linux/init.d/sysconfig.xencommons") CONFIG_FILES="$CONFIG_FILES hotplug/Linux/init.d/sysconfig.xencommons" ;; + "hotplug/Linux/systemd/proc-xen.mount") CONFIG_FILES="$CONFIG_FILES hotplug/Linux/systemd/proc-xen.mount" ;; + "hotplug/Linux/systemd/var-lib-xenstored.mount") CONFIG_FILES="$CONFIG_FILES hotplug/Linux/systemd/var-lib-xenstored.mount" ;; + "hotplug/Linux/systemd/xenstored.socket") CONFIG_FILES="$CONFIG_FILES hotplug/Linux/systemd/xenstored.socket" ;; + "hotplug/Linux/systemd/xenstored_ro.socket") CONFIG_FILES="$CONFIG_FILES hotplug/Linux/systemd/xenstored_ro.socket" ;; + "hotplug/Linux/systemd/xenstored.service") CONFIG_FILES="$CONFIG_FILES hotplug/Linux/systemd/xenstored.service" ;; + "hotplug/Linux/systemd/xenconsoled.service") CONFIG_FILES="$CONFIG_FILES hotplug/Linux/systemd/xenconsoled.service" ;; + "hotplug/Linux/systemd/xen-qemu-dom0-disk-backend.service") CONFIG_FILES="$CONFIG_FILES hotplug/Linux/systemd/xen-qemu-dom0-disk-backend.service" ;; + "hotplug/Linux/systemd/xendomains.service") CONFIG_FILES="$CONFIG_FILES hotplug/Linux/systemd/xendomains.service" ;; + "hotplug/Linux/systemd/xen-watchdog.service") CONFIG_FILES="$CONFIG_FILES hotplug/Linux/systemd/xen-watchdog.service" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; diff --git a/tools/configure.ac b/tools/configure.ac index e74fe4b135..f44b9f3a7b 100644 --- a/tools/configure.ac +++ b/tools/configure.ac @@ -9,6 +9,15 @@ AC_CONFIG_FILES([ ../config/Tools.mk hotplug/Linux/init.d/xencommons.in hotplug/Linux/init.d/sysconfig.xencommons +hotplug/Linux/systemd/proc-xen.mount +hotplug/Linux/systemd/var-lib-xenstored.mount +hotplug/Linux/systemd/xenstored.socket +hotplug/Linux/systemd/xenstored_ro.socket +hotplug/Linux/systemd/xenstored.service +hotplug/Linux/systemd/xenconsoled.service +hotplug/Linux/systemd/xen-qemu-dom0-disk-backend.service +hotplug/Linux/systemd/xendomains.service +hotplug/Linux/systemd/xen-watchdog.service ]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_AUX_DIR([../]) @@ -59,6 +68,7 @@ m4_include([../m4/fetcher.m4]) m4_include([../m4/ax_compare_version.m4]) m4_include([../m4/paths.m4]) m4_include([../m4/xenstored.m4]) +m4_include([../m4/systemd.m4]) AX_XEN_EXPAND_CONFIG() @@ -310,5 +320,6 @@ AC_CHECK_HEADERS([yajl/yajl_version.h sys/eventfd.h valgrind/memcheck.h utmp.h]) fi # ! $rump +AX_AVAILABLE_SYSTEMD() AC_OUTPUT() diff --git a/tools/hotplug/Linux/Makefile b/tools/hotplug/Linux/Makefile index 3d2d344b1c..d5a9ed2201 100644 --- a/tools/hotplug/Linux/Makefile +++ b/tools/hotplug/Linux/Makefile @@ -25,6 +25,8 @@ XEN_SCRIPTS += vscsi XEN_SCRIPTS += block-iscsi XEN_SCRIPTS += $(XEN_SCRIPTS-y) +SUBDIRS-$(CONFIG_SYSTEMD) += systemd + XEN_SCRIPT_DATA = xen-script-common.sh locking.sh logging.sh XEN_SCRIPT_DATA += xen-hotplug-common.sh xen-network-common.sh vif-common.sh XEN_SCRIPT_DATA += block-common.sh @@ -33,7 +35,7 @@ UDEV_RULES_DIR = $(CONFIG_DIR)/udev UDEV_RULES = xen-backend.rules $(UDEV_RULES-y) .PHONY: all -all: $(XENCOMMONS_INITD) +all: $(XENCOMMONS_INITD) subdirs-all $(XENCOMMONS_INITD): $(XEN_ROOT)/config/$(XEN_OS).modules $(XENCOMMONS_INITD).in $(XEN_ROOT)/tools/hotplug/Linux/update-modules.sh \ @@ -45,7 +47,7 @@ $(XENCOMMONS_INITD): $(XEN_ROOT)/config/$(XEN_OS).modules $(XENCOMMONS_INITD).in build: all .PHONY: install -install: all install-initd install-scripts install-udev +install: all install-initd install-scripts install-udev subdirs-install # See docs/misc/distro_mapping.txt for INITD_DIR location .PHONY: install-initd @@ -83,4 +85,4 @@ install-udev: done .PHONY: clean -clean: +clean: subdirs-clean diff --git a/tools/hotplug/Linux/systemd/Makefile b/tools/hotplug/Linux/systemd/Makefile new file mode 100644 index 0000000000..dc98b67367 --- /dev/null +++ b/tools/hotplug/Linux/systemd/Makefile @@ -0,0 +1,67 @@ +XEN_ROOT = $(CURDIR)/../../../.. +include $(XEN_ROOT)/tools/Rules.mk + +XEN_SYSTEMD_MODULES = xen.conf + +XEN_SYSTEMD_MOUNT = proc-xen.mount +XEN_SYSTEMD_MOUNT += var-lib-xenstored.mount + +XEN_SYSTEMD_SOCKET = xenstored.socket +XEN_SYSTEMD_SOCKET += xenstored_ro.socket + +XEN_SYSTEMD_SERVICE = xenstored.service +XEN_SYSTEMD_SERVICE += xenconsoled.service +XEN_SYSTEMD_SERVICE += xen-qemu-dom0-disk-backend.service +XEN_SYSTEMD_SERVICE += xendomains.service +XEN_SYSTEMD_SERVICE += xen-watchdog.service + +ALL_XEN_SYSTEMD = $(XEN_SYSTEMD_MODULES) \ + $(XEN_SYSTEMD_MOUNT) \ + $(XEN_SYSTEMD_SOCKET) \ + $(XEN_SYSTEMD_SERVICE) + +.PHONY: all +all: $(ALL_XEN_SYSTEMD) + +.PHONY: clean +clean: + +.PHONY: install +install: $(ALL_XEN_SYSTEMD) + [ -d $(DESTDIR)$(XEN_SYSTEMD_DIR) ] || \ + $(INSTALL_DIR) $(DESTDIR)$(XEN_SYSTEMD_DIR) + [ -d $(DESTDIR)$(XEN_SYSTEMD_MODULES_LOAD) ] || \ + $(INSTALL_DIR) $(DESTDIR)$(XEN_SYSTEMD_MODULES_LOAD) + $(INSTALL_DATA) *.socket $(DESTDIR)$(XEN_SYSTEMD_DIR) + $(INSTALL_DATA) *.service $(DESTDIR)$(XEN_SYSTEMD_DIR) + $(INSTALL_DATA) *.mount $(DESTDIR)$(XEN_SYSTEMD_DIR) + $(INSTALL_DATA) *.conf $(DESTDIR)$(XEN_SYSTEMD_MODULES_LOAD) + +$(XEN_SYSTEMD_MODULES): $(XEN_ROOT)/config/$(XEN_OS).modules + @set -e ; \ + IFS='' ;\ + cat $(XEN_ROOT)/config/$(XEN_OS).modules | ( \ + while read l ; do \ + if echo $${l} | egrep -q "^#" ; then \ + continue ;\ + fi ;\ + if echo "$${l}" | egrep -q "\|" ; then \ + m1=$${l%%|*} ;\ + m2=$${l#*|} ;\ + # Systemd modules-load.d lacks support ;\ + # for module replacement options, we ;\ + # need to add that support upstream but ;\ + # its best instead to ensure this file ;\ + # is no longer needed. Some folks ;\ + # however have reported issues with ;\ + # some modules automatically loading ;\ + # so we just load all necessary xen ;\ + # modules and for replacements we load ;\ + # the latest module ;\ + echo "$$m1" ;\ + echo "$$m2" ;\ + else \ + echo "$$l" ;\ + fi ;\ + done \ + ) > $@ diff --git a/tools/hotplug/Linux/systemd/proc-xen.mount.in b/tools/hotplug/Linux/systemd/proc-xen.mount.in new file mode 100644 index 0000000000..f0c4f3a556 --- /dev/null +++ b/tools/hotplug/Linux/systemd/proc-xen.mount.in @@ -0,0 +1,9 @@ +[Unit] +Description=Mount /proc/xen files +ConditionVirtualization=xen +RefuseManualStop=true + +[Mount] +What=xenfs +Where=/proc/xen +Type=xenfs diff --git a/tools/hotplug/Linux/systemd/var-lib-xenstored.mount.in b/tools/hotplug/Linux/systemd/var-lib-xenstored.mount.in new file mode 100644 index 0000000000..44dfce8fc4 --- /dev/null +++ b/tools/hotplug/Linux/systemd/var-lib-xenstored.mount.in @@ -0,0 +1,13 @@ +[Unit] +Description=mount xenstore file system +ConditionVirtualization=xen +RefuseManualStop=true + +[Mount] +Environment=XENSTORED_MOUNT_CTX=none +EnvironmentFile=-/etc/sysconfig/xenstored +EnvironmentFile=-/etc/default/xenstored +What=xenstore +Where=@XEN_LIB_STORED@ +Type=tmpfs +Options=mode=755,context="$XENSTORED_MOUNT_CTX" diff --git a/tools/hotplug/Linux/systemd/xen-qemu-dom0-disk-backend.service.in b/tools/hotplug/Linux/systemd/xen-qemu-dom0-disk-backend.service.in new file mode 100644 index 0000000000..8dbd110dd3 --- /dev/null +++ b/tools/hotplug/Linux/systemd/xen-qemu-dom0-disk-backend.service.in @@ -0,0 +1,22 @@ +[Unit] +Description=qemu for xen dom0 disk backend +Requires=proc-xen.mount var-lib-xenstored.mount xenstored.socket +After=xenstored.service xenconsoled.service +Before=xendomains.service libvirtd.service libvirt-guests.service +RefuseManualStop=true +ConditionVirtualization=xen + +[Service] +Type=simple +EnvironmentFile=-/etc/default/xenstored +EnvironmentFile=-/etc/sysconfig/xenstored +PIDFile=@XEN_RUN_DIR@/qemu-dom0.pid +ExecStartPre=/bin/grep -q control_d /proc/xen/capabilities +ExecStartPre=/bin/mkdir -p /var/run/xen +ExecStart=@LIBEXEC@/qemu-system-i386 -xen-domid 0 \ + -xen-attach -name dom0 -nographic -M xenpv -daemonize \ + -monitor /dev/null -serial /dev/null -parallel /dev/null \ + -pidfile @XEN_RUN_DIR@/qemu-dom0.pid + +[Install] +WantedBy=multi-user.target diff --git a/tools/hotplug/Linux/systemd/xen-watchdog.service.in b/tools/hotplug/Linux/systemd/xen-watchdog.service.in new file mode 100644 index 0000000000..acb2b775a6 --- /dev/null +++ b/tools/hotplug/Linux/systemd/xen-watchdog.service.in @@ -0,0 +1,13 @@ +[Unit] +Description=Xen-watchdog - run xen watchdog daemon +Requires=proc-xen.mount +After=proc-xen.mount xendomains.service +ConditionVirtualization=xen + +[Service] +Type=forking +ExecStart=@SBINDIR@/xenwatchdogd 30 15 +KillSignal=USR1 + +[Install] +WantedBy=multi-user.target diff --git a/tools/hotplug/Linux/systemd/xenconsoled.service.in b/tools/hotplug/Linux/systemd/xenconsoled.service.in new file mode 100644 index 0000000000..15fad3504f --- /dev/null +++ b/tools/hotplug/Linux/systemd/xenconsoled.service.in @@ -0,0 +1,20 @@ +[Unit] +Description=Xenconsoled - handles logging from guest consoles and hypervisor +Requires=xenstored.socket +After=xenstored.service +ConditionVirtualization=xen + +[Service] +Type=simple +Environment=XENCONSOLED_ARGS= +Environment=XENCONSOLED_LOG=none +Environment=XENCONSOLED_LOG_DIR=@XEN_LOG_DIR@/console +EnvironmentFile=-/etc/default/xenconsoled +EnvironmentFile=-/etc/sysconfig/xenconsoled +PIDFile=@XEN_RUN_DIR@/xenconsoled.pid +ExecStartPre=/bin/grep -q control_d /proc/xen/capabilities +ExecStartPre=/bin/mkdir -p ${XENCONSOLED_LOG_DIR} +ExecStart=@SBINDIR@/xenconsoled --pid-file @XEN_RUN_DIR@/xenconsoled.pid --log=${XENCONSOLED_LOG} --log-dir=${XENCONSOLED_LOG_DIR} $XENCONSOLED_ARGS + +[Install] +WantedBy=multi-user.target diff --git a/tools/hotplug/Linux/systemd/xendomains.service.in b/tools/hotplug/Linux/systemd/xendomains.service.in new file mode 100644 index 0000000000..70ce7c06d2 --- /dev/null +++ b/tools/hotplug/Linux/systemd/xendomains.service.in @@ -0,0 +1,16 @@ +[Unit] +Description=Xendomains - start and stop guests on boot and shutdown +Requires=xenstored.socket +After=xenstored.service xenconsoled.service +ConditionVirtualization=xen + +[Service] +Type=oneshot +RemainAfterExit=true +ExecStartPre=/bin/grep -q control_d /proc/xen/capabilities +ExecStart=-@LIBEXEC@/xendomains start +ExecStop=@LIBEXEC@/xendomains stop +ExecReload=@LIBEXEC@/xendomains restart + +[Install] +WantedBy=multi-user.target diff --git a/tools/hotplug/Linux/systemd/xenstored.service.in b/tools/hotplug/Linux/systemd/xenstored.service.in new file mode 100644 index 0000000000..4a9fcee009 --- /dev/null +++ b/tools/hotplug/Linux/systemd/xenstored.service.in @@ -0,0 +1,27 @@ +[Unit] +Description=The Xen xenstore +Requires=xenstored_ro.socket xenstored.socket proc-xen.mount var-lib-xenstored.mount +After=proc-xen.mount var-lib-xenstored.mount +Before=libvirtd.service libvirt-guests.service +RefuseManualStop=true +ConditionVirtualization=xen + +[Service] +Type=notify +Environment=XENSTORED_ARGS= +Environment=XENSTORED_ROOTDIR=@XEN_LIB_STORED@ +Environment=XENSTORED=@XENSTORED@ +EnvironmentFile=-/etc/default/xencommons +EnvironmentFile=-/etc/sysconfig/xencommons +ExecStartPre=/bin/grep -q control_d /proc/xen/capabilities +ExecStartPre=-/bin/rm -f @XEN_LIB_STORED@/tdb* +ExecStartPre=/bin/mkdir -p @XEN_RUN_DIR@ +ExecStart=/bin/sh -c "exec $XENSTORED --no-fork $XENSTORED_ARGS" +ExecStartPost=-@BINDIR@/xenstore-write "/local/domain/0/name" "Domain-0" +ExecStartPost=-@BINDIR@/xenstore-write "/local/domain/0/domid" 0 + +[Install] +WantedBy=multi-user.target +Also=xenstored_ro.socket xenstored.socket +Also=proc-xen.mount +Also=var-lib-xenstored.mount diff --git a/tools/hotplug/Linux/systemd/xenstored.socket.in b/tools/hotplug/Linux/systemd/xenstored.socket.in new file mode 100644 index 0000000000..461e4f4786 --- /dev/null +++ b/tools/hotplug/Linux/systemd/xenstored.socket.in @@ -0,0 +1,11 @@ +[Unit] +Description=xenstore socket +ConditionVirtualization=xen + +[Socket] +ListenStream=/var/run/xenstored/socket +SocketMode=0600 +Service=xenstored.service + +[Install] +WantedBy=sockets.target diff --git a/tools/hotplug/Linux/systemd/xenstored_ro.socket.in b/tools/hotplug/Linux/systemd/xenstored_ro.socket.in new file mode 100644 index 0000000000..6ab5c28f29 --- /dev/null +++ b/tools/hotplug/Linux/systemd/xenstored_ro.socket.in @@ -0,0 +1,11 @@ +[Unit] +Description=xenstore ro socket +ConditionVirtualization=xen + +[Socket] +ListenStream=/var/run/xenstored/socket_ro +SocketMode=0660 +Service=xenstored.service + +[Install] +WantedBy=sockets.target diff --git a/tools/ocaml/xenstored/Makefile b/tools/ocaml/xenstored/Makefile index 382a81359e..068e04abae 100644 --- a/tools/ocaml/xenstored/Makefile +++ b/tools/ocaml/xenstored/Makefile @@ -3,6 +3,11 @@ OCAML_TOPLEVEL = $(CURDIR)/.. include $(OCAML_TOPLEVEL)/common.make CFLAGS += -I$(XEN_ROOT)/tools/ +CFLAGS-$(CONFIG_SYSTEMD) += $(SYSTEMD_CFLAGS) +LDFLAGS-$(CONFIG_SYSTEMD) += $(SYSTEMD_LIBS) + +CFLAGS += $(CFLAGS-y) +LDFLAGS += $(LDFLAGS-y) OCAMLINCLUDE += \ -I $(OCAML_TOPLEVEL)/libs/xb \ diff --git a/tools/xenstore/Makefile b/tools/xenstore/Makefile index 08460c87a6..48f1e96d0e 100644 --- a/tools/xenstore/Makefile +++ b/tools/xenstore/Makefile @@ -9,6 +9,12 @@ CFLAGS += -I. CFLAGS += -I$(XEN_ROOT)/tools/ CFLAGS += $(CFLAGS_libxenctrl) +CFLAGS-$(CONFIG_SYSTEMD) += $(SYSTEMD_CFLAGS) +LDFLAGS-$(CONFIG_SYSTEMD) += $(SYSTEMD_LIBS) + +CFLAGS += $(CFLAGS-y) +LDFLAGS += $(LDFLAGS-y) + CLIENTS := xenstore-exists xenstore-list xenstore-read xenstore-rm xenstore-chmod CLIENTS += xenstore-write xenstore-ls xenstore-watch