customize: Add various options from virt-builder.

This adds the following options to virt-customize:

  --attach
  --attach-format
  -m / --memsize
  --network / --no-network
  --smp

This fixes commit 2b208d84db.
This commit is contained in:
Richard W.M. Jones
2014-03-25 22:09:34 +00:00
parent 87fcb4df03
commit 1a4709147a
2 changed files with 131 additions and 6 deletions

View File

@@ -19,6 +19,8 @@
open Common_gettext.Gettext
open Common_utils
open Customize_cmdline
open Printf
module G = Guestfs
@@ -28,13 +30,25 @@ let () = Random.self_init ()
let prog = Filename.basename Sys.executable_name
let main () =
let attach = ref [] in
let attach_format = ref None in
let set_attach_format = function
| "auto" -> attach_format := None
| s -> attach_format := Some s
in
let attach_disk s = attach := (!attach_format, s) :: !attach in
let debug_gc = ref false in
let domain = ref None in
let dryrun = ref false in
let files = ref [] in
let format = ref "auto" in
let quiet = ref false in
let libvirturi = ref "" in
let memsize = ref None in
let set_memsize arg = memsize := Some arg in
let network = ref true in
let quiet = ref false in
let smp = ref None in
let set_smp arg = smp := Some arg in
let trace = ref false in
let verbose = ref false in
@@ -60,6 +74,9 @@ let main () =
let argspec = [
"-a", Arg.String add_file, s_"file" ^ " " ^ s_"Add disk image file";
"--add", Arg.String add_file, s_"file" ^ " " ^ s_"Add disk image file";
"--attach", Arg.String attach_disk, "iso" ^ " " ^ s_"Attach data disk/ISO during install";
"--attach-format", Arg.String set_attach_format,
"format" ^ " " ^ s_"Set attach disk format";
"-c", Arg.Set_string libvirturi, s_"uri" ^ " " ^ s_"Set libvirt URI";
"--connect", Arg.Set_string libvirturi, s_"uri" ^ " " ^ s_"Set libvirt URI";
"--debug-gc", Arg.Set debug_gc, " " ^ s_"Debug GC and memory allocations (internal)";
@@ -70,8 +87,13 @@ let main () =
"--dry-run", Arg.Set dryrun, " " ^ s_"Perform a dry run";
"--format", Arg.Set_string format, s_"format" ^ " " ^ s_"Set format (default: auto)";
"--long-options", Arg.Unit display_long_options, " " ^ s_"List long options";
"-m", Arg.Int set_memsize, "mb" ^ " " ^ s_"Set memory size";
"--memsize", Arg.Int set_memsize, "mb" ^ " " ^ s_"Set memory size";
"--network", Arg.Set network, " " ^ s_"Enable appliance network (default)";
"--no-network", Arg.Clear network, " " ^ s_"Disable appliance network";
"-q", Arg.Set quiet, " " ^ s_"Don't print log messages";
"--quiet", Arg.Set quiet, " " ^ s_"Don't print log messages";
"--smp", Arg.Int set_smp, "vcpus" ^ " " ^ s_"Set number of vCPUs";
"-v", Arg.Set verbose, " " ^ s_"Enable debugging messages";
"--verbose", Arg.Set verbose, " " ^ s_"Enable debugging messages";
"-V", Arg.Unit display_version, " " ^ s_"Display version and exit";
@@ -145,9 +167,13 @@ read the man page virt-customize(1).
in
(* Dereference the rest of the args. *)
let attach = List.rev !attach in
let debug_gc = !debug_gc in
let dryrun = !dryrun in
let memsize = !memsize in
let network = !network in
let quiet = !quiet in
let smp = !smp in
let trace = !trace in
let verbose = !verbose in
@@ -158,11 +184,27 @@ read the man page virt-customize(1).
msg (f_"Examining the guest ...");
(* Connect to libguestfs. *)
let g = new G.guestfs () in
if trace then g#set_trace true;
if verbose then g#set_verbose true;
add g dryrun;
g#launch ();
let g =
let g = new G.guestfs () in
if trace then g#set_trace true;
if verbose then g#set_verbose true;
(match memsize with None -> () | Some memsize -> g#set_memsize memsize);
(match smp with None -> () | Some smp -> g#set_smp smp);
g#set_network network;
g#set_selinux ops.flags.selinux_relabel;
(* Add disks. *)
add g dryrun;
(* Attach ISOs, if we have any. *)
List.iter (
fun (format, file) ->
g#add_drive_opts ?format ~readonly:true file;
) attach;
g#launch ();
g in
(* Inspection. *)
(match Array.to_list (g#inspect_os ()) with

View File

@@ -48,6 +48,27 @@ force a particular format use the I<--format> option.
Add a remote disk. The URI format is compatible with guestfish.
See L<guestfish(1)/ADDING REMOTE STORAGE>.
=item B<--attach> ISOFILE
The given disk is attached to the libguestfs appliance. This is used
to provide extra software repositories or other data for
customization.
You probably want to ensure the volume(s) or filesystems in the
attached disks are labelled (or use an ISO volume name) so that you
can mount them by label in your run-scripts:
mkdir /tmp/mount
mount LABEL=EXTRA /tmp/mount
You can have multiple I<--attach> options, and the format can be any
disk format (not just an ISO).
=item B<--attach-format> FORMAT
Specify the disk format for the next I<--attach> option. The
C<FORMAT> is usually C<raw> or C<qcow2>. Use C<raw> for ISOs.
=item B<-c> URI
=item B<--connect> URI
@@ -96,6 +117,64 @@ If you have untrusted raw-format guest disk images, you should use
this option to specify the disk format. This avoids a possible
security problem with malicious guests (CVE-2010-3851).
=item B<-m> MB
=item B<--memsize> MB
Change the amount of memory allocated to I<--run> scripts. Increase
this if you find that I<--run> scripts or the I<--install> option are
running out of memory.
The default can be found with this command:
guestfish get-memsize
=item B<--network>
=item B<--no-network>
Enable or disable network access from the guest during the installation.
Enabled is the default. Use I<--no-network> to disable access.
The network only allows outgoing connections and has other minor
limitations. See L<virt-rescue(1)/NETWORK>.
If you use I<--no-network> then certain other options such as
I<--install> will not work.
This does not affect whether the guest can access the network once it
has been booted, because that is controlled by your hypervisor or
cloud environment and has nothing to do with virt-customize.
Generally speaking you should I<not> use I<--no-network>. But here
are some reasons why you might want to:
=over 4
=item 1.
Because the libguestfs backend that you are using doesn't support the
network. (See: L<guestfs(3)/BACKEND>).
=item 2.
Any software you need to install comes from an attached ISO, so you
don't need the network.
=item 3.
You don't want untrusted guest code trying to access your host network
when running virt-customize. This is particularly an issue when you
don't trust the source of the operating system templates. (See
L</SECURITY> below).
=item 4.
You don't have a host network (eg. in secure/restricted environments).
=back
=item B<-q>
=item B<--quiet>
@@ -104,6 +183,10 @@ Don't print log messages.
To enable detailed logging of individual file operations, use I<-x>.
=item B<--smp> N
Enable N E<ge> 2 virtual CPUs for I<--run> scripts to use.
=item B<-v>
=item B<--verbose>