Thoughts, stories and ideas.

Intel® NUC10 软路由历险记

. 9 min read . Written by Xinbao Dong
Intel® NUC10 软路由历险记

最近入了软路由的坑,入坑过程如下:

  1. 家里办了上海电信企业宽带,叠加精品网。上行 100Mbps,下行 500Mbps。好马配好鞍,准备把之前凑数的 K3 换了。
  2. 就这样进入了软路由的世界,一开始的打算是买个 3850U CPU 附近价位的,于是最终挑了一只 J4150 工控机。光速入手,让卖家帮忙刷了 esxi 并做了 WAN 口直通。领回家装了 ROS 和 Debian:ROS 不用说用作主路由(毕竟稳定);Debian 当个服务器,主要干**的事情。
  3. 就这样相安无事满意了一星期,内心又开始躁动了。躁动的原因是看到 J4105 跑满了 500M 后,CPU 占用率也快满了。强迫症如我当然不能忍,于是寻求更高端(gui)的解决方案。
  4. 我要求挺高,首先路由要小,其次性能要好,最好是工控机。从淘宝里面众多工控机里全量进行了筛选,7500U、8250U 等等的进入我的视野。但是,这些奇奇怪怪牌子的工控机,首先品质无法保障,我还是希望追求稳定;其次就是都不怎么好看(可能是主要原因)……
  5. 然后我找了找品牌厂商,终于淘到了索泰 MI643 和本文主角 NUC10。MI643 双网口(大声告诉我,可以做什么),不过据说是螃蟹的,心有芥蒂,其次还很贵,当时天猫活动准系统大概 2850 左右。NUC10 寒霜峡谷售价大概在 2450(咸鱼),单网口令人无奈,其他没什么缺陷。又挣扎了一天,逛了逛各大软路由论坛,实际上 NUC10+千兆网卡也算是一个可行的选择。
  6. 本着 NUC10 人气高,出问题也好解决的方针,最终还是入了寒霜峡谷 NUC10i5FNK。当天拼多多入手了 2.5G 网卡,京东入手了西部数据蓝盘 250G,拆了俩 iMac 上的内存条,正式走进了 NUC 的世界。

先小小做个总结:

经过一星期的使用下来,NUC10i5FNK 做软路由,除了一开始稍微折腾一下之外,之后还是非常稳定的。

优点:

  1. 外观好看,小巧,整体体积 115*112*38 真的是无人能敌。
  2. 没了,好看就够了。说笑了~性能强大,2450 的价位相对于工控机来说也不至于贵的离谱,毕竟三年保修。

缺点:

  1. 当然是只有一个网口,如果要当软路由只能配网关交换机,或者加一张 USB 网卡。我用的是 USB 网卡方案,相对来说网卡会比较烫,不过速度上没什么问题。

正式开始历险

NUC10 拿到手,真的是好小。拆机非常方便,把新鲜到手的硬盘和内存插上,开机,插入之前写好 esxi 6.7 安装文件的 U 盘开始安装,于是碰到了第一个坑。

坑一:ESXI 6.7 原生不支持 NUC10 网卡

安装到一半,ESXI 提示找不到网卡所以安装终止。

这坑非常好解决,Google 搜索“NUC10 ESXI” 第一个结果就是,傻瓜化的教程。总结就是 ESXI 默认的 NE1000 驱动不支持 NUC10 的网卡,不过开发者已经适配好了,但是没有合入 ESXI 的主干,需要自己重新集成进去。

集成驱动地址如下 ,因为我是 Mac,所以开了个 Windows 虚拟机集成了一下。注意,Mac 的 Powershell 不支持。

重新写入了 U盘,ESXI 至此安装成功。

坑二:ESXI 不支持 2.5Gbps USB 网卡

实际上,在购买之前我已经看了 ESXI 网卡的支持情况,需要安装额外的驱动来支持。主要有两个选择:第一个是 VMWare Flings,看起来有着半官方背景;第二个是用户 Gomes 自己编译的 RTL8152 系列的驱动,但是怎么使用似乎没怎么说清楚(至少作为一个 ESXI 新手我走了很多弯路)。

VMWare Flings 驱动支持千兆的 USB 网卡(例如ASIX88179、RTL8152),比如某联的就完美支持,但是它不支持 2.5Gpbs 的网卡 RTL8156;Gomes 编译的驱动理论上支持 RTL815x 系列。由于我买的某联是 RTL8156,所以只能选择后者。

中途踩了不少坑,直接说驱动 RTL8156 网卡一条正确的途径吧:

  1. 安装 vib,驱动在上面链接是有。可以选择在集成 ESXI 的时候直接将 vib 集成进去,也可以在安装后 ESXI 后,将 vib 文件通过 scp 传入到 ESXI 上,在命令行安装,重启。

    esxcli software vib install -v  xx.vib   # xx.vib 为文件名
    
  2. 最最最关键的一步,关闭 vmkusb。ESXI 新版本用 vmkusb 替代了usb、usbnet、usb-storage 等废弃模块,但是安装的 r8152 驱动依然是基于 usbnet 的。

    esxcli system module set -m=vmkusb -e=FALSE
    
  3. 重启后,检查 r8152 和 usbnet 是否加载成功。按照作者的说法,在 vmkusb 关闭了之后,usbnet 等会自动进行加载。但是我这边却不会自动加载,只能手动去 vmkload_mod。试过了 esxcfg-module 等命令,但是还是无法成功。如果有同学知道原因,麻烦告知下~

    vmkload_mod -l | egrep "r8152|usbnet"     # 检查 r8152 和 usbnet 的加载情况
    # 如果没自动加载,执行以下两句试试
    vmkload_mod usbnet
    vmkload_mod r8152
    
  4. 理论上这时候就可以在 ESXI 网页上看到网卡啦,或者你也可以通过命令行查看:

    esxcli network nic list
    
  5. 设置自启动,因为 usb 网卡官方没有支持,所以在重启之后,vSwitch 的关联会掉,所以需要在重启之后进行关联。主要参考了 VMWare Flings 的脚本,需要修改 /etc/rc.local.d/local.sh 文件,加入以下内容

    # 加载模块(如果你自动加载了,那就不需要这两句了)
    vmkload_mod usbnet
    vmkload_mod r8152
    
    # 我的 USB 网卡名是 vmnic32,这个可以通过上面第四点拿到,各位根据需要替换成自己的网卡名称。
    vusb0_status=$(esxcli network nic get -n vmnic32 | grep 'Link Status' | awk '{print $NF}')
    count=0
    while [[ $count -lt 20 && "${vusb0_status}" != "Up" ]]
    do
        sleep 1
        count=$(( $count + 1 ))
        vusb0_status=$(esxcli network nic get -n vmnic32 | grep 'Link Status' | awk '{print $NF}')
    done
    # 等待网卡上线之后,绑定 vSwitch
    if [ "${vusb0_status}" = "Up" ]; then
        esxcfg-vswitch -L vmnic32 vSwitch1
        #esxcfg-vswitch -M vmnic32 -p "Management Network" vSwitch1
        esxcfg-vswitch -M vmnic32 -p "VM Network1" vSwitch1
    fi
    

至此,ESXI 可以正常识别网卡,将NUC 自带网卡设置直通也是没问题的,不过感觉 NUC 这性能应该也不用。于是乎,ESXI 历险告一段落……

第二次历险:

因为 ESXI 天然不支持 USB 网卡,所以是不是可以考虑下天然支持 ESXI 的 Proxmox VE 呢?内心又开始蠢蠢欲动,在一个夜黑风高的夜晚,我用一张写入了 PVE 最新版的 U 盘,成功把自己弄得没网了。

事先我也是查了资料的,PVE USB 网卡资料会少一些,因为毕竟是天然支持,所以我想当然的认为我的 RTL8156 也支持了。事实上,我在装完 PVE 的时候,确实看到了两张网卡(一张内置的,一张 USB 网卡),内心非常兴奋。我尝试了把 USB 网卡当做 WAN 给 ROS 进行拨号,却始终拨号不成功。不死心把 NUC 内置网卡当做 WAN,USB 网卡当做 LAN,拨号成功了,但是上不了网,并且 USB 网卡协商速率只有 10Mbps…

因为我是 PVE 的初初初学者,ESXI 好歹也折腾了一下 J4105 软路由,PVE 就完全没经验了。最终还是在 syslog 里发现了端倪,USB 网卡在不断的 connect、disconnect,于是猜测是驱动问题了。

坑三:PVE 原生不支持 RTL8156 网卡

从 Github 上找到了驱动,需要自己编译下,编译其实很简单,安装头文件、依赖后编译即可:

# 安装 pve headers
wget http://download.proxmox.com/debian/pve/dists/buster/pvetest/binary-amd64/pve-headers-5.4.34-1-pve_5.4.34-2_amd64.deb
dpkg -i pve-headers-5.4.34-1-pve_5.4.34-2_amd64.deb
# 下载驱动
wget https://github.com/wget/realtek-r8152-linux/archive/v2.13.20200712.tar.gz
tar zxvf v2.13.20200712.tar.gz
cd realtek-r8152-linux-2.13.20200712/
# 安装编译工具
apt install build-essential libelf-dev  -y
# 编译后,可以拿到 r8152.ko module 文件
make
# 顺便找了下原 r8152 的 module,直接替换了,省心。(记得把原文件备份下)
cp r8152.ko /usr/lib/modules/5.4.34-1-pve/kernel/drivers/net/usb/r8152.ko

重启,发现 PVE 能够正常识别 RTL8156 网卡了,ROS 下也可以把 USB 网卡作为 WAN 拨号使用了。至此,PVE 方案也比较完美解决了。啰嗦一点,PVE 下 ROS 网卡的模型最好选 VirtIO ,选了 Intel E1000 发现跑不满。

最后

  1. 如果没有 2.5Gbps 的需求,还是乖乖买千兆网卡吧,比如某联的 RTL8152 就挺好。我试了下 Dell DA300,也能被 PVE 完美识别。
  2. NUC10 做一台 All in One 的设备来说,性能是完全足够的。同样的隧道跑满 500M,NUC10 下 CPU 占用仅为 35%,非常够用。单网口是 NUC10 的缺陷,但是用 USB 网卡完全可以弥补。目前 PVE 连续运行 6 天了,还没发现什么问题。
  3. 如果有什么 ESXI、PVE 网卡驱动上的问题(包括索要 PVE 网卡编译的 ko module),欢迎留言或者邮件。