diff --git a/vm-tool-setup.sh b/vm-tool-setup.sh index 125b52a..8370243 100755 --- a/vm-tool-setup.sh +++ b/vm-tool-setup.sh @@ -2,7 +2,7 @@ set -euo pipefail -echo "=== [1/5] Updating system and installing tools ===" +echo "=== [1/5] Installing essentials ===" sudo apt update sudo apt -y upgrade sudo apt install -y qemu-guest-agent util-linux haveged ethtool lshw dmidecode @@ -13,23 +13,35 @@ sudo systemctl enable --now qemu-guest-agent echo "=== [3/5] Trimming filesystems ===" sudo fstrim -av || true -echo "=== [4/5] Detecting VM NICs ===" -NIC_LIST=() -for nic in /sys/class/net/*; do - nicname=$(basename "$nic") - if [[ "$nicname" != "lo" && "$nicname" != vmbr* && "$nicname" != tap* && "$nicname" != veth* && "$nicname" != docker* ]]; then - NIC_LIST+=("$nicname") - fi -done +echo "=== [4/5] Creating conditional NIC tuning script ===" +TUNER_SCRIPT="/usr/local/sbin/conditional-nic-tuning.sh" -if [[ ${#NIC_LIST[@]} -eq 0 ]]; then - echo "⚠️ No usable NICs detected. Exiting." - exit 1 +sudo tee "$TUNER_SCRIPT" > /dev/null <<'EOSCRIPT' +#!/bin/bash +set -euo pipefail + +HYPERVISOR=$(systemd-detect-virt) +BROADCOM_FOUND=$(lspci | grep -i "broadcom" || true) + +if [[ "$HYPERVISOR" == "kvm" && -n "$BROADCOM_FOUND" ]]; then + echo "✅ Broadcom NIC on KVM detected — applying NIC tuning" + + for nic in /sys/class/net/*; do + name=$(basename "$nic") + [[ "$name" =~ ^(lo|vmbr|tap|veth|docker) ]] && continue + + echo "→ Tuning $name" + /usr/sbin/ethtool -K "$name" tx off rx off tso off gso off gro off || true + /sbin/ip link set "$name" txqueuelen 10000 || true + done +else + echo "❌ Skipping NIC tuning — not KVM with Broadcom NIC" fi +EOSCRIPT -echo "VM NICs detected: ${NIC_LIST[*]}" +sudo chmod +x "$TUNER_SCRIPT" -echo "=== [5/5] Creating systemd service with conditional logic ===" +echo "=== [5/5] Creating systemd service file ===" SERVICE_FILE="/etc/systemd/system/conditional-nic-offload.service" sudo tee "$SERVICE_FILE" > /dev/null <