Add bhyve support to virt-host-validate(1). It checks for the essential kernel modules to be available so that user can actually start VMs, have networking and console access. It uses the kldnext(2)/kldstat(2) routines to retrieve modules list. As bhyve is only available on FreeBSD and these routines were available long before bhyve appeared, not adding any specific configure checks for that. --- po/POTFILES.in | 1 + tools/Makefile.am | 1 + tools/virt-host-validate-bhyve.c | 78 ++++++++++++++++++++++++++++++++++++++++ tools/virt-host-validate-bhyve.h | 27 ++++++++++++++ tools/virt-host-validate.c | 12 +++++++ tools/virt-host-validate.pod | 4 +-- 6 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 tools/virt-host-validate-bhyve.c create mode 100644 tools/virt-host-validate-bhyve.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 9f66697d7..51b5859cb 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -306,6 +306,7 @@ tools/virsh-snapshot.c tools/virsh-volume.c tools/virsh.c tools/virt-admin.c +tools/virt-host-validate-bhyve.c tools/virt-host-validate-common.c tools/virt-host-validate-lxc.c tools/virt-host-validate-qemu.c diff --git a/tools/Makefile.am b/tools/Makefile.am index e6ae15025..a8bd3d1c2 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -142,6 +142,7 @@ virt_host_validate_SOURCES = \ virt-host-validate-common.c virt-host-validate-common.h \ virt-host-validate-qemu.c virt-host-validate-qemu.h \ virt-host-validate-lxc.c virt-host-validate-lxc.h \ + virt-host-validate-bhyve.c virt-host-validate-bhyve.h \ $(NULL) virt_host_validate_LDFLAGS = \ diff --git a/tools/virt-host-validate-bhyve.c b/tools/virt-host-validate-bhyve.c new file mode 100644 index 000000000..c7bf96f05 --- /dev/null +++ b/tools/virt-host-validate-bhyve.c @@ -0,0 +1,78 @@ +/* + * virt-host-validate-bhyve.c: Sanity check a bhyve hypervisor host + * + * Copyright (C) 2017 Roman Bogorodskiy + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include <config.h> + +#include <sys/param.h> +#include <sys/linker.h> +#include <stdio.h> + +#include "virt-host-validate-bhyve.h" +#include "virt-host-validate-common.h" + +#define MODULE_STATUS(mod, err_msg, err_code) \ + virHostMsgCheck("BHYVE", _("for %s module"), #mod); \ + if (mod ## _loaded) { \ + virHostMsgPass(); \ + } else { \ + virHostMsgFail(err_code, \ + _("%s module is not loaded, " err_msg), \ + #mod); \ + ret = -1; \ + } \ + +#define MODULE_STATUS_FAIL(mod, err_msg) \ + MODULE_STATUS(mod, err_msg, VIR_HOST_VALIDATE_FAIL) + +#define MODULE_STATUS_WARN(mod, err_msg) \ + MODULE_STATUS(mod, err_msg, VIR_HOST_VALIDATE_WARN) + + +int virHostValidateBhyve(void) +{ + int ret = 0; + int fileid = 0; + struct kld_file_stat stat; + bool vmm_loaded = false, if_tap_loaded = false; + bool if_bridge_loaded = false, nmdm_loaded = false; + + for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) { + stat.version = sizeof(struct kld_file_stat); + if (kldstat(fileid, &stat) < 0) + continue; + + if (STREQ(stat.name, "vmm.ko")) + vmm_loaded = true; + else if (STREQ(stat.name, "if_tap.ko")) + if_tap_loaded = true; + else if (STREQ(stat.name, "if_bridge.ko")) + if_bridge_loaded = true; + else if (STREQ(stat.name, "nmdm.ko")) + nmdm_loaded = true; + } + + MODULE_STATUS_FAIL(vmm, "will not be able to start VMs"); + MODULE_STATUS_WARN(if_tap, "networking will not work"); + MODULE_STATUS_WARN(if_bridge, "bridged networking will not work"); + MODULE_STATUS_WARN(nmdm, "nmdm console will not work"); + + return ret; +} diff --git a/tools/virt-host-validate-bhyve.h b/tools/virt-host-validate-bhyve.h new file mode 100644 index 000000000..290d4336f --- /dev/null +++ b/tools/virt-host-validate-bhyve.h @@ -0,0 +1,27 @@ +/* + * virt-host-validate-bhyve.h: Sanity check a bhyve hypervisor host + * + * Copyright (C) 2017 Roman Bogorodskiy + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#ifndef __VIRT_HOST_VALIDATE_BHYVE_H__ +# define __VIRT_HOST_VALIDATE_BHYVE_H__ + +int virHostValidateBhyve(void); + +#endif /* __VIRT_HOST_VALIDATE_BHYVE_H__ */ diff --git a/tools/virt-host-validate.c b/tools/virt-host-validate.c index f09282412..29d2482b6 100644 --- a/tools/virt-host-validate.c +++ b/tools/virt-host-validate.c @@ -36,6 +36,9 @@ #if WITH_LXC # include "virt-host-validate-lxc.h" #endif +#if WITH_BHYVE +# include "virt-host-validate-bhyve.h" +#endif static void show_help(FILE *out, const char *argv0) @@ -48,6 +51,7 @@ show_help(FILE *out, const char *argv0) "\n" " - qemu\n" " - lxc\n" + " - bhyve\n" "\n" " Options:\n" " -h, --help Display command line help\n" @@ -130,6 +134,14 @@ main(int argc, char **argv) } #endif +#if WITH_BHYVE + if (!hvname || STREQ(hvname, "bhyve")) { + usedHvname = true; + if (virHostValidateBhyve() < 0) + ret = EXIT_FAILURE; + } +#endif + if (hvname && !usedHvname) { fprintf(stderr, _("%s: unsupported hypervisor name %s\n"), argv[0], hvname); diff --git a/tools/virt-host-validate.pod b/tools/virt-host-validate.pod index 84917c83b..910114175 100644 --- a/tools/virt-host-validate.pod +++ b/tools/virt-host-validate.pod @@ -12,8 +12,8 @@ This tool validates that the host is configured in a suitable way to run libvirt hypervisor drivers. If invoked without any arguments it will check support for all hypervisor drivers it is aware of. Optionally it can be given a particular hypervisor -type ('qemu' or 'lxc') to restrict the checks to those relevant -for that virtualization technology +type ('qemu', 'lxc' or 'bhyve') to restrict the checks +to those relevant for that virtualization technology =head1 OPTIONS -- 2.11.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list