2016-05-25 14:44:28 +02:00
Index: libguestfs-1.32.4/fish/options.c
===================================================================
--- libguestfs-1.32.4.orig/fish/options.c
+++ libguestfs-1.32.4/fish/options.c
@@ -280,7 +280,33 @@ display_mountpoints_on_failure (const ch
guestfs_int_program_name);
for (i = 0; fses[i] != NULL; i += 2) {
- CLEANUP_FREE char *p = guestfs_canonical_device_name (g, fses[i]);
+ CLEANUP_FREE char *p = NULL;
+ CLEANUP_FREE char *device = guestfs_mountable_device (g, fses[i]);
+ CLEANUP_FREE char *subvolume = NULL;
+
+ guestfs_push_error_handler (g, NULL, NULL);
+
+ subvolume = guestfs_mountable_subvolume (g, fses[i]);
+ if (subvolume == NULL && guestfs_last_errno (g) != EINVAL) {
+ fprintf (stderr,
+ _("%s: cannot determine the subvolume for %s: %s (%d)\n"),
+ guestfs_int_program_name, fses[i],
+ guestfs_last_error (g), guestfs_last_errno (g));
+ exit (EXIT_FAILURE);
+ }
+
+ guestfs_pop_error_handler (g);
+
+ /* Reformat the internal btrfsvol string into a valid mount option */
+ if (device && subvolume) {
+ if (asprintf (&p, "%s:/:subvol=%s", device, subvolume) == -1) {
+ perror ("asprintf");
+ exit (EXIT_FAILURE);
+ }
+ } else {
+ p = guestfs_canonical_device_name (g, fses[i]);
+ }
+
fprintf (stderr, "%s: \t%s (%s)\n", guestfs_int_program_name,
p ? p : fses[i], fses[i+1]);
}
Index: libguestfs-1.32.4/generator/actions.ml
===================================================================
--- libguestfs-1.32.4.orig/generator/actions.ml
+++ libguestfs-1.32.4/generator/actions.ml
@@ -1290,6 +1290,32 @@ Please read L<guestfs(3)/INSPECTION> for
See also C<guestfs_inspect_get_mountpoints>." };
{ defaults with
+ name = "mountable_device"; added = (1, 33, 15);
+ style = RString "device", [Mountable "mountable"], [];
+ shortdesc = "extract the device part of a mountable";
+ longdesc = "\
+Returns the device name of a mountable. In quite a lot of
+cases, the mountable is the device name.
+
+However this doesn't apply for btrfs subvolumes, where the
+mountable is a combination of both the device name and the
+subvolume path (see also C<guestfs_mountable_subvolume> to
+extract the subvolume path of the mountable if any)." };
+
+ { defaults with
+ name = "mountable_subvolume"; added = (1, 33, 15);
+ style = RString "subvolume", [Mountable "mountable"], [];
+ shortdesc = "extract the subvolume part of a mountable";
+ longdesc = "\
+Returns the subvolume path of a mountable. Btrfs subvolumes
+mountables are a combination of both the device name and the
+subvolume path (see also C<guestfs_mountable_device> to extract
+the device of the mountable).
+
+If the mountable does not represent a btrfs subvolume, then
+this function fails and the C<errno> is set to C<EINVAL>." };
+
+ { defaults with
name = "set_network"; added = (1, 5, 4);
style = RErr, [Bool "network"], [];
fish_alias = ["network"]; config_only = true;
Index: libguestfs-1.32.4/po/POTFILES
===================================================================
--- libguestfs-1.32.4.orig/po/POTFILES
+++ libguestfs-1.32.4/po/POTFILES
@@ -344,6 +344,7 @@ src/libvirt-is-version.c
src/listfs.c
src/lpj.c
src/match.c
+src/mountable.c
src/osinfo.c
src/private-data.c
src/proto.c
Index: libguestfs-1.32.4/src/Makefile.am
===================================================================
--- libguestfs-1.32.4.orig/src/Makefile.am
+++ libguestfs-1.32.4/src/Makefile.am
@@ -121,6 +121,7 @@ libguestfs_la_SOURCES = \
listfs.c \
lpj.c \
match.c \
+ mountable.c \
osinfo.c \
private-data.c \
proto.c \
Index: libguestfs-1.32.4/src/mountable.c
===================================================================
--- /dev/null
+++ libguestfs-1.32.4/src/mountable.c
@@ -0,0 +1,52 @@
+/* libguestfs
+ * Copyright (C) 2016 SUSE LLC
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <config.h>
+#include <string.h>
+#include <errno.h>
+
+#include "guestfs.h"
+#include "guestfs-internal.h"
+#include "guestfs-internal-actions.h"
+
+
+char *
+guestfs_impl_mountable_device (guestfs_h *g, const char *mountable)
+{
+ CLEANUP_FREE_INTERNAL_MOUNTABLE struct guestfs_internal_mountable *mnt = NULL;
+
+ mnt = guestfs_internal_parse_mountable (g, mountable);
+ if (mnt == NULL)
+ return NULL;
+
+ return safe_strdup (g, mnt->im_device);
+}
+
+char *
+guestfs_impl_mountable_subvolume (guestfs_h *g, const char *mountable)
+{
+ CLEANUP_FREE_INTERNAL_MOUNTABLE struct guestfs_internal_mountable *mnt = NULL;
+
+ mnt = guestfs_internal_parse_mountable (g, mountable);
+ if (mnt == NULL || STREQ (mnt->im_volume, "")) {
+ guestfs_int_error_errno (g, EINVAL, "not a btrfs subvolume identifier");
+ return NULL;
+ }
+
+ return safe_strdup (g, mnt->im_volume);
+}
Index: libguestfs-1.32.4/v2v/windows_virtio.ml
===================================================================
--- libguestfs-1.32.4.orig/v2v/windows_virtio.ml
+++ libguestfs-1.32.4/v2v/windows_virtio.ml
@@ -26,6 +26,10 @@ open Regedit
open Types
open Utils
+let scsi_class_guid = "{4D36E97B-E325-11CE-BFC1-08002BE10318}"
+let viostor_pciid = "VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00"
+let vioscsi_pciid = "VEN_1AF4&DEV_1004&SUBSYS_00081AF4&REV_00"
+
let virtio_win =
try Sys.getenv "VIRTIO_WIN"
with Not_found ->
@@ -47,14 +51,26 @@ let rec install_drivers g inspect system
else (
(* Can we install the block driver? *)
let block : guestcaps_block_type =
- let source = driverdir // "viostor.sys" in
- if g#exists source then (
- let target = sprintf "%s/system32/drivers/viostor.sys" systemroot in
+ let filenames = ["virtio_blk"; "vrtioblk"; "viostor"] in
+ let viostor_driver = try (
+ Some (
+ List.find (
+ fun driver_file ->
+ let source = driverdir // driver_file ^ ".sys" in
+ g#exists source
+ ) filenames
+ )
+ ) with Not_found -> None in
+ match viostor_driver with
+ | Some driver_name -> (
+ let source = driverdir // (driver_name ^ ".sys") in
+ let target = sprintf "%s/system32/drivers/%s.sys" systemroot driver_name in
let target = g#case_sensitive_path target in
g#cp source target;
- add_viostor_to_registry g inspect root current_cs;
- Virtio_blk
- ) else (
+ add_guestor_to_registry g root current_cs driver_name
+ viostor_pciid;
+ Virtio_blk )
+ | None -> (
warning (f_"there is no viostor (virtio block device) driver for this version of Windows (%d.%d %s). virt-v2v looks for this driver in %s\n\nThe guest will be configured to use a slower emulated device.")
inspect.i_major_version inspect.i_minor_version
inspect.i_arch virtio_win;
@@ -63,7 +79,12 @@ let rec install_drivers g inspect system
(* Can we install the virtio-net driver? *)
let net : guestcaps_net_type =
- if not (g#exists (driverdir // "netkvm.inf")) then (
+ let filenames = ["virtio_net.inf"; "netkvm.inf"] in
+ let has_netkvm =
+ List.exists (
+ fun driver_file -> g#exists (driverdir // driver_file)
+ ) filenames in
+ if not has_netkvm then (
warning (f_"there is no virtio network driver for this version of Windows (%d.%d %s). virt-v2v looks for this driver in %s\n\nThe guest will be configured to use a slower emulated device.")
inspect.i_major_version inspect.i_minor_version
inspect.i_arch virtio_win;
@@ -88,270 +109,66 @@ let rec install_drivers g inspect system
(block, net, video)
)
-and add_viostor_to_registry g inspect root current_cs =
- let { i_major_version = major; i_minor_version = minor;
- i_arch = arch } = inspect in
- if (major == 6 && minor >= 2) || major >= 7 then (* Windows >= 8 *)
- add_viostor_to_driver_database g root arch current_cs
- else (* Windows <= 7 *)
- add_viostor_to_critical_device_database g root current_cs
-
-and add_viostor_to_critical_device_database g root current_cs =
- (* See http://rwmj.wordpress.com/2010/04/30/tip-install-a-device-driver-in-a-windows-vm/
- * NB: All these edits are in the HKLM\SYSTEM hive. No other
- * hive may be modified here.
- *)
- let regedits = [
- [ current_cs; "Control"; "CriticalDeviceDatabase"; "pci#ven_1af4&dev_1001&subsys_00000000" ],
- [ "Service", REG_SZ "viostor";
- "ClassGUID", REG_SZ "{4D36E97B-E325-11CE-BFC1-08002BE10318}" ];
-
- [ current_cs; "Control"; "CriticalDeviceDatabase"; "pci#ven_1af4&dev_1001&subsys_00020000" ],
- [ "Service", REG_SZ "viostor";
- "ClassGUID", REG_SZ "{4D36E97B-E325-11CE-BFC1-08002BE10318}" ];
-
- [ current_cs; "Control"; "CriticalDeviceDatabase"; "pci#ven_1af4&dev_1001&subsys_00021af4" ],
- [ "Service", REG_SZ "viostor";
- "ClassGUID", REG_SZ "{4D36E97B-E325-11CE-BFC1-08002BE10318}" ];
-
- [ current_cs; "Control"; "CriticalDeviceDatabase"; "pci#ven_1af4&dev_1001&subsys_00021af4&rev_00" ],
- [ "Service", REG_SZ "viostor";
- "ClassGUID", REG_SZ "{4D36E97B-E325-11CE-BFC1-08002BE10318}" ];
+and add_guestor_to_registry g root current_cs drv_name drv_pciid =
+ let ddb_node = g#hivex_node_get_child root "DriverDatabase" in
- [ current_cs; "Services"; "viostor" ],
+ let regedits =
+ if ddb_node = 0L then
+ cdb_regedits current_cs drv_name drv_pciid
+ else
+ ddb_regedits current_cs drv_name drv_pciid in
+
+ let drv_sys_path = sprintf "system32\\drivers\\%s.sys" drv_name in
+ let common_regedits = [
+ [ current_cs; "Services"; drv_name ],
[ "Type", REG_DWORD 0x1_l;
"Start", REG_DWORD 0x0_l;
"Group", REG_SZ "SCSI miniport";
"ErrorControl", REG_DWORD 0x1_l;
- "ImagePath", REG_EXPAND_SZ "system32\\drivers\\viostor.sys";
- "Tag", REG_DWORD 0x21_l ];
-
- [ current_cs; "Services"; "viostor"; "Parameters" ],
- [ "BusType", REG_DWORD 0x1_l ];
+ "ImagePath", REG_EXPAND_SZ drv_sys_path ];
+ ] in
- [ current_cs; "Services"; "viostor"; "Parameters"; "MaxTransferSize" ],
- [ "ParamDesc", REG_SZ "Maximum Transfer Size";
- "type", REG_SZ "enum";
- "default", REG_SZ "0" ];
-
- [ current_cs; "Services"; "viostor"; "Parameters"; "MaxTransferSize"; "enum" ],
- [ "0", REG_SZ "64 KB";
- "1", REG_SZ "128 KB";
- "2", REG_SZ "256 KB" ];
-
- [ current_cs; "Services"; "viostor"; "Parameters"; "PnpInterface" ],
- [ "5", REG_DWORD 0x1_l ];
-
- [ current_cs; "Services"; "viostor"; "Enum" ],
- [ "0", REG_SZ "PCI\\VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00\\3&13c0b0c5&0&20";
- "Count", REG_DWORD 0x1_l;
- "NextInstance", REG_DWORD 0x1_l ];
- ] in
+ reg_import g root (regedits @ common_regedits)
- reg_import g root regedits
+and cdb_regedits current_cs drv_name drv_pciid =
+ (* See http://rwmj.wordpress.com/2010/04/30/tip-install-a-device-driver-in-a-windows-vm/
+ * NB: All these edits are in the HKLM\SYSTEM hive. No other
+ * hive may be modified here.
+ *)
+ [
+ [ current_cs; "Control"; "CriticalDeviceDatabase";
+ "PCI#" ^ drv_pciid ],
+ [ "Service", REG_SZ drv_name;
+ "ClassGUID", REG_SZ scsi_class_guid ];
+ ]
-and add_viostor_to_driver_database g root arch current_cs =
+and ddb_regedits current_cs drv_name drv_pciid =
(* Windows >= 8 doesn't use the CriticalDeviceDatabase. Instead
* one must add keys into the DriverDatabase.
*)
- let viostor_inf =
- let arch =
- match arch with
- | "x86_64" -> "amd64"
- | "i386" | "i486" | "i585" | "i686" -> "x86"
- | _ ->
- error (f_"when adding viostor to the DriverDatabase, unknown architecture: %s") arch in
- (* XXX I don't know what the significance of the c863.. string is. It
- * may even be random.
- *)
- sprintf "viostor.inf_%s_%s" arch "c86329aaeb0a7904" in
-
- let scsi_adapter_guid = "{4d36e97b-e325-11ce-bfc1-08002be10318}" in
- (* There should be a key
- * HKLM\SYSTEM\DriverDatabase\DeviceIds\<scsi_adapter_guid>
- * We want to add:
- * "oem1.inf"=hex(0):
- * but if we find "oem1.inf" we'll add "oem2.inf" (etc).
- *)
- let oem_inf =
- let path = [ "DriverDatabase"; "DeviceIds"; scsi_adapter_guid ] in
- match Windows.get_node g root path with
- | None ->
- error (f_"cannot find HKLM\\SYSTEM\\DriverDatabase\\DeviceIds\\%s in the guest registry") scsi_adapter_guid
- | Some node ->
- let rec loop node i =
- let oem_inf = sprintf "oem%d.inf" i in
- let value = g#hivex_node_get_value node oem_inf in
- if value = 0_L then oem_inf else loop node (i+1)
- in
- let oem_inf = loop node 1 in
- (* Create the key. *)
- g#hivex_node_set_value node oem_inf (* REG_NONE *) 0_L "";
- oem_inf in
-
- (* There should be a key
- * HKLM\SYSTEM\ControlSet001\Control\Class\<scsi_adapter_guid>
- * There may be subkey(s) of this called "0000", "0001" etc. We want
- * to create the next free subkey. MSFT covers the key here:
- * https://technet.microsoft.com/en-us/library/cc957341.aspx
- * That page incorrectly states that the key has the form "000n".
- * In fact we observed from real registries that the key is a
- * decimal number that goes 0009 -> 0010 etc.
- *)
- let controller_path =
- [ current_cs; "Control"; "Class"; scsi_adapter_guid ] in
- let controller_offset =
- match Windows.get_node g root controller_path with
- | None ->
- error (f_"cannot find HKLM\\SYSTEM\\%s in the guest registry")
- (String.concat "\\" controller_path)
- | Some node ->
- let rec loop node i =
- let controller_offset = sprintf "%04d" i in
- let child = g#hivex_node_get_child node controller_offset in
- if child = 0_L then controller_offset else loop node (i+1)
- in
- loop node 0 in
-
- let regedits = [
- controller_path @ [ controller_offset ],
- [ "DriverDate", REG_SZ "6-4-2014";
- "DriverDateData", REG_BINARY "\x00\x40\x90\xed\x87\x7f\xcf\x01";
- "DriverDesc", REG_SZ "Red Hat VirtIO SCSI controller";
- "DriverVersion", REG_SZ "62.71.104.8600" (* XXX *);
- "InfPath", REG_SZ oem_inf;
- "InfSection", REG_SZ "rhelscsi_inst";
- "MatchingDeviceId", REG_SZ "PCI\\VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00";
- "ProviderName", REG_SZ "Red Hat, Inc." ];
-
- [ current_cs; "Enum"; "PCI"; "VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00\\3&13c0b0c5&0&38" ],
- [ "Capabilities", REG_DWORD 0x6_l;
- "ClassGUID", REG_SZ scsi_adapter_guid;
- "CompatibleIDs", REG_MULTI_SZ [
- "PCI\\VEN_1AF4&DEV_1001&REV_00";
- "PCI\\VEN_1AF4&DEV_1001";
- "PCI\\VEN_1AF4&CC_010000";
- "PCI\\VEN_1AF4&CC_0100";
- "PCI\\VEN_1AF4";
- "PCI\\CC_010000";
- "PCI\\CC_0100";
- ];
- "ConfigFlags", REG_DWORD 0_l;
- "ContainerID", REG_SZ "{00000000-0000-0000-ffff-ffffffffffff}";
- "DeviceDesc", REG_SZ (sprintf "@%s,%%rhelscsi.devicedesc%%;Red Hat VirtIO SCSI controller" oem_inf);
- "Driver", REG_SZ (sprintf "%s\\%s" scsi_adapter_guid controller_offset);
- "HardwareID", REG_MULTI_SZ [
- "PCI\\VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00";
- "PCI\\VEN_1AF4&DEV_1001&SUBSYS_00021AF4";
- "PCI\\VEN_1AF4&DEV_1001&CC_010000";
- "PCI\\VEN_1AF4&DEV_1001&CC_0100";
- ];
- "LocationInformation", REG_SZ "@System32\\drivers\\pci.sys,#65536;PCI bus %1, device %2, function %3;(0,7,0)";
- "Mfg", REG_SZ (sprintf "@%s,%%rhel%%;Red Hat, Inc." oem_inf);
- "ParentIdPrefix", REG_SZ "4&87f7bfb&0";
- "Service", REG_SZ "viostor";
- "UINumber", REG_DWORD 0x7_l ];
-
- [ current_cs; "Services"; "viostor" ],
- [ "ErrorControl", REG_DWORD 0x1_l;
- "Group", REG_SZ "SCSI miniport";
- "ImagePath", REG_EXPAND_SZ "system32\\drivers\\viostor.sys";
- "Owners", REG_MULTI_SZ [ oem_inf ];
- "Start", REG_DWORD 0x0_l;
- "Tag", REG_DWORD 0x58_l;
- "Type", REG_DWORD 0x1_l ];
-
- [ current_cs; "Services"; "viostor"; "Parameters" ],
- [ "BusType", REG_DWORD 0x1_l ];
-
- [ current_cs; "Services"; "viostor"; "Parameters"; "PnpInterface" ],
- [ "5", REG_DWORD 0x1_l ];
-
- [ "DriverDatabase"; "DriverInfFiles"; oem_inf ],
- [ "", REG_MULTI_SZ [ viostor_inf ];
- "Active", REG_SZ viostor_inf;
- "Configurations", REG_MULTI_SZ [ "rhelscsi_inst" ]
- ];
-
- [ "DriverDatabase"; "DeviceIds"; "PCI"; "VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00" ],
- [ oem_inf, REG_BINARY "\x01\xff\x00\x00" ];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf ],
- [ "", REG_SZ oem_inf;
- "F6", REG_DWORD 0x1_l;
- "InfName", REG_SZ "viostor.inf";
- "OemPath", REG_SZ ("X:\\windows\\System32\\DriverStore\\FileRepository\\" ^ viostor_inf);
- "Provider", REG_SZ "Red Hat, Inc.";
- "SignerName", REG_SZ "Microsoft Windows Hardware Compatibility Publisher";
- "SignerScore", REG_DWORD 0x0d000005_l;
- "StatusFlags", REG_DWORD 0x00000012_l;
- (* NB: scsi_adapter_guid appears inside this string. *)
- "Version", REG_BINARY "\x00\xff\x09\x00\x00\x00\x00\x00\x7b\xe9\x36\x4d\x25\xe3\xce\x11\xbf\xc1\x08\x00\x2b\xe1\x03\x18\x00\x40\x90\xed\x87\x7f\xcf\x01\x98\x21\x68\x00\x47\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00" ];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Configurations" ],
- [];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Configurations"; "rhelscsi_inst" ],
- [ "ConfigFlags", REG_DWORD 0_l;
- "Service", REG_SZ "viostor" ];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Configurations"; "rhelscsi_inst"; "Device" ],
- [];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Configurations"; "rhelscsi_inst"; "Device"; "Interrupt Management" ],
- [];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Configurations"; "rhelscsi_inst"; "Device"; "Interrupt Management"; "Affinity Policy" ],
- [ "DevicePolicy", REG_DWORD 0x00000005_l ];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Configurations"; "rhelscsi_inst"; "Device"; "Interrupt Management"; "MessageSignaledInterruptProperties" ],
- [ "MSISupported", REG_DWORD 0x00000001_l;
- "MessageNumberLimit", REG_DWORD 0x00000002_l ];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Configurations"; "rhelscsi_inst"; "Services" ],
- [];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Configurations"; "rhelscsi_inst"; "Services"; "viostor" ],
- [];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Configurations"; "rhelscsi_inst"; "Services"; "viostor"; "Parameters" ],
- [ "BusType", REG_DWORD 0x00000001_l ];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Configurations"; "rhelscsi_inst"; "Services"; "viostor"; "Parameters"; "PnpInterface" ],
- [ "5", REG_DWORD 0x00000001_l ];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Descriptors" ],
- [];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Descriptors"; "PCI" ],
- [];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Descriptors"; "PCI"; "VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00" ],
- [ "Configuration", REG_SZ "rhelscsi_inst";
- "Description", REG_SZ "%rhelscsi.devicedesc%";
- "Manufacturer", REG_SZ "%rhel%" ];
-
- [ "DriverDatabase"; "DriverPackages"; viostor_inf; "Strings" ],
- [ "rhel", REG_SZ "Red Hat, Inc.";
- "rhelscsi.devicedesc", REG_SZ "Red Hat VirtIO SCSI controller" ];
- ] in
-
- reg_import g root regedits;
-
-(*
- A few more keys which we don't add above. Note that "oem1.inf" ==
- 6f,00,65,00,6d,00,31,00,2e,00,69,00,6e,00,66,00.
-
- [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI\VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00\3&13c0b0c5&0&38\Properties\{540b947e-8b40-45bc-a8a2-6a0b894cbda2}\0007]
- @=hex(ffff0012):6f,00,65,00,6d,00,31,00,2e,00,69,00,6e,00,66,00,3a,00,50,00,43,00,49,00,5c,00,56,00,45,00,4e,00,5f,00,31,00,41,00,46,00,34,00,26,00,44,00,45,00,56,00,5f,00,31,00,30,00,30,00,31,00,26,00,53,00,55,00,42,00,53,00,59,00,53,00,5f,00,30,00,30,00,30,00,32,00,31,00,41,00,46,00,34,00,26,00,52,00,45,00,56,00,5f,00,30,00,30,00,2c,00,72,00,68,00,65,00,6c,00,73,00,63,00,73,00,69,00,5f,00,69,00,6e,00,73,00,74,00,00,00
-
- [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI\VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00\3&13c0b0c5&0&38\Properties\{83da6326-97a6-4088-9453-a1923f573b29}\0003]
- @=hex(ffff0012):6f,00,65,00,6d,00,31,00,2e,00,69,00,6e,00,66,00,3a,00,32,00,65,00,35,00,31,00,37,00,32,00,63,00,33,00,62,00,33,00,37,00,62,00,65,00,39,00,39,00,38,00,3a,00,72,00,68,00,65,00,6c,00,73,00,63,00,73,00,69,00,5f,00,69,00,6e,00,73,00,74,00,3a,00,36,00,32,00,2e,00,37,00,31,00,2e,00,31,00,30,00,34,00,2e,00,38,00,36,00,30,00,30,00,3a,00,50,00,43,00,49,00,5c,00,56,00,45,00,4e,00,5f,00,31,00,41,00,46,00,34,00,26,00,44,00,45,00,56,00,5f,00,31,00,30,00,30,00,31,00,26,00,53,00,55,00,42,00,53,00,59,00,53,00,5f,00,30,00,30,00,30,00,32,00,31,00,41,00,46,00,34,00,26,00,52,00,45,00,56,00,5f,00,30,00,30,00,00,00
-
- [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI\VEN_1AF4&DEV_1001&SUBSYS_00021AF4&REV_00\3&13c0b0c5&0&38\Properties\{a8b865dd-2e3d-4094-ad97-e593a70c75d6}\0005]
- @=hex(ffff0012):6f,00,65,00,6d,00,31,00,2e,00,69,00,6e,00,66,00,00,00
-*)
+ let drv_inf = "guestor.inf" in
+ let drv_inf_label = drv_inf ^ "_tmp" in
+ let drv_config = "guestor_conf" in
+
+ [
+ [ "DriverDatabase"; "DriverInfFiles"; drv_inf ],
+ [ "", REG_MULTI_SZ [ drv_inf_label ];
+ "Active", REG_SZ drv_inf_label;
+ "Configurations", REG_MULTI_SZ [ drv_config ] ];
+
+ [ "DriverDatabase"; "DeviceIds"; "PCI"; drv_pciid ],
+ [ drv_inf, REG_BINARY "\x01\xff\x00\x00" ];
+
+ [ "DriverDatabase"; "DriverPackages"; drv_inf_label;
+ "Configurations"; drv_config ],
+ [ "ConfigFlags", REG_DWORD 0_l;
+ "Service", REG_SZ drv_name ];
+
+ [ "DriverDatabase"; "DriverPackages"; drv_inf_label;
+ "Descriptors"; "PCI"; drv_pciid ],
+ [ "Configuration", REG_SZ drv_config ];
+ ]
(* Copy the matching drivers to the driverdir; return true if any have
* been copied.
@@ -359,7 +176,7 @@ and add_viostor_to_driver_database g roo
and copy_drivers g inspect driverdir =
let ret = ref false in
if is_directory virtio_win then (
- let cmd = sprintf "cd %s && find -type f" (quote virtio_win) in
+ let cmd = sprintf "cd %s && find -L -type f" (quote virtio_win) in
let paths = external_command cmd in
List.iter (
fun path ->
Index: libguestfs-1.32.4/appliance/init
===================================================================
--- libguestfs-1.32.4.orig/appliance/init
+++ libguestfs-1.32.4/appliance/init
@@ -47,7 +47,9 @@ ln -s ../run/lock /var/lock
# On Fedora 23, util-linux creates /etc/mtab in %post .. stupid
# and e2fsprogs fails if the link doesn't exist .. stupid stupid
-ln -s /proc/mounts /etc/mtab
+if ! test -e /etc/mtab; then
+ ln -s /proc/mounts /etc/mtab
+fi
# devtmpfs is required since udev 176
mount -t devtmpfs /dev /dev
Index: libguestfs-1.32.4/appliance/packagelist.in
===================================================================
--- libguestfs-1.32.4.orig/appliance/packagelist.in
+++ libguestfs-1.32.4/appliance/packagelist.in
@@ -134,6 +134,7 @@ ifelse(SUSE,1,
btrfsprogs
cryptsetup
dhcpcd
+ dhcp-client
genisoimage
glibc-locale
gptfdisk
@@ -141,9 +142,12 @@ ifelse(SUSE,1,
iproute2
iputils
libcap2
+ libhivex0
libselinux1
libyajl2
mkisofs
+ ntfsprogs
+ ntfs-3g
reiserfs
systemd
vim
Index: libguestfs-1.32.4/builder/virt-builder.pod
===================================================================
--- libguestfs-1.32.4.orig/builder/virt-builder.pod
+++ libguestfs-1.32.4/builder/virt-builder.pod
@@ -839,16 +839,17 @@ F<~root/virt-sysprep-firstboot.log>.
=item Windows
F<rhsrvany.exe>, available from sources at
-L<https://github.com/rwmjones/rhsrvany>, is installed to run the
+L<https://github.com/rwmjones/rhsrvany>, or F<pvvxsvc.exe>, available
+with SUSE VMDP is installed to run the
first boot scripts. It is required, and the setup of first boot
scripts will fail if it is not present.
-F<rhsrvany.exe> is copied from the location pointed to by the
+F<rhsrvany.exe> or F<pvvxsvc.exe> is copied from the location pointed to by the
C<VIRT_TOOLS_DATA_DIR> environment variable; if not set, a compiled-in
default will be used (something like F</usr/share/virt-tools>).
The output of the first boot scripts is available in the guest as
-F<C:\Program Files\Red Hat\Firstboot\log.txt>.
+F<C:\Program Files\Guestfs\Firstboot\log.txt>.
=back
@@ -1819,6 +1820,12 @@ I<--firstboot> or I<--firstboot-command>
See also: C<https://github.com/rwmjones/rhsrvany>
+=item F<pvvxsvc.exe>
+
+This is a Windows binary shipped with SUSE VMDP, used to install a "firstboot"
+script in Windows guests. It is required if you intend to use the
+I<--firstboot> or I<--firstboot-command> options with Windows guests.
+
=back
=item C<XDG_CACHE_HOME>
Index: libguestfs-1.32.4/customize/firstboot.ml
===================================================================
--- libguestfs-1.32.4.orig/customize/firstboot.ml
+++ libguestfs-1.32.4/customize/firstboot.ml
@@ -185,19 +185,25 @@ module Windows = struct
try Sys.getenv "VIRT_TOOLS_DATA_DIR"
with Not_found -> Guestfs_config.datadir // "virt-tools" in
- (* rhsrvany.exe must exist.
+ (* Either rhsrvany.exe or pvvxsvc.exe must exist.
*
* (Check also that it's not a dangling symlink but a real file).
*)
- let rhsrvany_exe = virt_tools_data_dir // "rhsrvany.exe" in
- (try
- let chan = open_in rhsrvany_exe in
- close_in chan
- with
- Sys_error msg ->
- error (f_"'%s' is missing. This file is required in order to install Windows firstboot scripts. You can get it by building rhsrvany (https://github.com/rwmjones/rhsrvany). Original error: %s")
- rhsrvany_exe msg
- );
+ let services = ["rhsrvany.exe"; "pvvxsvc.exe"] in
+ let srvany =
+ try
+ List.find (
+ fun service ->
+ try
+ let chan = open_in (virt_tools_data_dir // service) in
+ close_in chan;
+ true
+ with _ ->
+ false
+ ) services
+ with Not_found ->
+ error (f_"One of rhsrvany.exe or pvvxsvc.exe is missing in %s. One of them is required in order to install Windows firstboot scripts. You can get one by building rhsrvany (https://github.com/rwmjones/rhsrvany)")
+ virt_tools_data_dir in
(* Create a directory for firstboot files in the guest. *)
let firstboot_dir, firstboot_dir_win =
@@ -211,12 +217,12 @@ module Windows = struct
g#mkdir_p firstboot_dir;
loop firstboot_dir firstboot_dir_win path
in
- loop "" "C:" ["Program Files"; "Red Hat"; "Firstboot"] in
+ loop "" "C:" ["Program Files"; "Guestfs"; "Firstboot"] in
g#mkdir_p (firstboot_dir // "scripts");
- (* Copy rhsrvany to the guest. *)
- g#upload rhsrvany_exe (firstboot_dir // "rhsrvany.exe");
+ (* Copy pvvxsvc or rhsrvany to the guest. *)
+ g#upload (virt_tools_data_dir // srvany) (firstboot_dir // srvany);
(* Write a firstboot.bat control script which just runs the other
* scripts in the directory. Note we need to use CRLF line endings
@@ -232,7 +238,7 @@ set log=%%firstboot%%\\log.txt
set scripts=%%firstboot%%\\scripts
set scripts_done=%%firstboot%%\\scripts-done
-call :main > \"%%log%%\" 2>&1
+call :main >> \"%%log%%\" 2>&1
exit /b
:main
@@ -244,17 +250,17 @@ if not exist \"%%scripts_done%%\" (
for %%%%f in (\"%%scripts%%\"\\*.bat) do (
echo running \"%%%%f\"
- call \"%%%%f\"
+ move \"%%%%f\" \"%%scripts_done%%\"
+ pushd \"%%scripts_done%%\"
+ call \"%%%%~nf\"
set elvl=!errorlevel!
echo .... exit code !elvl!
- if !elvl! equ 0 (
- move \"%%%%f\" \"%%scripts_done%%\"
- )
+ popd
)
echo uninstalling firstboot service
-rhsrvany.exe -s firstboot uninstall
-" firstboot_dir_win in
+%s -s firstboot uninstall
+" firstboot_dir_win srvany in
g#write (firstboot_dir // "firstboot.bat") (unix2dos firstboot_script);
@@ -283,7 +289,7 @@ rhsrvany.exe -s firstboot uninstall
"Start", REG_DWORD 0x2_l;
"ErrorControl", REG_DWORD 0x1_l;
"ImagePath",
- REG_SZ (firstboot_dir_win ^ "\\rhsrvany.exe -s firstboot");
+ REG_SZ (sprintf "%s\\%s -s firstboot" firstboot_dir_win srvany);
"DisplayName", REG_SZ "Virt tools firstboot service";
"ObjectName", REG_SZ "LocalSystem" ];
Index: libguestfs-1.32.4/customize/virt-customize.pod
===================================================================
--- libguestfs-1.32.4.orig/customize/virt-customize.pod
+++ libguestfs-1.32.4/customize/virt-customize.pod
@@ -250,6 +250,12 @@ I<--firstboot> or I<--firstboot-command>
See also: C<https://github.com/rwmjones/rhsrvany>
+=item F<pvvxsvc.exe>
+
+This is a Windows binary shipped with SUSE VMDP, used to install a "firstboot"
+script in Windows guests. It is required if you intend to use the
+I<--firstboot> or I<--firstboot-command> options with Windows guests.
+
=back
=back
Index: libguestfs-1.32.4/sysprep/virt-sysprep.pod
===================================================================
--- libguestfs-1.32.4.orig/sysprep/virt-sysprep.pod
+++ libguestfs-1.32.4/sysprep/virt-sysprep.pod
@@ -550,6 +550,12 @@ I<--firstboot> or I<--firstboot-command>
See also: C<https://github.com/rwmjones/rhsrvany>
+=item F<pvvxsvc.exe>
+
+This is a Windows binary shipped with SUSE VMDP, used to install a "firstboot"
+script in Windows guests. It is required if you intend to use the
+I<--firstboot> or I<--firstboot-command> options with Windows guests.
+
=back
=back
Index: libguestfs-1.32.4/v2v/convert_linux.ml
===================================================================
--- libguestfs-1.32.4.orig/v2v/convert_linux.ml
+++ libguestfs-1.32.4/v2v/convert_linux.ml
@@ -125,7 +125,7 @@ let rec convert ~keep_serial_console (g
let installed_kernels : kernel_info list =
let rex_ko = Str.regexp ".*\\.k?o\\(\\.xz\\)?$" in
let rex_ko_extract = Str.regexp ".*/\\([^/]+\\)\\.k?o\\(\\.xz\\)?$" in
- let rex_initrd = Str.regexp "^initr\\(d\\|amfs\\)-.*\\.img$" in
+ let rex_initrd = Str.regexp "^initr\\(d\\|amfs\\)-.*\\(\\.img\\)?$" in
filter_map (
function
| { G.app2_name = name } as app
@@ -158,7 +158,8 @@ let rec convert ~keep_serial_console (g
(* Get/construct the version. XXX Read this from kernel file. *)
let version =
- sprintf "%s-%s" app.G.app2_version app.G.app2_release in
+ let prefix_len = String.length "/lib/modules/" in
+ String.sub modpath prefix_len (String.length modpath - prefix_len) in
(* Find the initramfs which corresponds to the kernel.
* Since the initramfs is built at runtime, and doesn't have
@@ -173,12 +174,11 @@ let rec convert ~keep_serial_console (g
let files =
List.filter (
fun n ->
- String.find n app.G.app2_version >= 0 &&
- String.find n app.G.app2_release >= 0
+ String.find n version >= 0
) files in
(* Don't consider kdump initramfs images (RHBZ#1138184). *)
let files =
- List.filter (fun n -> String.find n "kdump.img" == -1) files in
+ List.filter (fun n -> String.find n "kdump" == -1) files in
(* If several files match, take the shortest match. This
* handles the case where we have a mix of same-version non-Xen
* and Xen kernels:
Index: libguestfs-1.32.4/v2v/test-v2v-in-place.sh
===================================================================
--- libguestfs-1.32.4.orig/v2v/test-v2v-in-place.sh
+++ libguestfs-1.32.4/v2v/test-v2v-in-place.sh
@@ -97,7 +97,7 @@ mktest ()
:> "$script"
:> "$expected"
-firstboot_dir="/Program Files/Red Hat/Firstboot"
+firstboot_dir="/Program Files/Guestfs/Firstboot"
mktest "is-dir \"$firstboot_dir\"" true
mktest "is-file \"$firstboot_dir/firstboot.bat\"" true
mktest "is-dir \"$firstboot_dir/scripts\"" true
Index: libguestfs-1.32.4/v2v/test-v2v-virtio-win-iso.sh
===================================================================
--- libguestfs-1.32.4.orig/v2v/test-v2v-virtio-win-iso.sh
+++ libguestfs-1.32.4/v2v/test-v2v-virtio-win-iso.sh
@@ -93,7 +93,7 @@ mktest ()
:> "$script"
:> "$expected"
-firstboot_dir="/Program Files/Red Hat/Firstboot"
+firstboot_dir="/Program Files/Guestfs/Firstboot"
mktest "is-dir \"$firstboot_dir\"" true
mktest "is-file \"$firstboot_dir/firstboot.bat\"" true
mktest "is-dir \"$firstboot_dir/scripts\"" true
Index: libguestfs-1.32.4/v2v/test-v2v-windows-conversion.sh
===================================================================
--- libguestfs-1.32.4.orig/v2v/test-v2v-windows-conversion.sh
+++ libguestfs-1.32.4/v2v/test-v2v-windows-conversion.sh
@@ -86,7 +86,7 @@ mktest ()
:> "$script"
:> "$expected"
-firstboot_dir="/Program Files/Red Hat/Firstboot"
+firstboot_dir="/Program Files/Guestfs/Firstboot"
mktest "is-dir \"$firstboot_dir\"" true
mktest "is-file \"$firstboot_dir/firstboot.bat\"" true
mktest "is-dir \"$firstboot_dir/scripts\"" true
Index: libguestfs-1.32.4/v2v/virt-v2v.pod
===================================================================
--- libguestfs-1.32.4.orig/v2v/virt-v2v.pod
+++ libguestfs-1.32.4/v2v/virt-v2v.pod
@@ -167,6 +167,8 @@ OVAs from other hypervisors will not wor
=item RHEL 5 Xen
+=item SUSE Xen
+
=item Citrix Xen
Citrix Xen has not been recently tested.
@@ -336,7 +338,7 @@ Xen remote connections can be used. Oth
will not work in general.
See also L</INPUT FROM VMWARE VCENTER SERVER>,
-L</INPUT FROM RHEL 5 XEN> below.
+L</INPUT FROM XEN> below.
=item B<-if> format
@@ -1256,9 +1258,10 @@ Perform the conversion of the guest usin
Remove the F<guest.xml> and F<guest-disk*> files.
-=head1 INPUT FROM RHEL 5 XEN
+=head1 INPUT FROM XEN
-Virt-v2v is able to import Xen guests from RHEL 5 Xen hosts.
+Virt-v2v is able to import Xen guests from RHEL 5 Xen or SLES and
+openSUSE Xen hosts.
Virt-v2v uses libvirt for access to the remote Xen host, and therefore
the input mode should be I<-i libvirt>. As this is the default, you
@@ -1852,6 +1855,12 @@ script in the guest during conversion of
See also: C<https://github.com/rwmjones/rhsrvany>
+=item F<pvvxsvc.exe>
+
+This is a Windows binary shipped with SUSE VMDP, used to install a "firstboot"
+script in Windows guests. It is required if you intend to use the
+I<--firstboot> or I<--firstboot-command> options with Windows guests.
+
=item F<rhev-apt.exe>
(Optional)
Index: libguestfs-1.32.4/v2v/Makefile.am
===================================================================
--- libguestfs-1.32.4.orig/v2v/Makefile.am
+++ libguestfs-1.32.4/v2v/Makefile.am
@@ -291,6 +291,7 @@ TESTS_ENVIRONMENT = $(top_builddir)/run
TESTS = \
test-v2v-i-ova-formats.sh \
test-v2v-i-ova-gz.sh \
+ test-v2v-i-ova-subfolders.sh \
test-v2v-i-ova-two-disks.sh \
test-v2v-copy-to-local.sh
Index: libguestfs-1.32.4/v2v/convert_windows.ml
===================================================================
--- libguestfs-1.32.4.orig/v2v/convert_windows.ml
+++ libguestfs-1.32.4/v2v/convert_windows.ml
@@ -43,18 +43,25 @@ let convert ~keep_serial_console (g : G.
try Sys.getenv "VIRT_TOOLS_DATA_DIR"
with Not_found -> Guestfs_config.datadir // "virt-tools" in
- (* Check if RHEV-APT exists. This is optional. *)
- let rhev_apt_exe = virt_tools_data_dir // "rhev-apt.exe" in
- let rhev_apt_exe =
+ (* Check if either RHEV-APT or VMDP exists. This is optional. *)
+ let tools = [`RhevApt, "rhev-apt.exe"; `VmdpExe, "vmdp.exe"] in
+ let installer =
try
- let chan = open_in rhev_apt_exe in
- close_in chan;
- Some rhev_apt_exe
- with
- Sys_error msg ->
- warning (f_"'%s' is missing. Unable to install RHEV-APT (RHEV guest agent). Original error: %s")
- rhev_apt_exe msg;
- None in
+ let t, tool = List.find (
+ fun (_, tool) ->
+ try (
+ let exe_path = virt_tools_data_dir // tool in
+ let chan = open_in exe_path in
+ close_in chan;
+ true
+ ) with _ ->
+ false
+ ) tools in
+ Some (t, virt_tools_data_dir // tool)
+ with Not_found -> (
+ warning (f_"Neither rhev-apt.exe nor vmdp.exe can be found. Unable to install one of them.");
+ None
+ ) in
(* Get the Windows %systemroot%. *)
let systemroot = g#inspect_get_windows_systemroot inspect.i_root in
@@ -158,19 +165,19 @@ let convert ~keep_serial_console (g : G.
(* Perform the conversion of the Windows guest. *)
let rec configure_firstboot () =
- configure_rhev_apt ();
+ match installer with
+ | None -> ()
+ | Some (`RhevApt, tool_path) -> configure_rhev_apt tool_path
+ | Some (`VmdpExe, tool_path) -> configure_vmdp tool_path;
unconfigure_xenpv ()
- and configure_rhev_apt () =
+ and configure_rhev_apt tool_path =
(* Configure RHEV-APT (the RHEV guest agent). However if it doesn't
* exist just warn about it and continue.
*)
- match rhev_apt_exe with
- | None -> ()
- | Some rhev_apt_exe ->
- g#upload rhev_apt_exe "/rhev-apt.exe"; (* XXX *)
+ g#upload tool_path "/rhev-apt.exe"; (* XXX *)
- let fb_script = "\
+ let fb_script = "\
@echo off
echo installing rhev-apt
@@ -179,8 +186,38 @@ echo installing rhev-apt
echo starting rhev-apt
net start rhev-apt
" in
- Firstboot.add_firstboot_script g inspect.i_root
- "configure rhev-apt" fb_script
+ Firstboot.add_firstboot_script g inspect.i_root
+ "configure rhev-apt" fb_script
+
+ and configure_vmdp tool_path =
+ (* Configure VMDP if possible *)
+ g#upload tool_path "/vmdp.exe";
+
+ let fb_script = "\
+echo V2V first boot script started
+echo Decompressing VMDP installer
+\"\\vmdp.exe\"
+pushd \"VMDP-*\"
+echo Installing VMDP
+setup.exe /eula_accepted /no_reboot
+popd
+" in
+
+ let fb_recover_script = "\
+echo Finishing VMDP installation
+if not exist VMDP-* (
+ \"\\vmdp.exe\"
+)
+pushd \"VMDP-*\"
+setup.exe /eula_accepted /no_reboot
+popd
+" in
+
+ Firstboot.add_firstboot_script g inspect.i_root
+ "configure vmdp" fb_script;
+
+ Firstboot.add_firstboot_script g inspect.i_root
+ "finish vmdp setup" fb_recover_script
and unconfigure_xenpv () =
match xenpv_uninst with
Index: libguestfs-1.32.4/v2v/input_ova.ml
===================================================================
--- libguestfs-1.32.4.orig/v2v/input_ova.ml
+++ libguestfs-1.32.4/v2v/input_ova.ml
@@ -139,13 +139,14 @@ object
let rex = Str.regexp "SHA1(\\(.*\\))=\\([0-9a-fA-F]+\\)\r?" in
List.iter (
fun mf ->
+ let mf_folder = Filename.dirname mf in
let chan = open_in mf in
let rec loop () =
let line = input_line chan in
if Str.string_match rex line 0 then (
let disk = Str.matched_group 1 line in
let expected = Str.matched_group 2 line in
- let cmd = sprintf "sha1sum %s" (quote (exploded // disk)) in
+ let cmd = sprintf "sha1sum %s" (quote (mf_folder // disk)) in
let out = external_command cmd in
match out with
| [] ->
@@ -166,6 +167,7 @@ object
) mf;
(* Parse the ovf file. *)
+ let ovf_folder = Filename.dirname ovf in
let xml = read_whole_file ovf in
let doc = Xml.parse_memory xml in
@@ -266,7 +268,7 @@ object
| Some s -> s in
(* Does the file exist and is it readable? *)
- let filename = exploded // filename in
+ let filename = ovf_folder // filename in
Unix.access filename [Unix.R_OK];
(* The spec allows the file to be gzip-compressed, in which case
Index: libguestfs-1.32.4/v2v/test-v2v-i-ova-subfolders.expected
2015-09-07 20:30:32 +02:00
===================================================================
2014-05-13 15:51:49 +02:00
--- /dev/null
2016-05-25 14:44:28 +02:00
+++ libguestfs-1.32.4/v2v/test-v2v-i-ova-subfolders.expected
@@ -0,0 +1,18 @@
+Source guest information (--print-source option):
+
+ source name: 2K8R2EESP1_2_Medium
+hypervisor type: vmware
+ memory: 1073741824 (bytes)
+ nr vCPUs: 1
+ CPU features:
+ firmware: uefi
+ display:
+ video:
+ sound:
+disks:
+ subfolder/disk1.vmdk (vmdk) [scsi]
+removable media:
+ CD-ROM [ide] in slot 0
+NICs:
+ Network "Network adapter 1"
+
Index: libguestfs-1.32.4/v2v/test-v2v-i-ova-subfolders.ovf
2015-09-07 20:30:32 +02:00
===================================================================
--- /dev/null
2016-05-25 14:44:28 +02:00
+++ libguestfs-1.32.4/v2v/test-v2v-i-ova-subfolders.ovf
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Envelope vmw:buildId="build-1750787" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw="http://www.vmware.com/schema/ovf" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <References>
+ <File ovf:href="disk1.vmdk" ovf:id="file1" ovf:size="7804077568"/>
+ </References>
+ <DiskSection>
+ <Info>Virtual disk information</Info>
+ <Disk ovf:capacity="50" ovf:capacityAllocationUnits="byte * 2^30" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize="18975752192"/>
+ </DiskSection>
+ <NetworkSection>
+ <Info>The list of logical networks</Info>
+ <Network ovf:name="PG-VLAN60">
+ <Description>The PG-VLAN60 network</Description>
+ </Network>
+ </NetworkSection>
+ <VirtualSystem ovf:id="2K8R2EESP1_2_Medium">
+ <Info>A virtual machine</Info>
+ <Name>2K8R2EESP1_2_Medium</Name>
+ <OperatingSystemSection ovf:id="103" vmw:osType="windows7Server64Guest">
+ <Info>The kind of installed guest operating system</Info>
+ <Description>Microsoft Windows Server 2008 R2 (64-bit)</Description>
+ </OperatingSystemSection>
+ <VirtualHardwareSection>
+ <Info>Virtual hardware requirements</Info>
+ <System>
+ <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
+ <vssd:InstanceID>0</vssd:InstanceID>
+ <vssd:VirtualSystemIdentifier>2K8R2EESP1_2_Medium</vssd:VirtualSystemIdentifier>
+ <vssd:VirtualSystemType>vmx-10</vssd:VirtualSystemType>
+ </System>
+ <Item>
+ <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
+ <rasd:Description>Number of Virtual CPUs</rasd:Description>
+ <rasd:ElementName>1 virtual CPU(s)</rasd:ElementName>
+ <rasd:InstanceID>1</rasd:InstanceID>
+ <rasd:ResourceType>3</rasd:ResourceType>
+ <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
+ </Item>
+ <Item>
+ <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
+ <rasd:Description>Memory Size</rasd:Description>
+ <rasd:ElementName>1024MB of memory</rasd:ElementName>
+ <rasd:InstanceID>2</rasd:InstanceID>
+ <rasd:ResourceType>4</rasd:ResourceType>
+ <rasd:VirtualQuantity>1024</rasd:VirtualQuantity>
+ </Item>
+ <Item>
+ <rasd:Address>0</rasd:Address>
+ <rasd:Description>SCSI Controller</rasd:Description>
+ <rasd:ElementName>SCSI controller 0</rasd:ElementName>
+ <rasd:InstanceID>3</rasd:InstanceID>
+ <rasd:ResourceSubType>lsilogicsas</rasd:ResourceSubType>
+ <rasd:ResourceType>6</rasd:ResourceType>
+ <vmw:Config ovf:required="false" vmw:key="slotInfo.pciSlotNumber" vmw:value="160"/>
+ </Item>
+ <Item>
+ <rasd:Address>1</rasd:Address>
+ <rasd:Description>IDE Controller</rasd:Description>
+ <rasd:ElementName>IDE 1</rasd:ElementName>
+ <rasd:InstanceID>4</rasd:InstanceID>
+ <rasd:ResourceType>5</rasd:ResourceType>
+ </Item>
+ <Item>
+ <rasd:Address>0</rasd:Address>
+ <rasd:Description>IDE Controller</rasd:Description>
+ <rasd:ElementName>IDE 0</rasd:ElementName>
+ <rasd:InstanceID>5</rasd:InstanceID>
+ <rasd:ResourceType>5</rasd:ResourceType>
+ </Item>
+ <Item ovf:required="false">
+ <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
+ <rasd:ElementName>Video card</rasd:ElementName>
+ <rasd:InstanceID>6</rasd:InstanceID>
+ <rasd:ResourceType>24</rasd:ResourceType>
+ <vmw:Config ovf:required="false" vmw:key="enable3DSupport" vmw:value="false"/>
+ <vmw:Config ovf:required="false" vmw:key="use3dRenderer" vmw:value="automatic"/>
+ <vmw:Config ovf:required="false" vmw:key="useAutoDetect" vmw:value="true"/>
+ <vmw:Config ovf:required="false" vmw:key="videoRamSizeInKB" vmw:value="4096"/>
+ </Item>
+ <Item ovf:required="false">
+ <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
+ <rasd:ElementName>VMCI device</rasd:ElementName>
+ <rasd:InstanceID>7</rasd:InstanceID>
+ <rasd:ResourceSubType>vmware.vmci</rasd:ResourceSubType>
+ <rasd:ResourceType>1</rasd:ResourceType>
+ <vmw:Config ovf:required="false" vmw:key="allowUnrestrictedCommunication" vmw:value="false"/>
+ <vmw:Config ovf:required="false" vmw:key="slotInfo.pciSlotNumber" vmw:value="32"/>
+ </Item>
+ <Item ovf:required="false">
+ <rasd:AddressOnParent>0</rasd:AddressOnParent>
+ <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
+ <rasd:ElementName>CD/DVD drive 1</rasd:ElementName>
+ <rasd:InstanceID>8</rasd:InstanceID>
+ <rasd:Parent>4</rasd:Parent>
+ <rasd:ResourceSubType>vmware.cdrom.atapi</rasd:ResourceSubType>
+ <rasd:ResourceType>15</rasd:ResourceType>
+ </Item>
+ <Item>
+ <rasd:AddressOnParent>0</rasd:AddressOnParent>
+ <rasd:ElementName>Hard disk 1</rasd:ElementName>
+ <rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>
+ <rasd:InstanceID>9</rasd:InstanceID>
+ <rasd:Parent>3</rasd:Parent>
+ <rasd:ResourceType>17</rasd:ResourceType>
+ <vmw:Config ovf:required="false" vmw:key="backing.writeThrough" vmw:value="false"/>
+ </Item>
+ <Item>
+ <rasd:AddressOnParent>7</rasd:AddressOnParent>
+ <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+ <rasd:Connection>PG-VLAN60</rasd:Connection>
+ <rasd:Description>E1000 ethernet adapter on "PG-VLAN60"</rasd:Description>
+ <rasd:ElementName>Network adapter 1</rasd:ElementName>
+ <rasd:InstanceID>11</rasd:InstanceID>
+ <rasd:ResourceSubType>E1000</rasd:ResourceSubType>
+ <rasd:ResourceType>10</rasd:ResourceType>
+ <vmw:Config ovf:required="false" vmw:key="slotInfo.pciSlotNumber" vmw:value="33"/>
+ <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/>
+ </Item>
+ <vmw:Config ovf:required="false" vmw:key="cpuHotAddEnabled" vmw:value="false"/>
+ <vmw:Config ovf:required="false" vmw:key="cpuHotRemoveEnabled" vmw:value="false"/>
+ <vmw:Config ovf:required="false" vmw:key="firmware" vmw:value="efi"/>
+ <vmw:Config ovf:required="false" vmw:key="virtualICH7MPresent" vmw:value="false"/>
+ <vmw:Config ovf:required="false" vmw:key="virtualSMCPresent" vmw:value="false"/>
+ <vmw:Config ovf:required="false" vmw:key="memoryHotAddEnabled" vmw:value="false"/>
+ <vmw:Config ovf:required="false" vmw:key="nestedHVEnabled" vmw:value="false"/>
+ <vmw:Config ovf:required="false" vmw:key="powerOpInfo.powerOffType" vmw:value="soft"/>
+ <vmw:Config ovf:required="false" vmw:key="powerOpInfo.resetType" vmw:value="soft"/>
+ <vmw:Config ovf:required="false" vmw:key="powerOpInfo.standbyAction" vmw:value="checkpoint"/>
+ <vmw:Config ovf:required="false" vmw:key="powerOpInfo.suspendType" vmw:value="hard"/>
+ <vmw:Config ovf:required="false" vmw:key="tools.afterPowerOn" vmw:value="true"/>
+ <vmw:Config ovf:required="false" vmw:key="tools.afterResume" vmw:value="true"/>
+ <vmw:Config ovf:required="false" vmw:key="tools.beforeGuestShutdown" vmw:value="true"/>
+ <vmw:Config ovf:required="false" vmw:key="tools.beforeGuestStandby" vmw:value="true"/>
+ <vmw:Config ovf:required="false" vmw:key="tools.syncTimeWithHost" vmw:value="false"/>
+ <vmw:Config ovf:required="false" vmw:key="tools.toolsUpgradePolicy" vmw:value="upgradeAtPowerCycle"/>
+ </VirtualHardwareSection>
+ </VirtualSystem>
+</Envelope>
Index: libguestfs-1.32.4/v2v/test-v2v-i-ova-subfolders.sh
2015-09-07 20:30:32 +02:00
===================================================================
--- /dev/null
2016-05-25 14:44:28 +02:00
+++ libguestfs-1.32.4/v2v/test-v2v-i-ova-subfolders.sh
@@ -0,0 +1,65 @@
+#!/bin/bash -
+# libguestfs virt-v2v test script
+# Copyright (C) 2014 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# Test -i ova option with files located in a subfolder.
+
+unset CDPATH
+export LANG=C
+set -e
+
+if [ -n "$SKIP_TEST_V2V_I_OVA_SUBFOLDERS_SH" ]; then
+ echo "$0: test skipped because environment variable is set"
+ exit 77
+fi
+
+if [ "$(guestfish get-backend)" = "uml" ]; then
+ echo "$0: test skipped because UML backend does not support network"
+ exit 77
+fi
+
+export VIRT_TOOLS_DATA_DIR="$srcdir/../test-data/fake-virt-tools"
+
+. $srcdir/../test-data/guestfs-hashsums.sh
+
+d=test-v2v-i-ova-subfolders.d
+rm -rf $d
+mkdir -p $d/subfolder
+
+cp test-v2v-i-ova-subfolders.ovf $d/subfolder/
+
+pushd $d/subfolder
+
+truncate -s 10k disk1.vmdk
+sha=`do_sha1 disk1.vmdk`
+echo -e "SHA1(disk1.vmdk)=$sha\r" > disk1.mf
+
+cd ..
+tar -cf test.ova subfolder
+popd
+
+# Run virt-v2v but only as far as the --print-source stage, and
+# normalize the output.
+$VG virt-v2v --debug-gc --quiet \
+ -i ova $d/test.ova \
+ --print-source |
+sed 's,[^ \t]*\(subfolder/disk.*\.vmdk\),\1,' > $d/source
+
+# Check the parsed source is what we expect.
+diff -u test-v2v-i-ova-subfolders.expected $d/source
+
+rm -rf $d
2016-06-22 21:08:28 +02:00
Index: libguestfs-1.32.4/cat/filesystems.c
===================================================================
--- libguestfs-1.32.4.orig/cat/filesystems.c
+++ libguestfs-1.32.4/cat/filesystems.c
@@ -477,9 +477,28 @@ do_output_filesystems (void)
}
}
if ((columns & COLUMN_SIZE)) {
- size = guestfs_blockdev_getsize64 (g, fses[i]);
- if (size == -1)
+ CLEANUP_FREE char *device = guestfs_mountable_device (g, fses[i]);
+ CLEANUP_FREE char *subvolume = NULL;
+
+ guestfs_push_error_handler (g, NULL, NULL);
+
+ subvolume = guestfs_mountable_subvolume (g, fses[i]);
+ if (subvolume == NULL && guestfs_last_errno (g) != EINVAL) {
+ fprintf (stderr,
+ _("%s: cannot determine the subvolume for %s: %s: %s\n"),
+ guestfs_int_program_name, fses[i],
+ guestfs_last_error (g),
+ strerror (guestfs_last_errno (g)));
exit (EXIT_FAILURE);
+ }
+
+ guestfs_pop_error_handler (g);
+
+ if (!device || !subvolume) {
+ size = guestfs_blockdev_getsize64 (g, fses[i]);
+ if (size == -1)
+ exit (EXIT_FAILURE);
+ }
}
if (is_md (fses[i]))
Index: libguestfs-1.32.4/.gitignore
===================================================================
--- libguestfs-1.32.4.orig/.gitignore
+++ libguestfs-1.32.4/.gitignore
@@ -321,6 +321,7 @@ Makefile.in
/p2v/stamp-virt-p2v.pod
/p2v/stamp-virt-p2v-make-disk.pod
/p2v/stamp-virt-p2v-make-kickstart.pod
+/p2v/stamp-virt-p2v-make-kiwi.pod
/p2v/test-virt-p2v-pxe.id_rsa
/p2v/test-virt-p2v-pxe.id_rsa.pub
/p2v/test-virt-p2v-pxe.img
@@ -335,6 +336,8 @@ Makefile.in
/p2v/virt-p2v-make-disk.1
/p2v/virt-p2v-make-kickstart
/p2v/virt-p2v-make-kickstart.1
+/p2v/virt-p2v-make-kiwi
+/p2v/virt-p2v-make-kiwi.1
/perl/_build
/perl/bindtests.pl
/perl/blib
Index: libguestfs-1.32.4/configure.ac
===================================================================
--- libguestfs-1.32.4.orig/configure.ac
+++ libguestfs-1.32.4/configure.ac
@@ -159,6 +159,8 @@ AC_CONFIG_FILES([p2v/virt-p2v-make-disk]
[chmod +x,-w p2v/virt-p2v-make-disk])
AC_CONFIG_FILES([p2v/virt-p2v-make-kickstart],
[chmod +x,-w p2v/virt-p2v-make-kickstart])
+AC_CONFIG_FILES([p2v/virt-p2v-make-kiwi],
+ [chmod +x,-w p2v/virt-p2v-make-kiwi])
AC_CONFIG_FILES([php/extension/php-for-tests.sh],
[chmod +x,-w php/extension/php-for-tests.sh])
AC_CONFIG_FILES([pick-guests.pl],
Index: libguestfs-1.32.4/p2v/Makefile.am
===================================================================
--- libguestfs-1.32.4.orig/p2v/Makefile.am
+++ libguestfs-1.32.4/p2v/Makefile.am
@@ -21,6 +21,8 @@ EXTRA_DIST = \
HACKING \
dependencies.m4 \
issue \
+ kiwi-config.sh \
+ kiwi-config.xml.in \
launch-virt-p2v.in \
p2v.ks.in \
p2v.service \
@@ -28,15 +30,19 @@ EXTRA_DIST = \
virt-p2v-make-disk.in \
virt-p2v-make-disk.pod \
virt-p2v-make-kickstart.in \
- virt-p2v-make-kickstart.pod
+ virt-p2v-make-kickstart.pod \
+ virt-p2v-make-kiwi.in \
+ virt-p2v-make-kiwi.pod
CLEANFILES = \
stamp-virt-p2v.pod \
stamp-virt-p2v-make-disk.pod \
stamp-virt-p2v-make-kickstart.pod \
+ stamp-virt-p2v-make-kiwi.pod \
virt-p2v.1 \
virt-p2v-make-disk.1 \
- virt-p2v-make-kickstart.1
+ virt-p2v-make-kickstart.1 \
+ virt-p2v-make-kiwi.1
# Although virt-p2v is a regular binary, it is not usually installed
# in /usr/bin since it only functions when contained in an ISO or PXE
@@ -83,7 +89,7 @@ virt_p2v_LDADD = \
../gnulib/lib/libgnu.la
# Scripts to build the disk image, USB key, or kickstart.
-bin_SCRIPTS = virt-p2v-make-disk virt-p2v-make-kickstart
+bin_SCRIPTS = virt-p2v-make-disk virt-p2v-make-kickstart virt-p2v-make-kiwi
dependencies_files = \
dependencies.archlinux \
@@ -103,6 +109,8 @@ virtp2vdatadir = $(datadir)/virt-p2v
virtp2vdata_DATA = \
$(dependencies_files) \
issue \
+ kiwi-config.sh \
+ kiwi-config.xml.in \
launch-virt-p2v \
p2v.ks.in \
p2v.service
@@ -118,12 +126,14 @@ launch-virt-p2v: launch-virt-p2v.in
man_MANS = \
virt-p2v.1 \
virt-p2v-make-disk.1 \
- virt-p2v-make-kickstart.1
+ virt-p2v-make-kickstart.1 \
+ virt-p2v-make-kiwi.1
noinst_DATA = \
$(top_builddir)/website/virt-p2v.1.html \
$(top_builddir)/website/virt-p2v-make-disk.1.html \
- $(top_builddir)/website/virt-p2v-make-kickstart.1.html
+ $(top_builddir)/website/virt-p2v-make-kickstart.1.html \
+ $(top_builddir)/website/virt-p2v-make-kiwi.1.html
virt-p2v.1 $(top_builddir)/website/virt-p2v.1.html: stamp-virt-p2v.pod
@@ -156,6 +166,17 @@ stamp-virt-p2v-make-kickstart.pod: virt-
--license GPLv2+ \
--warning safe \
$<
+ touch $@
+
+virt-p2v-make-kiwi.1 $(top_builddir)/website/virt-p2v-make-kiwi.1.html: stamp-virt-p2v-make-kiwi.pod
+
+stamp-virt-p2v-make-kiwi.pod: virt-p2v-make-kiwi.pod
+ $(PODWRAPPER) \
+ --man virt-p2v-make-kiwi.1 \
+ --html $(top_builddir)/website/virt-p2v-make-kiwi.1.html \
+ --license GPLv2+ \
+ --warning safe \
+ $<
touch $@
# Tests.
Index: libguestfs-1.32.4/p2v/dependencies.m4
===================================================================
--- libguestfs-1.32.4.orig/p2v/dependencies.m4
+++ libguestfs-1.32.4/p2v/dependencies.m4
@@ -90,16 +90,18 @@ ifelse(SUSE,1,
pcre
libxml2
gtk2
- /usr/bin/ssh
- /usr/bin/qemu-nbd
+ qemu-tools
+ openssh
curl
hwdata
- /usr/bin/xinit
- /usr/bin/Xorg
+ xinit
+ xorg-x11-server
xf86-video-*
- metacity
NetworkManager
- nm-connection-editor
- network-manager-applet
- dbus-x11
+ xf86-input-*
+ icewm-lite
+ dbus-1-x11
+ yast2-network
+ libyui-qt
+ SuSEfirewall2
)
Index: libguestfs-1.32.4/p2v/gui.c
===================================================================
--- libguestfs-1.32.4.orig/p2v/gui.c
+++ libguestfs-1.32.4/p2v/gui.c
@@ -381,7 +381,10 @@ test_connection_thread (void *data)
static void
configure_network_button_clicked (GtkWidget *w, gpointer data)
{
- ignore_value (system ("nm-connection-editor &"));
+ if (access ("/sbin/yast2", X_OK) >= 0)
+ ignore_value (system ("yast2 lan &"));
+ else
+ ignore_value (system ("nm-connection-editor &"));
}
static void
Index: libguestfs-1.32.4/p2v/kiwi-config.sh
===================================================================
--- /dev/null
+++ libguestfs-1.32.4/p2v/kiwi-config.sh
@@ -0,0 +1,73 @@
+#!/bin/bash
+#================
+# FILE : config.sh
+#----------------
+# PROJECT : OpenSuSE KIWI Image System
+# COPYRIGHT : (c) 2006 SUSE LINUX Products GmbH. All rights reserved
+# :
+# AUTHOR : Marcus Schaefer <ms@suse.de>
+#======================================
+# Functions...
+#--------------------------------------
+test -f /.kconfig && . /.kconfig
+test -f /.profile && . /.profile
+
+#======================================
+# Greeting...
+#--------------------------------------
+echo "Configure image: [$kiwi_iname]..."
+
+#======================================
+# Mount system filesystems
+#--------------------------------------
+baseMount
+
+#======================================
+# Setup baseproduct link
+#--------------------------------------
+suseSetupProduct
+
+#======================================
+# Add missing gpg keys to rpm
+#--------------------------------------
+suseImportBuildKey
+
+#======================================
+# Activate services
+#--------------------------------------
+suseInsertService p2v
+
+#======================================
+# Setup default target, multi-user
+#--------------------------------------
+baseSetRunlevel 3
+
+#==========================================
+# remove package docs
+#------------------------------------------
+rm -rf /usr/share/doc/packages/*
+rm -rf /usr/share/doc/manual/*
+rm -rf /opt/kde*
+
+# Update the default getty target to login automatically as root without
+# prompting for a password
+sed -i 's/^ExecStart=\(.*\)/ExecStart=\1 -a root/' \
+ /usr/lib/systemd/system/getty@.service
+
+# Reserve tty1 as a getty so we can document it clearly
+echo ReserveVT=1 >> /etc/systemd/logind.conf
+
+sed -i 's/^ROOT_USES_LANG=.*$/ROOT_USES_LANG="yes"/' \
+ /etc/sysconfig/language
+
+#======================================
+# SuSEconfig
+#--------------------------------------
+suseConfig
+
+#======================================
+# Umount kernel filesystems
+#--------------------------------------
+baseCleanMount
+
+exit 0
Index: libguestfs-1.32.4/p2v/kiwi-config.xml.in
===================================================================
--- /dev/null
+++ libguestfs-1.32.4/p2v/kiwi-config.xml.in
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<image schemaversion="6.2" name="p2v-__KIWI_BOOT__" displayname="p2v___PACKAGE_VERSION_____KIWI_BOOT__">
+ <description type="system">
+ <author>Marcus Schäfer</author>
+ <contact>ms@suse.com</contact>
+ <specification>P2V __PACKAGE_VERSION__</specification>
+ </description>
+ <profiles>
+ <profile name="vmxFlavour" description="VMX with default kernel" import="true"/>
+ <profile name="netboot" description="compressed rootfs image for pxe"/>
+ </profiles>
+ <preferences>
+ <type image="iso" primary="true" boot="isoboot/suse-__KIWI_BOOT__" flags="overlay" hybrid="true" firmware="uefi" kernelcmdline="splash"/>
+ <version>__PACKAGE_VERSION__</version>
+ <packagemanager>zypper</packagemanager>
+ <locale>en_US</locale>
+ <keytable>us.map.gz</keytable>
+ <hwclock>utc</hwclock>
+ <bootloader-theme>__BRANDING__</bootloader-theme>
+ <bootsplash-theme>__BRANDING__</bootsplash-theme>
+ <rpm-excludedocs>true</rpm-excludedocs>
+ <rpm-check-signatures>false</rpm-check-signatures>
+ </preferences>
+ <preferences profiles="netboot">
+ <type image="pxe" filesystem="overlayfs" boot="netboot/suse-__KIWI_BOOT__">
+ <pxedeploy server="192.168.100.2" blocksize="4096">
+ <partitions device="/dev/sda">
+ <partition type="swap" number="1" size="5"/>
+ <partition type="L" number="2" size="image" mountpoint="/" target="true"/>
+ <partition type="L" number="3" target="false"/>
+ </partitions>
+ <union ro="/dev/sda2" rw="/dev/sda3" type="overlayfs"/>
+ </pxedeploy>
+ </type>
+ </preferences>
+ <preferences profiles="vmxFlavour">
+ <type image="vmx" filesystem="ext3" boot="vmxboot/suse-__KIWI_BOOT__" format="vmdk" bootloader="grub2" firmware="uefi" kernelcmdline="splash" bootpartition="false">
+ <systemdisk name="systemVG"/>
+ <machine memory="512" guestOS="suse" HWversion="4">
+ <vmdisk id="0" controller="ide"/>
+ <vmnic driver="e1000" interface="0" mode="bridged"/>
+ </machine>
+ </type>
+ </preferences>
+ <users group="root">
+ <user password="p2v" pwdformat="plain" home="/root" name="root"/>
+ </users>
+ <!--__REPOS__-->
+ <packages type="image" patternType="onlyRequired">
+ <package name="__BASE_PATTERN__"/>
+ <package name="plymouth-branding-__BRANDING__" bootinclude="true"/>
+ <package name="grub2-branding-__BRANDING__" bootinclude="true"/>
+ <package name="iputils"/>
+ <package name="grub2"/>
+ <package name="grub2-x86_64-efi"/>
+ <package name="syslinux"/>
+ <package name="lvm2"/>
+ <package name="plymouth"/>
+ <package name="fontconfig"/>
+ <package name="fonts-config"/>
+ <package name="tar"/>
+ <package name="systemd"/>
+ <package name="systemd-sysvinit"/>
+ <package name="dracut"/>
+ <package name="wicked"/>
+ <package name="iproute2"/>
+ <package name="sudo"/>
+ <package name="dhcp-client"/>
+ <package name="which"/>
+ <!-- virt-p2v dependencies from dependencies.suse -->
+<!--__DEPENDENCIES__-->
+ </packages>
+ <packages type="iso">
+ <package name="gfxboot-branding-__BRANDING__" bootinclude="true" bootdelete="true"/>
+ </packages>
+ <packages type="image" profiles="vmxFlavour">
+ <package name="kernel-default" replaces="kernel-xen"/>
+ <package name="kernel-default" replaces="xen-kmp-default"/>
+ <package name="kernel-default" replaces="xen-libs"/>
+ <package name="kernel-default" replaces="xen-tools"/>
+ <package name="kernel-default" replaces="xen"/>
+ <package name="gfxboot-branding-__BRANDING__" bootinclude="true" bootdelete="true"/>
+ </packages>
+ <packages type="bootstrap">
+ <package name="udev"/>
+ <package name="filesystem"/>
+ <package name="glibc-locale"/>
+ <package name="cracklib-dict-full"/>
+ <package name="ca-certificates"/>
+ <package name="__RELEASE_PKG__"/>
+ </packages>
+</image>
Index: libguestfs-1.32.4/p2v/launch-virt-p2v.in
===================================================================
--- libguestfs-1.32.4.orig/p2v/launch-virt-p2v.in
+++ libguestfs-1.32.4/p2v/launch-virt-p2v.in
@@ -22,8 +22,20 @@
# and virt-p2v.
if [ "$1" = "run" ]; then
cd /
- metacity &
- nm-applet &
+ ID=
+ if test -f /etc/os-release; then
+ . /etc/os-release
+ fi
+
+ case "$ID" in
+ sles|opensuse)
+ # not all versions of SLE / openSUSE ship metacity and nm-applet
+ icewm &
+ ;;
+ *)
+ metacity &
+ nm-applet &
+ esac
exec @libexecdir@/virt-p2v
else
xinit "$0" run
Index: libguestfs-1.32.4/p2v/utils.c
===================================================================
--- libguestfs-1.32.4.orig/p2v/utils.c
+++ libguestfs-1.32.4/p2v/utils.c
@@ -143,7 +143,7 @@ get_if_vendor (const char *if_name, int
*/
/* XXX We could make this configurable. */
-#define NETWORK_ONLINE_COMMAND "nm-online -t 30"
+#define NETWORK_ONLINE_COMMAND "nm-online -t 30 -x"
void
wait_network_online (const struct config *config)
Index: libguestfs-1.32.4/p2v/virt-p2v-make-disk.pod
===================================================================
--- libguestfs-1.32.4.orig/p2v/virt-p2v-make-disk.pod
+++ libguestfs-1.32.4/p2v/virt-p2v-make-disk.pod
@@ -148,6 +148,7 @@ L</FILES> above). If not set, a compile
L<virt-p2v(1)>,
L<virt-p2v-make-kickstart(1)>,
+L<virt-p2v-make-kiwi(1)>,
L<virt-v2v(1)>,
L<http://libguestfs.org/>.
Index: libguestfs-1.32.4/p2v/virt-p2v-make-kiwi.in
===================================================================
--- /dev/null
+++ libguestfs-1.32.4/p2v/virt-p2v-make-kiwi.in
@@ -0,0 +1,228 @@
+#!/bin/bash -
+# @configure_input@
+# virt-p2v-make-kiwi
+# Copyright (C) 2016 SUSE.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+unset CDPATH
+
+program="virt-p2v-make-kiwi"
+version="@PACKAGE_VERSION@"
+
+TEMP=`getopt \
+ -o o:V \
+ --long help,inject-ssh-identity:,output:,version \
+ -n $program -- "$@"`
+if [ $? != 0 ]; then
+ echo "$program: problem parsing the command line arguments"
+ exit 1
+fi
+eval set -- "$TEMP"
+
+usage ()
+{
+ echo "Usage:"
+ echo " $program [--options] [-o kiwi-folder]"
+ echo
+ echo "Read $program(1) man page for more information."
+ exit $1
+}
+
+output=p2v.kiwi
+ssh_identity=
+
+while true; do
+ case "$1" in
+ --inject-ssh-identity)
+ ssh_identity="$2"
+ shift 2;;
+ -o|--output)
+ output="$2"
+ shift 2;;
+ -V|--version)
+ echo "$program $version"
+ exit 0;;
+ --help)
+ usage 0;;
+ --)
+ shift
+ break;;
+ *)
+ echo "internal error ($1)"
+ exit 1;;
+ esac
+done
+
+set -e
+
+# Deal with stupid autotools libexecdir-not-expandable crap.
+prefix="@prefix@"
+exec_prefix="@exec_prefix@"
+libexecdir="@libexecdir@"
+
+if [ -n "$VIRT_P2V_DATA_DIR" ]; then
+ datadir="$VIRT_P2V_DATA_DIR"
+ host_libexecdir="$VIRT_P2V_DATA_DIR"
+else
+ datadir="@datadir@/virt-p2v"
+ host_libexecdir="@libexecdir@"
+fi
+
+# Dependencies. Since kiwi is SUSE-specific, only include
+# dependencies.suse here.
+depsfile="$datadir/dependencies.suse"
+if [ ! -f "$depsfile" ]; then
+ echo "$0: cannot find dependencies file ($depsfile)"
+ exit 1
+fi
+dependencies=
+while read line; do
+ if [ -n "$line" ]; then
+ depname=$(echo $line | awk '{gsub(/ /, "", $0); print}')
+ pkg=" <package name=\"$depname\"/>"
+ if [ -z "$dependencies" ]; then
+ dependencies="$pkg"
+ else
+ dependencies="$dependencies
+$pkg"
+ fi
+ fi
+done < $depsfile
+
+# Compute the distro-dependent pieces for kiwi
+branding=
+release_pkg=
+base_pattern=
+kiwi_boot=
+repos=
+. /etc/os-release
+case "$NAME" in
+ SLES)
+ branding="SLE"
+ release_pkg="sles-release"
+ base_pattern="patterns-sles-Minimal"
+ case "$VERSION_ID" in
+ 12)
+ kiwi_boot="SLES12"
+ repos="http://download.suse.de/ibs/SUSE:/SLE-12:/Update/standard
+ http://download.suse.de/ibs/SUSE:/SLE-12:/GA/standard"
+ ;;
+ 12.1)
+ kiwi_boot="SLES12"
+ repos="http://download.suse.de/ibs/SUSE:/SLE-12-SP1:/Update/standard
+ http://download.suse.de/ibs/SUSE:/SLE-12-SP1:/GA/standard
+ http://download.suse.de/ibs/SUSE:/SLE-12:/Update/standard
+ http://download.suse.de/ibs/SUSE:/SLE-12:/GA/standard"
+ ;;
+ *)
+ echo "Unsupported distribution $NAME $VERSION_ID"
+ exit 1;;
+ esac;;
+ openSUSE*)
+ branding="openSUSE"
+ release_pkg="openSUSE-release"
+ base_pattern="patterns-openSUSE-base"
+ case "$VERSION" in
+ 13.1\ *)
+ kiwi_boot="13.1"
+ repos="obs://13.1/repo/oss"
+ ;;
+ 13.2\ *)
+ kiwi_boot="13.2"
+ repos="obs://13.2/repo/oss"
+ ;;
+ 42.1)
+ kiwi_boot="leap42.1"
+ repos="obs://leap/42.1/repo/oss"
+ ;;
+ *\ \(Tumbleweed\))
+ kiwi_boot="leap42.1"
+ repos="obs://openSUSE:Factory/standard"
+ ;;
+ *)
+ echo "Unsupported distribution $NAME $VERSION_ID"
+ exit 1;;
+ esac;;
+ *)
+ echo "Unsupported distribution $NAME $VERSION"
+ exit 1;;
+esac
+
+# Compute the repos
+repos_xml=
+for repo in $repos; do
+ repos_xml=" <repository type=\"rpm-md\">\n <source path=\"$repo\"/>\n </repository>\n$repos_xml"
+done
+
+mkdir $output
+cp $datadir/kiwi-config.sh $output/config.sh
+
+mkdir -p $output/root/etc/sysconfig/network
+cat >$output/root/etc/sysconfig/network/ifcfg-eth0 << EOF
+BOOTPROTO='dhcp'
+MTU=''
+REMOTE_IPADDR=''
+STARTMODE='onboot'
+EOF
+
+mkdir -p $output/root/etc/systemd/system
+cp $datadir/p2v.service $output/root/etc/systemd/system
+
+mkdir -p $output/root/etc/udev/rules.d
+cat >$output/root/etc/udev/rules.d/70-persistent-net.rules <<EOF
+SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="?*", NAME="eth0"
+EOF
+
+cp $datadir/issue $output/root/etc/issue
+
+mkdir -p $output/root/usr/bin
+cp $datadir/launch-virt-p2v $output/root/usr/bin
+
+mkdir -p $output/root/$libexecdir
+cp $host_libexecdir/virt-p2v $output/root/$libexecdir
+
+if test "z$ssh_identity" != "z"; then
+ mkdir -p $output/root/var/tmp
+ cp $ssh_identity $output/root/var/tmp/id_rsa
+ chmod 0600 $output/root/var/tmp/id_rsa
+fi
+
+# Now generate the final kiwi config, substituting as necessary.
+@AWK@ \
+ -v "dependencies=$dependencies" \
+ -v "md5sum_virt_p2v=$md5sum_virt_p2v" \
+ -v "libexecdir=$libexecdir" \
+ -v "branding=$branding" \
+ -v "release_pkg=$release_pkg" \
+ -v "base_pattern=$base_pattern" \
+ -v "kiwi_boot=$kiwi_boot" \
+ -v "repos=$repos_xml" \
+ '{
+ gsub (/__PACKAGE_NAME__/, "@PACKAGE_NAME@");
+ gsub (/__PACKAGE_VERSION__/, "@PACKAGE_VERSION@");
+ gsub (/__PACKAGE_VERSION_FULL__/, "@PACKAGE_VERSION_FULL@");
+ gsub (/<!--__DEPENDENCIES__-->/, dependencies);
+ gsub (/__LIBEXECDIR__/, libexecdir);
+ gsub (/__BRANDING__/, branding);
+ gsub (/__RELEASE_PKG__/, release_pkg);
+ gsub (/__BASE_PATTERN__/, base_pattern);
+ gsub (/__KIWI_BOOT__/, kiwi_boot);
+ gsub (/<!--__REPOS__-->/, repos);
+ print;
+ }' \
+ $datadir/kiwi-config.xml.in > $output/config.xml
+
+echo "kiwi config folder written to $output"
Index: libguestfs-1.32.4/p2v/virt-p2v-make-kiwi.pod
===================================================================
--- /dev/null
+++ libguestfs-1.32.4/p2v/virt-p2v-make-kiwi.pod
@@ -0,0 +1,184 @@
+=head1 NAME
+
+virt-p2v-make-kiwi - Build the virt-p2v kiwi configuration
+
+=head1 SYNOPSIS
+
+ virt-p2v-make-kiwi [--inject-ssh-identity path] [-o kiwi-folder]
+
+=head1 DESCRIPTION
+
+L<virt-p2v(1)> converts a physical machine to run virtualized on KVM,
+managed by libvirt, OpenStack, oVirt, Red Hat Enterprise
+Virtualisation (RHEV), or one of the other targets supported by
+L<virt-v2v(1)>.
+
+Kiwi is a tool used mainly by SUSE Linux Enterprise and openSUSE to
+build live CDs, make appliances and so on. It is driven by a few files
+including an xml description of the machine.
+
+virt-p2v-make-kiwi builds a folder containing all the pieces needed for
+kiwi to build a bootable P2V live CD ISO, USB key, or PXE image. This tool
+only builds the kiwi configuration, but this manual page describes some of
+the ways you can use the kickstart file.
+
+=head1 BUILDING THE KIWI CONFIGURATION
+
+Using virt-p2v-make-kiwi is very simple:
+
+ virt-p2v-make-kiwi
+
+will build a kiwi configuration based on the current machine's distribution.
+
+To control the name of the output folder, use the I<-o> parameter.
+
+=head1 BUILDING A LIVE CD / ISO
+
+Once you have the kiwi configuration folder, you can use L<kiwi(1)> to make a
+live CD:
+
+ sudo kiwi --build p2v.kiwi -d build --type iso
+
+Before running this, you may have to tweak the C<config.xml> file
+to change the locale and keyboard mapping to the one you need.
+
+If running on a SUSE Linux Entreprise Server, add the path to your packages repositories
+using the C<--ignore-repos> and C<--add-repo> kiwi parameters.
+
+The generated ISO image will be placed in the C<build> folder.
+
+=head1 BUILDING A BOOTABLE USB KEY
+
+Use the L<dd(1)> program to write the ISO created above to a USB key:
+
+ sudo dd if=path/to/p2v.iso of=/dev/sdX
+
+=head1 BUILDING A PXE BOOT IMAGE
+
+To create a PXE boot image, run kiwi in such a way:
+
+ sudo kiwi --build $PWD/p2v.kiwi -d build --add-profile netboot --type pxe
+
+For more details on how to use the generated image, report to the kiwi documentation
+on PXE images: L<https://doc.opensuse.org/projects/kiwi/doc/#chap.pxe>
+
+=head1 ADDING AN SSH IDENTITY
+
+You can inject an SSH identity (private key) file to the kiwi config and
+hence into the ISO using the I<--inject-ssh-identity> option. Note
+that you I<cannot> inject a key once the ISO has been built.
+
+First create a key pair. It must have an empty passphrase:
+
+ ssh-keygen -t rsa -N '' -f id_rsa
+
+This creates a private key (C<id_rsa>) and a public key
+(C<id_rsa.pub>) pair. The public key should be appended to the
+C<authorized_keys> file on the virt-v2v conversion server (usually to
+C</root/.ssh/authorized_keys>).
+
+The private key should be added to the kiwi config and then
+discarded:
+
+ virt-p2v-make-kiwi [...] --inject-ssh-identity id_rsa
+ rm id_rsa
+
+The ISO can then be built from the kickstart in the usual way (see
+above), and it will contain the embedded SSH identity
+(F</var/tmp/id_rsa>).
+
+When booting virt-p2v, specify the URL of the injected file like this:
+
+ │ User name: [root_____________________________] │
+ │ │
+ │ Password: [ <leave this field blank> ] │
+ │ │
+ │ SSH Identity URL: [file:///var/tmp/id_rsa___________] │
+
+or if using the kernel command line, add:
+
+ p2v.identity=file:///var/tmp/id_rsa
+
+For more information, see L<virt-p2v(1)/SSH IDENTITIES>.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--help>
+
+Display help.
+
+=item B<--inject-ssh-identity> id_rsa
+
+Add an SSH identity (private key) file into the kickstart.
+See L</ADDING AN SSH IDENTITY> above.
+
+=item B<-o> OUTPUT
+
+=item B<--output> OUTPUT
+
+Write kiwi configuration to the C<OUTPUT> folder. If not specified, the default is
+F<p2v.kiwi> in the current directory.
+
+=item B<-V>
+
+=item B<--version>
+
+Display version number and exit.
+
+=back
+
+=head1 FILES
+
+=over 4
+
+=item F<$libexecdir/virt-p2v>
+
+The L<virt-p2v(1)> binary which is copied into the kiwi configuration.
+
+The location of the binary can be changed by setting the
+C<VIRT_P2V_DATA_DIR> environment variable.
+
+=item F<$datadir/virt-p2v/issue>
+
+=item F<$datadir/virt-p2v/launch-virt-p2v.in>
+
+=item F<$datadir/virt-p2v/kiwi>
+
+=item F<$datadir/virt-p2v/p2v.service>
+
+Various data files that are used to make the kiwi appliance.
+
+The location of these files can be changed by setting the
+C<VIRT_P2V_DATA_DIR> environment variable.
+
+=back
+
+=head1 ENVIRONMENT VARIABLES
+
+=over 4
+
+=item C<VIRT_P2V_DATA_DIR>
+
+The directory where virt-p2v-make-kiwi looks for data files and
+the virt-p2v binary (see L</FILES> above). If not set, a compiled-in
+location is used.
+
+=back
+
+=head1 SEE ALSO
+
+L<virt-p2v(1)>,
+L<virt-p2v-make-disk(1)>,
+L<virt-v2v(1)>,
+L<kiwi(1)>,
+L<http://libguestfs.org/>.
+
+=head1 AUTHORS
+
+Cédric Bosdonnat
+
+=head1 COPYRIGHT
+
+Copyright (C) 2016 SUSE Ltd.
Index: libguestfs-1.32.4/p2v/virt-p2v.pod
===================================================================
--- libguestfs-1.32.4.orig/p2v/virt-p2v.pod
+++ libguestfs-1.32.4/p2v/virt-p2v.pod
@@ -725,6 +725,7 @@ control connection to be displayed in th
L<virt-p2v-make-disk(1)>,
L<virt-p2v-make-kickstart(1)>,
+L<virt-p2v-make-kiwi(1)>,
L<virt-v2v(1)>,
L<qemu-nbd(1)>,
L<ssh(1)>,