[PATCH 1/2] v2v: support tar.gz and tar.xz ova files
by Pino Toscano
When dealing with a ova detected as gzip of xz, uncompress few bytes of
it to check whether it is a compressed tarball, and if so untar it.
Related to RHBZ#1186800.
---
v2v/input_ova.ml | 48 ++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 42 insertions(+), 6 deletions(-)
diff --git a/v2v/input_ova.ml b/v2v/input_ova.ml
index 74db1f7..a84037d 100644
--- a/v2v/input_ova.ml
+++ b/v2v/input_ova.ml
@@ -43,13 +43,32 @@ object
*)
if is_directory ova then ova
else (
+ let uncompress_head zcat file =
+ let cmd = sprintf "%s %s" zcat (quote file) in
+ let chan_out, chan_in, chan_err = Unix.open_process_full cmd [||] in
+ let buf = String.create 512 in
+ let len = input chan_out buf 0 (String.length buf) in
+ (* We're expecting the subprocess to fail because we close
+ * the pipe early, so:
+ *)
+ ignore (Unix.close_process_full (chan_out, chan_in, chan_err));
+
+ let tmpfile, chan = Filename.open_temp_file ~temp_dir:tmpdir "ova.file." "" in
+ output chan buf 0 len;
+ close_out chan;
+
+ tmpfile in
+
+ let untar ?(format = "") file outdir =
+ let cmd = sprintf "tar -x%sf %s -C %s" format (quote file) (quote outdir) in
+ if verbose then printf "%s\n%!" cmd;
+ if Sys.command cmd <> 0 then
+ error (f_"error unpacking %s, see earlier error messages") ova in
+
match detect_file_type ova with
| `Tar ->
(* Normal ovas are tar file (not compressed). *)
- let cmd = sprintf "tar -xf %s -C %s" (quote ova) (quote tmpdir) in
- if verbose then printf "%s\n%!" cmd;
- if Sys.command cmd <> 0 then
- error (f_"error unpacking %s, see earlier error messages") ova;
+ untar ova tmpdir;
tmpdir
| `Zip ->
(* However, although not permitted by the spec, people ship
@@ -62,8 +81,25 @@ object
if Sys.command cmd <> 0 then
error (f_"error unpacking %s, see earlier error messages") ova;
tmpdir
- | `GZip | `XZ | `Unknown ->
- error (f_"%s: unsupported file format\n\nFormats which we currently understand for '-i ova' are: uncompressed tar, zip") ova
+ | (`GZip|`XZ) as format ->
+ let zcat, tar_fmt =
+ match format with
+ | `GZip -> "zcat", "z"
+ | `XZ -> "xzcat", "J"
+ | _ -> assert false in
+ let tmpfile = uncompress_head zcat ova in
+ let tmpfiletype = detect_file_type tmpfile in
+ (* Remove tmpfile from tmpdir, to leave it empty. *)
+ Sys.remove tmpfile;
+ (match tmpfiletype with
+ | `Tar ->
+ untar ~format:tar_fmt ova tmpdir;
+ tmpdir
+ | `Zip | `GZip | `XZ | `Unknown ->
+ error (f_"%s: unsupported file format\n\nFormats which we currently understand for '-i ova' are: tar (uncompressed, compress with gzip or xz), zip") ova
+ )
+ | `Unknown ->
+ error (f_"%s: unsupported file format\n\nFormats which we currently understand for '-i ova' are: tar (uncompressed, compress with gzip or xz), zip") ova
) in
(* Exploded path must be absolute (RHBZ#1155121). *)
--
2.1.0
9 years, 7 months
[PATCH 1/4] v2v: domainxml: factor out connect and pool loading
by Pino Toscano
Factor out the connection and pool loading out of v2v_pool_dumpxml, so
it can be used in later implementations requiring a pool.
Should be just code motion.
---
v2v/domainxml-c.c | 84 +++++++++++++++++++++++++++++++++----------------------
1 file changed, 51 insertions(+), 33 deletions(-)
diff --git a/v2v/domainxml-c.c b/v2v/domainxml-c.c
index 4224d72..077c153 100644
--- a/v2v/domainxml-c.c
+++ b/v2v/domainxml-c.c
@@ -106,6 +106,55 @@ libvirt_auth_default_wrapper (virConnectCredentialPtr cred,
}
}
+virStoragePoolPtr
+connect_and_load_pool (const char *conn_uri, const char *pool_name)
+{
+ /* We have to assemble the error on the stack because a dynamic
+ * string couldn't be freed.
+ */
+ char errmsg[256];
+ virErrorPtr err;
+ virConnectPtr conn;
+ virStoragePoolPtr pool;
+
+ /* We have to call the default authentication handler, not least
+ * since it handles all the PolicyKit crap. However it also makes
+ * coding this simpler.
+ */
+ conn = virConnectOpenAuth (conn_uri, virConnectAuthPtrDefault,
+ VIR_CONNECT_RO);
+ if (conn == NULL) {
+ if (conn_uri)
+ snprintf (errmsg, sizeof errmsg,
+ _("cannot open libvirt connection '%s'"), conn_uri);
+ else
+ snprintf (errmsg, sizeof errmsg, _("cannot open libvirt connection"));
+ caml_invalid_argument (errmsg);
+ }
+
+ /* Suppress default behaviour of printing errors to stderr. Note
+ * you can't set this to NULL to ignore errors; setting it to NULL
+ * restores the default error handler ...
+ */
+ virConnSetErrorFunc (conn, NULL, ignore_errors);
+
+ /* Look up the pool. */
+ pool = virStoragePoolLookupByUUIDString (conn, pool_name);
+
+ if (!pool)
+ pool = virStoragePoolLookupByName (conn, pool_name);
+
+ if (!pool) {
+ err = virGetLastError ();
+ snprintf (errmsg, sizeof errmsg,
+ _("cannot find libvirt pool '%s': %s"), pool_name, err->message);
+ virConnectClose (conn);
+ caml_invalid_argument (errmsg);
+ }
+
+ return pool;
+}
+
value
v2v_dumpxml (value passwordv, value connv, value domnamev)
{
@@ -230,42 +279,11 @@ v2v_pool_dumpxml (value connv, value poolnamev)
if (connv != Val_int (0))
conn_uri = String_val (Field (connv, 0)); /* Some conn */
- /* We have to call the default authentication handler, not least
- * since it handles all the PolicyKit crap. However it also makes
- * coding this simpler.
- */
- conn = virConnectOpenAuth (conn_uri, virConnectAuthPtrDefault,
- VIR_CONNECT_RO);
- if (conn == NULL) {
- if (conn_uri)
- snprintf (errmsg, sizeof errmsg,
- _("cannot open libvirt connection '%s'"), conn_uri);
- else
- snprintf (errmsg, sizeof errmsg, _("cannot open libvirt connection"));
- caml_invalid_argument (errmsg);
- }
-
- /* Suppress default behaviour of printing errors to stderr. Note
- * you can't set this to NULL to ignore errors; setting it to NULL
- * restores the default error handler ...
- */
- virConnSetErrorFunc (conn, NULL, ignore_errors);
-
/* Look up the pool. */
poolname = String_val (poolnamev);
- pool = virStoragePoolLookupByUUIDString (conn, poolname);
-
- if (!pool)
- pool = virStoragePoolLookupByName (conn, poolname);
-
- if (!pool) {
- err = virGetLastError ();
- snprintf (errmsg, sizeof errmsg,
- _("cannot find libvirt pool '%s': %s"), poolname, err->message);
- virConnectClose (conn);
- caml_invalid_argument (errmsg);
- }
+ pool = connect_and_load_pool (conn_uri, poolname);
+ conn = virStoragePoolGetConnect (pool);
xml = virStoragePoolGetXMLDesc (pool, 0);
if (xml == NULL) {
--
2.1.0
9 years, 7 months
[PATCH] v2v: convert libvirt display port configuration
by Pino Toscano
Read the port configuration from the XML of libvirt domains, restoring
it when writing new libvirt XMLs instead of always setting the
"autoport" option.
---
v2v/input_disk.ml | 2 +-
v2v/input_libvirtxml.ml | 13 +++++++++++--
v2v/output_libvirt.ml | 8 +++++++-
v2v/output_qemu.ml | 3 ++-
v2v/types.ml | 1 +
v2v/types.mli | 1 +
6 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/v2v/input_disk.ml b/v2v/input_disk.ml
index 2c70368..40bd783 100644
--- a/v2v/input_disk.ml
+++ b/v2v/input_disk.ml
@@ -87,7 +87,7 @@ class input_disk verbose input_format disk = object
s_features = [ "acpi"; "apic"; "pae" ];
s_display =
Some { s_display_type = Window; s_keymap = None; s_password = None;
- s_listen = LNone };
+ s_listen = LNone; s_port = None };
s_disks = [disk];
s_removables = [];
s_nics = [network];
diff --git a/v2v/input_libvirtxml.ml b/v2v/input_libvirtxml.ml
index 4fb6358..2e8fa1f 100644
--- a/v2v/input_libvirtxml.ml
+++ b/v2v/input_libvirtxml.ml
@@ -117,14 +117,23 @@ let parse_libvirt_xml ~verbose xml =
warning (f_"<listen type='%s'> in the input libvirt XML was ignored") t;
LNone
) in
+ let port =
+ match xpath_to_string "@autoport" "yes" with
+ | "no" ->
+ let port = xpath_to_int "@port" (-1) in
+ if port >= 0 then Some port
+ else None
+ | _ -> None in
match xpath_to_string "@type" "" with
| "" -> None
| "vnc" ->
Some { s_display_type = VNC;
- s_keymap = keymap; s_password = password; s_listen = listen }
+ s_keymap = keymap; s_password = password; s_listen = listen;
+ s_port = port }
| "spice" ->
Some { s_display_type = Spice;
- s_keymap = keymap; s_password = password; s_listen = listen }
+ s_keymap = keymap; s_password = password; s_listen = listen;
+ s_port = port }
| "sdl"|"desktop" as t ->
warning (f_"virt-v2v does not support local displays, so <graphics type='%s'> in the input libvirt XML was ignored") t;
None
diff --git a/v2v/output_libvirt.ml b/v2v/output_libvirt.ml
index 64dc2dc..fc083d3 100644
--- a/v2v/output_libvirt.ml
+++ b/v2v/output_libvirt.ml
@@ -222,7 +222,6 @@ let create_libvirt_xml ?pool source targets guestcaps target_features =
append_attr ("heads", "1") video;
- append_attr ("autoport", "yes") graphics;
(match source.s_display with
| Some { s_keymap = Some km } -> append_attr ("keymap", km) graphics
| _ -> ());
@@ -240,6 +239,13 @@ let create_libvirt_xml ?pool source targets guestcaps target_features =
append_child sub graphics
| LNone -> ())
| _ -> ());
+ (match source.s_display with
+ | Some { s_port = Some p } ->
+ append_attr ("autoport", "no") graphics;
+ append_attr ("port", string_of_int p) graphics
+ | _ ->
+ append_attr ("autoport", "yes") graphics;
+ append_attr ("port", "-1") graphics);
video, graphics in
diff --git a/v2v/output_qemu.ml b/v2v/output_qemu.ml
index c3f64d1..d9a10b1 100644
--- a/v2v/output_qemu.ml
+++ b/v2v/output_qemu.ml
@@ -95,7 +95,8 @@ object
| VNC ->
fpf "%s-display vnc=:0" nl
| Spice ->
- fpf "%s-spice port=5900,addr=127.0.0.1" nl
+ fpf "%s-spice port=%d,addr=127.0.0.1" nl
+ (match display.s_port with None -> 5900 | Some p -> p)
);
fpf "%s-vga %s" nl
(match guestcaps.gcaps_video with Cirrus -> "cirrus" | QXL -> "qxl")
diff --git a/v2v/types.ml b/v2v/types.ml
index 9e4fa35..633fe3f 100644
--- a/v2v/types.ml
+++ b/v2v/types.ml
@@ -63,6 +63,7 @@ and source_display = {
s_keymap : string option;
s_password : string option;
s_listen : s_display_listen;
+ s_port : int option;
}
and s_display_type = Window | VNC | Spice
and s_display_listen =
diff --git a/v2v/types.mli b/v2v/types.mli
index a3c1fd4..a1ec4ba 100644
--- a/v2v/types.mli
+++ b/v2v/types.mli
@@ -83,6 +83,7 @@ and source_display = {
s_password : string option; (** If required, password to access
the display. *)
s_listen : s_display_listen; (** Listen address. *)
+ s_port : int option; (** Display port. *)
}
and s_display_type = Window | VNC | Spice
and s_display_listen =
--
2.1.0
9 years, 7 months
[PATCH 1/2] filearch: move libmagic code in an own function
by Pino Toscano
Also use a cleanup attribue to ease the close of the magic_t handle.
This is mostly code motion, hopefully with no actual behaviour changes.
---
src/filearch.c | 100 +++++++++++++++++++++++++++++++++++++++------------------
1 file changed, 68 insertions(+), 32 deletions(-)
diff --git a/src/filearch.c b/src/filearch.c
index 8708a4b..219eaae 100644
--- a/src/filearch.c
+++ b/src/filearch.c
@@ -42,6 +42,22 @@
#if defined(HAVE_LIBMAGIC)
+# ifdef HAVE_ATTRIBUTE_CLEANUP
+# define CLEANUP_MAGIC_T_FREE __attribute__((cleanup(cleanup_magic_t_free)))
+
+static void
+cleanup_magic_t_free (void *ptr)
+{
+ magic_t m = *(magic_t *) ptr;
+
+ if (m)
+ magic_close (m);
+}
+
+# else
+# define CLEANUP_MAGIC_T_FREE
+# endif
+
COMPILE_REGEXP (re_file_elf,
"ELF.*(?:executable|shared object|relocatable), (.+?),", 0)
COMPILE_REGEXP (re_elf_ppc64, "64.*PowerPC", 0)
@@ -92,6 +108,55 @@ is_regular_file (const char *filename)
return lstat (filename, &statbuf) == 0 && S_ISREG (statbuf.st_mode);
}
+static char *
+magic_for_file (guestfs_h *g, const char *filename, bool *loading_ok,
+ bool *matched)
+{
+ int flags;
+ CLEANUP_MAGIC_T_FREE magic_t m = NULL;
+ const char *line;
+ char *elf_arch;
+
+ flags = g->verbose ? MAGIC_DEBUG : 0;
+ flags |= MAGIC_ERROR | MAGIC_RAW;
+
+ if (loading_ok)
+ *loading_ok = false;
+ if (matched)
+ *matched = false;
+
+ m = magic_open (flags);
+ if (m == NULL) {
+ perrorf (g, "magic_open");
+ return NULL;
+ }
+
+ if (magic_load (m, NULL) == -1) {
+ perrorf (g, "magic_load: default magic database file");
+ return NULL;
+ }
+
+ line = magic_file (m, filename);
+ if (line == NULL) {
+ perrorf (g, "magic_file: %s", filename);
+ return NULL;
+ }
+
+ if (loading_ok)
+ *loading_ok = true;
+
+ elf_arch = match1 (g, line, re_file_elf);
+ if (elf_arch == NULL) {
+ error (g, "no re_file_elf match in '%s'", line);
+ return NULL;
+ }
+
+ if (matched)
+ *matched = true;
+
+ return canonical_elf_arch (g, elf_arch);
+}
+
/* Download and uncompress the cpio file to find binaries within. */
static const char *initrd_binaries[] = {
"bin/ls",
@@ -170,40 +235,11 @@ cpio_arch (guestfs_h *g, const char *file, const char *path)
safe_asprintf (g, "%s/%s", dir, initrd_binaries[i]);
if (is_regular_file (bin)) {
- int flags;
- magic_t m;
- const char *line;
- CLEANUP_FREE char *elf_arch = NULL;
-
- flags = g->verbose ? MAGIC_DEBUG : 0;
- flags |= MAGIC_ERROR | MAGIC_RAW;
-
- m = magic_open (flags);
- if (m == NULL) {
- perrorf (g, "magic_open");
- goto out;
- }
-
- if (magic_load (m, NULL) == -1) {
- perrorf (g, "magic_load: default magic database file");
- magic_close (m);
- goto out;
- }
-
- line = magic_file (m, bin);
- if (line == NULL) {
- perrorf (g, "magic_file: %s", bin);
- magic_close (m);
- goto out;
- }
+ bool loading_ok, matched;
- elf_arch = match1 (g, line, re_file_elf);
- if (elf_arch != NULL) {
- ret = canonical_elf_arch (g, elf_arch);
- magic_close (m);
+ ret = magic_for_file (g, bin, &loading_ok, &matched);
+ if (!loading_ok || matched)
goto out;
- }
- magic_close (m);
}
}
error (g, "file_architecture: could not determine architecture of cpio archive");
--
2.1.0
9 years, 7 months
[PATCH] v2v: convert libvirt display listen configuration (RHBZ#1174073)
by Pino Toscano
Read the listen configuration from the XML of libvirt domains, restoring
it when writing new libvirt XMLs.
---
v2v/input_disk.ml | 3 ++-
v2v/input_libvirtxml.ml | 26 ++++++++++++++++++++++++--
v2v/output_libvirt.ml | 11 +++++++++++
v2v/types.ml | 15 +++++++++++++--
v2v/types.mli | 5 +++++
5 files changed, 55 insertions(+), 5 deletions(-)
diff --git a/v2v/input_disk.ml b/v2v/input_disk.ml
index 969c43c..2c70368 100644
--- a/v2v/input_disk.ml
+++ b/v2v/input_disk.ml
@@ -86,7 +86,8 @@ class input_disk verbose input_format disk = object
s_vcpu = 1; (* 1 vCPU is a safe default *)
s_features = [ "acpi"; "apic"; "pae" ];
s_display =
- Some { s_display_type = Window; s_keymap = None; s_password = None };
+ Some { s_display_type = Window; s_keymap = None; s_password = None;
+ s_listen = LNone };
s_disks = [disk];
s_removables = [];
s_nics = [network];
diff --git a/v2v/input_libvirtxml.ml b/v2v/input_libvirtxml.ml
index d0d0e95..4fb6358 100644
--- a/v2v/input_libvirtxml.ml
+++ b/v2v/input_libvirtxml.ml
@@ -95,14 +95,36 @@ let parse_libvirt_xml ~verbose xml =
match xpath_to_string "@keymap" "" with "" -> None | k -> Some k in
let password =
match xpath_to_string "@passwd" "" with "" -> None | pw -> Some pw in
+ let listen =
+ let obj = Xml.xpath_eval_expression xpathctx "listen" in
+ let nr_nodes = Xml.xpathobj_nr_nodes obj in
+ if nr_nodes < 1 then LNone
+ else (
+ (* Use only the first <listen> configuration. *)
+ match xpath_to_string "listen[1]/@type" "" with
+ | "" -> LNone
+ | "address" ->
+ (match xpath_to_string "listen[1]/@address" "" with
+ | "" -> LNone
+ | a -> LAddress a
+ )
+ | "network" ->
+ (match xpath_to_string "listen[1]/@network" "" with
+ | "" -> LNone
+ | n -> LNetwork n
+ )
+ | t ->
+ warning (f_"<listen type='%s'> in the input libvirt XML was ignored") t;
+ LNone
+ ) in
match xpath_to_string "@type" "" with
| "" -> None
| "vnc" ->
Some { s_display_type = VNC;
- s_keymap = keymap; s_password = password }
+ s_keymap = keymap; s_password = password; s_listen = listen }
| "spice" ->
Some { s_display_type = Spice;
- s_keymap = keymap; s_password = password }
+ s_keymap = keymap; s_password = password; s_listen = listen }
| "sdl"|"desktop" as t ->
warning (f_"virt-v2v does not support local displays, so <graphics type='%s'> in the input libvirt XML was ignored") t;
None
diff --git a/v2v/output_libvirt.ml b/v2v/output_libvirt.ml
index 8220096..64dc2dc 100644
--- a/v2v/output_libvirt.ml
+++ b/v2v/output_libvirt.ml
@@ -229,6 +229,17 @@ let create_libvirt_xml ?pool source targets guestcaps target_features =
(match source.s_display with
| Some { s_password = Some pw } -> append_attr ("passwd", pw) graphics
| _ -> ());
+ (match source.s_display with
+ | Some { s_listen = listen } ->
+ (match listen with
+ | LAddress a ->
+ let sub = e "listen" [ "type", "address"; "address", a ] [] in
+ append_child sub graphics
+ | LNetwork n ->
+ let sub = e "listen" [ "type", "network"; "network", n ] [] in
+ append_child sub graphics
+ | LNone -> ())
+ | _ -> ());
video, graphics in
diff --git a/v2v/types.ml b/v2v/types.ml
index f1088fb..2677e34 100644
--- a/v2v/types.ml
+++ b/v2v/types.ml
@@ -62,8 +62,13 @@ and source_display = {
s_display_type : s_display_type;
s_keymap : string option;
s_password : string option;
+ s_listen : display_listen;
}
and s_display_type = Window | VNC | Spice
+and display_listen =
+ | LNone
+ | LAddress of string
+ | LNetwork of string
let rec string_of_source s =
sprintf " source name: %s
@@ -162,11 +167,17 @@ and string_of_source_nic { s_mac = mac; s_vnet = vnet; s_vnet_type = typ } =
| Some mac -> " mac: " ^ mac)
and string_of_source_display { s_display_type = typ;
- s_keymap = keymap; s_password = password } =
- sprintf "%s%s%s"
+ s_keymap = keymap; s_password = password;
+ s_listen = listen } =
+ sprintf "%s%s%s%s"
(match typ with Window -> "window" | VNC -> "vnc" | Spice -> "spice")
(match keymap with None -> "" | Some km -> " " ^ km)
(match password with None -> "" | Some _ -> " with password")
+ (match listen with
+ | LNone -> ""
+ | LAddress a -> sprintf " listening on address %s" a
+ | LNetwork n -> sprintf " listening on network %s" n
+ )
type overlay = {
ov_overlay_file : string;
diff --git a/v2v/types.mli b/v2v/types.mli
index 3cfdb18..f42bbd9 100644
--- a/v2v/types.mli
+++ b/v2v/types.mli
@@ -82,8 +82,13 @@ and source_display = {
s_keymap : string option; (** Guest keymap. *)
s_password : string option; (** If required, password to access
the display. *)
+ s_listen : display_listen; (** Listen address. *)
}
and s_display_type = Window | VNC | Spice
+and display_listen =
+ | LNone
+ | LAddress of string (** Listen address. *)
+ | LNetwork of string (** Listen network. *)
val string_of_source : source -> string
val string_of_source_disk : source_disk -> string
--
2.1.0
9 years, 7 months
supermin in Fedora Rawhide switched to using dnf instead of yum
by Richard W.M. Jones
supermin needs to download packages (eg. RPMs) when preparing the
appliance.
'dnf download' finally appears to have made parallel downloads
reliable[1]. Better late than never. So I have experimentally
switched Rawhide's supermin to use 'dnf download' instead of the
(deprecated) 'yumdownloader' program.
This only affects the 'supermin --prepare' phase, which means it only
affects people building libguestfs from source. Ordinary use of
libguestfs, even in Rawhide, should be unaffected.
If you are building libguestfs from source on Fedora please try the
new supermin + dnf, and let me know if you find any problems.
Rich.
[1] https://bugzilla.redhat.com/1157233
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages. http://libguestfs.org
9 years, 7 months
[PATCH v1 DO NOT APPLY 2/2] v2v: Support conversion of Windows >= 8
by Richard W.M. Jones
**NOTE: For review only, not to be applied**
https://bugzilla.redhat.com/show_bug.cgi?id=1190669
Historically virt-v2v has been able to install the viostor (Windows
virtio-blk) driver into a Windows <= 7 guest Critical Device Database
(CDD), allowing the guest to boot on the target hypervisor. The guest
then runs a firstboot script which reinstalls the viostor driver
properly and installs all the other virtio drivers.
However this never worked with Windows >= 8.
The reason it didn't work is because Windows >= 8 drops all support
for the CDD, replacing it with another driver database in the
registry.
The attached patches (mainly the second one) make the conversion work
for Windows >= 8.
The registry changes are considerably more intrusive than for Windows
with the CDD, so I'm rather less sure that this patch is a good idea.
Specific areas of concern include:
- What is "oem1.inf"?
- Where does the magic string "c86329aaeb0a7904" come from?
- Will reinstallation of viostor create a second viostor driver
entry? (This needs testing)
- Is GUID 4d36e97b-e325-11ce-bfc1-08002be10318 guaranteed to
exist?
- Do we need to set the right DriverVersion?
- Do we need to place viostor.inf somewhere in the guest filesystem?
It seems work without this file.
Note I only tested this on Windows 8.1 64 bit so far.
Rich.
9 years, 7 months
Next stable release?
by Margaret Lewicka
Hello,
Are there any chances of next stable release appearing soonish? I'm
getting pushback from Homebrew maintainers about the massive amount of
patching required to build the current stable on Mac, since all the
patches have been merged in after last stable.
(I'm also getting pushback about the 4GB download of virtual
appliance, but as I understand that one is non-optional. Don't suppose
there is a chance of making it thin?)
--
Margaret
9 years, 7 months