[libvirt] [RFC PATCHv2] network: try to eliminate default network conflict during package install

Laine Stump laine at laine.org
Fri Sep 12 17:37:30 UTC 2014

Sometimes libvirt is installed on a host that is already using the
network If the libvirt-daemon-config-network package
is installed, this creates a conflict, since that package has been
hard-coded to create a virtual network that also uses In the past libvirt has attempted to warn of /
remediate this situation by checking for conflicting routes when the
network is started, but it turns out that isn't always useful (for
example in the case that the *other* interface/network creating the
conflict hasn't yet been started at the time libvirtd start its own

This patch attempts to catch the problem earlier - at install
time. During the %post install script for
libvirt-daemon-config-network, we use a case statement to look through
the output of "ip route show" for a route that exactly matches, and if found we search for a similar route that
*doesn't* match (e.g.  When we find an available
route, we just replace all occurrences of "122" in the default.xml
that is being created with the newly found 192.168 subnet. This could
obviously be made more complicated - examine the template defaul.xml
to automatically determine the existing network address and mask
rather than hard coding it in the specfile, etc, but this scripting is
simpler and gets the job done as long as we continue to use in the template. (If anyone with mad bash skillz
wants to suggest something to do that, by all means please do).

This is intended to at least "further reduce" occurrence of the
problems detailed in:


Difference from V1: fixed some typos in the commit message as pointed
out by Eric. Also switched from using comparison loops for route
matching, to using a case statement as a low cost replacement for grep
(again, as suggested by Eric).

Unless there is an objection, I will push this patch later this
afternoon so that we can try it out. In the off chance that it causes
any disasters, we have plenty of time to revert before the next
release :-)

 libvirt.spec.in | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/libvirt.spec.in b/libvirt.spec.in
index a6a58cf..90da0c2 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -1728,8 +1728,37 @@ fi
     %if %{with_network}
 %post daemon-config-network
 if test $1 -eq 1 && test ! -f %{_sysconfdir}/libvirt/qemu/networks/default.xml ; then
+    # see if the network used by default network creates a conflict,
+    # and try to resolve it
+    # NB: is used in the default.xml template file;
+    # do not modify any of those values here without also modifying
+    # them in the template.
+    orig_sub=122
+    sub=${orig_sub}
+    nl='
+    routes="${nl}$(ip route show | cut -d' ' -f1)"
+    case ${routes} in
+      *"${nl}192.168.${orig_sub}.0/24${nl}"*)
+        # there was a match, so we need to look for an unused subnet
+        for new_sub in $(seq 123 254); do
+          case ${routes} in
+          *"${nl}192.168.${new_sub}.0/24${nl}"*)
+            ;;
+          *)
+            sub=$new_sub
+            break;
+            ;;
+          esac
+        done
+        ;;
+      *)
+        ;;
+    esac
-    sed -e "s,</name>,</name>\n  <uuid>$UUID</uuid>," \
+    sed -e "s/${orig_sub}/${sub}/g" \
+        -e "s,</name>,</name>\n  <uuid>$UUID</uuid>," \
          < %{_datadir}/libvirt/networks/default.xml \
          > %{_sysconfdir}/libvirt/qemu/networks/default.xml
     ln -s ../default.xml %{_sysconfdir}/libvirt/qemu/networks/autostart/default.xml

More information about the libvir-list mailing list