全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 4874|回复: 47

[经验] 【意见征集】一键重装支持访客时区 静态双栈 网卡重定向

 关闭 [复制链接]
发表于 2022-12-2 20:06:19 | 显示全部楼层 |阅读模式
本帖最后由 天权璇玑 于 2022-12-5 10:07 编辑

项目地址:https://github.com/leitbogioro/Tools

最近更新及使用方法:https://hostloc.com/forum.php?mod=viewthread&tid=1094336

另外,你支持新安装的系统中,默认将网卡名重定向吗?小投票的内容如果看不懂,参见本帖第三节:8. 自动识别网卡是否被重定向。投票结果会影响到后续开发,请慎重选择。

最近更新:

1. 完善判断网络类型策略

Ubuntu 的网络配置文件固定在 /etc/netplan 里,处理起来好预测,但 Debian 的网络配置文件有时候会被放在 /run/network 目录中,redhat 系出现了 7 8 系列一套,即 network scripts,9 系列一套,即 NetworkManager 一套的配置,每套会存在于标准的 /etc 目录里,也会存在于 /run 目录里,还有的在 /user/lib 里,甚至特别地,对于 GCP,它故意隐藏了 redhat 8 9 系的网络配置文件,不但用单引号把文件名括起来,还给文件名添加空格(影响到 awk 按列获取),比如 'Wire Line 1.nmconnection' 导致 bash 内置的各种命令,都无**确读取到文件名,因为单引号是一种强引用,任何对单引号的读取如果原文件附带的单引号本身不加转义,导致前后两个单引号读取出来的结果为空,导致定位具体文件名错误。所以脚本转换了读取策略,定位到配置文件所在父目录,用 grep 遍历方式查找带有静态网络配置的特征关键字是否在这个目录即可。反正确定 ip,网关,子网掩码的方法依赖于系统自带的 ip 命令,不需要读取具体的网络配置文件。读取网络配置文件的目的仅仅是为了确认系统网络配置是动态还是静态的,这会影响到重启后自动应答文件该选择哪种方式引导安装程序配置网络。

2. 支持 redhat 系静态双栈配置

Redhat 系自动应答文件,kickstart 里,允许给一个网卡添加 ipv4 地址,子网掩码的基础上,再添加  --ipv6=1ad8::::857b/128 这种格式,即包含了一个 ipv6 地址和它斜杠后的子网掩码,也支持单独添加一条 ipv6 网关,即 --ipv6gate=,加上  --nameserver= 可以添加多条 DNS 服务器,用英文逗号隔开即可,这样在自动应答文件可以统一配置的情况下,我就不用像 Debian 那样,因为自动应答文件里指定 IP 地址等参数前缀是一样的,不支持给单网卡添加多个不同参数,同样前缀指令新的会覆盖旧的,不能共存。支持 ipv6 的配置还得放到系统安装完成后,后续自定命令执行阶段,强写到 /etc/network/interfaces 里,也不用纠结 Redhat 系 7 8 9 不同的网络配置文件目录,不同的写入语法这些问题。再加上如果是双栈动态,Redhat 系会双栈自动配好,不用再像 Debian 那样,给网络配置文件里单独给目标网卡写一条开启 dhcp 的命令,这个机能说实话蛮不错的,Debian 应该好好学学。

3. 优化进入低内存模式策略

机器如果安装的是 Debian 11,内存小于 768M,会让机器自动进入低内存模式,如果是 Debian 10,阈值是512M,照这个趋势下去,我真怕哪天小内存机器也不能愉快的网络重装 Debian 了。Redhat 系早就成了吞内存巨兽。

4. 经测试,内存不足 1.5G 的机器安装 centos 7会卡死,即最小化镜像无法完整下载到内存中,这个问题只能通过加内存,或用外部驱动器来加载引导才能解决。内存不够的机器安装会终止。

5. Debian 系默认 GPT 分区,以适应未来 3TB 以上硬盘需求,Redhat 系默认是这个,不用修改。

6. 访客时区自动设置

缺省情况下,如果我们给脚本的时区一个固定值,比如:Asia/Shanghai,即可满足绝大部分国人的需求,但本着国际主义精神,该脚本面向的是全世界用户,包括我的 github 项目文档就是用纯英文写的,为了适应全世界各地用户的时区,我添加了根据访问该 VPS 用户的 IP 地址,确定其时区的功能,该功能通过 https://ipgeolocation.io/ 提供的 API 完成。

如果你不想被 API 追踪,或想手动设置时区,也可以添加 -timezone 参数,如:-timezone "Asia/Shanghai" 来完成设置,如果输入的格式不对,或者不在当前系统内置的时区列表内,比如“Asia\Osaka”,脚本仍提供了一个缺省值:"Asia/Tokyo"。

另外,我通过 ping 谷歌和推特的连通性来确认机器是在中国大陆境内还是境外,如果是境内,跳过使用 API,直接给上海时区,正好覆盖到绝大部分生活在国内的国人,操作国内机器的需求。

考虑到中国大陆的 VPS 购买需要实名制,一个从未来过中国大陆的外国人无法完成购买,所以曾经来过,或在中国大陆生活过,拥有正式身份(包括临时的),拥有购买中国大陆 VPS 能力,且目前正生活在非东八区时区以外的这一部分人的数量极少,所以不在自动时区设置功能所照顾的范围内,如果你正好是这一部分人,请根据自己所生活的地区,手动设置正确的时区。

如果你使用的是代理连接机器,那么很抱歉,本脚本不是电脑病毒或者贞子,无法从终端逃逸到你当前运行的实体机上,查询你的物理网卡外网 IP 地址并完成正确的时区设置,只能按你用哪个 IP 连接到的这台机器设置当地时区,包括代理服务器。这种情况下,你也需要手动设置正确的时区。

7. 双栈静态网络支持

针对各位坛友 VPS 极为特殊的疑难杂症,比如双栈(同时拥有 IPv4 和 IPv6 地址)且都是静态地址配置的机器,做出了优化,由于系统安装程序只能完成一个网卡的单栈(IPv4)配置,所以支持静态 IPv6 的实现,即获取用户当前系统 IPv6 配置并写入到新系统里的步骤,放到 preseed 后续流程中,双栈动态 DHCP 机器当然也 ok,此特性仅限 Debian。

出现这个案例的机器,最初是坛友@坏坏 向我汇报的,他的机器来自荷兰的一个 oneman 小商家,结果实验做到一半,机器失联了,后来一直连不上了。于是我就用甲骨文的双栈机继续验证,强写静态双栈配置,然后重装,实验后发现新功能可用。

再次提醒,脚本判断是静态还是 dhcp 的策略是优先静态,即读出系统中某一个栈的网络配置如果是静态,那么双栈都按静态配置,这点在某些 IPv4 是动态,ipv6 是静态配置的机器上经过实验得到了验证,即此时应当双栈静态配置,新系统中网络才能完美配好,如果要强行指定静态或动态,你可以在脚本命令最后,加上“--network "static/manual" 或 --network "dhcp/auto" ”参数。

实验机器:甲骨文 Oracle ARM 2 OCPU 12 GB 双栈机,区域:澳大利亚悉尼。


强写静态 IPv4 和 IPv6 配置的网络配置


preseed 内系统安装阶段写入了正确的 IPv4 配置


preseed 内后续执行阶段写入了正确的 IPv6 配置


再次进入系统后,网络配置是正确的,不要在意网卡名为什么换了这些细节,详情在第8节,压力测试顺便一块儿做了

Redhat 系列由于版本 7 和 8 的网络配置在 /etc/sysconfig/network-scripts/ 里,9 的网络配置在 /etc/NetworkManager/system-connections/ 里,不同目录里网络配置文件的格式完全不同,处理起来实在麻烦,所以双栈机静态地址配置  IPv6  放在 kickstart 自动应答文件里统一完成,DHCP 可双栈自动配置好。

8. 自动识别网卡是否被重定向

部分商家的部分系统模板,如搬瓦工的 Ubuntu 22.04 amd64,默认会在 /etc/default/grub 这个文件的 “ GRUB_CMDLINE_LINUX="" ”项目中,插入:"net.ifnames=0 biosdevname=0" 值,包括坛友@坏坏 的机器,这个参数是通过 grub 或 grub2 引导 Linux 内核时,强制所有网卡的名称重定向为统一的 eth0,eth1……这样的,而不再是网卡本身的物理名称,比如 ens18,ens3,enp0s3,等等。

这么做比较方便网络管理员用脚本对一个大局域网里数十台,乃至上万的计算机的网络配置进行统一管理,因为网卡名称都统一了,不会因为网卡制造商名称不同而不同,坏处是一旦新安装系统里,未指定附带这个值,那么原系统里获取的比如“eth0”的网卡名称,以及与它有关的网络配置,在新系统内就无效了。

所以,我在脚本里默认对网卡重定向的机器做了优化,如果什么都不指定,脚本会自动检测当前系统是否将网卡名称重定向了,如果是,新安装的系统内继承这个配置,并且由于我们知道这样做,默认第一个网卡名必然是“eth0”,所以属于网卡“eth0”的,预先写好的网络配置内容仍然有效。如果没有做这个设置,那么我们在当前系统获得的网卡名称就是真实的,属于该网卡名称下的网络配置对新系统也有效。

为了给那些喜欢追求新鲜感和刺激感,勇于挑战自我的朋友们,提供更加 exciting 的选择,我还添加了两个参数,一个是 --adapter "真实的物理网卡名",另一个是 --netdevice-unite(该参数不需要指定值)。这两个参数不建议混用,因为它们的作用几乎是相反的:

--adapter 的作用是,如果你的原系统网卡名重定向了,当且仅当你知道这台机器网卡正确的物理名称是什么,并且要在新系统里关闭网卡重定向功能是才需要指配,为什么要告诉脚本物理网卡的真实名称?因为 Linux 内核网卡重定向功能对真实网卡名进行了完全隐藏,我在系统里找半天也无法找到,既然在当前系统内无法找到,那就只能你手动指配。注意,如果指配错误,会直接影响到重启后安装程序自动配置 IPv4 网络,以及后续 IPv6 网络配置文件的写入正确性。

正如其名,--netdevice-unite 的作用恰好反过来,即如果你当前系统网卡并没有被重定向,但想要在待安装的新系统里进行重定向,那么你可以指配这个参数,无论在哪个商家,哪个配置的机器上安装,在新系统里,网卡名称会被统一成 eth0 eth1……等,但代价是新系统里不再记录真实网卡的名字,在使用这个参数时,你应该提前记好这台机器本来真实网卡的名字是什么,以备以后重装时,不再需要网卡重定向了之后还原配置。


动态网卡未重定向网络配置


动态网卡重定向网络配置

静态网卡重定向网络配置第2节里有。


网卡未重定向时,grub 自定义配置文件:/etc/default/grub


网卡重定向时,grub 自定义配置文件,目录同上

如果想在当前系统手动修改网卡重定向,或取消网卡重定向怎么办?

打开文件,寻找到“ GRUB_CMDLINE_LINUX="" ”项目,针对“net.ifnames=0 biosdevname=0”,加入表示重定向网卡名称,删除表示还原网卡真实名称。

  1. vim /etc/default/grub
复制代码


刷新 grub 配置才能生效,grub1 或 grub2 命令不同,根据实际情况自己选择:

  1. grub-mkconfig
  2. grub2-mkconfig
复制代码


当然,说了这么复杂,你只需要记住,相信脚本的自动判断能力,指派的东西越多,出错的概率越大,the less is more。

另外,以上这些,自己怎么折腾都行,不要在正式的生产环境中操作,尤其是涉及到修改内核加载参数的操作,谁也无法承担生产环境中出错带来的不可逆的后果,你应当对你自己的行为负责。
单选投票, 共有 69 人参与投票
10.14% (7)
1.45% (1)
0.00% (0)
0.00% (0)
88.41% (61)
您所在的用户组没有投票权限
发表于 2022-12-2 20:33:49 | 显示全部楼层
太牛逼了
发表于 2022-12-2 20:42:48 来自手机 | 显示全部楼层
太牛逼了 支持archlinux
发表于 2022-12-2 21:08:43 | 显示全部楼层
顶一下
你的帖子,让我重新在loc看到了光
发表于 2022-12-2 21:16:00 | 显示全部楼层
5k 不来了?
发表于 2022-12-2 22:56:17 | 显示全部楼层
价值几K的脚本
发表于 2022-12-3 00:15:53 | 显示全部楼层
好,支持大佬的技术贴,阴阳怪退散
发表于 2022-12-3 02:06:30 | 显示全部楼层
大佬牛皮。



/**
* 人死后会成为什么?夜空中的一座孤岛。——《一封孤岛的信》
*
* Link https://greasyfork.org/zh-CN/scripts/396933-hostloc-zsbd
*/
发表于 2022-12-3 13:40:22 | 显示全部楼层
什么时候支持archlinux
 楼主| 发表于 2022-12-3 13:52:53 | 显示全部楼层
腾讯云6折购 发表于 2022-12-3 13:40
什么时候支持archlinux

不常用啊,很多商家后面板都没有
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-19 19:08 , Processed in 0.077739 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表