From 44afd4c1f26379b32f62690cf19e06022cafa994 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 2 Jun 2016 14:51:12 +0100 Subject: [PATCH] builder: Warn if --output is a host partition (RHBZ#1342337). But allow the warning to be turned off using --no-warn-if-partition. Ming Xie tried to create a bootable USB key using 'virt-p2v-make-disk -o /dev/sdX1'. That works, but doesn't create a bootable key because it puts everything into the first partition. Emit a warning if someone tries to do this to try to prevent user error: virt-builder: warning: output device (/dev/sdb1) is a partition. If you are writing to a USB key or external drive then you probably need to write to the whole device, not to a partition. If this warning is wrong then you can disable it with --no-warn-if-partition (cherry picked from commit 7274f11ad408bcd4299ba82b3b26f46e62930d03) --- builder/builder.ml | 9 +++++++++ builder/cmdline.ml | 6 ++++++ builder/cmdline.mli | 1 + builder/virt-builder.pod | 9 +++++++++ 4 files changed, 25 insertions(+) diff --git a/builder/builder.ml b/builder/builder.ml index a6f92c7..ac4c748 100644 --- a/builder/builder.ml +++ b/builder/builder.ml @@ -268,6 +268,15 @@ let main () = (* --- If we get here, we want to create a guest. --- *) + (* Warn if the user might be writing to a partition on a USB key. *) + (match cmdline.output with + | Some device when is_partition device -> + if cmdline.warn_if_partition then + warning (f_"output device (%s) is a partition. If you are writing to a USB key or external drive then you probably need to write to the whole device, not to a partition. If this warning is wrong then you can disable it with --no-warn-if-partition") + device; + | Some _ | None -> () + ); + (* Download the template, or it may be in the cache. *) let template = let template, delete_on_exit = diff --git a/builder/cmdline.ml b/builder/cmdline.ml index 4893cbf..5205fe6 100644 --- a/builder/cmdline.ml +++ b/builder/cmdline.ml @@ -51,6 +51,7 @@ type cmdline = { smp : int option; sources : (string * string) list; sync : bool; + warn_if_partition : bool; } let parse_cmdline () = @@ -115,6 +116,7 @@ let parse_cmdline () = let add_source arg = push_front arg sources in let sync = ref true in + let warn_if_partition = ref true in let argspec = [ "--arch", Arg.Set_string arch, "arch" ^ " " ^ s_"Set the output architecture"; @@ -163,6 +165,8 @@ let parse_cmdline () = "--smp", Arg.Int set_smp, "vcpus" ^ " " ^ s_"Set number of vCPUs"; "--source", Arg.String add_source, "URL" ^ " " ^ s_"Set source URL"; "--no-sync", Arg.Clear sync, " " ^ s_"Do not fsync output file on exit"; + "--no-warn-if-partition", Arg.Clear warn_if_partition, + " " ^ s_"Do not warn if writing to a partition"; ] in let customize_argspec, get_customize_ops = Customize_cmdline.argspec () in let customize_argspec = @@ -212,6 +216,7 @@ read the man page virt-builder(1). let smp = !smp in let sources = List.rev !sources in let sync = !sync in + let warn_if_partition = !warn_if_partition in (* No arguments and machine-readable mode? Print some facts. *) if args = [] && machine_readable then ( @@ -323,4 +328,5 @@ read the man page virt-builder(1). gpg = gpg; list_format = list_format; memsize = memsize; network = network; ops = ops; output = output; size = size; smp = smp; sources = sources; sync = sync; + warn_if_partition = warn_if_partition; } diff --git a/builder/cmdline.mli b/builder/cmdline.mli index 4c201dd..854db61 100644 --- a/builder/cmdline.mli +++ b/builder/cmdline.mli @@ -39,6 +39,7 @@ type cmdline = { smp : int option; sources : (string * string) list; sync : bool; + warn_if_partition : bool; } val parse_cmdline : unit -> cmdline diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod index 545b134..94ba430 100644 --- a/builder/virt-builder.pod +++ b/builder/virt-builder.pod @@ -495,6 +495,15 @@ Note that you should not point I<--source> to sources that you don't trust (unless the source is signed by someone you do trust). See also the I<--no-network> option. +=item B<--no-warn-if-partition> + +Do not emit a warning if the output device is a partition. This +warning avoids a common user error when writing to a USB key or +external drive, when you should normally write to the whole device +(S>), not to a partition on the device +(S>). Use this option to I this +warning. + =item B<-v> =item B<--verbose> -- 2.7.4