[Pkg-xen-devel] Bug#955994: xen-utils-common: Could not start vif

Samuel Thibault sthibault at debian.org
Sun Apr 5 20:14:15 BST 2020


Package: xen-utils-common
Version: 4.11.3+24-g14b62ab3e5-1
Severity: normal
Tags: patch

Hello,

I was having issues with starting domains with vif-nat: 

♭ xl cr -c mydom
Parsing config from mydom
libxl: error: libxl_exec.c:117:libxl_report_child_exitstatus: /etc/xen/scripts/vif-nat online [27191] exited with error status 1
libxl: error: libxl_device.c:1286:device_hotplug_child_death_cb: script: /etc/xen/scripts/vif-nat failed; error detected.
libxl: error: libxl_create.c:1519:domcreate_attach_devices: Domain 25:unable to add vif devices
libxl: error: libxl_domain.c:1034:libxl__destroy_domid: Domain 25:Non-existant domain
libxl: error: libxl_domain.c:993:domain_destroy_callback: Domain 25:Unable to destroy guest
libxl: error: libxl_domain.c:920:domain_destroy_cb: Domain 25:Destruction of domain failed

It happens that it seems that's merely because handle_iptable() does not
pass a return value, and I guess the return value is thus that of the
latest command, which may not be true, and that makes vif-nat fail. The
attached patch fixes that.

Samuel

-- System Information:
Debian Release: bullseye/sid
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable-debug'), (500, 'testing-debug'), (500, 'stable-debug'), (500, 'proposed-updates-debug'), (500, 'proposed-updates'), (500, 'oldstable-proposed-updates-debug'), (500, 'oldstable-proposed-updates'), (500, 'oldoldstable'), (500, 'buildd-unstable'), (500, 'unstable'), (500, 'stable'), (500, 'oldstable'), (1, 'experimental-debug'), (1, 'buildd-experimental'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 5.6.0 (SMP w/8 CPU cores)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8), LANGUAGE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages xen-utils-common depends on:
ii  libc6           2.30-2
ii  libxenstore3.0  4.11.3+24-g14b62ab3e5-1
ii  lsb-base        11.1.0
ii  python          2.7.17-2
ii  ucf             3.0038+nmu1
ii  udev            244.3-1
ii  xenstore-utils  4.11.3+24-g14b62ab3e5-1

xen-utils-common recommends no packages.

Versions of packages xen-utils-common suggests:
pn  xen-doc  <none>

-- Configuration Files:
/etc/xen/scripts/vif-nat changed:
dir=$(dirname "$0")
. "$dir/vif-common.sh"
if [ -f /etc/dhcpd.conf ]
then
	dhcp=${dhcp:-yes}
else
	dhcp=${dhcp:-no}
fi
if [ "$dhcp" != 'no' ]
then
  dhcpd_conf_file=$(find_dhcpd_conf_file)
  dhcpd_init_file=$(find_dhcpd_init_file)
  dhcpd_arg_file=$(find_dhcpd_arg_file)
  if [ -z "$dhcpd_conf_file" ] || [ -z "$dhcpd_init_file" ] || [ -z "$dhcpd_arg_file" ]
  then
    echo 'Failed to find dhcpd configuration or init or args file.' >&2
    exit 1
  fi
fi
domid=$(xenstore_read "$XENBUS_PATH/frontend-id")
vifid=$(xenstore_read "$XENBUS_PATH/handle")
vifid=$(( $vifid + 1 ))
ip_from_dom()
{
  local domid1=$(( $domid / 256 ))
  local domid2=$(( $domid % 256 ))
  echo "10.$domid1.$domid2.$vifid/16"
}
routing_ip()
{
  echo $(echo $1 | awk -F. '{print $1"."$2"."$3"."$4 + 127}')
}
dotted_quad()
{
 echo\
 $(( ($1 & 0xFF000000) >> 24))\
.$(( ($1 & 0x00FF0000) >> 16))\
.$(( ($1 & 0x0000FF00) >> 8 ))\
.$((  $1 & 0x000000FF       ))
}
if [ "$ip" = "" ]
then
  ip=$(ip_from_dom)
fi
router_ip=$(routing_ip "$ip")
vif_ip=`echo ${ip} | awk -F/ '{print $1}'`
hostname=$(xenstore_read "$XENBUS_PATH/domain" | tr -- '_.:/+' '-----')
if [ "$vifid" != "1" ]
then
  hostname="$hostname-$vifid"
fi
dhcparg_remove_entry()
{
  local tmpfile=$(mktemp)
  sed -e "s/${dev} //" "$dhcpd_arg_file" >"$tmpfile"
  if diff "$tmpfile" "$dhcpd_arg_file" >/dev/null
  then
    rm "$tmpfile"
  else
    mv "$tmpfile" "$dhcpd_arg_file"
  fi
}
dhcparg_add_entry()
{
  dhcparg_remove_entry
  local tmpfile=$(mktemp)
  # handle Red Hat, SUSE, and Debian styles, with or without quotes
  sed -e 's/^DHCPDARGS="*\([^"]*\)"*/DHCPDARGS="\1'"${dev} "'"/' \
     "$dhcpd_arg_file" >"$tmpfile" && mv "$tmpfile" "$dhcpd_arg_file"
  sed -e 's/^DHCPD_INTERFACE="*\([^"]*\)"*/DHCPD_INTERFACE="\1'"${dev} "'"/' \
     "$dhcpd_arg_file" >"$tmpfile" && mv "$tmpfile" "$dhcpd_arg_file"
  sed -e 's/^INTERFACES="*\([^"]*\)"*/INTERFACES="\1'"${dev} "'"/' \
     "$dhcpd_arg_file" >"$tmpfile" && mv "$tmpfile" "$dhcpd_arg_file"
  rm -f "$tmpfile"
}
dhcp_remove_entry()
{
  local tmpfile=$(mktemp)
  grep -v "host $hostname" "$dhcpd_conf_file" >"$tmpfile"
  if diff "$tmpfile" "$dhcpd_conf_file" >/dev/null
  then
    rm "$tmpfile"
  else
    mv "$tmpfile" "$dhcpd_conf_file"
  fi
  dhcparg_remove_entry
}
dhcp_up()
{
  claim_lock "vif-nat-dhcp"
  dhcp_remove_entry
  mac=$(xenstore_read "$XENBUS_PATH/mac")
  echo >>"$dhcpd_conf_file" \
"host $hostname { hardware ethernet $mac; fixed-address $vif_ip; option routers $router_ip; option host-name \"$hostname\"; }"
  dhcparg_add_entry
  release_lock "vif-nat-dhcp"
  "$dhcpd_init_file" restart || true
}
dhcp_down()
{
  claim_lock "vif-nat-dhcp"
  dhcp_remove_entry
  release_lock "vif-nat-dhcp"
  "$dhcpd_init_file" restart || true # We need to ignore failure because
                                     # ISC dhcpd 3 borks if there is nothing
                                     # for it to do, which is the case if
                                     # the outgoing interface is not
                                     # configured to offer leases and there
                                     # are no vifs.
}
case "$command" in
    online)
        if ip route | grep -q "dev ${dev}"
        then
          log debug "${dev} already up"
          exit 0
        fi
        do_or_die ip link set dev "${dev}" up arp on
        do_or_die ip addr add "$router_ip" dev "${dev}"
        do_or_die ip route add "$vif_ip" dev "${dev}" src "$router_ip"
        echo 1 >/proc/sys/net/ipv4/conf/${dev}/proxy_arp
        [ "$dhcp" != 'no' ] && dhcp_up
        ;;
    offline)
        [ "$dhcp" != 'no' ] && dhcp_down
        do_without_error ifconfig "${dev}" down
        ;;
esac
handle_iptable
call_hooks vif post
log debug "Successful vif-nat $command for ${dev}."
if [ "$command" = "online" ]
then
  success
fi

/etc/xen/xl.conf changed:
vif.default.script="vif-nat"


-- no debconf information

-- 
Samuel
<Y> C'ETAIT PAS UN BUG !
<y> :ppp
<y> c ce qu'on dit ;)
<Y> (j'ai appuye sur ON, ca peut arriver, non ?)
 -+- #hp debuggue IRCprime -+-
-------------- next part --------------
--- a/tools/hotplug/Linux/vif-common.sh
+++ b/tools/hotplug/Linux/vif-common.sh
@@ -183,7 +183,7 @@ frob_iptable()
 handle_iptable()
 {
   # This function is disabled in Debian packaging. See Debian bug #894013.
-  return
+  return 0
 
   # Check for a working iptables installation.  Checking for the iptables
   # binary is not sufficient, because the user may not have the appropriate
@@ -191,7 +191,7 @@ handle_iptable()
   # anything with it, so we can just return.
   if ! iptables_w -L -n >&/dev/null
   then
-    return
+    return 0
   fi
 
   claim_lock "iptables"


More information about the Pkg-xen-devel mailing list