Pino Toscano
2016-Nov-25 10:22 UTC
[Libguestfs] [PATCH 1/2] daemon: allow to change the labels of swap partitions
---
daemon/daemon.h | 1 +
daemon/labels.c | 3 +++
daemon/swap.c | 21 +++++++++++++++++++++
generator/actions.ml | 4 ++++
4 files changed, 29 insertions(+)
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 79a5288..2379e31 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -254,6 +254,7 @@ extern int64_t ntfs_minimum_size (const char *device);
/*-- in swap.c --*/
extern int swap_set_uuid (const char *device, const char *uuid);
+extern int swap_set_label (const char *device, const char *label);
/* ordinary daemon functions use these to indicate errors
* NB: you don't need to prefix the string with the current command,
diff --git a/daemon/labels.c b/daemon/labels.c
index 20f27cb..aaa3eaf 100644
--- a/daemon/labels.c
+++ b/daemon/labels.c
@@ -85,6 +85,9 @@ do_set_label (const mountable_t *mountable, const char *label)
else if (STREQ (vfs_type, "xfs"))
r = xfslabel (mountable->device, label);
+ else if (STREQ (vfs_type, "swap"))
+ r = swap_set_label (mountable->device, label);
+
else
NOT_SUPPORTED (-1, "don't know how to set the label for
'%s' filesystems",
vfs_type);
diff --git a/daemon/swap.c b/daemon/swap.c
index 9d7839e..028bc1e 100644
--- a/daemon/swap.c
+++ b/daemon/swap.c
@@ -239,3 +239,24 @@ swap_set_uuid (const char *device, const char *uuid)
return 0;
}
+
+int
+swap_set_label (const char *device, const char *label)
+{
+ int r;
+ CLEANUP_FREE char *err = NULL;
+
+ if (strlen (label) > SWAP_LABEL_MAX) {
+ reply_with_error ("%s: Linux swap labels are limited to %d
bytes",
+ label, SWAP_LABEL_MAX);
+ return -1;
+ }
+
+ r = command (NULL, &err, str_swaplabel, "-L", label, device,
NULL);
+ if (r == -1) {
+ reply_with_error ("%s", err);
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/generator/actions.ml b/generator/actions.ml
index 43de38b..5e0356f 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -10304,6 +10304,10 @@ when trying to set the label.
The label is limited to 11 bytes.
+=item swap
+
+The label is limited to 16 bytes.
+
=back
If there is no support for changing the label
--
2.7.4
Pino Toscano
2016-Nov-25 10:22 UTC
[Libguestfs] [PATCH 2/2] resize: shrink/expand swap partitions
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
Richard W.M. Jones
2016-Dec-07 11:54 UTC
Re: [Libguestfs] [PATCH 1/2] daemon: allow to change the labels of swap partitions
On Fri, Nov 25, 2016 at 11:22:26AM +0100, Pino Toscano wrote:> --- > daemon/daemon.h | 1 + > daemon/labels.c | 3 +++ > daemon/swap.c | 21 +++++++++++++++++++++ > generator/actions.ml | 4 ++++ > 4 files changed, 29 insertions(+) > > diff --git a/daemon/daemon.h b/daemon/daemon.h > index 79a5288..2379e31 100644 > --- a/daemon/daemon.h > +++ b/daemon/daemon.h > @@ -254,6 +254,7 @@ extern int64_t ntfs_minimum_size (const char *device); > > /*-- in swap.c --*/ > extern int swap_set_uuid (const char *device, const char *uuid); > +extern int swap_set_label (const char *device, const char *label); > > /* ordinary daemon functions use these to indicate errors > * NB: you don't need to prefix the string with the current command, > diff --git a/daemon/labels.c b/daemon/labels.c > index 20f27cb..aaa3eaf 100644 > --- a/daemon/labels.c > +++ b/daemon/labels.c > @@ -85,6 +85,9 @@ do_set_label (const mountable_t *mountable, const char *label) > else if (STREQ (vfs_type, "xfs")) > r = xfslabel (mountable->device, label); > > + else if (STREQ (vfs_type, "swap")) > + r = swap_set_label (mountable->device, label); > + > else > NOT_SUPPORTED (-1, "don't know how to set the label for '%s' filesystems", > vfs_type); > diff --git a/daemon/swap.c b/daemon/swap.c > index 9d7839e..028bc1e 100644 > --- a/daemon/swap.c > +++ b/daemon/swap.c > @@ -239,3 +239,24 @@ swap_set_uuid (const char *device, const char *uuid) > > return 0; > } > + > +int > +swap_set_label (const char *device, const char *label) > +{ > + int r; > + CLEANUP_FREE char *err = NULL; > + > + if (strlen (label) > SWAP_LABEL_MAX) { > + reply_with_error ("%s: Linux swap labels are limited to %d bytes", > + label, SWAP_LABEL_MAX); > + return -1; > + } > + > + r = command (NULL, &err, str_swaplabel, "-L", label, device, NULL); > + if (r == -1) { > + reply_with_error ("%s", err); > + return -1; > + } > + > + return 0; > +} > diff --git a/generator/actions.ml b/generator/actions.ml > index 43de38b..5e0356f 100644 > --- a/generator/actions.ml > +++ b/generator/actions.ml > @@ -10304,6 +10304,10 @@ when trying to set the label. > > The label is limited to 11 bytes. > > +=item swap > + > +The label is limited to 16 bytes. > + > =back > > If there is no support for changing the label > -- > 2.7.4 > > _______________________________________________ > Libguestfs mailing list > Libguestfs@redhat.com > https://www.redhat.com/mailman/listinfo/libguestfsObvious improvement, ACK. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-builder quickly builds VMs from scratch http://libguestfs.org/virt-builder.1.html
Richard W.M. Jones
2016-Dec-07 11:55 UTC
Re: [Libguestfs] [PATCH 2/2] resize: shrink/expand swap partitions
On Fri, Nov 25, 2016 at 11:22:27AM +0100, Pino Toscano wrote:> 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.ACK. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into KVM guests. http://libguestfs.org/virt-v2v
Possibly Parallel Threads
- [PATCH 0/2] Support for expanding f2fs partitions
- [PATCH 2/2] resize: shrink/expand swap partitions
- [PATCH 0/2] resize: Split out the command line parsing into Cmdline
- [PATCH v2 2/2] resize: expand f2fs partitions
- Re: virt-resize: support to MBR logical partitions and some question