qemu-nbd: allow specifying image as a set of options args
Currently qemu-nbd allows an image filename to be passed on the command line, but unless using the JSON format, it does not have a way to set any options except the format eg qemu-nbd https://127.0.0.1/images/centos7.iso qemu-nbd /home/berrange/demo.qcow2 This adds a --image-opts arg that indicates that the positional filename should be interpreted as a full option string, not just a filename. qemu-nbd --image-opts driver=https,url=https://127.0.0.1/images,sslverify=off qemu-nbd --image-opts driver=file,filename=/home/berrange/demo.qcow2 This flag is mutually exclusive with the '-f' flag. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
499afa2512
commit
77c9aaefd7
43
qemu-nbd.c
43
qemu-nbd.c
@ -43,6 +43,7 @@
|
||||
#define QEMU_NBD_OPT_DETECT_ZEROES 4
|
||||
#define QEMU_NBD_OPT_OBJECT 5
|
||||
#define QEMU_NBD_OPT_TLSCREDS 6
|
||||
#define QEMU_NBD_OPT_IMAGE_OPTS 7
|
||||
|
||||
static NBDExport *exp;
|
||||
static bool newproto;
|
||||
@ -105,6 +106,7 @@ static void usage(const char *name)
|
||||
" --aio=MODE set AIO mode (native or threads)\n"
|
||||
" --discard=MODE set discard mode (ignore, unmap)\n"
|
||||
" --detect-zeroes=MODE set detect-zeroes mode (off, on, unmap)\n"
|
||||
" --image-opts treat FILE as a full set of image options\n"
|
||||
"\n"
|
||||
"Report bugs to <qemu-devel@nongnu.org>\n"
|
||||
, name, NBD_DEFAULT_PORT, "DEVICE");
|
||||
@ -394,6 +396,16 @@ static SocketAddress *nbd_build_socket_address(const char *sockpath,
|
||||
}
|
||||
|
||||
|
||||
static QemuOptsList file_opts = {
|
||||
.name = "file",
|
||||
.implied_opt_name = "file",
|
||||
.head = QTAILQ_HEAD_INITIALIZER(file_opts.head),
|
||||
.desc = {
|
||||
/* no elements => accept any params */
|
||||
{ /* end of list */ }
|
||||
},
|
||||
};
|
||||
|
||||
static QemuOptsList qemu_object_opts = {
|
||||
.name = "object",
|
||||
.implied_opt_name = "qom-type",
|
||||
@ -475,6 +487,7 @@ int main(int argc, char **argv)
|
||||
{ "object", 1, NULL, QEMU_NBD_OPT_OBJECT },
|
||||
{ "export-name", 1, NULL, 'x' },
|
||||
{ "tls-creds", 1, NULL, QEMU_NBD_OPT_TLSCREDS },
|
||||
{ "image-opts", 0, NULL, QEMU_NBD_OPT_IMAGE_OPTS },
|
||||
{ NULL, 0, NULL, 0 }
|
||||
};
|
||||
int ch;
|
||||
@ -493,6 +506,7 @@ int main(int argc, char **argv)
|
||||
QDict *options = NULL;
|
||||
const char *export_name = NULL;
|
||||
const char *tlscredsid = NULL;
|
||||
bool imageOpts = false;
|
||||
|
||||
/* The client thread uses SIGTERM to interrupt the server. A signal
|
||||
* handler ensures that "qemu-nbd -v -c" exits with a nice status code.
|
||||
@ -672,6 +686,9 @@ int main(int argc, char **argv)
|
||||
case QEMU_NBD_OPT_TLSCREDS:
|
||||
tlscredsid = optarg;
|
||||
break;
|
||||
case QEMU_NBD_OPT_IMAGE_OPTS:
|
||||
imageOpts = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -800,13 +817,29 @@ int main(int argc, char **argv)
|
||||
bdrv_init();
|
||||
atexit(bdrv_close_all);
|
||||
|
||||
if (fmt) {
|
||||
options = qdict_new();
|
||||
qdict_put(options, "driver", qstring_from_str(fmt));
|
||||
srcpath = argv[optind];
|
||||
if (imageOpts) {
|
||||
QemuOpts *opts;
|
||||
if (fmt) {
|
||||
error_report("--image-opts and -f are mutually exclusive");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
opts = qemu_opts_parse_noisily(&file_opts, srcpath, true);
|
||||
if (!opts) {
|
||||
qemu_opts_reset(&file_opts);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
options = qemu_opts_to_qdict(opts, NULL);
|
||||
qemu_opts_reset(&file_opts);
|
||||
blk = blk_new_open("hda", NULL, NULL, options, flags, &local_err);
|
||||
} else {
|
||||
if (fmt) {
|
||||
options = qdict_new();
|
||||
qdict_put(options, "driver", qstring_from_str(fmt));
|
||||
}
|
||||
blk = blk_new_open("hda", srcpath, NULL, options, flags, &local_err);
|
||||
}
|
||||
|
||||
srcpath = argv[optind];
|
||||
blk = blk_new_open("hda", srcpath, NULL, options, flags, &local_err);
|
||||
if (!blk) {
|
||||
error_reportf_err(local_err, "Failed to blk_new_open '%s': ",
|
||||
argv[optind]);
|
||||
|
@ -13,7 +13,8 @@ Export a QEMU disk image using the NBD protocol.
|
||||
@c man end
|
||||
|
||||
@c man begin OPTIONS
|
||||
@var{filename} is a disk image filename.
|
||||
@var{filename} is a disk image filename, or a set of block
|
||||
driver options if @var{--image-opts} is specified.
|
||||
|
||||
@var{dev} is an NBD device.
|
||||
|
||||
@ -33,6 +34,10 @@ The offset into the image
|
||||
The interface to bind to (default @samp{0.0.0.0})
|
||||
@item -k, --socket=@var{path}
|
||||
Use a unix socket with path @var{path}
|
||||
@item --image-opts
|
||||
Treat @var{filename} as a set of image options, instead of a plain
|
||||
filename. If this flag is specified, the @var{-f} flag should
|
||||
not be used, instead the '@code{format=}' option should be set.
|
||||
@item -f, --format=@var{fmt}
|
||||
Force the use of the block driver for format @var{fmt} instead of
|
||||
auto-detecting
|
||||
|
Loading…
Reference in New Issue
Block a user