Hi Carlos, Doesn't this mean that, even though it might not be possible to do this today (is it?), you're effectively disabling the usage of physical disks for VMs, i.e. equivalent of a raw disk device used in other hypervisors?
Regards, Raf On Thu, Aug 31, 2017 at 12:56:20AM BST, Carlos Cardenas wrote: > Add check(s) in vmd/vmctl to ensure a VM's disk are regular files. > > Tested with the following: > vmctl start "test1" -d /dev/sd3c #block device > vmctl start "test2" -d /dev/rsd3c #char device > vmctl start "test3" -d fifo #named pipe > > Comments? Ok? > > diff --git usr.sbin/vmctl/vmctl.c usr.sbin/vmctl/vmctl.c > index f694f61e48c..e3db6a78c5b 100644 > --- usr.sbin/vmctl/vmctl.c > +++ usr.sbin/vmctl/vmctl.c > @@ -204,6 +204,11 @@ vm_start_complete(struct imsg *imsg, int *ret, int > autoconnect) > warnx("could not find specified disk image(s)"); > *ret = ENOENT; > break; > + case VMD_DISK_INVALID: > + warnx("specified disk image(s) are " > + "not regular files"); > + *ret = ENOENT; > + break; > default: > errno = res; > warn("start vm command failed"); > diff --git usr.sbin/vmd/config.c usr.sbin/vmd/config.c > index 1e1166f8263..ced7ab666b4 100644 > --- usr.sbin/vmd/config.c > +++ usr.sbin/vmd/config.c > @@ -20,6 +20,7 @@ > #include <sys/queue.h> > #include <sys/time.h> > #include <sys/uio.h> > +#include <sys/stat.h> > #include <sys/socket.h> > > #include <net/if.h> > @@ -157,6 +158,7 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, > uint32_t peerid, uid_t uid) > struct vmd_if *vif; > struct vmop_create_params *vmc = &vm->vm_params; > struct vm_create_params *vcp = &vmc->vmc_params; > + struct stat stat_buf; > unsigned int i; > int fd = -1, vmboot = 0; > int kernfd = -1, *diskfds = NULL, *tapfds = NULL; > @@ -225,6 +227,19 @@ config_setvm(struct privsep *ps, struct vmd_vm *vm, > uint32_t peerid, uid_t uid) > > /* Open disk images for child */ > for (i = 0 ; i < vcp->vcp_ndisks; i++) { > + /* Stat disk[i] to ensure it is a regular file */ > + if (stat(vcp->vcp_disks[i], &stat_buf) == -1) { > + log_warn("%s: can't open disk %s", __func__, > + vcp->vcp_disks[i]); > + errno = VMD_DISK_MISSING; > + goto fail; > + } > + if (S_ISREG(stat_buf.st_mode) == 0) { > + log_warn("%s: disk %s is not a regular file", __func__, > + vcp->vcp_disks[i]); > + errno = VMD_DISK_INVALID; > + goto fail; > + } > if ((diskfds[i] = > open(vcp->vcp_disks[i], O_RDWR)) == -1) { > log_warn("%s: can't open disk %s", __func__, > diff --git usr.sbin/vmd/vmd.h usr.sbin/vmd/vmd.h > index 57bdb71cd5f..daeffa7c80e 100644 > --- usr.sbin/vmd/vmd.h > +++ usr.sbin/vmd/vmd.h > @@ -53,6 +53,7 @@ > /* vmd -> vmctl error codes */ > #define VMD_BIOS_MISSING 1001 > #define VMD_DISK_MISSING 1002 > +#define VMD_DISK_INVALID 1003 > > /* 100.64.0.0/10 from rfc6598 (IPv4 Prefix for Shared Address Space) */ > #define VMD_DHCP_PREFIX "100.64.0.0/10" > -- > 2.14.1 > -- Raf Czlonka Support Systems Analyst Clinical School Computing Service, School of Clinical Medicine University of Cambridge, Box 111 Cambridge Biomedical Campus Cambridge, CB2 0SP, Tel. 01223 (7)46728