diff options
author | neel <neel@FreeBSD.org> | 2013-10-17 00:28:35 +0000 |
---|---|---|
committer | neel <neel@FreeBSD.org> | 2013-10-17 00:28:35 +0000 |
commit | 24a03e33cfed07a0a177ec644b81666406a76ce3 (patch) | |
tree | 58758e4bee94ba049066782ce69d754fa2cf137d | |
parent | c39edfbbf86784a5c5ddca4f4b1599f8e39313f0 (diff) | |
download | FreeBSD-src-24a03e33cfed07a0a177ec644b81666406a76ce3.zip FreeBSD-src-24a03e33cfed07a0a177ec644b81666406a76ce3.tar.gz |
Add an option to bhyveload(8) that allows setting a loader environment variable
from the command line.
The option syntax is "-e <name=value>". It may be used multiple times to set
multiple environment variables.
Reviewed by: grehan
Requested by: alfred
-rwxr-xr-x | share/examples/bhyve/vmrun.sh | 11 | ||||
-rw-r--r-- | usr.sbin/bhyveload/bhyveload.8 | 9 | ||||
-rw-r--r-- | usr.sbin/bhyveload/bhyveload.c | 55 |
3 files changed, 56 insertions, 19 deletions
diff --git a/share/examples/bhyve/vmrun.sh b/share/examples/bhyve/vmrun.sh index 2e1bb38..edb6048 100755 --- a/share/examples/bhyve/vmrun.sh +++ b/share/examples/bhyve/vmrun.sh @@ -39,11 +39,12 @@ DEFAULT_VIRTIO_DISK="./diskdev" DEFAULT_ISOFILE="./release.iso" usage() { - echo "Usage: vmrun.sh [-hai][-g <gdbport>][-m <memsize>][-d <disk file>][-I <location of installation iso>][-t <tapdev>] <vmname>" + echo "Usage: vmrun.sh [-hai][-g <gdbport>][-m <memsize>][-d <disk file>][-e <name=value>][-I <location of installation iso>][-t <tapdev>] <vmname>" echo " -h: display this help message" echo " -a: force memory mapped local apic access" echo " -c: number of virtual cpus (default is ${DEFAULT_CPUS})" echo " -d: virtio diskdev file (default is ${DEFAULT_VIRTIO_DISK})" + echo " -e: set FreeBSD loader environment variable" echo " -g: listen for connection from kgdb at <gdbport>" echo " -i: force boot of the Installation CDROM image" echo " -I: Installation CDROM image location (default is ${DEFAULT_ISOFILE})" @@ -73,8 +74,9 @@ virtio_diskdev=${DEFAULT_VIRTIO_DISK} tapdev=${DEFAULT_TAPDEV} apic_opt="" gdbport=0 +env_opt="" -while getopts haic:g:I:m:d:t: c ; do +while getopts haic:e:g:I:m:d:t: c ; do case $c in h) usage @@ -85,6 +87,9 @@ while getopts haic:g:I:m:d:t: c ; do d) virtio_diskdev=${OPTARG} ;; + e) + env_opt="${env_opt} -e ${OPTARG}" + ;; g) gdbport=${OPTARG} ;; i) @@ -163,7 +168,7 @@ while [ 1 ]; do installer_opt="" fi - ${LOADER} -m ${memsize} -d ${BOOTDISK} ${vmname} + ${LOADER} -m ${memsize} -d ${BOOTDISK} ${env_opt} ${vmname} if [ $? -ne 0 ]; then break fi diff --git a/usr.sbin/bhyveload/bhyveload.8 b/usr.sbin/bhyveload/bhyveload.8 index 2efcad0..00ce362 100644 --- a/usr.sbin/bhyveload/bhyveload.8 +++ b/usr.sbin/bhyveload/bhyveload.8 @@ -38,6 +38,7 @@ guest inside a bhyve virtual machine .Op Fl m Ar mem-size .Op Fl d Ar disk-path .Op Fl h Ar host-path +.Op Fl e Ar name=value .Ar vmname .Sh DESCRIPTION .Nm @@ -91,6 +92,14 @@ is the pathname of the guest's boot disk image. The .Ar host-path is the directory at the top of the guest's boot filesystem. +.It Fl e Ar name=value +Set the FreeBSD loader environment variable +.Ar name +to +.Ar value . +.Pp +The option may be used more than once to set more than one environment +variable. .El .Sh EXAMPLES To create a virtual machine named diff --git a/usr.sbin/bhyveload/bhyveload.c b/usr.sbin/bhyveload/bhyveload.c index 6e541e8..4ce3df4 100644 --- a/usr.sbin/bhyveload/bhyveload.c +++ b/usr.sbin/bhyveload/bhyveload.c @@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$"); #include <sys/ioctl.h> #include <sys/stat.h> #include <sys/disk.h> +#include <sys/queue.h> #include <machine/specialreg.h> #include <machine/vmm.h> @@ -498,23 +499,37 @@ cb_getmem(void *arg, uint64_t *ret_lowmem, uint64_t *ret_highmem) vm_get_memory_seg(ctx, 4 * GB, ret_highmem, NULL); } -static const char * -cb_getenv(void *arg, int num) +struct env { + const char *str; /* name=value */ + SLIST_ENTRY(env) next; +}; + +static SLIST_HEAD(envhead, env) envhead; + +static void +addenv(const char *str) { - int max; + struct env *env; - static const char * var[] = { - "smbios.bios.vendor=BHYVE", - "boot_serial=1", - NULL - }; + env = malloc(sizeof(struct env)); + env->str = str; + SLIST_INSERT_HEAD(&envhead, env, next); +} - max = sizeof(var) / sizeof(var[0]); +static const char * +cb_getenv(void *arg, int num) +{ + int i; + struct env *env; + + i = 0; + SLIST_FOREACH(env, &envhead, next) { + if (i == num) + return (env->str); + i++; + } - if (num < max) - return (var[num]); - else - return (NULL); + return (NULL); } static struct loader_callbacks cb = { @@ -553,8 +568,8 @@ usage(void) { fprintf(stderr, - "usage: %s [-m mem-size][-d <disk-path>] [-h <host-path>] " - "<vmname>\n", progname); + "usage: %s [-m mem-size][-d <disk-path>] [-h <host-path>] " + "[-e <name=value>] <vmname>\n", progname); exit(1); } @@ -572,12 +587,16 @@ main(int argc, char** argv) mem_size = 256 * MB; disk_image = NULL; - while ((opt = getopt(argc, argv, "d:h:m:")) != -1) { + while ((opt = getopt(argc, argv, "d:e:h:m:")) != -1) { switch (opt) { case 'd': disk_image = optarg; break; + case 'e': + addenv(optarg); + break; + case 'h': host_base = optarg; break; @@ -638,5 +657,9 @@ main(int argc, char** argv) if (disk_image) { disk_fd = open(disk_image, O_RDONLY); } + + addenv("smbios.bios.vendor=BHYVE"); + addenv("boot_serial=1"); + func(&cb, NULL, USERBOOT_VERSION_3, disk_fd >= 0); } |