[Libguestfs] [PATCH 2/2] resize: shrink/expand swap partitions

Pino Toscano ptoscano at redhat.com
Fri Nov 25 10:22:27 UTC 2016


Handle the swap partition on their own, rebuilding them using the
existing UUID and label.
---
 resize/resize.ml       | 35 ++++++++++++++++++++++++++++-------
 resize/virt-resize.pod |  8 ++++++++
 2 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/resize/resize.ml b/resize/resize.ml
index 7d06f18..59ee5bf 100644
--- a/resize/resize.ml
+++ b/resize/resize.ml
@@ -60,6 +60,7 @@ and partition_content =
   | ContentPV of int64           (* physical volume (size of PV) *)
   | ContentFS of string * int64  (* mountable filesystem (FS type, FS size) *)
   | ContentExtendedPartition     (* MBR extended partition *)
+  | ContentSwap                  (* Swap partition *)
 and partition_operation =
   | OpCopy                       (* copy it as-is, no resizing *)
   | OpIgnore                     (* ignore it (create on target, but don't
@@ -104,11 +105,13 @@ and string_of_partition_content = function
   | ContentPV sz -> sprintf "LVM PV (%Ld bytes)" sz
   | ContentFS (fs, sz) -> sprintf "filesystem %s (%Ld bytes)" fs sz
   | ContentExtendedPartition -> "extended partition"
+  | ContentSwap -> "swap"
 and string_of_partition_content_no_size = function
   | ContentUnknown -> "unknown data"
   | ContentPV _ -> "LVM PV"
   | ContentFS (fs, _) -> sprintf "filesystem %s" fs
   | ContentExtendedPartition -> "extended partition"
+  | ContentSwap -> "swap"
 
 (* Data structure describing LVs on the source disk.  This is only
  * used if the user gave the --lv-expand option.
@@ -130,6 +133,7 @@ let debug_logvol lv =
 
 type expand_content_method =
   | PVResize | Resize2fs | NTFSResize | BtrfsFilesystemResize | XFSGrowFS
+  | Mkswap
 
 let string_of_expand_content_method = function
   | PVResize -> s_"pvresize"
@@ -137,6 +141,7 @@ let string_of_expand_content_method = function
   | NTFSResize -> s_"ntfsresize"
   | BtrfsFilesystemResize -> s_"btrfs-filesystem-resize"
   | XFSGrowFS -> s_"xfs_growfs"
+  | Mkswap -> s_"mkswap"
 
 type unknown_filesystems_mode =
   | UnknownFsIgnore
@@ -414,6 +419,8 @@ read the man page virt-resize(1).
         let fs = g#vfs_type dev in
         if fs = "unknown" then
           ContentUnknown
+        else if fs = "swap" then
+          ContentSwap
         else if fs = "LVM2_member" then (
           let rec loop = function
             | [] ->
@@ -531,7 +538,7 @@ read the man page virt-resize(1).
         assert (
           match typ with
           | ContentPV _ | ContentExtendedPartition -> false
-          | ContentUnknown | ContentFS _ -> true
+          | ContentUnknown | ContentFS _ | ContentSwap -> true
         );
 
         { lv_name = name; lv_type = typ; lv_operation = LVOpNone }
@@ -558,6 +565,7 @@ read the man page virt-resize(1).
       | ContentFS (("xfs"), _) when !xfs_available -> true
       | ContentFS _ -> false
       | ContentExtendedPartition -> false
+      | ContentSwap -> true
     else
       fun _ -> false
 
@@ -572,6 +580,7 @@ read the man page virt-resize(1).
       | ContentFS (("xfs"), _) when !xfs_available -> XFSGrowFS
       | ContentFS _ -> assert false
       | ContentExtendedPartition -> assert false
+      | ContentSwap -> Mkswap
     else
       fun _ -> assert false
   in
@@ -665,6 +674,7 @@ read the man page virt-resize(1).
         | ContentExtendedPartition ->
           error (f_"%s: This extended partition contains logical partitions which might be damaged by shrinking it.  If you want to shrink this partition, you need to use the '--resize-force' option, but that could destroy logical partitions within this partition.  (This error came from '%s' option on the command line.)")
             name option
+        | ContentSwap -> ()
       );
 
       p.p_operation <- OpResize newsize
@@ -831,7 +841,8 @@ read the man page virt-resize(1).
             (match p.p_type with
             | ContentUnknown
             | ContentPV _
-            | ContentExtendedPartition -> ()
+            | ContentExtendedPartition
+            | ContentSwap -> ()
             | ContentFS (fs, _) ->
               error (f_"unknown/unavailable method for expanding the %s filesystem on %s")
                 fs p.p_name
@@ -848,7 +859,8 @@ read the man page virt-resize(1).
             (match lv.lv_type with
             | ContentUnknown
             | ContentPV _
-            | ContentExtendedPartition -> ()
+            | ContentExtendedPartition
+            | ContentSwap -> ()
             | ContentFS (fs, _) ->
               error (f_"unknown/unavailable method for expanding the %s filesystem on %s")
                 fs lv.lv_name;
@@ -886,7 +898,8 @@ read the man page virt-resize(1).
               (match p.p_type with
               | ContentUnknown
               | ContentPV _
-              | ContentExtendedPartition -> ()
+              | ContentExtendedPartition
+              | ContentSwap -> ()
               | ContentFS (fs, _) ->
                 warning (f_"unknown/unavailable method for expanding the %s filesystem on %s")
                   fs p.p_name;
@@ -916,7 +929,8 @@ read the man page virt-resize(1).
                 (match lv.lv_type with
                 | ContentUnknown
                 | ContentPV _
-                | ContentExtendedPartition -> ()
+                | ContentExtendedPartition
+                | ContentSwap -> ()
                 | ContentFS (fs, _) ->
                   warning (f_"unknown/unavailable method for expanding the %s filesystem on %s")
                     fs name;
@@ -1199,7 +1213,7 @@ read the man page virt-resize(1).
         message (f_"Copying %s") source;
 
         (match p.p_type with
-         | ContentUnknown | ContentPV _ | ContentFS _ ->
+         | ContentUnknown | ContentPV _ | ContentFS _ | ContentSwap ->
            g#copy_device_to_device ~size:copysize ~sparse source target
 
          | ContentExtendedPartition ->
@@ -1255,7 +1269,7 @@ read the man page virt-resize(1).
 
     | { p_type =
         (ContentFS _|ContentUnknown|ContentPV _
-            |ContentExtendedPartition) } :: _
+            |ContentExtendedPartition|ContentSwap) } :: _
     | [] -> ()
   );
 
@@ -1312,6 +1326,13 @@ read the man page virt-resize(1).
       | NTFSResize -> g#ntfsresize ~force:ntfsresize_force target
       | BtrfsFilesystemResize -> with_mounted target g#btrfs_filesystem_resize
       | XFSGrowFS -> with_mounted target g#xfs_growfs
+      | Mkswap ->
+        (* Rebuild the swap using the UUID and label of the existing
+         * swap partition.
+         *)
+        let uuid = g#vfs_uuid target in
+        let label = g#vfs_label target in
+        g#mkswap ~uuid ~label target
     in
 
     (* Expand partition content as required. *)
diff --git a/resize/virt-resize.pod b/resize/virt-resize.pod
index aa01849..2344056 100644
--- a/resize/virt-resize.pod
+++ b/resize/virt-resize.pod
@@ -398,6 +398,14 @@ Btrfs filesystems, if libguestfs was compiled with support for btrfs.
 
 XFS filesystems, if libguestfs was compiled with support for XFS.
 
+=item *
+
+Linux swap partitions.
+
+Please note that libguestfs I<destroys> the existing swap content
+by recreating it with C<mkswap>, so this should not be used when
+the guest is suspended.
+
 =back
 
 Note that you cannot use I<--expand> and I<--shrink> together.
-- 
2.7.4




More information about the Libguestfs mailing list