virt-host-validate: distinguish exists vs accessible for devices

Currently we just check that various devices are accessible.
This leads to inaccurate errors reported for /dev/kvm and
/dev/vhost-net if they exist but an unprivileged user lacks
access. Switch existing checks to look for file existance,
and add a separate check for accessibility of /dev/kvm
since some distros don't grant users access by default.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2015-10-07 17:02:31 +01:00
parent 8a6b6037f8
commit fd6d506c50
3 changed files with 47 additions and 21 deletions

View File

@ -115,12 +115,29 @@ void virHostMsgFail(virHostValidateLevel level,
}
int virHostValidateDevice(const char *hvname,
const char *dev_name,
virHostValidateLevel level,
const char *hint)
int virHostValidateDeviceExists(const char *hvname,
const char *dev_name,
virHostValidateLevel level,
const char *hint)
{
virHostMsgCheck(hvname, "for device %s", dev_name);
virHostMsgCheck(hvname, "if device %s exists", dev_name);
if (access(dev_name, F_OK) < 0) {
virHostMsgFail(level, hint);
return -1;
}
virHostMsgPass();
return 0;
}
int virHostValidateDeviceAccessible(const char *hvname,
const char *dev_name,
virHostValidateLevel level,
const char *hint)
{
virHostMsgCheck(hvname, "if device %s is accessible", dev_name);
if (access(dev_name, R_OK|W_OK) < 0) {
virHostMsgFail(level, hint);

View File

@ -42,10 +42,15 @@ extern void virHostMsgPass(void);
extern void virHostMsgFail(virHostValidateLevel level,
const char *hint);
extern int virHostValidateDevice(const char *hvname,
const char *dev_name,
virHostValidateLevel level,
const char *hint);
extern int virHostValidateDeviceExists(const char *hvname,
const char *dev_name,
virHostValidateLevel level,
const char *hint);
extern int virHostValidateDeviceAccessible(const char *hvname,
const char *dev_name,
virHostValidateLevel level,
const char *hint);
extern bool virHostValidateHasCPUFlag(const char *name);

View File

@ -20,7 +20,6 @@
*/
#include <config.h>
#include "virt-host-validate-qemu.h"
#include "virt-host-validate-common.h"
@ -32,25 +31,30 @@ int virHostValidateQEMU(void)
if (virHostValidateHasCPUFlag("svm") ||
virHostValidateHasCPUFlag("vmx")) {
virHostMsgPass();
if (virHostValidateDevice("QEMU", "/dev/kvm",
VIR_HOST_VALIDATE_FAIL,
_("Check that the 'kvm-intel' or 'kvm-amd' modules are "
"loaded & the BIOS has enabled virtualization")) < 0)
if (virHostValidateDeviceExists("QEMU", "/dev/kvm",
VIR_HOST_VALIDATE_FAIL,
_("Check that the 'kvm-intel' or 'kvm-amd' modules are "
"loaded & the BIOS has enabled virtualization")) < 0)
ret = -1;
else if (virHostValidateDeviceAccessible("QEMU", "/dev/kvm",
VIR_HOST_VALIDATE_FAIL,
_("Check /dev/kvm is world writable or you are in "
"a group that is allowed to access it")) < 0)
ret = -1;
} else {
virHostMsgFail(VIR_HOST_VALIDATE_WARN,
_("Only emulated CPUs are available, performance will be significantly limited"));
}
if (virHostValidateDevice("QEMU", "/dev/vhost-net",
VIR_HOST_VALIDATE_WARN,
_("Load the 'vhost_net' module to improve performance "
"of virtio networking")) < 0)
if (virHostValidateDeviceExists("QEMU", "/dev/vhost-net",
VIR_HOST_VALIDATE_WARN,
_("Load the 'vhost_net' module to improve performance "
"of virtio networking")) < 0)
ret = -1;
if (virHostValidateDevice("QEMU", "/dev/net/tun",
VIR_HOST_VALIDATE_FAIL,
_("Load the 'tun' module to enable networking for QEMU guests")) < 0)
if (virHostValidateDeviceExists("QEMU", "/dev/net/tun",
VIR_HOST_VALIDATE_FAIL,
_("Load the 'tun' module to enable networking for QEMU guests")) < 0)
ret = -1;
return ret;