Intel NICを搭載したLinuxサーバのLLDPが正しく動作しない問題
サマリー
Intel NICを搭載したLinuxサーバにおいて lldpd をインストールして設定を行ってもその設定が反映されず、ハードウェアの情報が表示される場合、Intel NIC (i40e) のLLDPオフロードが有効になっているためこれを無効にする必要がある。
詳細
lldpdを apt install lldpd でインストールしたのち、以下のように設定を行った。
configure system interface pattern eno*,ens* configure lldp portidsubtype ifname
ネットワークスイッチ側からLLDPネイバーを表示すると以下のようになった。Chassis IdにはMACアドレス、Port infoにはLinux上でのインターフェイス名が見えることが期待値であったが、ハードウェア固有の値が表示されている。
{master:0} me@myswitch> show lldp neighbors Local Interface Parent Interface Chassis Id Port info System Name xe-0/0/8 ae2 39373638-3935-5099-4E99-303330309999Embedded ALOM, Port 1 xe-0/0/10 ae2 39373638-3935-5099-4E99-303330309999PCI-E Slot 1, Port 1
{master:0} me@myswitch> show lldp neighbors interface xe-0/0/8 LLDP Neighbor Information: Local Information: Index: 147 Time to live: 121 Time mark: Tue Jun 2 06:27:34 2020 Age: 12 secs Local Interface : xe-0/0/8 Parent Interface : ae2 Local Port ID : 521 Ageout Count : 0 Neighbour Information: Chassis type : Locally assigned Chassis ID : 39373638-3935-5099-4E99-303330309999 Port type : Mac address Port ID : 00:00:5e:a2:72:00 Port description : Embedded ALOM, Port 1 System Description : HPE ProLiant DL360 Gen10
また、サーバ側からLLDPの自身の情報とネイバーの情報を表示すると、ChassisIDやPorIDが正しく設定されていることがわかり、ネイバーが見えていないこともわかる。スイッチ側の設定はスイッチ間のLLDP設定で正しく表示できていることが確認できていたため、これはスイッチからのLLDPDUがLinuxのレイヤーまで届いていないということになる。
root@myserver:~# lldpcli show chassis ------------------------------------------------------------------------------- Local chassis: ------------------------------------------------------------------------------- Chassis: ChassisID: mac 00:00:5e:7b:a4:10 SysName: myserver SysDescr: Ubuntu 18.04.3 LTS Linux 4.15.0-55-generic #60-Ubuntu SMP Tue Jul 2 18:22:20 UTC 2019 x86_64 MgmtIP: 10.102.253.54 MgmtIP: fe80::ac91:afff:fe1f:aee0 Capability: Bridge, on Capability: Router, on Capability: Wlan, off Capability: Station, off ------------------------------------------------------------------------------- [lldpcli] # show interfaces ports eno5 ------------------------------------------------------------------------------- LLDP interfaces: ------------------------------------------------------------------------------- Interface: eno5, via: unknown Chassis: ChassisID: mac 00:00:5e:7b:a4:10 SysName: myserver Port: PortID: ifname eno5 PortDescr: eno5 TTL: 120 -------------------------------------------------------------------------------
root@myserver:~# lldpcli show neighbor ports eno5 ------------------------------------------------------------------------------- LLDP neighbors: -------------------------------------------------------------------------------
生のハードウェアIDが表示されていたため、BIOSの設定を疑って漁ってみたが、見つからなくて途方に暮れたので友人たちに訪ねてみると早速ヒントを貰った
NICか何かがオフロードしちゃって応答してたとかいう事象があったような… https://t.co/qOrKDpdi4u
— Masayuki Kobayashi (@markunet) 2020年6月2日
Intel NIC (i40eドライバ)でLLDPのオフロードが有効になっているようである。
centos6 - Disable internal Intel X710 LLDP agent - Server Fault
バージョン2.3.6以降のi40eのドライバーではethtool経由でLLDPオフロードを無効にできるようであるが、Ubuntu18.04で使っていたドライバはそれより若いバージョンであったため、 debugコマンド経由で無効にする方法を利用した。以下のようにdisable-lldp-offload.sh という名前でスクリプトを配置し、再起動時でもオフロードの無効化が自動でできるようにするため、/etc/cron.d/lldp から@rebootで呼び出すことにした(systemdではなく)。
#!/bin/bash i40e_path=/sys/kernel/debug/i40e for dev in $i40e_path/*; do [ -e "$dev" ] || break echo lldp stop > "${dev}/command” done
@reboot root sleep 60 && /root/disable-lldp-offload.sh
スイッチ側からも無事に正しい情報を参照できるようになった。
{master:0} me@myswitch> show lldp neighbors Local Interface Parent Interface Chassis Id Port info System Name xe-0/0/8 ae2 00:00:5e:7b:a4:10 eno5 myserver xe-0/0/10 ae2 00:00:5e:7b:a4:10 ens1f0 myserver
ありがとう @markunet !!