Commit 72651f02 authored by Kroese's avatar Kroese Committed by GitHub
Browse files

Add vhost support in NAT mode

Add vhost support in NAT mode
parents 2b1ba544 de61445f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ services:
            BOOT: "http://www.example.com/image.iso"
        devices:
            - /dev/kvm
            - /dev/vhost-net
        cap_add:
            - NET_ADMIN                       
        ports:
+2 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
<div align="center">

[![Build]][build_url]
[![Version]][build_url]
[![Version]][ghcr_url]
[![Size]][ghcr_url]

[build_url]: https://github.com/qemu-tools/qemu-docker/
@@ -38,6 +38,7 @@ services:
            BOOT: "http://www.example.com/image.iso"
        devices:
            - /dev/kvm
            - /dev/vhost-net
        cap_add:
            - NET_ADMIN                       
        ports:
+4 −4
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ if [ -f "${DATA}" ]; then

    echo "INFO: Resizing data disk from $OLD_SIZE to $DATA_SIZE bytes.."

    if [ "$ALLOCATE" = "N" ]; then
    if [[ "${ALLOCATE}" == [Nn]* ]]; then

      # Resize file by changing its length
      truncate -s "${DATA_SIZE}" "${DATA}"; 
@@ -45,7 +45,7 @@ if [ -f "${DATA}" ]; then
        echo "ERROR: Could not allocate a file for the data disk." && exit 85
      fi

      if [ "$ALLOCATE" = "Z" ]; then
      if [[ "${ALLOCATE}" == [Zz]* ]]; then

        GB=$(( (REQ + 1073741823)/1073741824 ))

@@ -68,7 +68,7 @@ fi

if [ ! -f "${DATA}" ]; then

  if [ "$ALLOCATE" = "N" ]; then
  if [[ "${ALLOCATE}" == [Nn]* ]]; then

    # Create an empty file
    truncate -s "${DATA_SIZE}" "${DATA}"
@@ -89,7 +89,7 @@ if [ ! -f "${DATA}" ]; then
      echo "ERROR: Could not allocate a file for the data disk." && exit 87
    fi

    if [ "$ALLOCATE" = "Z" ]; then
    if [[ "${ALLOCATE}" == [Zz]* ]]; then

      echo "INFO: Preallocating ${DISK_SIZE} of diskspace, please wait..."
      dd if=/dev/urandom of="${DATA}" count="${DATA_SIZE}" bs=1M iflag=count_bytes status=none
+2 −2
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ else
  PROGRESS="--progress=dot:giga"
fi

[ "$DEBUG" = "Y" ] && set -x
[[ "${DEBUG}" == [Yy1]* ]] && set -x

{ wget "$BOOT" -O "$TMP" -q --no-check-certificate --show-progress "$PROGRESS"; rc=$?; } || :
(( rc != 0 )) && echo "ERROR: Failed to download ${BOOT}, reason: $rc" && exit 60
@@ -31,6 +31,6 @@ FILE="$STORAGE/boot.img"
mv -f "$TMP" "$FILE"

{ set +x; } 2>/dev/null
[ "$DEBUG" = "Y" ] && echo
[[ "${DEBUG}" == [Yy1]* ]] && echo

return 0
+22 −19
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ configureDHCP() {
  NETWORK=$(ip -o route | grep "${VM_NET_DEV}" | grep -v default | awk '{print $1}')
  IP=$(ip address show dev "${VM_NET_DEV}" | grep inet | awk '/inet / { print $2 }' | cut -f1 -d/)

  [ "$DEBUG" = "Y" ] && set -x
  [[ "${DEBUG}" == [Yy1]* ]] && set -x
  { ip link add link "${VM_NET_DEV}" "${VM_NET_VLAN}" type macvlan mode bridge 2> /dev/null ; rc=$?; } || :

  if (( rc != 0 )); then
@@ -80,12 +80,6 @@ configureDHCP() {
    echo "container: --device-cgroup-rule='c ${MAJOR}:* rwm' --device=/dev/vhost-net" && exit 21
  fi

  # Create /dev/vhost-net
  if [ ! -c /dev/vhost-net ]; then
    mknod /dev/vhost-net c 10 238
    chmod 660 /dev/vhost-net
  fi

  { exec 40>>/dev/vhost-net; rc=$?; } || :

  if (( rc != 0 )); then
@@ -99,7 +93,7 @@ configureDHCP() {
configureNAT () {

  VM_NET_IP='20.20.20.21'
  [ "$DEBUG" = "Y" ] && set -x
  [[ "${DEBUG}" == [Yy1]* ]] && set -x

  #Create bridge with static IP for the VM guest

@@ -129,7 +123,7 @@ configureNAT () {
  fi

  { set +x; } 2>/dev/null
  [ "$DEBUG" = "Y" ] && echo
  [[ "${DEBUG}" == [Yy1]* ]] && echo

  #Check port forwarding flag
  if [[ $(< /proc/sys/net/ipv4/ip_forward) -eq 0 ]]; then
@@ -149,9 +143,12 @@ configureNAT () {

  NET_OPTS="-netdev tap,ifname=${VM_NET_TAP},script=no,downscript=no,id=hostnet0"

  { exec 40>>/dev/vhost-net; rc=$?; } || :
  (( rc == 0 )) && NET_OPTS="$NET_OPTS,vhost=on,vhostfd=40"

  # Build DNS options from container /etc/resolv.conf

  if [ "$DEBUG" = "Y" ]; then
  if [[ "${DEBUG}" == [Yy1]* ]]; then
    echo "/etc/resolv.conf:" && echo && cat /etc/resolv.conf && echo
  fi

@@ -178,7 +175,7 @@ configureNAT () {

  DNSMASQ_OPTS=$(echo "$DNSMASQ_OPTS" | sed 's/\t/ /g' | tr -s ' ' | sed 's/^ *//')

  [ "$DEBUG" = "Y" ] && set -x
  [[ "${DEBUG}" == [Yy1]* ]] && set -x

  $DNSMASQ ${DNSMASQ_OPTS:+ $DNSMASQ_OPTS}

@@ -198,13 +195,19 @@ fi

[ ! -c /dev/net/tun ] && echo "ERROR: TUN network interface not available..." && exit 85

# Create the necessary file structure for /dev/vhost-net
if [ ! -c /dev/vhost-net ]; then
  mknod /dev/vhost-net c 10 238
  chmod 660 /dev/vhost-net
fi

update-alternatives --set iptables /usr/sbin/iptables-legacy > /dev/null
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy > /dev/null

VM_NET_MAC="${VM_NET_MAC//-/:}"
GATEWAY=$(ip r | grep default | awk '{print $3}')

if [ "$DEBUG" = "Y" ]; then
if [[ "${DEBUG}" == [Yy1]* ]]; then

  IP=$(ip address show dev "${VM_NET_DEV}" | grep inet | awk '/inet / { print $2 }' | cut -f1 -d/)
  echo "INFO: Container IP is ${IP} with gateway ${GATEWAY}" && echo
@@ -213,12 +216,7 @@ if [ "$DEBUG" = "Y" ]; then

fi

if [ "$DHCP" != "Y" ]; then

  # Configuration for static IP
  configureNAT

else
if [[ "${DHCP}" == [Yy1]* ]]; then

  if [[ "$GATEWAY" == "172."* ]]; then
    echo -n "ERROR: You cannot enable DHCP while the container is "
@@ -228,10 +226,15 @@ else
  # Configuration for DHCP IP
  configureDHCP

else

  # Configuration for static IP
  configureNAT

fi

NET_OPTS="${NET_OPTS} -device virtio-net-pci,romfile=,netdev=hostnet0,mac=${VM_NET_MAC},id=net0"

[ "$DEBUG" = "Y" ] && echo && echo "Finished network setup.." && echo
[[ "${DEBUG}" == [Yy1]* ]] && echo && echo "Finished network setup.." && echo

return 0
Loading