resize: shrink/expand swap partitions

Handle the swap partition on their own, rebuilding them using the
existing UUID and label.
This commit is contained in:
Pino Toscano
2016-11-25 11:18:41 +01:00
parent aad24f4d56
commit e21b055f3e
2 changed files with 36 additions and 7 deletions

View File

@@ -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. *)

View File

@@ -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.