forked from pool/libguestfs
759c6fe608
- v2v: add support for win2k16. Backport commit e93d4ea3, fate#316274 OBS-URL: https://build.opensuse.org/request/show/412295 OBS-URL: https://build.opensuse.org/package/show/Virtualization/libguestfs?expand=0&rev=367
2152 lines
78 KiB
Diff
2152 lines
78 KiB
Diff
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_guestor_to_registry g root current_cs drv_name drv_pciid =
|
|
+ let ddb_node = g#hivex_node_get_child root "DriverDatabase" in
|
|
|
|
-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}" ];
|
|
-
|
|
- [ 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 ->
|
|
@@ -467,6 +284,8 @@ and virtio_iso_path_matches_guest_os pat
|
|
(6, 3, not_client)
|
|
else if pathelem "w10" || pathelem "win10" then
|
|
(10, 0, is_client)
|
|
+ else if pathelem "2k16" || pathelem "win2016" then
|
|
+ (10, 0, not_client)
|
|
else
|
|
raise Not_found in
|
|
|
|
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,20 @@ 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 +187,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
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ 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
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ 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
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ 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
|
|
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)>,
|