[Libguestfs] [PATCH 1/1] virt-make-fs: add '--blocksize' option support
Richard W.M. Jones
rjones at redhat.com
Mon Feb 24 13:59:23 UTC 2020
On Wed, Feb 19, 2020 at 02:09:29AM +0200, Mykola Ivanets wrote:
> From: Nikolay Ivanets <stenavin at gmail.com>
>
> This patch adds '--blocksize' command line option for virt-make-fs
> tool. This option allows specifying disk sector size as described in
> 'guestfs_add_drive_opts' libguestfs API.
> ---
> make-fs/make-fs.c | 28 ++++++++++++++++++++++++++--
> make-fs/test-virt-make-fs.sh | 5 ++++-
> make-fs/virt-make-fs.pod | 10 ++++++++++
> 3 files changed, 40 insertions(+), 3 deletions(-)
>
> diff --git a/make-fs/make-fs.c b/make-fs/make-fs.c
> index 5d8c3a385..81d1cf90b 100644
> --- a/make-fs/make-fs.c
> +++ b/make-fs/make-fs.c
> @@ -54,10 +54,12 @@ int in_virt_rescue = 0;
>
> static const char *format = "raw", *label = NULL,
> *partition = NULL, *size_str = NULL, *type = "ext2";
> +int blocksize = 0;
Needs to be a static int.
> enum { HELP_OPTION = CHAR_MAX + 1 };
> static const char options[] = "F:s:t:Vvx";
> static const struct option long_options[] = {
> + { "blocksize", 1, 0, 0 },
> { "debug", 0, 0, 'v' }, /* for compat with Perl tool */
> { "floppy", 0, 0, 0 },
> { "format", 1, 0, 'F' },
> @@ -87,6 +89,7 @@ usage (int status)
> " %s [--options] input.tar.gz output.img\n"
> " %s [--options] directory output.img\n"
> "Options:\n"
> + " --blocksize=512|4096 Set sector size of the output disk\n"
> " --floppy Make a virtual floppy disk\n"
> " -F|--format=raw|qcow2|.. Set output format\n"
> " --help Display brief help\n"
> @@ -146,6 +149,9 @@ main (int argc, char *argv[])
> partition = "mbr";
> else
> partition = optarg;
> + } else if (STREQ (long_options[option_index].name, "blocksize")) {
> + if (sscanf (optarg, "%d", &blocksize) != 1)
> + error (EXIT_FAILURE, 0, _("--blocksize option is not numeric"));
> } else
> error (EXIT_FAILURE, 0,
> _("unknown long option: %s (%d)"),
> @@ -678,11 +684,23 @@ do_make_fs (const char *input, const char *output_str)
> estimate, estimate / 1024, estimate / 4096);
> }
>
> + /* For partition alignment and extra space at the end of the disk:
> + * by default we create first partition at 128 sector boundary and leave the
Best to keep lines under 78 or so characters long. In emacs you can
use M-q (Esc q) to automatically format the comment.
> + * last 128 sectors at the end of the disk free.
> + */
> + if (partition)
> + estimate += 2 * 128 * blocksize;
> +
> estimate += 256 * 1024; /* For superblocks &c. */
>
> if (STRPREFIX (type, "ext") && type[3] >= '3') {
> - /* For ext3+, add some more for the journal. */
> - estimate += 1024 * 1024;
> + /* For ext3+, add some more for the journal. Journal should be at least
> + * 1024 file system blocks. By default file system block size is 1024 bytes
> + * if disk sector size is 512 bytes and 4096 bytes if disk sector size is
> + * 4096 bytes. Note that default file system block size may be changed via
> + * /etc/mke2fs.conf but we cannot handle that at the moment.
> + */
Same here about the length of lines.
> + estimate += 1024 * (blocksize == 512 ? 1024 : 4096);
> }
>
> else if (STREQ (type, "ntfs")) {
> @@ -697,6 +715,11 @@ do_make_fs (const char *input, const char *output_str)
> estimate += 256 * 1024 * 1024;
> }
>
> + else if (STREQ (type, "xfs")) {
> + /* xfs requires at least 4096 blocks. Default block size is 4096 bytes. */
> + estimate += 4096 * 4096;
> + }
> +
> /* Add 10%, see above. */
> estimate *= 1.10;
>
> @@ -718,6 +741,7 @@ do_make_fs (const char *input, const char *output_str)
>
> if (guestfs_add_drive_opts (g, output,
> GUESTFS_ADD_DRIVE_OPTS_FORMAT, format,
> + GUESTFS_ADD_DRIVE_OPTS_BLOCKSIZE, blocksize,
> -1) == -1)
> return -1;
>
> diff --git a/make-fs/test-virt-make-fs.sh b/make-fs/test-virt-make-fs.sh
> index 79d058b6a..01c332b1d 100755
> --- a/make-fs/test-virt-make-fs.sh
> +++ b/make-fs/test-virt-make-fs.sh
> @@ -83,9 +83,12 @@ size=`random_choice`
> choices=("" --label=FOO)
> label=`random_choice`
>
> +choices=(--blocksize=512 --blocksize=4096)
> +blocksize=`random_choice`
> +
> if [ -n "$LIBGUESTFS_DEBUG" ]; then debug=--debug; fi
>
> -params="$type $format $partition $size $label $debug"
> +params="$type $format $partition $size $label $blocksize $debug"
> echo "test-virt-make-fs: parameters: $params"
>
> rm -f test.file test.tar output.img
> diff --git a/make-fs/virt-make-fs.pod b/make-fs/virt-make-fs.pod
> index 76ccbd120..bd4802c7c 100644
> --- a/make-fs/virt-make-fs.pod
> +++ b/make-fs/virt-make-fs.pod
> @@ -122,6 +122,16 @@ or rerun virt-make-fs to build another image from scratch.
>
> Display brief help.
>
> +=item B<--blocksize=512>
> +
> +=item B<--blocksize=4096>
> +
> +This parameter sets the sector size of the output disk image.
> +
> +The default is C<512> bytes.
> +
> +See also L<guestfs(3)/guestfs_add_drive_opts>.
> +
> =item B<--floppy>
>
> Create a virtual floppy disk.
Patch looks good apart from those few minor things.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages. http://libguestfs.org
More information about the Libguestfs
mailing list