最近在Windows11上捣鼓WSL2,跑了一个ubuntu的26.04系统。在Windows上启动WSL服务后,发现我blog在本地跑不起来了,即构建后出现以下错误:
1 2 3 4 5 INFO === Checking package dependencies === INFO === Checking theme configurations === INFO === Registering Hexo extensions === FATAL Permission denied. You can't use port 4000. FATAL Something' s wrong. Maybe you can find the solution here: https:
根据FATAL日志可知我们的 localhost:4000 貌似在引入WSL之后被占用了。
进一步了解发现:我们的Windows作为宿主机,在启用Hyper-V服务后,系统的部分端口会被Hyper-V占用。终端使用以下命令查看被保留的端口:
1 netsh int ipv4 show excludedportrange protocol=tcp
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 协议 tcp 端口排除范围 开始端口 结束端口 ---------- -------- 80 80 3421 3520 3583 3682 3683 3782 3783 3882 3883 3982 3983 4082 4083 4182 4183 4282 4283 4382 4383 4482 4483 4582 4583 4682 4683 4782 5357 5357 50000 50059 * * - 管理的端口排除。
可以发现我们的4000端口处于 3983~4082 之间被保留了。这也是为什么我们的程序跑不起来的原因。
这里要说明一点:保留区是动态划分的,也就是说每次重启都会随机划分,所以我们程序端口越高,越不容易和保留区撞车 。
解决方法:
将我们程序端口开在保留区之外的区域,例如4800以上(4783 以上大片空闲,不容易撞上保留区)。
修改动态端口范围
1 2 netsh int ipv4 set dynamicport tcp start=55000 num=10536 netsh int ipv6 set dynamicport tcp start=55000 num=10536
以上两行命令可以将动态端口保留区强制限制在 55000 ~ 65536 这个区间,这样就不容易和我们的程序冲突。
1 netsh int ipv4 add excludedportrange protocol=tcp startport=4000 numberofports=1
以上命令执行后,port4000将不会被划入保留端口。
不止是blog,端口随机保留会导致例如代理等服务不可访问,出现一些“有时可用,有时又不可用”的灵异问题。后续若再出现此类类似问题,应先从这方面考虑。