We've been carrying this exact patch in RHEL 7 for several years. It
reverts the change made in 2014 where we switched to using the virbr0
bridge for libguestfs networking instead of SLIRP. We thought SLIRP
was going to become unsupported in qemu, but recently there have been
more encouraging signs since it looks like SLIRP will be spun off as a
separate project, running as a modular process and properly secured
and supported.
This reverts commit 224de20b9a8d5ea56f6337f19b4ca237bb88eca0.
---
lib/guestfs.pod | 10 ----------
lib/launch-libvirt.c | 44 +++++++++++++++++++++-----------------------
2 files changed, 21 insertions(+), 33 deletions(-)
diff --git a/lib/guestfs.pod b/lib/guestfs.pod
index 3a9805c95..e1998c7eb 100644
--- a/lib/guestfs.pod
+++ b/lib/guestfs.pod
@@ -1551,16 +1551,6 @@ On Fedora, install C<kernel-debuginfo> for the
C<vmlinux> file
(containing symbols). Make sure the symbols precisely match the
kernel being used.
-=head3 network_bridge
-
-The libvirt backend supports:
-
- export LIBGUESTFS_BACKEND_SETTINGS=network_bridge=virbrX
-
-This allows you to override the bridge that is connected to when the
-network is enabled. The default is C<virbr0>. See also
-L</guestfs_set_network>.
-
=head2 ATTACHING TO RUNNING DAEMONS
I<Note (1):> This is B<highly experimental> and has a tendency to eat
diff --git a/lib/launch-libvirt.c b/lib/launch-libvirt.c
index 12dc2dbf6..fcfc910b3 100644
--- a/lib/launch-libvirt.c
+++ b/lib/launch-libvirt.c
@@ -126,7 +126,6 @@ struct backend_libvirt_data {
char *selinux_label;
char *selinux_imagelabel;
bool selinux_norelabel_disks;
- char *network_bridge;
char name[DOMAIN_NAME_LEN]; /* random name */
bool is_kvm; /* false = qemu, true = kvm (from capabilities)*/
struct version libvirt_version; /* libvirt version */
@@ -448,12 +447,6 @@ launch_libvirt (guestfs_h *g, void *datav, const char *libvirt_uri)
guestfs_get_backend_setting (g, "internal_libvirt_imagelabel");
data->selinux_norelabel_disks =
guestfs_int_get_backend_setting_bool (g,
"internal_libvirt_norelabel_disks");
- if (g->enable_network) {
- data->network_bridge =
- guestfs_get_backend_setting (g, "network_bridge");
- if (!data->network_bridge)
- data->network_bridge = safe_strdup (g, "virbr0");
- }
guestfs_pop_error_handler (g);
if (g->enable_network && check_bridge_exists (g, data->network_bridge) ==
-1)
@@ -1276,19 +1269,6 @@ construct_libvirt_xml_devices (guestfs_h *g,
} end_element ();
} end_element ();
- /* Connect to libvirt bridge (see: RHBZ#1148012). */
- if (g->enable_network) {
- start_element ("interface") {
- attribute ("type", "bridge");
- start_element ("source") {
- attribute ("bridge", params->data->network_bridge);
- } end_element ();
- start_element ("model") {
- attribute ("type", "virtio");
- } end_element ();
- } end_element ();
- }
-
/* Libvirt adds some devices by default. Indicate to libvirt
* that we don't want them.
*/
@@ -1693,6 +1673,27 @@ construct_libvirt_xml_qemu_cmdline (guestfs_h *g,
attribute ("value", tmpdir);
} end_element ();
+ /* Workaround because libvirt user networking cannot specify "net="
+ * parameter.
+ */
+ if (g->enable_network) {
+ start_element ("qemu:arg") {
+ attribute ("value", "-netdev");
+ } end_element ();
+
+ start_element ("qemu:arg") {
+ attribute ("value", "user,id=usernet,net=169.254.0.0/16");
+ } end_element ();
+
+ start_element ("qemu:arg") {
+ attribute ("value", "-device");
+ } end_element ();
+
+ start_element ("qemu:arg") {
+ attribute ("value", VIRTIO_DEVICE_NAME ("virtio-net")
",netdev=usernet");
+ } end_element ();
+ }
+
/* The qemu command line arguments requested by the caller. */
for (hp = g->hv_params; hp; hp = hp->next) {
start_element ("qemu:arg") {
@@ -2017,9 +2018,6 @@ shutdown_libvirt (guestfs_h *g, void *datav, int check_for_errors)
free (data->selinux_imagelabel);
data->selinux_imagelabel = NULL;
- free (data->network_bridge);
- data->network_bridge = NULL;
-
for (i = 0; i < data->nr_secrets; ++i)
free (data->secrets[i].secret);
free (data->secrets);
--
2.19.0.rc0