Multiple persistent USB NIC bindings for Intel NUCs on ESXi 7

In my homelab iam using three Intel NUCs (NUC8i7BEH) in a 3-node All-Flash vSAN Cluster running on VMware ESXi 7 and vCenter 7. Being a great piece of hardware to run ESXi in a homelab enviroment, the downside is, that most of the models come with just one onboard network adapter.

If you want to physically separate different types of traffic like Management, vSAN, vMotion, NFS or iSCSI or use technologies like Link-Aggregation, the only option is to use USB Network Adapters. In my case, iam using two TP-LINK UE300 USB 3.0 Network Adapters based on the Realtek RTL 8153 chipset for each ESXi host.

Songtao Zheng and William Lam did a great job with there VMware Fling USB Network Native Driver for ESXi supporting ESXi 6.5, ESXi 6.7 and ESXi 7.0. The installation is pretty straight forward, just download the corresponding ZIP-File for your ESXi version and install the Offline-Bundle with:

esxcli software vib install -d /full/path/to/the/offline_bundle_zip_file.zip

And select the vusbX USB Network Adapter as an uplink for your Standard Switch or Distributed Switch. I use them on two Distributed Switches.

The limitation comes with the persistent binding of the vusbX USB Network Adapters. Because the USB Network Adapter binding happens late in the boot process of the ESXi host and we want the ESXi host to preserve its setting upon a reboot, the configuration should be added to the /etc/rc.local.d/local.sh file. The provided sample configuration worked for ESXi 7.0 but it is only for one vusbX USB Network Adapter. I needed a solution for two adapters on one host. I took the Distributed Switch configuration and added some code to preserve the settings for two adapters.

VDS_0_NAME=vDS
VDS_0_PORT_ID=10
VDS_1_NAME=vDS-NSX
VDS_1_PORT_ID=2

vusb0_status=`esxcli network nic get -n vusb0 | grep 'Link Status' | awk '{print "v0:" $NF}'` && vusb1_status=`esxcli network nic get -n vusb1 | grep 'Link Status' | awk '{print "v1:" $NF}'`
count=0
while [[ $count -lt 40 ]] && [[ "${vusb0_status}" != "v0:Up" || "${vusb1_status}" != "v1:Up" ]]
do
	sleep 5
	count=$(( $count + 1 ))
	vusb0_status=`esxcli network nic get -n vusb0 | grep 'Link Status' | awk '{print "v0:" $NF}'` && vusb1_status=`esxcli network nic get -n vusb1 | grep 'Link Status' | awk '{print "v1:" $NF}'`
done

if [ "${vusb0_status}" = "v0:Up" ]; then
    esxcfg-vswitch -P vusb0 -V ${VDS_0_PORT_ID} ${VDS_0_NAME}
fi

if [ "${vusb1_status}" = "v1:Up" ]; then
    esxcfg-vswitch -P vusb1 -V ${VDS_1_PORT_ID} ${VDS_1_NAME}
fi

Note: Dont forget to change VDS_[0,1]_NAME and VDS_[0,1]_PORT to match your ESXi settings.

Because of the physical Switchports, the VLAN configuration and the Distributed Switch Uplink binding, i had to make sure, that vusb0 will be vusb0 after a reboot and that the adapters do not get reversed. I noticed very soon in the testing process that on my NUCs with both USB Network Adapters connected to the rear USB-Ports, the lower one was always presented as vusb0 and the upper one always as vusb1.

Finally a Intel NUC with three 1Gbit/s adapter to play with… Leave a comment or find me on Twitter.

This Post Has One Comment

  1. Alex

    👍🏻 Thanks for the good Blog. The solution with the Nuc is very interesting. 😉

    Kind regards Alex

Comments are closed.