Pino Toscano
2015-Oct-23 16:28 UTC
[Libguestfs] [PATCH 1/2] resize: add --unknown-filesystems
Introduce a new option to control how virt-resize behaves when asking to expand a filesystem, either unknown to libguestfs or that virt-resize cannot expand. The default keeps the current behaviour, i.e. just warn. --- bash/virt-resize | 3 +++ resize/resize.ml | 65 ++++++++++++++++++++++++++++++++++++++++++++++++-- resize/virt-resize.pod | 28 +++++++++++++++++++++- 3 files changed, 93 insertions(+), 3 deletions(-) diff --git a/bash/virt-resize b/bash/virt-resize index 4471f07..5627807 100644 --- a/bash/virt-resize +++ b/bash/virt-resize @@ -36,6 +36,9 @@ _guestfs_options_only () --password-crypto) COMPREPLY=( $( compgen -W "md5 sha256 sha512" -- "$cur") ) return ;; + --unknown-filesystems) + COMPREPLY=( $( compgen -W "ignore warn error" -- "$cur") ) + return ;; esac case "$cur" in diff --git a/resize/resize.ml b/resize/resize.ml index 75bb2f7..ecb7cf0 100644 --- a/resize/resize.ml +++ b/resize/resize.ml @@ -149,13 +149,18 @@ let string_of_expand_content_method = function | BtrfsFilesystemResize -> s_"btrfs-filesystem-resize" | XFSGrowFS -> s_"xfs_growfs" +type unknown_filesystems_mode + | UnknownFsIgnore + | UnknownFsWarn + | UnknownFsError + (* Main program. *) let main () let infile, outfile, align_first, alignment, copy_boot_loader, deletes, dryrun, expand, expand_content, extra_partition, format, ignores, lv_expands, machine_readable, ntfsresize_force, output_format, - resizes, resizes_force, shrink, sparse + resizes, resizes_force, shrink, sparse, unknown_fs_mode let add xs s = xs := s :: !xs in @@ -187,6 +192,7 @@ let main () else shrink := s in let sparse = ref true in + let unknown_fs_mode = ref "warn" in let ditto = " -\"-" in let argspec = [ @@ -215,6 +221,8 @@ let main () "--resize-force", Arg.String (add resizes_force), s_"part=size" ^ " " ^ s_"Forcefully resize partition"; "--shrink", Arg.String set_shrink, s_"part" ^ " " ^ s_"Shrink partition"; "--no-sparse", Arg.Clear sparse, " " ^ s_"Turn off sparse copying"; + "--unknown-filesystems", Arg.Set_string unknown_fs_mode, + s_"ignore|warn|error" ^ " " ^ s_"Behaviour on expand unknown filesystems (default: warn)"; ] in let argspec = set_standard_options argspec in let disks = ref [] in @@ -253,6 +261,7 @@ read the man page virt-resize(1). let resizes_force = List.rev !resizes_force in let shrink = match !shrink with "" -> None | str -> Some str in let sparse = !sparse in + let unknown_fs_mode = !unknown_fs_mode in if alignment < 1 then error (f_"alignment cannot be < 1"); @@ -266,6 +275,14 @@ read the man page virt-resize(1). | _ -> error (f_"unknown --align-first option: use never|always|auto") in + let unknown_fs_mode + match unknown_fs_mode with + | "ignore" -> UnknownFsIgnore + | "warn" -> UnknownFsWarn + | "error" -> UnknownFsError + | _ -> + error (f_"unknown --unknown-filesystems: use ignore|warn|error") in + (* No arguments and machine-readable mode? Print out some facts * about what this binary supports. We only need to print out new * things added since this option, or things which depend on features @@ -315,7 +332,7 @@ read the man page virt-resize(1). deletes, dryrun, expand, expand_content, extra_partition, format, ignores, lv_expands, machine_readable, ntfsresize_force, output_format, - resizes, resizes_force, shrink, sparse in + resizes, resizes_force, shrink, sparse, unknown_fs_mode in (* Default to true, since NTFS/btrfs/XFS support are usually available. *) let ntfs_available = ref true in @@ -821,6 +838,50 @@ read the man page virt-resize(1). lv.lv_operation <- LVOpExpand ) lv_expands; + (* In case we need to error out on unknown/unhandled filesystems, + * iterate on what we need to resize/expand. + *) + (match unknown_fs_mode with + | UnknownFsIgnore -> () + | UnknownFsWarn -> () + | UnknownFsError -> + List.iter ( + fun p -> + match p.p_operation with + | OpCopy + | OpIgnore + | OpDelete -> () + | OpResize _ -> + if not (can_expand_content p.p_type) then ( + (match p.p_type with + | ContentUnknown + | ContentPV _ + | ContentExtendedPartition -> () + | ContentFS (fs, _) -> + error (f_"unknown/unavailable method for expanding the %s filesystem on %s") + fs p.p_name + ); + ) + ) partitions; + + List.iter ( + fun lv -> + match lv.lv_operation with + | LVOpNone -> () + | LVOpExpand -> + if not (can_expand_content lv.lv_type) then ( + (match lv.lv_type with + | ContentUnknown + | ContentPV _ + | ContentExtendedPartition -> () + | ContentFS (fs, _) -> + error (f_"unknown/unavailable method for expanding the %s filesystem on %s") + fs lv.lv_name; + ); + ) + ) lvs; + ); + (* Print a summary of what we will do. *) flush stderr; diff --git a/resize/virt-resize.pod b/resize/virt-resize.pod index db282b4..a0ab459 100644 --- a/resize/virt-resize.pod +++ b/resize/virt-resize.pod @@ -578,6 +578,28 @@ gigabyte of free space. Note that you cannot use I<--expand> and I<--shrink> together. +=item B<--unknown-filesystems ignore> + +=item B<--unknown-filesystems warn> + +=item B<--unknown-filesystems error> + +Configure the behaviour of virt-resize when asking to expand a +filesystem, and neither libguestfs has the support it, nor virt-resize +knows how to expand the content of the filesystem. + +I<--unknown-filesystems ignore> will cause virt-resize to silently +ignore such filesystems, and nothing is printed about them. + +I<--unknown-filesystems warn> (the default behaviour) will cause +virt-resize to warn for each of the filesystem that cannot be +expanded, but still continuing to resize the disk. + +I<--unknown-filesystems error> will cause virt-resize to error out +at the first filesystem that cannot be expanded. + +See also L</"unknown/unavailable method for expanding the TYPE filesystem on DEVICE/LV">. + =item B<-v> =item B<--verbose> @@ -764,7 +786,11 @@ expand that type of filesystem. =back -In both cases, virt-resize will not expand the mentioned filesystem. +In both cases, virt-resize will not expand the mentioned filesystem; +the result (unless I<--unknown-filesystems error> is specified) +is that the partitions containing such filesystems will be actually +bigger as requested, but the filesystems will still be usable at the +their older sizes. =head1 ALTERNATIVE TOOLS -- 2.1.0
Pino Toscano
2015-Oct-23 16:28 UTC
[Libguestfs] [PATCH 2/2] builder: run virt-resize with --unknown-filesystems=error
This way, we can make sure that if a template needs to be expanded, the result will have all the filesystems correctly expanded, fitting into the new sizes of their partitions. --- builder/builder.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builder/builder.ml b/builder/builder.ml index 6850f8f..feb6e0d 100644 --- a/builder/builder.ml +++ b/builder/builder.ml @@ -575,7 +575,7 @@ let main () if verbose () then g#set_verbose true; g#disk_create ?preallocation ofile oformat osize in let cmd - sprintf "virt-resize%s%s%s --output-format %s%s%s %s %s" + sprintf "virt-resize%s%s%s --output-format %s%s%s --unknown-filesystems error %s %s" (if verbose () then " --verbose" else " --quiet") (if is_block_device ofile then " --no-sparse" else "") (match iformat with -- 2.1.0
Richard W.M. Jones
2015-Oct-27 13:29 UTC
Re: [Libguestfs] [PATCH 2/2] builder: run virt-resize with --unknown-filesystems=error
On Fri, Oct 23, 2015 at 06:28:59PM +0200, Pino Toscano wrote:> This way, we can make sure that if a template needs to be expanded, the > result will have all the filesystems correctly expanded, fitting into > the new sizes of their partitions. > --- > builder/builder.ml | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/builder/builder.ml b/builder/builder.ml > index 6850f8f..feb6e0d 100644 > --- a/builder/builder.ml > +++ b/builder/builder.ml > @@ -575,7 +575,7 @@ let main () > if verbose () then g#set_verbose true; > g#disk_create ?preallocation ofile oformat osize in > let cmd > - sprintf "virt-resize%s%s%s --output-format %s%s%s %s %s" > + sprintf "virt-resize%s%s%s --output-format %s%s%s --unknown-filesystems error %s %s" > (if verbose () then " --verbose" else " --quiet") > (if is_block_device ofile then " --no-sparse" else "") > (match iformat with > -- > 2.1.0The series looks fine, so ACK series. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 100 libraries supported. http://fedoraproject.org/wiki/MinGW
Reasonably Related Threads
- [PATCH v2 2/2] resize: expand f2fs partitions
- [PATCH 0/2] resize: Split out the command line parsing into Cmdline
- [PATCH 2/2] OCaml tools: simplify machine-readable handling
- [PATCH] handle --debug-gc universally via at_exit hook
- [PATCH 2/2] resize: shrink/expand swap partitions