自从使用Winux(WSL的昵称,我这样叫这个玩意,挺有意思),赶脚有点爱上Windows下的这个好玩有趣的功能了。这个子系统可以在Windows下轻松的操作Linux,而且不用重量级的虚拟机,也不用过于简单的Docker容器。这为我日常的工作和学习都带了巨大的方便性。

  只是快乐的玩耍了没多久,发现这个东东貌似就经常会和其它的软件发生端口冲突,尤其是我在使用Docker版的MySQL时,因为经常要将Docker内的端口暴露至Host,在MySQL容器重启的时候就会经常失败,仔细分析日志发现,原来是MySQL的端口经常被占用。当然这难不倒我,于是我就用Docker的端口映射,重映射一个端口就行了,但是MySQL重启后依然会失败,报同样的错误,所以每次使用MySQL容器我就必须要不停的重建容器重映射端口,十分的郁闷。后来查阅了很多资料,我突发奇想,何不看看到底是什么东东老是这么爱抢别人的端口?结果我神奇的发现居然是Hyper-V!

  于是我就开始搜索关于Hyper-V端口设置的一些资料,发现原来这玩意的端口分配是动态调节的,即限定一个或若干个起始端口号,然后再限定连续端口数量,结果默认的Hyper-V就会在小于10000的端口范围内预留连续的几千个动态端口,而且过分的是因为WinDocker依赖于Hyper-V所以当一个容器使用了一个动态端口之后,即使Docker容器停机或重启它也不释放端口,结果就一直霸占着,在Docker容器重启后它依旧不释放。

  于是,按照网络教程的方法,我就把这该死Hyper-V动态端口限定到了从30000开始,并且只保留1000个连续端口的范围内。这下Docker容器清净了,怎么重启,怎么新建都不会再有端口冲突的问题了。

  至此可能您看的已经不耐烦了,这个端口冲突问题跟Winux有啥关系?我负责任的告诉你,关系Very、Very、Very的大,因为限定了Hyper-V的端口范围后,同样依赖它的Winux系统内,各种系统就没法更新了!神奇吧?

  一开始我也是觉得很奇怪,我以为是我什么误操作导致了Winux下的Ubuntu不能联网更新了,但是Ping哪里哪里都是通的。于是修改Hyper-V的虚拟网卡,新建,然后重挂载到对应虚拟机,结果还是不行,于是在Windows商店中果断的重置了Winux系统,结果Ubuntu跟有记忆一样,还是不能更新,于是乎又按照各路网络大神教唆的什么改更新镜像地址,改DNS等等试了一圈,还是不行,即使连国内的什么阿里镜像,网易镜像统统不行,总是报无法连接的错误。而且更神奇的是,我在Winux的Ubuntu内Ping阿里、网易的网址都是通的,只是apt update死活没法连接成功!最后我连防火墙什么的都停了也无济于事。然后我就干脆先不用它了,改用Docker下的Ubuntu镜像启动容器顶着用一下吧,显然这违背了一般Docker使用的初衷,但对于一个爱倒腾的IT民工来讲,一切条条框框都是我们势要打破的枷锁!

  最终不能使用Winux的Ubuntu系统,让我如鲠在喉,也搜了很多资料,甚至爬墙出去各种搜,都是无济于事。今早起来,兴许是在昨晚做梦唤醒了我脑内古老的记忆的缘故,我突然想起,这会不会是因为我限制了Hyper-V动态端口范围的原因?毕竟Winux官方说这玩意也严重依赖Hyper-V,于是本着死马当活马医,并且本着不怕重装系统的精神,说干就干,经过下列操作,再启动Winux的Ubuntu,一组apt update,只能说Winux联网的感觉真爽!

  注意下列操作需要在Windows的cmd或powershell中使用,推荐使用PowerShell。

1、查看预留端口范围

netsh int ipv4 show dynamicport tcp 

2、关闭Hyper-V先

注意:这步会重启系统

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

3、配置允许的动态端口范围

注意:这步至关重要,不要吝啬num后面的连续范围,要像打麻将一样,一万、两万的给,不要像我之前那样只给1000,并且开始的端口号最好不要大过20000,否则Winux系统又会没法更新了,不信你可以自己试试。

netsh int ipv4 set dynamicport tcp start=10000 num=16383

4、重启Hyper-V

注意:这步会重启系统

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

  至此,经过上面的看似跟Winux系统毫无关系的操作之后,重新登进Winux的Ubuntu之后,apt update就溜到飞起了。

  最后请不要问我为啥不能apt update就不能用Ubuntu了,懂的人自然懂,不懂的,呵呵!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐