Klemens Nanni(k...@openbsd.org) on 2019.11.30 01:44:48 +0100:
> Just like on amd64 with vmctl(8), I want to be able to easily create
> disk images.
> 
> ldomctl(8) currently advises to use dd(1), those files are not sparse
> either so creating big images may take a lot of time and the process
> tends to be error prone.

you can create sparse files with dd using seek=<large-num>

  dd if=/dev/zero of=blarf bs=1 count=0 seek=512M

no opinion on the diff.


> `ldomctl create-vdisk -s size file' behaves like
> `vmctl create -s size file' except that size is parsed by scan_scaled(3)
> and not assumed to be megabytes, e.g.
> 
>       $ ldomctl create-vdisk -s 8G ~/guest01.img
>       t4-2$ ./obj/ldomctl create-vdisk -s 8G ~/guest01.img
>       t4-2$ ls -l ~/guest01.img
>       -rw-------  1 kn  kn  8589934592 Nov 30 01:42 /home/kn/guest01.img
>       t4-2$ du ~/guest01.img
>       96   /home/kn/guest01.img  
> 
> Feedback? OK?
> 
> 
> Index: ldom.conf.5
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ldomctl/ldom.conf.5,v
> retrieving revision 1.7
> diff -u -p -r1.7 ldom.conf.5
> --- ldom.conf.5       28 Nov 2019 18:40:42 -0000      1.7
> +++ ldom.conf.5       29 Nov 2019 23:56:07 -0000
> @@ -59,8 +59,9 @@ for a list of OpenPROM variables.
>  The specified file is used to back a virtual disk of the guest
>  domain.
>  .Ar file
> -can be a block device node or a disk image file created with
> -.Xr dd 1 .
> +can be a block device node or a disk image file created with the
> +.Cm create-vdisk
> +command.
>  This keyword can be used multiple times.
>  .It Ic vnet Op Brq Ar keyword Ns = Ns Ar value ...
>  Assign a
> Index: ldomctl.8
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ldomctl/ldomctl.8,v
> retrieving revision 1.18
> diff -u -p -r1.18 ldomctl.8
> --- ldomctl.8 28 Nov 2019 18:03:33 -0000      1.18
> +++ ldomctl.8 29 Nov 2019 23:47:01 -0000
> @@ -34,6 +34,16 @@ information about domains running on the
>  .Pp
>  The following commands are available:
>  .Bl -tag -width Ds
> +.It Cm create-vdisk Fl s Ar size Ar file
> +Create a virtual disk image with the specified
> +.Ar file
> +path and
> +.Ar size ,
> +in bytes.
> +.Ar size
> +can be specified with a human-readable scale, using the format described in
> +.Xr scan_scaled 3 ,
> +e.g. 512M.
>  .It Cm console Ar domain
>  Using
>  .Xr cu 1
> @@ -119,8 +129,8 @@ openbsd [next]
>  .Pp
>  Create a virtual disk image for each guest domain:
>  .Bd -literal -offset indent
> -# dd if=/dev/zero of=/home/puffy/vdisk0 bs=1m count=8192
> -# dd if=/dev/zero of=/home/salmah/vdisk0 bs=1m count=8192
> +# ldomctl create-vdisk -s 8G /home/puffy/vdisk0
> +# ldomctl create-vdisk -s 8G /home/salmah/vdisk0
>  .Ed
>  .Pp
>  The minirootfs install media can be used to boot guest domains:
> Index: ldomctl.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ldomctl/ldomctl.c,v
> retrieving revision 1.27
> diff -u -p -r1.27 ldomctl.c
> --- ldomctl.c 28 Nov 2019 18:40:42 -0000      1.27
> +++ ldomctl.c 30 Nov 2019 00:40:49 -0000
> @@ -18,12 +18,15 @@
>  
>  #include <sys/types.h>
>  #include <sys/ioctl.h>
> +#include <sys/stat.h>
>  #include <err.h>
> +#include <errno.h>
>  #include <fcntl.h>
>  #include <stdlib.h>
>  #include <stdio.h>
>  #include <string.h>
>  #include <unistd.h>
> +#include <util.h>
>  
>  #include "ds.h"
>  #include "hvctl.h"
> @@ -53,6 +56,7 @@ void list(int argc, char **argv);
>  void list_io(int argc, char **argv);
>  void xselect(int argc, char **argv);
>  void delete(int argc, char **argv);
> +void create_vdisk(int argc, char **argv);
>  void guest_start(int argc, char **argv);
>  void guest_stop(int argc, char **argv);
>  void guest_panic(int argc, char **argv);
> @@ -67,6 +71,7 @@ struct command commands[] = {
>       { "list-io",    list_io },
>       { "select",     xselect },
>       { "delete",     delete },
> +     { "create-vdisk", create_vdisk },
>       { "start",      guest_start },
>       { "stop",       guest_stop },
>       { "panic",      guest_panic },
> @@ -117,6 +122,9 @@ main(int argc, char **argv)
>       if (cmdp->cmd_name == NULL)
>               usage();
>  
> +     if (strcmp(argv[0], "create-vdisk") == 0)
> +             goto skip_hv;
> +
>       hv_open();
>  
>       /*
> @@ -153,6 +161,7 @@ main(int argc, char **argv)
>                       add_guest(prop->d.arc.node);
>       }
>  
> +skip_hv:
>       (cmdp->cmd_func)(argc, argv);
>  
>       exit(EXIT_SUCCESS);
> @@ -165,6 +174,7 @@ usage(void)
>           "\t%1$s download directory\n"
>           "\t%1$s dump|list|list-io\n"
>           "\t%1$s init-system file\n"
> +         "\t%1$s create-vdisk -s size file\n"
>           "\t%1$s console|panic|start|status|stop [domain]\n", getprogname());
>       exit(EXIT_FAILURE);
>  }
> @@ -347,6 +357,48 @@ delete(int argc, char **argv)
>               ds_conn_handle(dc);
>  
>       mdstore_delete(dc, argv[1]);
> +}
> +
> +void
> +create_vdisk(int argc, char **argv)
> +{
> +     int ch, fd, save_errno;
> +     long long imgsize;
> +     const char *imgfile_path;
> +
> +     while ((ch = getopt(argc, argv, "s:")) != -1) {
> +             switch (ch) {
> +             case 's':
> +                     if (scan_scaled(optarg, &imgsize) == -1)
> +                             err(1, "invalid size: %s", optarg);
> +                     break;
> +             default:
> +                     usage();
> +             }
> +     }
> +     argc -= optind;
> +     argv += optind;
> +
> +     if (argc != 1)
> +             usage();
> +
> +     imgfile_path = argv[0];
> +
> +     /* Refuse to overwrite an existing image */
> +     if ((fd = open(imgfile_path, O_RDWR | O_CREAT | O_TRUNC | O_EXCL,
> +         S_IRUSR | S_IWUSR)) == -1)
> +             err(1, "ftruncate");
> +
> +     /* Extend to desired size */
> +     if (ftruncate(fd, (off_t)imgsize) == -1) {
> +             save_errno = errno;
> +             close(fd);
> +             unlink(imgfile_path);
> +             errno = save_errno;
> +             err(1, "ftruncate");
> +     }
> +
> +     close(fd);
>  }
>  
>  void
> 

Reply via email to