简述: 昨天晚上给旧笔记本安装 fedora35,并安装无线网卡驱动,特点是没有有线网络。本来以为分分钟搞定,结果折腾几个小时。
背景
年前没啥事情做,打算把积压的一些资料给吃掉,主要是关于linux系统和容器化的一些内容,光看不实操肯定不行,得有个好的试验环境。
我的环境
我之前我很长一段时间的主要模式是:本地win+linux组成的双系统(双系统盘+1数据盘),主要学习试验环境都在linux上,工作和写文档都在win上面,区分后用起来很方便。
但是去年中我的老笔记本(联想Y410P)内存条坏了,一时没找到原因就买了现在用的这个笔记本(联想小新)。
小新只有一块500G的SSD,且不能扩硬盘,如果不用独立硬盘模式装双系统的话,就得把原来这个 windows 给做了重装,觉得太麻烦于是就改为主用 windows 环境了,当前的模式是(本地win11+本地虚拟机+2云主机),也挺好使的。
但windows与linux的环境差异毕竟明显,经常开关虚机也不方便,云主机网络又慢,总感觉是不方便。而且这个win11内存消耗极大,刚开机啥也没干就去了6个G内存,如下图
昨天下午突然看到我的老笔记本还在吃灰,就想着是不是应该把这位老黄牛给拉出来再榨取一下,毕竟CPU也不慢,有SSD启动也不慢。
于是想了个 新模式:
-
笔记本小新同学以后就主要负责工作、文档、沟通、以及简单的学习和测试;
-
老笔记本以后就主要负责专业方面的内容,比如试验环境+笔记文档;
-
通过云主机的GIT来同步关键资料,通过移动硬盘和本地网络来转移大文件。
linux作为第一环境的主要优点
-
环境与线上相似,命令或脚本现写现测,比对各种系统参数时不用开虚机;
-
自动化任务方便;
-
生命在于折腾
二、开始安装系统
这部分内容其实很快就完成了
简单说就是去华为镜像站下载了一个 fedora35 的ISO镜像,然后刻录到U盘做启动live盘,在老笔记本上选择U盘启动,进入图形化界面点下一步就行。
总耗时 = 下载镜像15分钟 + 刻录U盘15分钟 + 安装15分钟 + 人员点鼠标2分钟 = 不到1小时完成了
衍生话题
装系统以前可是个(技术活+人情活)。
现在想想主要原因还是因为早些年的硬件和系统(windows)本身就不稳定,需要靠频繁的重启或重装来缓解,而随着硬件和系统越来越稳定,大家基本就不需要咋去关注这些内容了,一般来说不瞎搞就很难坏。我上学使用XP那会,自从偷师学会了重装XP后,一般都是2-3月重装一回。
后来工作后需求稳定的环境,就比较小心谨慎半年或一年装一回,改用win7后很稳定就很少折腾这些了。至于linux因为工作和学习的缘故就太多不能比较。
三、安装驱动
说明:
linux系统一般都把主要的设备驱动都带上了的,基本不需要补充驱动程序,服务器环境除非有特殊硬件,基本上很难会遇到通用硬件不支持的情况。
我的这个老笔记本因为无线网卡用的是博通的BCM43142芯片,这个驱动是不开源的,官方只提供windows的驱动。
但是有放出来了一个私有的linux驱动,也能支持这个网卡,因为不开源,所以没有在系统厂商的官方仓库内,需要第三方仓库(rpmfusion)进行安装。
已知第三方仓库内驱动的包名为 broadcom-wl 需要的依赖为 akmod-wl akmods kmod-wl 等等
现有场景说明
家里只有无线网络,即有无线路由器没有内网有线接口,只有这台win11的小新笔记本能上网了,打算通过它代理一下网络。
以下内容称 win11的小新为 A主机,新装 fedora 的老笔记本为 B 主机。
解决方案一
话说手里有把锤子,看啥都像钉子。
刚好前几天我又看了一遍 ssh 的三种代理模式,即 正向代理、反向代理、SOCKS5代理,并且了解到 putty 对三种模式的代理也都是支持的。
念念不忘必须有回响,这时的第一反应,那就是用 SOCKS5 来尝试一下。
SOCKS5 代理解释
SOCKS5 是一种常用的数据包的封装协议,发送方需要将原始请求进行封装,交给代理服务器后,由代理服务器解包后再发出去;
计划步骤
-
A 主机(windows)使用 putty 做为代理客户端 ssh连接到我的腾讯云服务器(代理服务器端)上去;
-
putty 有开启 SOCKS5 代理,本地启动一个 10001 端口;
-
拿一条网线接 A/B 主机的有线网口,配置IP为同一个网段;
-
B 主机设置系统级的SOCKS5代理,指向 A 主机的IP和代理端口;
-
B 主机 yum 添加第三方仓库源,并安装网卡驱动
为什么不用直接代理的模式,而用客户端服务器的代理模式;
因为有现成的 putty+云主机 可以用,配置简单,基本上一键就能开启。
流量方向: B 主机发起请求,转给 A 主机的代理客户端开放的端口,代理客户端转给代理服务器端,由服务器端最终发出去。
遇到的问题:
1/2/3/4 步骤都很正常,确定没有问题,第5步就是不成功
那就开始排查呗:
先在 B 主机默认的火狐浏览器打开百度的页面,没打开;
然后使用百度的 公网IP+80端口,通了,虽然没打开页面,但有看到发生了跳转的动作。
那就再抓包排查呗:
-
B主机使用域名形式访问,在A主机没有抓到包
-
B主机使用IP的形式访问,在A主机有抓到TCP包
说明DNS解析请求没有发过来。
看了一下火狐浏览器代理配置内有个选项“DNS是否走代理”,勾选上,再测,使用域名能打开百度了,OK
火狐是可以了,那 dnf/yum 怎么办呢?如何让它们的域名解析也走代理呢?
后面的排查实际折腾了很久,通过抓包、换curl验证、浏览器验证、改域名解析地址啥的,1个多小时吧,没搞定,放弃。
【事后这个方案证实可行,而且奇简单无比,见文末】
于是准备换个新方法
解决方案二
想着不就是几个驱动包嘛,我手动装总行了吧
计划步骤
-
A主机去镜像站下载有驱动的 rpm 包
-
通过有线网络传到 B 主机上
-
B主机上 rpm -ivh *.rpm 安装成功,重启主机,成功
开始操作,先下载了主要的几个驱动包,并传了过去,安装时发现缺依赖,然后下载依赖包传过去,又有缺新依赖。
三轮下来后发现太麻烦,有没有优化措施呢?
突然想起来我这个B主机的浏览器不是已经可以上网了吗(前面步骤的那个代理);
于是改进措施为:B主机浏览器下载依赖包,安装,发现缺依赖。重复执行这个流程。
又是三轮之后,发现情况不对,有个包居然有10几个依赖包,再往下推说不定还有几层新依赖包,无法想象。
不行,必须换方法。
再想想前面代理的模式已经差临门一脚了,就这么放弃也不甘心,于是打算再抢救一下这个方案。
到这突然我反应过来,我真是傻,为什么要纠结这个代理域名解析啊;
我自己本地hosts解不行吗!
想到这里,我又反应过来,为啥我还非得去一遍云服务器,直接A主机出网不就完了;
于是换我另一把锤子(nginx)
解决方案三
计划步骤
-
A 主机配置 nginx 监听80端口,将流量转发到镜像站的http接口去;
-
B 主机把yum源里面的域名进行本地解析,解析到 A 主机去。
实际上还有一些小细节,比如yum源配置文件里面的镜像站地址路径与实际路径地址要修改匹配一致。
sudo dnf install xxx
没出意外,成功啦~
重启旧笔记本电脑后,gnome 右上角出现无线网络的标志啦~
联无线网成功啦~
开心美滋滋
弄完后,已经有点晚了,决定收拾一下明天再装环境吧,于是关机后整理台面。
咦,我怎么有两个U盘,不对,我只有一个U盘,那这个像U盘的东西是啥?
我的脑袋突然就炸开了,这难道是我的 “linux免驱USB无线网卡”
气得我一时想说点什么,又终是哑然无语,形成了内伤。
总结知识点
科普一下基本的DNS解析流程
-
应用程序发起对某域名的请求;
-
应用程序从自身的缓存中解析出IP地址;
当然应用程序要有这个缓存机制,一般浏览器都是有的,或者长期持久运行的程序会考虑这个机制。
而一些临时性的命令行工具基本就不会考虑去实现;
-
应用程序调用操作系统系统提供的接口方法 getaddrinfo() 来通过操作系统获取域名解析后的IP地址;
-
操作系统读取自身在内存中的DNS缓存结果;
/etc/host.conf 文件可以理解为也属于缓存的一种, 文件缓存, 基本上实时更新到内存缓存中。
-
如果系统本地缓存没有,则操作系统向 DNS 服务器发起 DNS 查询请求,等待结果。
在代理模式下的DNS解析流程
如果程序自身支持代理:
一般程序就会把请求解析域名的的动作封装在 SOCKS5 的流量中,不再调用操作系统的 getaddrinfo() 方法进行解析。
比如火狐浏览器,就支持设置是否 DNS 解析也走代理,curl 也是有参数支持的。
如果是支持代理,但没有将DNS解析流量进行SOCKS5封装,那就走操作系统获取解析。
如果程序不支持代理:
那么还是调用 操作系统的方法来获取域名解析,与代理无关。
不同代理模式的下DNS解析最终是谁发出的:
直连模式:特点是没有服务器端,由代理客户端发出的最终请求,那当然就是代理客户端进行的;
代理模式:特点是除了客户端还有服务器端,最终请求是服务器发出去的;
使用代理时的注意事项:
可能会出现应用程序通过本地OS解析出了一个地址,但是代理服务器却访问不了这个地址。
比如本地解析的域名是v6地址,但代理只支持v4,又或者本地域名解析出的这个地址,与代理服务器之间有网络限制。
curl 工具如何使用代理
curl 默认不走代理;
使用 –socks5 参数可以指定socks5代理地址和端口,但域名解析还是OS进行的;
使用 –socks5-hostname 参数就可以域名解析和IP一起都走代理;
又或者是通过配置系统环境变量设置代理。
方法如下:
|
|
方案一的解决办法
方案一是有办法走代理的;
yum 配置了 http 源后,底层最终还是用的 libcurl 库去调用的资源服务器,既然 curl 命令的域名解析可以走代理,那么公共的这个 libcurl 库应该也是有方法支持的。
简单到加一行配置就行,直接需修改 dnf/yum 的配置文件
|
|
然后 yum install xxx 就行了
事后就很容易发现方法奇多,奇简单。
而我当时哪怕去 “man curl” 或者是 “man dnf.conf” 看一眼,再或者去百度收一下 “yum 代理”,也都不至于搞成这样。
关于我的“linux免驱USB无线网卡”
这是个神器,推荐可能去机房的运维人员都买一个
优点:
-
免驱,内核自带驱动,2.6+的内核应该是都支持的,实测有效,windows也是免驱;
-
便宜,好像只要40-60块钱;
-
速度还行,应该是54m的,够用;
-
热插拔,随用随插,没啥影响;
使用场景:
-
家里的台式机接无线网络;
-
去机房折腾服务器时可以坐远点(远离空调和噪音)。
文末总结:做事情前多想,办法肯定比肯定困难多