在 FreeBSD 11 中使用 Mellanox Connect-X2 (MNPA19-XTR) 10G 網卡

最近在 Taobao 上找到一個相當不錯的東西: Mellanox Connect-X2 10G NIC (MNPA19-XTR)。這張卡在淘寶上的價格是 150 人民幣,換算成台幣之後 700 元有找,相較於 Intel x520 價格只要大概 1/10 不到,作為入門的 10G 網卡來說真的相當划算,我又挑了幾款 Cisco 的 SFP+ DAC 線之後,就交由集貨運來台灣。10G 網卡目前對我最重要的用途就是作為 iSCSI Storage 的介面卡,FreeBSD 搭配 ZFS 在加上 kernel-level 的 iSCSI target 相當適合作為日常 Storage 、VM storage 或是教室、辦公室無碟系統使用。

FreeBSD 9.0 之後加入了 Mellanox/Infiniband 的支援,但是預設是沒有開啟的,因此裝上網卡後開機會看不到這張卡,我們得要自行編譯啟用。Mellanox 的 Driver 可以操作在 Ethernet 或是 Infiniband 模式,透過 sysctl 來切換操作的模式。在安裝上大致有兩種選擇,一種是把所需要的 kernel module 加入編譯設定檔後重新編譯 kernel,這會花上不少時間;如果你正好要重編 kernel可以透過這種方式。我採用的是另一種方式,只編譯我要的 kernel module。在編譯之前必須先下載跟你目前 FreeBSD 版本相同的 kernel sourcetree,因為我已經更新到最新的 FreeBSD 11.0-RELEASE-p10,直接透過 svn 下載最新的 source tree。

1
sudo svn checkout https://svn.freebsd.org/base/releng/11.0 /usr/src

接著透過一個簡單的 shell script 完成編譯跟安裝,因為我用不到 Infiniband 的功能,故在此只安裝 ethernet 相關的 module,Connect-X2 對應到的 driver 是 mlx4。

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh

cd /usr/src/sys/modules
for module in mlx4 mlxen; do
cd $module
make
make install
sync
kldload $module
printf "${module}_load=\"YES\"" >> /boot/loader.conf
cd ..
done

最後記得在 sysctl.conf 裡面設定網卡的操作模式

1
2
3
4
# sysctl.conf

# 設定第 0 port 操作在 ethernet 模式
sys.device.mlx4_coreX.mlx4_port0=eth

如果編譯及安裝成功,使用 kldstat 會看到 mlx4 跟 mlxen 被成功載入

1
2
3
4
5
6
7
8
9
$ kldstat
Id Refs Address Size Name
1 21 0xffffffff80200000 1fa88f8 kernel
2 1 0xffffffff821aa000 30aec0 zfs.ko
3 2 0xffffffff824b5000 adc0 opensolaris.ko
4 1 0xffffffff82b11000 2a05 uhid.ko
5 2 0xffffffff82b14000 311ec mlx4.ko
6 2 0xffffffff82b46000 fcf6 linuxkpi.ko
7 1 0xffffffff82b56000 12601 mlxen.ko

透過 ifconfig 可以看到 mlxen0 這張網卡

1
2
3
4
5
6
mlxen0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=6d07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWFILTER,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
ether 00:02:c9:XX:XX:XX
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (autoselect <full-duplex,rxpause,txpause>)
status: active

這樣就大功告成囉,但有一件事要注意,未來在做大版本更新的時候,別忘來要再重新編譯一次 kernel module 否則網卡會消失不見喔!