[libvirt] [PATCH] network: avoid existing bridges during rpm install of default network

Michal Privoznik mprivozn at redhat.com
Mon Oct 5 14:15:37 UTC 2015


On 29.09.2015 19:11, Laine Stump wrote:
> When we install the libvirt-daemon-config-network package from an rpm,
> the specfile checks that the subnet used for the default network isn't
> already used, but blindly assumes that virbr0 is available. This is
> almost always the case, but there could be a situation where someone
> was already using virbr0 for their own network, then decided to
> install libvirt-daemon-config-network, leading to a failure when they
> tried to start the default network.
> 
> This patch adds a bit to the %post script for the
> daemon-network-config package (in the specfile, used only for .rpm
> packages) that checks "ip link show" and the existing libvirt network
> xml files in a loop to find the lowest numbered virbrN that is
> currently unused by either.
> 
> (note that we already check for in-use bridge devices when defining a
> network in libvirt's network driver, but the rpm install bypasses
> libvirt (which may not yet be fully functional) and creates the xml
> file itself).
> ---
> 
> I found this sitting in a source tree, written a few months ago and
> forgotten. It is a followup to commit 37b8bc6f, which added a similar
> check in the network driver during virNetworkDefineXML(). I vaguely
> recall someone reporting this problem on IRC or maybe on one of the
> mailing lists (they had created a bridge manually using the name
> virbr0, then when they installed libvirt, it happily made a network
> definition using virbr0). Yes, not very common, but possible.
> 
>  libvirt.spec.in | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/libvirt.spec.in b/libvirt.spec.in
> index 78a4cc3..931c5b9 100644
> --- a/libvirt.spec.in
> +++ b/libvirt.spec.in
> @@ -1793,8 +1793,24 @@ if test $1 -eq 1 && test ! -f %{_sysconfdir}/libvirt/qemu/networks/default.xml ;
>          ;;
>      esac
>  
> +    # find an unused bridge device named virbrN (this assumes that the
> +    # original name in default.xml is exactly "virbr0", so do not
> +    # change it there without also changing orig_br).
> +    orig_br=0
> +    br=${orig_br}
> +    while ip link show virbr${br} >/dev/null 2>&1 ||\
> +          (grep '<bridge ' %{_sysconfdir}/libvirt/qemu/networks/*.xml |\
> +           grep virbr${br} >/dev/null 2>&1); do
> +      br=$(expr ${br} + 1)
> +      # safety to prevent an endless loop
> +      if test ${br} -gt 256; then
> +          break;
> +      fi
> +    done
> +
>      UUID=`/usr/bin/uuidgen`
>      sed -e "s/${orig_sub}/${sub}/g" \
> +        -e "s/virbr${orig_br}/virbr${br}/" \
>          -e "s,</name>,</name>\n  <uuid>$UUID</uuid>," \
>           < %{_datadir}/libvirt/networks/default.xml \
>           > %{_sysconfdir}/libvirt/qemu/networks/default.xml
> 

ACK

Michal




More information about the libvir-list mailing list