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
This commit is contained in:
parent
5d452cea64
commit
b6afa84b8c
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
struct env {
|
||||
const char *str; /* name=value */
|
||||
SLIST_ENTRY(env) next;
|
||||
};
|
||||
|
||||
static SLIST_HEAD(envhead, env) envhead;
|
||||
|
||||
static void
|
||||
addenv(const char *str)
|
||||
{
|
||||
struct env *env;
|
||||
|
||||
env = malloc(sizeof(struct env));
|
||||
env->str = str;
|
||||
SLIST_INSERT_HEAD(&envhead, env, next);
|
||||
}
|
||||
|
||||
static const char *
|
||||
cb_getenv(void *arg, int num)
|
||||
{
|
||||
int max;
|
||||
int i;
|
||||
struct env *env;
|
||||
|
||||
static const char * var[] = {
|
||||
"smbios.bios.vendor=BHYVE",
|
||||
"boot_serial=1",
|
||||
NULL
|
||||
};
|
||||
i = 0;
|
||||
SLIST_FOREACH(env, &envhead, next) {
|
||||
if (i == num)
|
||||
return (env->str);
|
||||
i++;
|
||||
}
|
||||
|
||||
max = sizeof(var) / sizeof(var[0]);
|
||||
|
||||
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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user