BBRplus报错sysctl No such file or directory的三个真实原因
装完BBRplus,按照教程执行开启命令,结果报了这样的错:
1 | sysctl: setting key "net.ipv4.tcp_congestion_control": No such file or directory |
服务器本身能正常连上,跟装BBRplus重启后连不上机器那种彻底失联不是一回事,也不是内核版本不支持那种脚本运行到装内核这一步就报错——这次是内核好像装完了、系统也正常,但真正启用的时候卡住了。这篇专门讲这个具体的sysctl报错,三种常见原因,从最常见到最容易被忽略排列。
先搞清楚这个报错到底在说什么
net.ipv4.tcp_congestion_control这个内核参数,只有当前内核已经加载了对应的拥塞控制算法模块,才会存在。sysctl报"No such file or directory",意思很直白:系统压根找不到这个参数对应的文件路径,说明当前正在运行的内核里,根本没有加载BBRplus这个模块,不是配置写错了,是这个模块从一开始就不存在。
先跑这条命令,看当前内核认识哪些拥塞控制算法:
1 | cat /proc/sys/net/ipv4/tcp_available_congestion_control |
如果输出里只有cubic、reno这些系统自带的算法,没有bbrplus,就确认是这个问题,接下来按顺序排查三种原因。
原因一:模块没有真正加载(最常见)
很多教程写的步骤是"装内核 → 重启 → 直接跑sysctl命令",但重启完内核本身启动了,不代表BBRplus这个模块自动加载了——有些安装方式需要重启之后手动加载一次模块:
1 | modprobe tcp_bbrplus |
跑完这条再用lsmod | grep bbr确认一下模块有没有出现在列表里,出现了再重新执行sysctl命令,这时候大概率就能正常设置成功了。如果希望以后每次开机都自动加载,不用每次手动跑,可以把模块名写进开机自动加载的配置文件里,具体写法根据发行版不同略有差异,Debian/Ubuntu系可以写进/etc/modules-load.d/目录下新建一个配置文件里。
原因二:VPS本身是OpenVZ虚拟化,根本装不了
这个原因比较容易被忽略,但一旦是这个情况,再怎么折腾模块加载都没用。OpenVZ是一种容器级别的虚拟化技术,所有OpenVZ容器共享宿主机的同一个内核,普通用户在容器内部没有权限、也没有能力去换成另一个内核——BBRplus这类需要专门编译替换内核的方案,前提就是"能自己换内核",OpenVZ环境从根上就不满足这个前提,装了也是白装,报错是必然的。
判断自己的VPS是不是OpenVZ,跑这条:
1 | systemd-detect-virt |
如果输出是openvz,说明确实是这个原因,BBRplus这条路走不通了,需要换成不依赖单独编译内核的方案,比如原版BBR(也需要内核支持,OpenVZ环境下同样可能用不了,具体看服务商宿主机内核版本),或者直接联系VPS服务商问一下宿主机内核是否已经开启了BBR——OpenVZ环境下,很多时候能不能用BBR,取决于服务商在宿主机层面有没有开,用户自己是决定不了的。
如果输出的是kvm或者xen,说明是全虚拟化,可以自己换内核,直接排除这个原因,回去检查原因一和原因三。
原因三:系统其实还在跑旧内核
内核确实装上了,但因为某些原因,重启之后系统实际启动的还是旧的内核,不是刚装的新内核,旧内核里自然没有BBRplus模块。用这条确认当前实际运行的内核版本:
1 | uname -r |
对照一下这个版本号是不是你刚装的那个新内核(新内核的版本号通常会带"bbrplus"字样)。如果对不上,说明GRUB的默认启动项没有正确切换到新内核,需要手动检查GRUB配置,或者重启时在启动菜单里手动选择新内核测试是否能正常进入,确认没问题后再设置为默认启动项。
小结
遇到这个sysctl报错,别急着重装系统或者反复重试同一个脚本,按available_congestion_control列表 → systemd-detect-virt虚拟化类型 → uname -r当前内核版本,这三步一步步排查,基本能定位到具体是哪种情况,对症处理就行。