On Thu, Jul 13, 2023 at 07:10:45PM +0200, Laszlo Ersek wrote:
> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2184967
> 
> This series makes both backends prefer passt over slirp for appliance
> networking, if QEMU or libvirt (respectively) is recent enough, and
> passt is installed.
> 
> My test setup is:
> 
> $ virt-builder fedora-38
> 
> Then, each test run looks like this:
> 
> Terminal#1:
> 
> $ ./run rescue/virt-rescue --network --ro -a fedora-38.img
> 
> Terminal#2:
> 
> - check if "passt" is running (ps -ef, pgrep, ...), provided it *should*
>   be running
> 
> Terminal#1:
> 
> ><rescue> ping -c 3 8.8.8.8
> ><rescue> ip neighbor
> ><rescue> ip addr
> ><rescue> ip route
> 
> Expected results (in the above order), always on the "eth0" lines:
> - all three pings succeed (get replies)
> - 52:56:00:00:00:02
> - 169.254.2.15/16
> - default via 169.254.2.2

Another good test (and the one that really matters) would be something
like this on Terminal #1 ...

><rescue> chroot /sysroot bash
><rescue> dnf install emacs

(or some other package).  If dnf can see the Fedora repositories
despite the network setup being slightly wonky, that will mean that
virt-customize should work.

> Actual results:
> 
> (1) At current master (13c7052ff96d):
> 
> (1.1) With "LIBGUESTFS_BACKEND=direct":
> 
>       Pass, this is the baseline.
> 
> (1.2) With "LIBGUESTFS_BACKEND=libvirt":
> 
>       Pass, this is the baseline.
> 
> (2) With this series applied:
> 
> (2.1) With passt not installed:
> 
> (2.1.1) With "LIBGUESTFS_BACKEND=direct":
> 
>         Pass, this is a regression test concerning the absence of
>         "passt".
> 
> (2.1.2) With "LIBGUESTFS_BACKEND=libvirt":
> 
>         Pass, this is a regression test concerning the absence of
>         "passt".
> 
> (2.2) With passt installed:
> 
> (2.2.1) With "LIBGUESTFS_BACKEND=direct":
> 
>         Pass, this verifies the new feature.
> 
> (2.2.2) With "LIBGUESTFS_BACKEND=libvirt":
> 
>         Basic connectivity works fine (i.e., the pings).
> 
>         The "ip neighbor" and "ip route" checks fail. In addition, the
>         "ip addr" check *partially* fails. All that is due to libvirt
>         bugs:
> 
>         (a) Libvirt specifies the *guest MAC* (virtio-net MAC) as the
>             *host MAC* for passt, with a wrong "--mac-addr" option (from
>             libvirt commit a56f0168d576, "qemu: hook up passt config to
>             qemu domains", 2023-01-10). This breaks "ip neighbor".
> 
>         (b) Libvirt doesn't pass the "--gateway" option to passt. This
>             breaks "ip route". Namely, passt (following its default
>             behavior) sets the guest's gateway to 192.168.0.1, which is
>             the gateway for my *host*.
> 
>         (c) "ip addr" also reports "169.254.2.15/1". The IP address is
>             fine, but the netmask is wrong; it's not /16. This is most
>             likely a consequence of (b) -- normally the gateway is
>             supposed to be on the same Ethernet segment (subnet) as the
>             endpoint! 192 decimal is 11000000 binary, while 169 decimal
>             is 10101001 binary, and their longest common initial bit
>             sequence is just 1 bit -- hence the /1, most likely.
> 
>         I've filed <https://bugzilla.redhat.com/show_bug.cgi?id=2222766>
>         about these.

It's good that this work has found a bunch of libvirt bugs!

Rich.

> The upshot is that "appliance networking with passt" works with either
> backend, but with the libvirt backend, there are some appliance-visible
> differences from the SLIRP environment. Whether that's a problem in
> practice, I can't tell (probably not a problem) -- dependent on future
> decisions about RHBZ#2222766, we might want to update the libvirt
> backend code introduced here.
> 
> Laszlo
> 
> Laszlo Ersek (7):
>   lib: fix NETWORK_ADDRESS: make it an actual IP address, not a subnet
>     base
>   lib/launch-libvirt: support networking with passt
>   docs: fix broken link in the guestfs manual
>   docs: clarify sockdir's separation
>   lib: move guestfs_int_create_socketname() from "launch.c" to
>     "tmpdirs.c"
>   lib: introduce guestfs_int_make_pid_path()
>   lib/launch-direct: support networking with passt
> 
>  fish/guestfish.pod              |   4 +-
>  generator/actions_properties.ml |   8 +-
>  lib/guestfs-internal.h          |  32 ++++-
>  lib/guestfs.pod                 |   6 +-
>  lib/launch-direct.c             | 147 +++++++++++++++++++-
>  lib/launch-libvirt.c            |  11 ++
>  lib/launch.c                    |  54 +++----
>  lib/tmpdirs.c                   |  41 ++++++
>  8 files changed, 263 insertions(+), 40 deletions(-)
> 
> 
> base-commit: 13c7052ff96d5ee99ec1b1252f1a3b4d7aed44d2
> _______________________________________________
> Libguestfs mailing list
> Libguestfs@redhat.com
> https://listman.redhat.com/mailman/listinfo/libguestfs

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to