记录最近一次linux系统安装

linux安装

简述: 昨天晚上给旧笔记本安装 fedora35,并安装无线网卡驱动,特点是没有有线网络。本来以为分分钟搞定,结果折腾几个小时。

背景

年前没啥事情做,打算把积压的一些资料给吃掉,主要是关于linux系统和容器化的一些内容,光看不实操肯定不行,得有个好的试验环境。

我的环境

我之前我很长一段时间的主要模式是:本地win+linux组成的双系统(双系统盘+1数据盘),主要学习试验环境都在linux上,工作和写文档都在win上面,区分后用起来很方便。

但是去年中我的老笔记本(联想Y410P)内存条坏了,一时没找到原因就买了现在用的这个笔记本(联想小新)。

小新只有一块500G的SSD,且不能扩硬盘,如果不用独立硬盘模式装双系统的话,就得把原来这个 windows 给做了重装,觉得太麻烦于是就改为主用 windows 环境了,当前的模式是(本地win11+本地虚拟机+2云主机),也挺好使的。

但windows与linux的环境差异毕竟明显,经常开关虚机也不方便,云主机网络又慢,总感觉是不方便。而且这个win11内存消耗极大,刚开机啥也没干就去了6个G内存,如下图

win11开机内存占用

昨天下午突然看到我的老笔记本还在吃灰,就想着是不是应该把这位老黄牛给拉出来再榨取一下,毕竟CPU也不慢,有SSD启动也不慢。

于是想了个 新模式:

  1. 笔记本小新同学以后就主要负责工作、文档、沟通、以及简单的学习和测试;

  2. 老笔记本以后就主要负责专业方面的内容,比如试验环境+笔记文档;

  3. 通过云主机的GIT来同步关键资料,通过移动硬盘和本地网络来转移大文件。

linux作为第一环境的主要优点

  1. 环境与线上相似,命令或脚本现写现测,比对各种系统参数时不用开虚机;

  2. 自动化任务方便;

  3. 生命在于折腾


二、开始安装系统

这部分内容其实很快就完成了

简单说就是去华为镜像站下载了一个 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 是一种常用的数据包的封装协议,发送方需要将原始请求进行封装,交给代理服务器后,由代理服务器解包后再发出去;

计划步骤

  1. A 主机(windows)使用 putty 做为代理客户端 ssh连接到我的腾讯云服务器(代理服务器端)上去;

  2. putty 有开启 SOCKS5 代理,本地启动一个 10001 端口;

  3. 拿一条网线接 A/B 主机的有线网口,配置IP为同一个网段;

  4. B 主机设置系统级的SOCKS5代理,指向 A 主机的IP和代理端口;

  5. B 主机 yum 添加第三方仓库源,并安装网卡驱动

为什么不用直接代理的模式,而用客户端服务器的代理模式;

因为有现成的 putty+云主机 可以用,配置简单,基本上一键就能开启。

流量方向: B 主机发起请求,转给 A 主机的代理客户端开放的端口,代理客户端转给代理服务器端,由服务器端最终发出去。

遇到的问题:

1/2/3/4 步骤都很正常,确定没有问题,第5步就是不成功

那就开始排查呗:

先在 B 主机默认的火狐浏览器打开百度的页面,没打开;

然后使用百度的 公网IP+80端口,通了,虽然没打开页面,但有看到发生了跳转的动作。

那就再抓包排查呗:

  1. B主机使用域名形式访问,在A主机没有抓到包

  2. B主机使用IP的形式访问,在A主机有抓到TCP包

说明DNS解析请求没有发过来。

看了一下火狐浏览器代理配置内有个选项“DNS是否走代理”,勾选上,再测,使用域名能打开百度了,OK

火狐是可以了,那 dnf/yum 怎么办呢?如何让它们的域名解析也走代理呢?

后面的排查实际折腾了很久,通过抓包、换curl验证、浏览器验证、改域名解析地址啥的,1个多小时吧,没搞定,放弃。

【事后这个方案证实可行,而且奇简单无比,见文末】

于是准备换个新方法

解决方案二

想着不就是几个驱动包嘛,我手动装总行了吧

计划步骤

  1. A主机去镜像站下载有驱动的 rpm 包

  2. 通过有线网络传到 B 主机上

  3. B主机上 rpm -ivh *.rpm 安装成功,重启主机,成功

开始操作,先下载了主要的几个驱动包,并传了过去,安装时发现缺依赖,然后下载依赖包传过去,又有缺新依赖。

三轮下来后发现太麻烦,有没有优化措施呢?

突然想起来我这个B主机的浏览器不是已经可以上网了吗(前面步骤的那个代理);

于是改进措施为:B主机浏览器下载依赖包,安装,发现缺依赖。重复执行这个流程。

又是三轮之后,发现情况不对,有个包居然有10几个依赖包,再往下推说不定还有几层新依赖包,无法想象。

不行,必须换方法。

再想想前面代理的模式已经差临门一脚了,就这么放弃也不甘心,于是打算再抢救一下这个方案。

到这突然我反应过来,我真是傻,为什么要纠结这个代理域名解析啊;

我自己本地hosts解不行吗!

想到这里,我又反应过来,为啥我还非得去一遍云服务器,直接A主机出网不就完了;

于是换我另一把锤子(nginx)

解决方案三

计划步骤

  1. A 主机配置 nginx 监听80端口,将流量转发到镜像站的http接口去;

  2. B 主机把yum源里面的域名进行本地解析,解析到 A 主机去。

实际上还有一些小细节,比如yum源配置文件里面的镜像站地址路径与实际路径地址要修改匹配一致。

sudo dnf install xxx

没出意外,成功啦~

重启旧笔记本电脑后,gnome 右上角出现无线网络的标志啦~

联无线网成功啦~

开心美滋滋

弄完后,已经有点晚了,决定收拾一下明天再装环境吧,于是关机后整理台面。

咦,我怎么有两个U盘,不对,我只有一个U盘,那这个像U盘的东西是啥?

我的脑袋突然就炸开了,这难道是我的 “linux免驱USB无线网卡”

气得我一时想说点什么,又终是哑然无语,形成了内伤。

总结知识点

科普一下基本的DNS解析流程

  1. 应用程序发起对某域名的请求;

  2. 应用程序从自身的缓存中解析出IP地址;

    当然应用程序要有这个缓存机制,一般浏览器都是有的,或者长期持久运行的程序会考虑这个机制。

    而一些临时性的命令行工具基本就不会考虑去实现;

  3. 应用程序调用操作系统系统提供的接口方法 getaddrinfo() 来通过操作系统获取域名解析后的IP地址;

  4. 操作系统读取自身在内存中的DNS缓存结果;

    /etc/host.conf 文件可以理解为也属于缓存的一种, 文件缓存, 基本上实时更新到内存缓存中。

  5. 如果系统本地缓存没有,则操作系统向 DNS 服务器发起 DNS 查询请求,等待结果。

在代理模式下的DNS解析流程

如果程序自身支持代理:

一般程序就会把请求解析域名的的动作封装在 SOCKS5 的流量中,不再调用操作系统的 getaddrinfo() 方法进行解析。

比如火狐浏览器,就支持设置是否 DNS 解析也走代理,curl 也是有参数支持的。

如果是支持代理,但没有将DNS解析流量进行SOCKS5封装,那就走操作系统获取解析。

如果程序不支持代理:

那么还是调用 操作系统的方法来获取域名解析,与代理无关。

不同代理模式的下DNS解析最终是谁发出的:

直连模式:特点是没有服务器端,由代理客户端发出的最终请求,那当然就是代理客户端进行的;

代理模式:特点是除了客户端还有服务器端,最终请求是服务器发出去的;

使用代理时的注意事项:

可能会出现应用程序通过本地OS解析出了一个地址,但是代理服务器却访问不了这个地址。

比如本地解析的域名是v6地址,但代理只支持v4,又或者本地域名解析出的这个地址,与代理服务器之间有网络限制。

curl 工具如何使用代理

curl 默认不走代理;

使用 –socks5 参数可以指定socks5代理地址和端口,但域名解析还是OS进行的;

使用 –socks5-hostname 参数就可以域名解析和IP一起都走代理;

又或者是通过配置系统环境变量设置代理。

方法如下:

1
2
3
4
5
curl --socks5-hostname 10.2.1.6:10001 http://baidu.com/
curl -x socks5h://10.2.1.6:10001 http://baidu.com/

export ALL_PROXY=socks5h://10.2.1.6:10001
curl https://baidu.com/

方案一的解决办法

方案一是有办法走代理的;

yum 配置了 http 源后,底层最终还是用的 libcurl 库去调用的资源服务器,既然 curl 命令的域名解析可以走代理,那么公共的这个 libcurl 库应该也是有方法支持的。

简单到加一行配置就行,直接需修改 dnf/yum 的配置文件

1
2
/etc/dnf/dnf.conf
proxy=socks5h://10.2.1.6:10001

然后 yum install xxx 就行了

事后就很容易发现方法奇多,奇简单。

而我当时哪怕去 “man curl” 或者是 “man dnf.conf” 看一眼,再或者去百度收一下 “yum 代理”,也都不至于搞成这样。

关于我的“linux免驱USB无线网卡”

这是个神器,推荐可能去机房的运维人员都买一个

优点:

  1. 免驱,内核自带驱动,2.6+的内核应该是都支持的,实测有效,windows也是免驱;

  2. 便宜,好像只要40-60块钱;

  3. 速度还行,应该是54m的,够用;

  4. 热插拔,随用随插,没啥影响;

使用场景:

  1. 家里的台式机接无线网络;

  2. 去机房折腾服务器时可以坐远点(远离空调和噪音)。


文末总结:做事情前多想,办法肯定比肯定困难多

微信搜索IT运维小秋

Licensed under CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议,知会作者并注明出处
不得用于商业用途!
最后更新于 2022-01-25 00:00 UTC