[Libguestfs] [PATCH v4] v2v: linux: correctly reconfigure the initrd on Debian

Tomáš Golembiovský tgolembi at redhat.com
Fri Sep 16 11:10:37 UTC 2016


Using update-initramfs is the native way of updating initrd on Debian
based systems.

To add some modules to the image we can list them in file
/etc/initramfs-tools/modules.

Signed-off-by: Tomáš Golembiovský <tgolembi at redhat.com>
---
 v2v/convert_linux.ml | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml
index 08f4b2a..22a7919 100644
--- a/v2v/convert_linux.ml
+++ b/v2v/convert_linux.ml
@@ -478,6 +478,15 @@ let rec convert ~keep_serial_console (g : G.guestfs) inspect source rcaps =
         ignore (g#command (Array.of_list args))
       in
 
+      let run_update_initramfs_command () =
+        let args =
+          "/usr/sbin/update-initramfs"  ::
+            (if verbose () then [ "-v" ] else [])
+          @ [ "-c"; "-k"; mkinitrd_kv ]
+        in
+        ignore (g#command (Array.of_list args))
+      in
+
       if g#is_file ~followsymlinks:true "/sbin/dracut" then
         run_dracut_command "/sbin/dracut"
       else if g#is_file ~followsymlinks:true "/usr/bin/dracut" then
@@ -491,6 +500,30 @@ let rec convert ~keep_serial_console (g : G.guestfs) inspect source rcaps =
                        "-k"; kernel.ki_vmlinuz |]
         )
       )
+      else if family = `Debian_family then (
+        if not (g#is_file ~followsymlinks:true "/usr/sbin/update-initramfs") then
+          error (f_"unable to rebuild initrd (%s) because update-initramfs was not found in the guest")
+            initrd;
+
+        if List.length modules > 0 then (
+          (* The modules to add to initrd are defined in:
+          *     /etc/initramfs-tools/modules
+          * File format is same as modules(5).
+          *)
+          let file = "/etc/initramfs-tools/modules" in
+          let path = sprintf "/files%s" file in
+          g#aug_transform "modules" file;
+          g#aug_load ();
+          g#aug_set (sprintf "%s/#comment[last()+1]" path)
+            "The following modules were added by virt-v2v";
+          List.iter (
+            fun m -> g#aug_clear (sprintf "%s/%s" path m)
+          ) modules;
+          g#aug_save ();
+        );
+
+        run_update_initramfs_command ()
+      )
       else if g#is_file ~followsymlinks:true "/sbin/mkinitrd" then (
         let module_args = List.map (sprintf "--with=%s") modules in
         let args =
-- 
2.9.3

v4 changes: using Augeas to do the dirty job




More information about the Libguestfs mailing list