[Libguestfs] [v2v PATCH] convert_linux: start the QEMU guest agent in a distro-specific way

Richard W.M. Jones rjones at redhat.com
Wed Aug 17 16:03:28 UTC 2022


On Wed, Aug 17, 2022 at 04:47:36PM +0200, Laszlo Ersek wrote:
> The current command "service <package-name> start" does not apply to
> RHEL-6; the service name ("qemu-ga") differs from the package name
> ("qemu-guest-agent") there.
> 
> Overhaul the logic -- detach the command from the package name; cover the
> RHEL, ALT, SUSE and Debian families separately. Remove the "chkconfig"
> command, as in all tested / investigated cases, it is unnecessary.
> 
> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2028764
> Signed-off-by: Laszlo Ersek <lersek at redhat.com>
> ---
>  convert/convert_linux.ml | 56 ++++++++++++++++++++++++++++------------
>  1 file changed, 40 insertions(+), 16 deletions(-)
> 
> diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml
> index 2aaa438e42ac..b8e9ad15e22d 100644
> --- a/convert/convert_linux.ml
> +++ b/convert/convert_linux.ml
> @@ -66,6 +66,34 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ =
>      | _ -> None
>    in
>  
> +  let qga_svc_start_cmd family distro major =
> +    match family, distro, major with
> +    | `RHEL_family, ( "rhel" | "centos" | "scientificlinux" | "redhat-based" |
> +                      "oraclelinux" ), 6 ->

Shouldn't this be:
                                 ...    , i when i <= 6 ->

?

> +      (* https://bugzilla.redhat.com/show_bug.cgi?id=2028764#c52 *)
> +      Some "service qemu-ga start"
> +
> +    | `RHEL_family, _, _ ->
> +      (* https://bugzilla.redhat.com/show_bug.cgi?id=2028764#c52 *)
> +      Some "systemctl start qemu-guest-agent"
> +
> +    | `ALT_family, _, _ ->
> +      (* https://bugzilla.redhat.com/show_bug.cgi?id=2028764#c45 *)
> +      Some "systemctl start qemu-guest-agent"
> +
> +    | `SUSE_family, _, _ ->
> +      (* https://bugzilla.redhat.com/show_bug.cgi?id=2028764#c51 *)
> +      None
> +
> +    | `Debian_family, _, _ ->
> +      (* https://bugzilla.redhat.com/show_bug.cgi?id=2028764#c42 *)
> +      Some "service qemu-guest-agent start"
> +
> +    | _ ->
> +      (* should never be called when "qga_pkg_of_family" returns None *)
> +      assert false
> +  in
> +
>    assert (inspect.i_package_format = "rpm" || inspect.i_package_format = "deb");
>  
>    (* Fail early if i_apps is empty.  Certain steps such as kernel
> @@ -615,23 +643,19 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ =
>                          \ \ rm -f %s\n\
>                          fi\n" selinux_enforcing selinux_enforcing);
>  
> -            (* Start the agent now and at subsequent boots. The following
> -             * commands should work on both sysvinit distros / distro versions
> -             * (regardless of "/etc/rc.d/" vs. "/etc/init.d/" being the scheme
> -             * in use) and systemd distros (via redirection to systemctl).
> -             *
> -             * On distros where the chkconfig command is redirected to
> -             * systemctl, the chkconfig command is likely superfluous. That's
> -             * because on systemd distros, the QGA package comes with such
> -             * runtime dependencies / triggers that the presence of the
> -             * virtio-serial port named "org.qemu.guest_agent.0" automatically
> -             * starts the agent during (second and later) boots. However, even
> -             * on such distros, the chkconfig command should do no harm.
> +            (* On all the distro families covered by "qga_pkg_of_family" and
> +             * "qga_svc_start_cmd", the QEMU guest agent service is always
> +             * enabled by package installation for *subsequent* boots. Package
> +             * installation may or may not enable the service for the current
> +             * (i.e., first) boot, however, so try that here manually.
>               *)
> -            fbs "start qga"
> -              (sprintf "#!/bin/sh\n\
> -                        service %s start\n\
> -                        chkconfig %s on\n" qga_pkg qga_pkg)
> +            match qga_svc_start_cmd family inspect.i_distro inspect.i_major_version
> +            with
> +            | None -> ()
> +            | Some start_cmd ->
> +              fbs "start qga"
> +                (sprintf "#!/bin/sh\n\
> +                          %s\n" start_cmd)
>            with
>            | Guest_packages.Unknown_package_manager msg
>            | Guest_packages.Unimplemented_package_manager msg ->

If you wanted to reduce the long range dependency between
qga_pkg_of_family and qga_svc_start_cmd (and hence the assert) you
could make a qga_something function that returns both the package name
and the service start command as a pair of strings (or None).  It
could make the code more maintainable long term.

It all looks fine, so ACK either way.

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


More information about the Libguestfs mailing list