Pino Toscano
2017-Mar-22 10:19 UTC
[Libguestfs] [PATCH 0/5] dib: initial work to support d-i-b 2.0
Hi, this series start to implement some of the changes needed to support d-i-b 2.0; normal VM distro builds seem to work correctly, ramdisk builds are still broken and require more efforts. Thanks, Pino Toscano (5): dib: implement get_image_element_array stuff dib: export IMAGE_BLOCK_DEVICE_WITHOUT_PART dib: extract get_required_tool out of require_tool dib: require a Python interpreter dib: implement IMAGE_ELEMENT_YAML dib/cmdline.ml | 21 ++++++++++++++++++++- dib/cmdline.mli | 1 + dib/dib.ml | 44 ++++++++++++++++++++++++++++++++++++++++---- dib/utils.ml | 7 +++++-- dib/virt-dib.pod | 11 +++++++++++ 5 files changed, 77 insertions(+), 7 deletions(-) -- 2.9.3
Pino Toscano
2017-Mar-22 10:19 UTC
[Libguestfs] [PATCH 1/5] dib: implement get_image_element_array stuff
Output the get_image_element_array function like d-i-b does, together
with the eval stuff needed to make it work.
get_image_element_array is basically a bash array, with the keys are the
used elements, and the values are the paths of each element; it is a new
addition in d-i-b 2.0.
This is used so far only for the extra-data.d phase.
---
dib/dib.ml | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/dib/dib.ml b/dib/dib.ml
index 2e4da4b..0d128e3 100644
--- a/dib/dib.ml
+++ b/dib/dib.ml
@@ -74,9 +74,15 @@ let envvars_string l
let prepare_external ~envvars ~dib_args ~dib_vars ~out_name ~root_label
~rootfs_uuid ~image_cache ~arch ~network ~debug ~fs_type ~checksum
- destdir libdir fakebindir all_elements element_paths + destdir libdir
fakebindir loaded_elements all_elements element_paths let network_string = if
network then "" else "1" in
let checksum_string = if checksum then "1" else "" in
+ let elements_paths_array + List.map (
+ fun e ->
+ sprintf "[%s]=%s" e (quote (Hashtbl.find loaded_elements
e).directory)
+ ) (StringSet.elements all_elements) in
+ let elements_paths_array = String.concat " " elements_paths_array
in
let run_extra = sprintf "\
#!/bin/bash
@@ -91,6 +97,8 @@ shift
script=$1
shift
+VIRT_DIB_OURPATH=$(dirname $(realpath $0))
+
# user variables
%s
@@ -116,6 +124,9 @@ export DIB_DEBUG_TRACE=%d
export FS_TYPE=%s
export DIB_CHECKSUM=%s
+elinfo_out=$(<${VIRT_DIB_OURPATH}/elinfo_out)
+eval \"$elinfo_out\"
+
ENVIRONMENT_D_DIR=$target_dir/../environment.d
if [ -d $ENVIRONMENT_D_DIR ] ; then
@@ -148,7 +159,15 @@ $target_dir/$script
debug
fs_type
checksum_string in
- write_script (destdir // "run-part-extra.sh") run_extra
+ write_script (destdir // "run-part-extra.sh") run_extra;
+ let elinfo_out = sprintf "\
+function get_image_element_array {
+ echo \"%s\"
+};
+export -f get_image_element_array;
+"
+ elements_paths_array in
+ write_script (destdir // "elinfo_out") elinfo_out
let prepare_aux ~envvars ~dib_args ~dib_vars ~log_file ~out_name ~rootfs_uuid
~arch ~network ~root_label ~install_type ~debug ~extra_packages ~fs_type
@@ -636,7 +655,7 @@ let main () ~checksum:cmdline.checksum
tmpdir cmdline.basepath
(auxtmpdir // "fake-bin")
- all_elements cmdline.element_paths;
+ loaded_elements all_elements cmdline.element_paths;
let run_hook ~blockdev ~sysroot ?(new_wd = "") (g :
Guestfs.guestfs) hook try
--
2.9.3
Pino Toscano
2017-Mar-22 10:19 UTC
[Libguestfs] [PATCH 2/5] dib: export IMAGE_BLOCK_DEVICE_WITHOUT_PART
New environment variable exported by d-i-b 2.0.
---
dib/dib.ml | 1 +
1 file changed, 1 insertion(+)
diff --git a/dib/dib.ml b/dib/dib.ml
index 0d128e3..1df9aff 100644
--- a/dib/dib.ml
+++ b/dib/dib.ml
@@ -217,6 +217,7 @@ export TMP_HOOKS_PATH=$mysysroot/tmp/in_target.aux/hooks
export DIB_ARGS=\"%s\"
export
DIB_MANIFEST_SAVE_DIR=\"$mysysroot/tmp/in_target.aux/out/${IMAGE_NAME}.d\"
export IMAGE_BLOCK_DEVICE=$blockdev
+export IMAGE_BLOCK_DEVICE_WITHOUT_PART=$(echo ${IMAGE_BLOCK_DEVICE} | sed -e
\"s|^\\(.*loop[0-9]*\\)p[0-9]*$|\\1|g\")
export IMAGE_ELEMENT=\"%s\"
export DIB_ENV=%s
export DIB_DEBUG_TRACE=%d
--
2.9.3
Pino Toscano
2017-Mar-22 10:19 UTC
[Libguestfs] [PATCH 3/5] dib: extract get_required_tool out of require_tool
Extract from require_tool an helper function to search for the tool, and
return the found path (instead of ignoring it).
---
dib/utils.ml | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/dib/utils.ml b/dib/utils.ml
index da5e738..967754d 100644
--- a/dib/utils.ml
+++ b/dib/utils.ml
@@ -90,11 +90,14 @@ let digit_prefix_compare a b let do_mkdir dir mkdir_p
dir 0o755
-let require_tool tool - try ignore (which tool)
+let get_required_tool tool + try which tool
with Executable_not_found tool ->
error (f_"%s needed but not found") tool
+let require_tool tool + ignore (get_required_tool tool)
+
let do_cp src destdir let cmd = [ "cp"; "-t"; destdir;
"-a"; src ] in
if run_command cmd <> 0 then exit 1
--
2.9.3
Pino Toscano
2017-Mar-22 10:19 UTC
[Libguestfs] [PATCH 4/5] dib: require a Python interpreter
d-i-b 2.0 is written in Python, and thus it passes the information about
the interpreter used for it (sys.executable) to the scripts that need
it; this mechanism replaces the old discovery of what is the default
Python interpreter in the system.
Since we are not Python-based, look for 'python' and use it as default
interpreter, with the --python command line option to set a different
one.
The only place where it is used so far are extra-data.d scripts; in case
it will be used also in other out-of-chroot phases, a different solution
will be needed.
---
dib/cmdline.ml | 21 ++++++++++++++++++++-
dib/cmdline.mli | 1 +
dib/dib.ml | 10 +++++++++-
dib/virt-dib.pod | 11 +++++++++++
4 files changed, 41 insertions(+), 2 deletions(-)
diff --git a/dib/cmdline.ml b/dib/cmdline.ml
index 875f617..2cc1722 100644
--- a/dib/cmdline.ml
+++ b/dib/cmdline.ml
@@ -54,6 +54,7 @@ type cmdline = {
arch : string;
envvars : string list;
checksum : bool;
+ python : string option;
}
let parse_cmdline () @@ -151,6 +152,9 @@ read the man page virt-dib(1).
let checksum = ref false in
+ let python = ref None in
+ let set_python arg = python := Some arg in
+
let argspec = [
[ S 'p'; L"element-path" ], Getopt.String
("path", append_element_path), s_"Add new a elements
location";
[ L"exclude-element" ], Getopt.String ("element",
append_excluded_element),
@@ -167,6 +171,7 @@ read the man page virt-dib(1).
[ L"extra-packages" ], Getopt.String ("pkg,...",
append_extra_packages),
s_"Add extra packages to install";
[ L"checksum" ], Getopt.Set checksum, s_"Generate
MD5 and SHA256 checksum files";
+ [ L"python" ], Getopt.String ("python",
set_python), s_"Set Python interpreter";
[ L"ramdisk" ], Getopt.Set is_ramdisk, "Switch to
a ramdisk build";
[ L"ramdisk-element" ], Getopt.Set_string ("name",
ramdisk_element), s_"Main element for building ramdisks";
@@ -223,6 +228,7 @@ read the man page virt-dib(1).
let machine_readable = !machine_readable in
let extra_packages = List.rev !extra_packages in
let checksum = !checksum in
+ let python = !python in
(* No elements and machine-readable mode? Print some facts. *)
if elements = [] && machine_readable then (
@@ -246,6 +252,19 @@ read the man page virt-dib(1).
if elements = [] then
error (f_"at least one distribution root element must be
specified");
+ let python + match python with
+ | Some exe ->
+ let p + if Filename.is_relative exe then
+ get_required_tool exe
+ else (
+ Unix.access exe [Unix.X_OK];
+ exe
+ ) in
+ Some p
+ | None -> None in
+
{ debug = debug; basepath = basepath; elements = elements;
excluded_elements = excluded_elements; element_paths = element_paths;
excluded_scripts = excluded_scripts; use_base = use_base; drive = drive;
@@ -256,5 +275,5 @@ read the man page virt-dib(1).
extra_packages = extra_packages; memsize = memsize; network = network;
smp = smp; delete_on_failure = delete_on_failure;
formats = formats; arch = arch; envvars = envvars;
- checksum = checksum;
+ checksum = checksum; python = python;
}
diff --git a/dib/cmdline.mli b/dib/cmdline.mli
index acfce5a..5c82efd 100644
--- a/dib/cmdline.mli
+++ b/dib/cmdline.mli
@@ -46,6 +46,7 @@ type cmdline = {
arch : string;
envvars : string list;
checksum : bool;
+ python : string option;
}
val parse_cmdline : unit -> cmdline
diff --git a/dib/dib.ml b/dib/dib.ml
index 1df9aff..ab5481a 100644
--- a/dib/dib.ml
+++ b/dib/dib.ml
@@ -74,6 +74,7 @@ let envvars_string l
let prepare_external ~envvars ~dib_args ~dib_vars ~out_name ~root_label
~rootfs_uuid ~image_cache ~arch ~network ~debug ~fs_type ~checksum
+ ~python
destdir libdir fakebindir loaded_elements all_elements element_paths let
network_string = if network then "" else "1" in
let checksum_string = if checksum then "1" else "" in
@@ -123,6 +124,7 @@ export TMP_DIR=\"${TMPDIR}\"
export DIB_DEBUG_TRACE=%d
export FS_TYPE=%s
export DIB_CHECKSUM=%s
+export DIB_PYTHON_EXEC=%s
elinfo_out=$(<${VIRT_DIB_OURPATH}/elinfo_out)
eval \"$elinfo_out\"
@@ -158,7 +160,8 @@ $target_dir/$script
(quote dib_vars)
debug
fs_type
- checksum_string in
+ checksum_string
+ python in
write_script (destdir // "run-part-extra.sh") run_extra;
let elinfo_out = sprintf "\
function get_image_element_array {
@@ -524,6 +527,10 @@ let main () error (f_"the specified base path is
not the diskimage-builder library");
(* Check for required tools. *)
+ let python + match cmdline.python with
+ | None -> get_required_tool "python"
+ | Some exe -> exe in
require_tool "uuidgen";
Output_format.check_formats_prerequisites cmdline.formats;
if cmdline.checksum then
@@ -654,6 +661,7 @@ let main () ~network:cmdline.network
~debug
~fs_type:cmdline.fs_type
~checksum:cmdline.checksum
+ ~python
tmpdir cmdline.basepath
(auxtmpdir // "fake-bin")
loaded_elements all_elements cmdline.element_paths;
diff --git a/dib/virt-dib.pod b/dib/virt-dib.pod
index be7550a..5c1423e 100644
--- a/dib/virt-dib.pod
+++ b/dib/virt-dib.pod
@@ -354,6 +354,17 @@ to debug failures to run scripts.
The default is to delete the output files if virt-dib fails (or,
for example, some script that it runs fails).
+=item B<--python> PYTHON
+
+Specify a different Python interpreter to use. Parts of
+C<diskimage-builder> are implemented in Python, and thus an
+interpreter is needed.
+
+C<PYTHON> can either be an executable filename (e.g. F<python2>,
+which is then searched in C<$PATH>), or a full path (e.g.
+F</usr/bin/python2>). If not specified, the default value is
+F<python>.
+
=item B<-q>
=item B<--quiet>
--
2.9.3
Pino Toscano
2017-Mar-22 10:19 UTC
[Libguestfs] [PATCH 5/5] dib: implement IMAGE_ELEMENT_YAML
Export a new environment variable for extra-data.d scripts, that
contains a YAML representation of the elements in use.
This is a new addition in d-i-b 2.0.
---
dib/dib.ml | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/dib/dib.ml b/dib/dib.ml
index ab5481a..9ccf9ba 100644
--- a/dib/dib.ml
+++ b/dib/dib.ml
@@ -78,6 +78,12 @@ let prepare_external ~envvars ~dib_args ~dib_vars ~out_name
~root_label
destdir libdir fakebindir loaded_elements all_elements element_paths let
network_string = if network then "" else "1" in
let checksum_string = if checksum then "1" else "" in
+ let elements_paths_yaml + List.map (
+ fun e ->
+ sprintf "%s: %s" e (quote (Hashtbl.find loaded_elements
e).directory)
+ ) (StringSet.elements all_elements) in
+ let elements_paths_yaml = String.concat ", " elements_paths_yaml in
let elements_paths_array List.map (
fun e ->
@@ -164,11 +170,13 @@ $target_dir/$script
python in
write_script (destdir // "run-part-extra.sh") run_extra;
let elinfo_out = sprintf "\
+export IMAGE_ELEMENT_YAML=\"{%s}\"
function get_image_element_array {
echo \"%s\"
};
export -f get_image_element_array;
"
+ elements_paths_yaml
elements_paths_array in
write_script (destdir // "elinfo_out") elinfo_out
--
2.9.3
Richard W.M. Jones
2017-Mar-22 15:56 UTC
Re: [Libguestfs] [PATCH 4/5] dib: require a Python interpreter
On Wed, Mar 22, 2017 at 11:19:49AM +0100, Pino Toscano wrote:> if elements = [] && machine_readable then ( > @@ -246,6 +252,19 @@ read the man page virt-dib(1). > if elements = [] then > error (f_"at least one distribution root element must be specified"); > > + let python > + match python with > + | Some exe -> > + let p > + if Filename.is_relative exe thenIIUC what you mean here is "the 'exe' filename doesn't contain any slashes"? That isn't what is written above.> + get_required_tool exe > + else ( > + Unix.access exe [Unix.X_OK]; > + exe > + ) in > + Some p > + | None -> None inRich. -- 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/
Richard W.M. Jones
2017-Mar-22 15:57 UTC
Re: [Libguestfs] [PATCH 0/5] dib: initial work to support d-i-b 2.0
On Wed, Mar 22, 2017 at 11:19:45AM +0100, Pino Toscano wrote:> Hi, > > this series start to implement some of the changes needed to support > d-i-b 2.0; normal VM distro builds seem to work correctly, ramdisk > builds are still broken and require more efforts.This seems fine, modulo a minor comment that I made about patch 4, so ACK. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://people.redhat.com/~rjones/virt-top