[Libguestfs] [PATCH 2/2] Add --size for ext2 filesystem

Richard W.M. Jones rjones at redhat.com
Mon Jul 13 18:25:21 UTC 2015


On Mon, Jul 13, 2015 at 05:35:56PM +0200, Pino Toscano wrote:
> Add a --size option to setting the size of the ext2 filesystem,
> so it is possible to create ext2 appliances with smaller disk images.
> 
> The default is like the previously hardcoded value of 4GB.
> ---
>  src/build.ml     |  4 ++--
>  src/ext2.ml      | 19 ++++++++++---------
>  src/prepare.ml   |  2 +-
>  src/supermin.ml  |  9 +++++++--
>  src/supermin.pod | 15 +++++++++++++++
>  5 files changed, 35 insertions(+), 14 deletions(-)
> 
> diff --git a/src/build.ml b/src/build.ml
> index d7d0781..fb2e6d3 100644
> --- a/src/build.ml
> +++ b/src/build.ml
> @@ -59,7 +59,7 @@ and string_of_file_content = function
>  
>  let rec build debug
>      (copy_kernel, dtb_wildcard, format, host_cpu,
> -     packager_config, tmpdir, use_installed)
> +     packager_config, tmpdir, use_installed, size)
>      inputs outputdir =
>    if debug >= 1 then
>      printf "supermin: build: %s\n%!" (String.concat " " inputs);
> @@ -210,7 +210,7 @@ let rec build debug
>      and initrd = outputdir // "initrd" in
>      let kernel_version, modpath =
>        Kernel.build_kernel debug host_cpu dtb_wildcard copy_kernel kernel dtb in
> -    Ext2.build_ext2 debug basedir files modpath kernel_version appliance;
> +    Ext2.build_ext2 debug basedir files modpath kernel_version appliance size;
>      Ext2_initrd.build_initrd debug tmpdir modpath initrd
>  
>  and read_appliance debug basedir appliance = function
> diff --git a/src/ext2.ml b/src/ext2.ml
> index d5c26a7..79539a3 100644
> --- a/src/ext2.ml
> +++ b/src/ext2.ml
> @@ -23,26 +23,27 @@ open Utils
>  open Ext2fs
>  open Package_handler
>  
> -(* The ext2 image that we build always has a fixed size, and we 'hope'
> - * that the files fit in (otherwise we'll get an error).  Note that
> - * the file is sparsely allocated.
> +(* The ext2 image that we build has a size of 4GB if not specified,
> + * and we 'hope' that the files fit in (otherwise we'll get an error).
> + * Note that the file is sparsely allocated.
>   *
>   * The downside of allocating a very large initial disk is that the
>   * fixed overhead of ext2 is larger (since ext2 calculates it based on
>   * the size of the disk).  For a 4GB disk the overhead is
>   * approximately 66MB.
> - *
> - * In future, make this configurable, or determine it from the input
> - * files (XXX).
>   *)
> -let appliance_size = 4L *^ 1024L *^ 1024L *^ 1024L
> +let default_appliance_size = 4L *^ 1024L *^ 1024L *^ 1024L
>  
> -let build_ext2 debug basedir files modpath kernel_version appliance =
> +let build_ext2 debug basedir files modpath kernel_version appliance size =
>    if debug >= 1 then
>      printf "supermin: ext2: creating empty ext2 filesystem '%s'\n%!" appliance;
>  
>    let fd = openfile appliance [O_WRONLY;O_CREAT;O_TRUNC;O_NOCTTY] 0o644 in
> -  LargeFile.ftruncate fd appliance_size;
> +  let size =
> +    match size with
> +    | None -> default_appliance_size
> +    | Some s -> s in
> +  LargeFile.ftruncate fd size;
>    close fd;
>  
>    let cmd =
> diff --git a/src/prepare.ml b/src/prepare.ml
> index 75f21dc..7e522e9 100644
> --- a/src/prepare.ml
> +++ b/src/prepare.ml
> @@ -22,7 +22,7 @@ open Package_handler
>  open Utils
>  
>  let prepare debug (copy_kernel, dtb_wildcard, format, host_cpu,
> -             packager_config, tmpdir, use_installed)
> +             packager_config, tmpdir, use_installed, size)
>      inputs outputdir =
>    if debug >= 1 then
>      printf "supermin: prepare: %s\n%!" (String.concat " " inputs);
> diff --git a/src/supermin.ml b/src/supermin.ml
> index 14261d6..9623229 100644
> --- a/src/supermin.ml
> +++ b/src/supermin.ml
> @@ -94,6 +94,7 @@ let main () =
>      let outputdir = ref "" in
>      let packager_config = ref "" in
>      let use_installed = ref false in
> +    let size = ref None in
>  
>      let set_debug () = incr debug in
>  
> @@ -118,6 +119,8 @@ let main () =
>        exit 1
>      in
>  
> +    let set_size arg = size := Some (parse_size arg) in
> +
>      let error_supermin_5 () =
>        eprintf "supermin: *** error: This is supermin version 5.\n";
>        eprintf "supermin: *** It looks like you are looking for supermin version 4.\n";
> @@ -143,6 +146,7 @@ let main () =
>        "-o",        Arg.Set_string outputdir,  "OUTPUTDIR Set output directory";
>        "--packager-config", Arg.Set_string packager_config, "CONFIGFILE Set packager config file";
>        "--prepare", Arg.Unit set_prepare_mode, " Prepare a supermin appliance";
> +      "--size",    Arg.String set_size,       " Set the size of the ext2 filesystem";
>        "--use-installed", Arg.Set use_installed, " Use installed files instead of accessing network";
>        "-v",        Arg.Unit set_debug,        " Enable debugging messages";
>        "--verbose", Arg.Unit set_debug,        ditto;
> @@ -165,6 +169,7 @@ let main () =
>      let packager_config =
>        match !packager_config with "" -> None | s -> Some s in
>      let use_installed = !use_installed in
> +    let size = !size in
>  
>      let format =
>        match mode, !format with
> @@ -184,7 +189,7 @@ let main () =
>  
>      debug, mode, if_newer, inputs, lockfile, outputdir,
>      (copy_kernel, dtb_wildcard, format, host_cpu,
> -     packager_config, tmpdir, use_installed) in
> +     packager_config, tmpdir, use_installed, size) in
>  
>    if debug >= 1 then printf "supermin: version: %s\n" Config.package_version;
>  
> @@ -192,7 +197,7 @@ let main () =
>     * This fails with an error if one could not be located.
>     *)
>    let () =
> -    let (_, _, _, _, packager_config, tmpdir, _) = args in
> +    let (_, _, _, _, packager_config, tmpdir, _, _) = args in
>      let settings = {
>        debug = debug;
>        tmpdir = tmpdir;
> diff --git a/src/supermin.pod b/src/supermin.pod
> index f2e8446..f9b7395 100644
> --- a/src/supermin.pod
> +++ b/src/supermin.pod
> @@ -189,6 +189,9 @@ appliance to C<OUTPUTDIR/initrd>, and the ext2 filesystem image to
>  C<OUTPUTDIR/root>.  (Where C<OUTPUTDIR> is specified by the I<-o>
>  option).
>  
> +The filesystem (C<OUTPUTDIR/root>) has a default size of 4 GB
> +(see also the I<--size> option).
> +
>  =back
>  
>  =item B<--host-cpu> CPU
> @@ -283,6 +286,18 @@ However this option is useful in some controlled situations: for
>  example when using supermin inside a freshly installed chroot, or if
>  you have no network access during the build.
>  
> +=item B<--size> SIZE
> +
> +(I<--build> mode only)
> +
> +Select the size of the output ext2 filesystem, where the size can be
> +specified using common names such as C<32G> (32 gigabytes) etc.
> +
> +If the size is not specified, a default size of 4 GB is used.
> +
> +To specify size in bytes, the number must be followed by the lowercase
> +letter I<b>, eg: S<C<--size 10737418240b>>.
> +
>  =item B<-v>
>  
>  =item B<--verbose>
> -- 
> 2.1.0

ACK series.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine.  Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/




More information about the Libguestfs mailing list