[Pkg-libvirt-commits] [libguestfs] 10/14: v2v: Remap block device names in grub & /etc/fstab.

Hilko Bengen bengen at moszumanska.debian.org
Sat Aug 30 08:29:05 UTC 2014


This is an automated email from the git hooks/post-receive script.

bengen pushed a commit to annotated tag upstream/1.27.20
in repository libguestfs.

commit dbe0b69f24421f258da2fb420b58fc1530a9cd03
Author: Richard W.M. Jones <rjones at redhat.com>
Date:   Mon Jun 30 16:24:03 2014 +0100

    v2v: Remap block device names in grub & /etc/fstab.
    
    eg. Change /dev/hda to /dev/vda
---
 v2v/convert_linux.ml | 142 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 137 insertions(+), 5 deletions(-)

diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml
index 63ff22d..aba8d2c 100644
--- a/v2v/convert_linux.ml
+++ b/v2v/convert_linux.ml
@@ -1004,6 +1004,137 @@ let rec convert ?(keep_serial_console = true) verbose (g : G.guestfs)
            msg
     )
 
+  and remap_block_devices virtio =
+    (* This function's job is to iterate over boot configuration
+     * files, replacing "hda" with "vda" or whatever is appropriate.
+     * This is mostly applicable to old guests, since newer OSes use
+     * LABEL or UUID where possible.
+     *
+     * The original Convert::Linux::_remap_block_devices function was
+     * very complex indeed.  This drops most of the complexity.  In
+     * particular it assumes all non-removable source disks will be
+     * added to the target in the order they appear in the libvirt XML.
+     *)
+    let block_prefix =
+      match family, major_version with
+      | `RHEL_family, v when v < 5 ->
+        (* RHEL < 5 used old ide driver *) "hd"
+      | `RHEL_family, 5 ->
+        (* RHEL 5 uses libata, but udev still uses: *) "hd"
+      | `SUSE_family, _ ->
+        (* SUSE uses libata, but still presents IDE disks as: *) "hd"
+      | _, _ ->
+        (* All modern distros use libata: *) "sd" in
+    let map =
+      mapi (
+        fun i disk ->
+          let source_dev =
+            match disk.s_target_dev with (* target/@dev in _source_ HV *)
+            | Some dev -> dev
+            | None -> (* ummm, what? *) block_prefix ^ drive_name i in
+          let target_dev = block_prefix ^ drive_name i in
+          source_dev, target_dev
+      ) source.s_disks in
+
+    (* Possible Augeas paths to search for device names. *)
+    let paths = [
+      (* /etc/fstab *)
+      "/files/etc/fstab/*/spec";
+
+      (* grub-legacy config *)
+      "/files" ^ grub_config ^ "/*/kernel/root";
+      "/files" ^ grub_config ^ "/*/kernel/resume";
+      "/files/boot/grub/device.map/*[label() != \"#comment\"]";
+
+      (* grub2 config *)
+      "/files/etc/sysconfig/grub/GRUB_CMDLINE_LINUX";
+      "/files/etc/default/grub/GRUB_CMDLINE_LINUX";
+      "/files/etc/default/grub/GRUB_CMDLINE_LINUX_DEFAULT";
+    ] in
+
+    (* Which of these paths actually exist? *)
+    let paths =
+      List.flatten (List.map Array.to_list (List.map g#aug_match paths)) in
+
+    (* Map device names for each entry. *)
+    let rex_resume = Str.regexp "^\\(.*resume=\\)\\(/dev/[^ ]\\)\\(.*\\)$"
+    and rex_device_cciss_p =
+      Str.regexp "^/dev/\\(cciss/c[0-9]+d[0-9]+\\)p\\([0-9]+\\)$"
+    and rex_device_cciss =
+      Str.regexp "^/dev/\\(cciss/c[0-9]+d[0-9]+\\)$"
+    and rex_device_p =
+      Str.regexp "^/dev/\\([a-z]+\\)\\([0-9]*\\)$"
+    and rex_device =
+      Str.regexp "^/dev/\\([a-z]+\\)$" in
+
+    let rec replace_if_device path value =
+      if Str.string_match rex_device_cciss_p value 0 then (
+        let device = Str.matched_group 1 value
+        and part = Str.matched_group 2 value in
+        "/dev/" ^ replace path device ^ part
+      )
+      else if Str.string_match rex_device_cciss value 0 then (
+        let device = Str.matched_group 1 value in
+        "/dev/" ^ replace path device
+      )
+      else if Str.string_match rex_device_p value 0 then (
+        let device = Str.matched_group 1 value
+        and part = Str.matched_group 2 value in
+        "/dev/" ^ replace path device ^ part
+      )
+      else if Str.string_match rex_device value 0 then (
+        let device = Str.matched_group 1 value in
+        "/dev/" ^ replace path device
+      )
+      else (* doesn't look like a known device name *)
+        value
+
+    and replace path device =
+      try List.assoc device map
+      with Not_found ->
+        if string_find device "md" = -1 && string_find device "fd" = -1 then
+          warning ~prog (f_"%s references unknown device \"%s\".  You may have to fix this entry manually after conversion.")
+            path device;
+        device
+    in
+
+    let changed = ref false in
+    List.iter (
+      fun path ->
+        let value = g#aug_get path in
+
+        let value =
+          (* Handle grub2 resume=<dev> specially. *)
+          if string_find path "GRUB_CMDLINE" >= 0 then (
+            if Str.string_match rex_resume value 0 then (
+              let start = Str.matched_group 1 value
+              and device = Str.matched_group 2 value
+              and end_ = Str.matched_group 3 value in
+              let device = replace_if_device path device in
+              start ^ device ^ end_
+            )
+            else value
+          )
+          else replace_if_device path value in
+
+        g#aug_set path value;
+        changed := true
+    ) paths;
+
+    if !changed then (
+      g#aug_save ();
+
+      (* If it's grub2, we have to regenerate the config files. *)
+      if grub = `Grub2 then
+        ignore (g#command [| "grub2-mkconfig"; "-o"; grub_config |]);
+
+      Lib_linux.augeas_reload verbose g
+    );
+
+    (* Delete blkid caches if they exist, since they will refer to the old
+     * device names.  blkid will rebuild these on demand.
+     *)
+    List.iter g#rm_f ["/etc/blkid/blkid.tab"; "/etc/blkid.tab"]
   in
 
   augeas_grub_configuration ();
@@ -1027,12 +1158,13 @@ let rec convert ?(keep_serial_console = true) verbose (g : G.guestfs)
     grub_remove_console ();
   );
 
+  (*
+    XXX to do from original v2v:
+    configure display driver
+    configure_kernel_modules  # updates /etc/modules.conf and friends
+  *)
 
-
-
-
-
-
+  remap_block_devices virtio;
 
   let guestcaps = {
     gcaps_block_bus = if virtio then "virtio" else "ide";

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-libvirt/libguestfs.git



More information about the Pkg-libvirt-commits mailing list