Re: ldomctl: Add create-vdisk command

2019-12-05 Thread Sebastian Benoit
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=

  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 -  1.7
> +++ ldom.conf.5   29 Nov 2019 23:56:07 -
> @@ -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 -  1.18
> +++ ldomctl.8 29 Nov 2019 23:47:01 -
> @@ -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 -  1.27
> +++ ldomctl.c 30 Nov 2019 00:40:49 -
> @@ -18,12 +18,15 @@
>  
>  #include 
>  #include 
> +#include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 
>  #include 
>  #include 
> +#include 
>  
>  #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;
> +  

ldomctl: Add create-vdisk command

2019-11-29 Thread Klemens Nanni
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.

`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 -  1.7
+++ ldom.conf.5 29 Nov 2019 23:56:07 -
@@ -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 -  1.18
+++ ldomctl.8   29 Nov 2019 23:47:01 -
@@ -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 -  1.27
+++ ldomctl.c   30 Nov 2019 00:40:49 -
@@ -18,12 +18,15 @@
 
 #include 
 #include 
+#include 
 #include 
+#include 
 #include 
 #include 
 #include 
 #include 
 #include 
+#include 
 
 #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();
+   }
+   }
+