proxmox: NIC issues with e1000e network adapters

Troubleshooting KB with e1000e NICs on proxmox
Feb 8, 2026 AI Generated (Verified) Author:
  • pabu
Default Thumbnail
Image credit: psalabs.eu

Summary

Some Intel onboard NICs using the e1000e driver can intermittently lose network connectivity on Proxmox VE and repeatedly log errors like:

  • e1000e … Detected Hardware Unit Hang

This can cascade into Linux bridge ports being disabled (VM connectivity loss) and may trigger reboot/recovery automation if present.

A commonly used mitigation is to disable specific NIC offloads (especially TSO) and disable EEE (Energy Efficient Ethernet), then re-apply those settings on every boot using a systemd unit.

Symptoms

  • Intermittent network loss on the Proxmox host
  • VMs lose connectivity (bridge ports enter disabled state)
  • Kernel logs show repeated hang messages

Example kernel log line:

e1000e 0000:00:1f.6 enp0s31f6: Detected Hardware Unit Hang
e1000e 0000:00:1f.6 enp0s31f6: Detected Hardware Unit Hang

Affected components

  • Proxmox VE host
  • Intel onboard NIC using the e1000e driver
  • Example interface: enp0s31f6

Solution overview

  1. Confirm the interface uses the e1000e driver
  2. Disable offloads (TSO/GSO/GRO)
  3. Disable EEE (if enabled/active)
  4. Persist both changes via a systemd oneshot unit
  5. Verify after reboot and monitor logs for recurrence

Step 1 — Confirm NIC driver and interface

# Show NIC + driver mapping
lspci -nnk | grep -A3 -i ethernet

# Driver details for the interface
ethtool -i enp0s31f6
# Show NIC + driver mapping
lspci -nnk | grep -A3 -i ethernet

# Driver details for the interface
ethtool -i enp0s31f6

Step 2 — Apply mitigations immediately (runtime)

Check current state:

ethtool -k enp0s31f6 | egrep 'tcp-segmentation-offload|generic-segmentation-offload|generic-receive-offload'
ethtool -k enp0s31f6 | egrep 'tcp-segmentation-offload|generic-segmentation-offload|generic-receive-offload'

Disable the common problematic features:

ethtool -K enp0s31f6 tso off gso off gro off
ethtool -K enp0s31f6 tso off gso off gro off

Check:

ethtool --show-eee enp0s31f6
ethtool --show-eee enp0s31f6

Disable:

ethtool --set-eee enp0s31f6 eee off
ethtool --set-eee enp0s31f6 eee off

Note: ethtool settings are not persistent across reboot unless re-applied.

Step 3 — Persist across reboot with systemd

3.1 Create the service

Create /etc/systemd/system/nic-offloads.service:

[Unit]
Description=Disable problematic NIC offloads + EEE for e1000e stability
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
# Offloads (common mitigation for e1000e hangs)
ExecStart=/usr/sbin/ethtool -K enp0s31f6 tso off gso off gro off
# EEE (recommended if active)
ExecStart=/usr/sbin/ethtool --set-eee enp0s31f6 eee off
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
[Unit]
Description=Disable problematic NIC offloads + EEE for e1000e stability
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
# Offloads (common mitigation for e1000e hangs)
ExecStart=/usr/sbin/ethtool -K enp0s31f6 tso off gso off gro off
# EEE (recommended if active)
ExecStart=/usr/sbin/ethtool --set-eee enp0s31f6 eee off
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

3.2 Enable and run it now

systemctl daemon-reload
systemctl enable --now nic-offloads.service
systemctl restart nic-offloads.service
systemctl daemon-reload
systemctl enable --now nic-offloads.service
systemctl restart nic-offloads.service

Step 4 — Verification checklist

4.1 Verify EEE is disabled

ethtool --show-eee enp0s31f6
ethtool --show-eee enp0s31f6

Expected:

  • EEE status: disabled

4.2 Verify offloads are disabled

ethtool -k enp0s31f6 | egrep 'tcp-segmentation-offload|generic-segmentation-offload|generic-receive-offload'
ethtool -k enp0s31f6 | egrep 'tcp-segmentation-offload|generic-segmentation-offload|generic-receive-offload'

Expected:

  • tcp-segmentation-offload: off
  • generic-segmentation-offload: off
  • generic-receive-offload: off

4.3 Verify service ran successfully

systemctl status nic-offloads.service --no-pager
journalctl -u nic-offloads.service -b --no-pager
systemctl status nic-offloads.service --no-pager
journalctl -u nic-offloads.service -b --no-pager

Step 5 — Logging & monitoring

mkdir -p /var/log/journal
systemctl restart systemd-journald
mkdir -p /var/log/journal
systemctl restart systemd-journald

5.2 Monitor for recurrence

journalctl -k -f | egrep -i 'e1000e|Hardware Unit Hang|NETDEV WATCHDOG|timed out|reset'
journalctl -k -f | egrep -i 'e1000e|Hardware Unit Hang|NETDEV WATCHDOG|timed out|reset'

To review the previous boot if a reboot happens again:

journalctl -b -1 -k --no-pager | egrep -i 'e1000e|Hardware Unit Hang|NETDEV WATCHDOG|timed out|reset'
journalctl -b -1 -k --no-pager | egrep -i 'e1000e|Hardware Unit Hang|NETDEV WATCHDOG|timed out|reset'

Rollback

Re-enable offloads (choose what you want on):

ethtool -K enp0s31f6 tso on gso on gro on
ethtool -K enp0s31f6 tso on gso on gro on

Re-enable EEE (if desired):

ethtool --set-eee enp0s31f6 eee on
ethtool --set-eee enp0s31f6 eee on

Disable persistence:

systemctl disable --now nic-offloads.service
rm -f /etc/systemd/system/nic-offloads.service
systemctl daemon-reload
systemctl disable --now nic-offloads.service
rm -f /etc/systemd/system/nic-offloads.service
systemctl daemon-reload

If the issue persists

  1. Update BIOS/firmware (board + NIC)
  2. Test a different Proxmox kernel version (regression check)
  3. Consider e1000e tuning parameters (advanced)
  4. Long-term reliability: add a more robust NIC (e.g., Intel i210/i350 class)

Quick copy/paste: reapply + verify

# Apply now
ethtool -K enp0s31f6 tso off gso off gro off
ethtool --set-eee enp0s31f6 eee off

# Verify
ethtool --show-eee enp0s31f6
ethtool -k enp0s31f6 | egrep 'tcp-segmentation-offload|generic-segmentation-offload|generic-receive-offload'

# Service logs
systemctl status nic-offloads.service --no-pager
journalctl -u nic-offloads.service -b --no-pager
# Apply now
ethtool -K enp0s31f6 tso off gso off gro off
ethtool --set-eee enp0s31f6 eee off

# Verify
ethtool --show-eee enp0s31f6
ethtool -k enp0s31f6 | egrep 'tcp-segmentation-offload|generic-segmentation-offload|generic-receive-offload'

# Service logs
systemctl status nic-offloads.service --no-pager
journalctl -u nic-offloads.service -b --no-pager

References

  • Proxmox forum thread: Intel NIC e1000e hardware unit hang
  • Garrett Laman: Fixing Intel e1000e NIC hangs on Proxmox nodes
  • Kernel docs: Intel e1000e driver
  • systemd: Running services after the network is up (network-online.target)
  • ethtool documentation (EEE / offloads)