Linux 一键重装亮点汇总,单栈多 IPv6 配置技术攻坚,修复重启过慢

论坛主贴:

史上最强,支持Debian 12 raid 0 Ubuntu 22.04 AlmaLinux/RockyLinux/CentOS 9 Fedora 38 AlpineLinux Kali Linux和Windows一键重装脚本功能更新,bug反馈贴(长期更新)

github:

https://github.com/leitbogioro/Tools

图库为 sm.ms,国内用户需挂梯子全局才能查看。

最近更新,致力于解决各种偏难险怪的硬盘、卡分区、网络、引导等等问题,不断增加泛用性和使用体验是我的一贯追求:

  • 多硬盘独服,支持重装成 Debian 系、红帽系时,以软 raid 0 1 5 6 10 任意策略组盘,可最大化利用多磁盘容量或性能,全网独家;
  • 自动识别原系统中 IPv4 栈、IPv6 栈各自的动态或静态配置,并在重装前自动应答文件内给出适合的配置方案,全网独家;
  • Debian 全系/Kali 安装时支持处理公网 IPv4 内网 IPv4 ,公网 IPv4 A B C 类与公网 IPv4 均不相同的公网 IPv4 网关组合,有效解决 Hetzner Spaceberg OVH Godaddy tk-hosting arkecx 等等一众商家重装难问题,全网独家;
  • 支持单 IPv4 单 IPv6 双栈机重装后网络配置全部完整写入新系统,无需苦逼手改,全网独家;
  • 支持单栈 IPv4 多条 IPv6 重装后所有网络配置不掉,不论原机器里有几条 IPv6 ,10 条、20 条、50 条,甚至 1000 条也没问题!全网独家,支持目标系统为 Debian/Kali 红帽 9 ,Fedora;
  • 支持纯 IPv6 栈,单条 IPv6 配置机器重装,全网独家,支持目标系统为 Debian/Kali 红帽系;
  • 支持纯 IPv6 栈,多条 IPv6 配置机器重装,全网独家,支持目标系统为 Debian/Kali 红帽系;
  • 支持在 Cloudcone、ReadyIDC 等商家重装重启后不会卡 grub,全网独家;
  • 支持自动排除由 warp 套上的网卡,避免识别机器自带网络栈出错,全网独家;
  • 支持排除系统中所有不可读写的光盘设备,避免将系统装入错误硬盘,而非简单幼稚地仅获取第一个:lsblk | head -n 1,避免重装时卡盘,全网独家;
  • 更精确地识别当前 ssh 用户 IP 地址,给出所在时区,全世界任何人使用本脚本,除非套代理,均可获得适合的当前时区,而非简单粗暴“Asia/Shanghai”,全网独家;
  • 内置中国大陆境内境外自动检测更换源功能,除 dd Windows 和 Ubuntu ,自己手动指定不适合的源以外,安装任何脚本支持的系统,中间流程完全不会卡顿,全网独家;
  • 经过多名坛友、大量测试获得的稳定性保证。
  • 解决了 IPv4 单栈机重启时间过长的问题。
  • 随着未来 IPv4 地址资源的枯竭、IPv6 的普及,以及 IPv6 地址资源相比 IPv4 指数级丰富的特点,人均几百个 IPv6 不是梦。未来 双栈单 IPv4 单 IPv6、双栈单 IPv4 多 IPv6、单栈单 IPv6、单栈多 IPv6 的机器会越来越普遍 ,及早调整策略,以适应未来更加复杂多变的网络配置环境,是我开发时不得不考虑到的一个前瞻性问题。

之前考虑到有些 IPv4 的机器,未来可能被分配到 IPv6 地址,所以网络配置文件里多给了一条 IPv6 的 dhcp,但如果这台机器始终无 IPv6 连接,Debian/Kali 重启时就会试图对 IPv6 进行 dhcp 配置,直至失败超时。单栈 IPv4 机器把网络配置文件中“iface 网卡名 inet6 dhcp”这条删掉就行了,红帽 NetworkManager 默认给单栈 IPv4 机 IPv6 部分自动配置,重启就不会出现过慢问题。

单栈机 IPv4,曾经用脚本重装过 Debian/Kali ,删除 IPv6 dhcp :

sudo sed -i '/inet6 dhcp/d' /etc/network/interfaces

单栈机 IPv6,曾经用脚本重装过 Debian/Kali ,删除 IPv4 dhcp :

sudo sed -i '/inet dhcp/d' /etc/network/interfaces

今后 IPv4 栈机不会再被自动添加 IPv6 dhcp 配置,相应地,IPv6 栈机也不会再被自动添加 IPv4 dhcp 配置,重启过慢的问题到此解决。

红帽系单栈纯 IPv6 环境下重装研究

此前另一个解决的问题,就是红帽系在单栈 IPv6 网络中安装时网络无法配置的问题,最开始这个问题,是在 server-factory 的单栈 IPv6 上发现的,当然他家的 2GB 内存容量有问题,除了解决了 IPv6 网络配置,还会因写入内存不够导致安装失败。

于是只能在 digital ocean 上开一台内存较大的机型来完成测试。

有人会问,Digital Ocean 不是双栈吗?如何拿来测试单栈 IPv6 呢?别急,我把拿它家机器来开发的好处和调整逐一道来:

  • Digital Ocean 双栈静态,这就意味着在目标机型上,只要我们不给 IPv4 或 IPv6 网络栈配置,就能“模拟”出对应的单网络栈状态,这点很重要,双栈都不能是动态,否则在红帽系等系统下,会因为系统自动获取某个栈网络成功而导致人为地模拟单栈的操作失败;
  • 随用随开随删,按时付费,开一个大内存机型,完成测试目标后,即可删掉,不受包年包月困扰;
  • 可访问 VNC,安装时出现错误或因网络配置失败导致公网无法访问时,可在 VNC 内进行 debug;
  • 性能和网络条件尚可。

Tips:Digital Ocean 创建 droplets 后,默认拥有静态 IPv4 配置,且已被刷入新安装的系统,开启 IPv6 栈,必须将已创建并开机的 droplet shutdown,然后在 Public IPv6 Address 下方找到“Enable”按钮启用即可。
由于开启 IPv6 不可能在创建 droplet 之前完成,所以第一次开机时配置的系统里,肯定是没有 IPv6 配置的,我们既可以按官方指南手工开启,也可以 rebuild droplet,用官方提供的重装功能再重装一次,新系统内 IPv6 部分就被自动配置好了,非常方便,推荐新开机时机器中没有数据,且需要快速开启 IPv6 的用户使用。
Digital Ocean 官方开启 IPv6 及不同系统下手工配置静态 IPv6 流程指南:
How to Enable IPv6 on Droplets
用后面板功能重装流程指南:
How to Rebuild Droplets

地区选择美东、自带系统默认 Ubuntu、为了配置足够,内存特意选择 4GB 机型,月付 24 刀,就耍几个小时而已,花不了多少:

开机后按以上流程关机、Enable IPv6、后台模板重装、再次开机,记得一定要以其 IPv6 公网地址访问,否则把 IPv4 配置删除后,以 IPv4 栈建立的 ssh 连接就断开了

系统中 IPv4 IPv6 双栈皆已配置好,直接来看看 Ubuntu 的网络配置文件吧:

cat /etc/netplan/50-cloud-init.yaml

Netplan yaml 格式网络配置文件也有它的好处和特点,比如条目从属分明、缩进敏感、但相比 Debian 的 if up down 还是有点复杂,这里我们不去做过多探讨,把画框处公网 IPv4/掩码后缀、routes 下的 to 所有 IPv4 地址以及 via 部分全部删除:

修改前:

修改后:

保存文件并退出,将新修改后的网络配置应用于 netplan 服务:

netplan apply

对于程序员来说,waring 不是问题,只有 error 才是。草,走,忽略!

ping -4 google.com 不通,ping -6 google.com 通,说明我们将这台双栈 droplet 改造成单栈 IPv6 的目标顺利达成:

程序开发中有一个很重要的思维,就是“没有条件,创造条件”,实际环境千变万化,但是我们为了实现某个环境下的软件测试和功能开发,且这种预想中的环境暂时不存在,比如本次案例中“需要一台大内存单栈 IPv6 机器来测试红帽系重装”的需求,该怎么办?

那么经过以上配置,我们获得了理想中所需的实验环境,这个思维除了运用于此,也可以发散到其他任何地方,包括下面我们将会关闭 Crunchbits 中的 IPv4 配置,以模拟单栈且多 IPv6 时,该如何处理的情况。

最重要的不是具体的流程,而是思路,有了思路,对应的具体流程自然水到渠成。

红帽系单栈 IPv6 重装配置中间走过的坑就不论述了,直接把要点标出来:

  • 对于 Kickstart 文件,“network”语句配置动态或静态 IPv6 的标准格式为:

动态 dhcp:

network --device=网卡名 --bootproto=dhcp --ipv6=auto --nameserver=IPv6 DNS --hostname=$(hostname) --onboot=on --activate --noipv4

静态 static:

network --device=网卡名 --bootproto=dhcp --ipv6=主 IPv6/实际 IPv6 掩码后缀 --ipv6gateway=IPv6 网关 --nameserver=IPv6 DNS --hostname=$(hostname) --onboot=on --activate --noipv4

这两条配置与单栈 IPv4、双栈机之间最大的差别,就是必须要指定“--noipv4”,以强制不配置 IPv4 网络。

重启前 grub 引导菜单中,网络安装内核启动时参数的附加也很有说道,仅配置 kickstart 文件部分,系统重启后仍然无法配置 IPv6 网络:

对于动态 dhcp 机型,加入一条“noipv4”以不配置 IPv4 网络即可,如果要配置多 DNS,必须一条一条添加:

noipv4 nameserver=IPv6 dns 1 nameserver=IPv6 dns 2

对于静态 static 机型,除了加入“noipv4”,还要用以下格式添加完整的 IPv6 配置:

noipv4 ip=[本机主 IPv6 地址]::[IPv6 网关]:主 IPv6 实际掩码后缀::网卡名:none nameserver=IPv6 dns 1 nameserver=IPv6 dns 2

由于以上给内核直接配置 IP 地址的方法,中间会有很多英文冒号“:”来分隔及区分不同参数,再加上 IPv6 地址本身就是以冒号分隔,所以必须用一对英文中括号“[]”,将主 IPv6 地址、IPv6 网关给包裹起来,否则内核将无法正确读取相关 IPv6 地址参数。

对于 IPv4 而言,由于其是由英文逗号“.”分隔的,和“:”明显有分别,所以不需要用“[]”将其括起来,我在给 AlpineLinux 配置以 IPv4 静态启动的时候,会遵守这个规则。

通过以上配置,红帽系就可以在单栈 IPv6 环境下顺利启动、连接网络,并完成系统的安装了,以下是安装流程展示:

脚本顺利地识别出单栈 IPv6 网络:

重启后 anaconda 中的流程演示:

安装结束后连接测试的目标系统 RockyLinux 9、Fedora 38 等,查看网络配置文件,很明显,NetworkManager 中,[ipv4] 部分 method 为 disabled,IPv6 部分被刷入了静态配置:

为了测试单栈 IPv6 dhcp 下安装红帽系的表现,我们再开一台 Vultr 的机器,IPv4 网络部分选择不配置,仅开启 IPv6 ,从系统层面彻底断开 IPv4,由于 Vultr 双栈部分均是 dhcp,所以通过构建该环境,我们可以测试出单栈 IPv6 dhcp 下安装红帽系的情况。

配置纯 IPv6 dhcp 比较简单,以下是安装前 grub 启动菜单部分、kickstart 中的配置,以及安装流程演示:

menuentry 'Install AlmaLinux 9 x86_64' --class almalinux --class gnu-linux --class gnu --class os {
  load_video
  set gfxpayload=text
  insmod gzio
  insmod part_gpt
  insmod xfs
  set root='hd0,gpt2'
  if [ x$feature_platform_search_hint = xy ]; then
    search --no-floppy --fs-uuid --set=root --hint='hd0,gpt2'  080614b0-36af-4a44-a142-537bb890f184
  else
    search --no-floppy --fs-uuid --set=root 080614b0-36af-4a44-a142-537bb890f184
  fi
  linux16 /vmlinuz inst.ks=file://ks.cfg  inst.nomemcheck quiet noipv4 nameserver=2606:4700:4700::1001 nameserver=2001:4860:4860::8844
  initrd16 /initrd.img
}
network --device=enp1s0 --bootproto=dhcp --ipv6=auto --nameserver=2606:4700:4700::1001,2001:4860:4860::8844 --hostname=vultr --onboot=on --activate --noipv4

至此,红帽系在纯 IPv6 栈环境下的网络重装支持已圆满完成。

Debian 系、红帽系单栈 IPv6 环境下多 IPv6 条目写入重装研究

根据以上章节思路,“模拟”出来一个单栈且有多条 IPv6 的环境,自然不是什么难事,我们手头的 Crunchbits 14 刀年付特价机正好完美符合该条件:

  • 双栈静态配置;
  • IPv6 栈可被分配最多 51 条 IPv6 地址;
  • 可访问 VNC;
  • 性能和网络条件尚可。

由于单栈 IPv4 ,多条 IPv6 写入支持所需要做的工作,之前 跨越极限,Linux 一键重装接受 Crunchbits 机 50 条 IPv6 写入大试炼 这篇文章中已经详细论述,所以在此基础上,再接再厉,达成新的目标也不是那么难了。

还是以 Crunchbits 这台机器为例,模拟成纯 IPv6 栈后,我们需要考虑的问题是,应该以哪一条 IPv6 作为重装时优先被配置的参数。

为了精简概括,假设此台机器拥有 3 条 IPv6 ,地址如下:

2606:a8c0:3::64/128
2606:a8c0:3:6f::a/64
2606:a8c0:3:6f::b/64

Crunchbits 在 最近更新维护 前,网关还统一是 fd2e:: 的时候,我发现了一个很有意思的地方,就是:

  • 在配置了 2606:a8c0:3::64 的情况下,2606:a8c0:3:6f::a 和 2606:a8c0:3:6f::b 才能正常工作;
  • 仅配置 2606:a8c0:3:6f::a 或 2606:a8c0:3:6f::b ,而不配置 2606:a8c0:3::64 的情况下,IPv6 栈不工作,自己无法 ping 通外界,外界也不可访问相关地址;
  • 在经过维护后,各 IPv6 地址网关均被统一成 2606:a8c0:3::1 ,此时无论配置系统中哪一个 IPv6 ,其 IPv6 都能正常工作。

从地址范围来看,2606:a8c0:3::64 是比 2606:a8c0:3:6f::a 和 2606:a8c0:3:6f::b 要大的,我推测之前为什么必须要配置 2606:a8c0:3::64 ,其余多条 IPv6 才能正常工作的原因,是 2606:a8c0:3::64 是其余多条 IPv6 的母段,其余 IPv6 必须通过该母段才能工作。

虽然 Crunchbits 运维解决了这个 bug,但这个曾经的 bug 给我带来了一个思路,就是在单栈多 IPv6 环境下,筛选出哪条 IPv6 作为安装系统时先被配置的 IPv6 最好,避免出现任选一条,重启时无网的状况。

解决思路很简单,先把系统中多 IPv6 条目都筛选出来,把它们存在一个数组里,这里和处理双栈多 IPv6 是一致的,但对于单栈 IPv6 ,我们还需要进行以下一系列处理和运算:

  • 由于 shell 不支持多维数组,所以我们对数组中元素每做一次处理,都要把它们存储到一个新数组里,不过每个新数组内元素的顺序不会变;
  • 去掉“2606:a8c0:3::64/128”等斜杠以及掩码后缀,这里用 cut 来实现即可,用循环把它们存储到一个新的数组里,如 (2606:a8c0:3::64 2606:a8c0:3:6f::a 2606:a8c0:3:6f::b);
  • 还是遍历数组的元素,将它们被简写的部分“补零、补冒号”,最后再转写成完整的 IPv6 格式,这个功能通过我以前为单栈 IPv6 安装 Debian 时,将简写的 1 - 128 位掩码后缀转写成完整 IPv6 地址格式的函数“fillAbbrOfIpv6”和“ultimateFormatOfIpv6”来实现,理论上可以将任意被缩写的 IPv6 地址转换成全写,相当方便;
  • 被转写后的 IPv6 ,由于位数完全相等,才有了互相比较哪个范围最大的可能,直接拿 2606:a8c0:3::64 和 2606:a8c0:3:6f::a 等是无法做比较的;
  • 以拥有几个“0000”为标准,确定哪个 IPv6 范围最大,并将其作为重启后被优先配置的 IPv6。

完整的检查代码如下:

function collectAllIpv6Addresses() {
  [[ "$1" -ge "2" && "$IPStackType" != "IPv4Stack" ]] && {
    Network6Config="isStatic"
    i6Addrs=()
    for tmpIp6 in $allI6Addrs; do
      i6Addrs[${#i6Addrs[@]}]=$tmpIp6
    done
    if [[ "$IPStackType" == "IPv6Stack" ]]; then
      allI6AddrsWithoutSuffix=()
      for tmpIp6 in ${i6Addrs[@]}; do
        tmpIp6=$(echo $tmpIp6 | cut -d'/' -f1)
        allI6AddrsWithoutSuffix[${#allI6AddrsWithoutSuffix[@]}]=$tmpIp6
      done
      allI6AddrsWithUltimateFormat=()
      for tmpIp6 in ${allI6AddrsWithoutSuffix[@]}; do
        tmpIp6=$(ultimateFormatOfIpv6 "$tmpIp6")
        allI6AddrsWithUltimateFormat[${#allI6AddrsWithUltimateFormat[@]}]=$tmpIp6
      done
      allI6AddrsWithOmittedClassesNum=()
      for tmpIp6 in ${allI6AddrsWithUltimateFormat[@]}; do
        tmpIp6=$(echo $tmpIp6 | grep -oi "0000" | wc -l)
        allI6AddrsWithOmittedClassesNum[${#allI6AddrsWithOmittedClassesNum[@]}]=$tmpIp6
      done
      omittedClassesMaxNum=${allI6AddrsWithOmittedClassesNum[0]}
      for tmpIp6 in ${!allI6AddrsWithOmittedClassesNum[@]}; do
        if [[ "$omittedClassesMaxNum" -le "${allI6AddrsWithOmittedClassesNum[${tmpIp6}]}" ]]; then
          omittedClassesMaxNum=${allI6AddrsWithOmittedClassesNum[${tmpIp6}]}
        fi
      done
      getArrItemIdx "${allI6AddrsWithOmittedClassesNum[*]}" "$omittedClassesMaxNum"
      mainIp6Index="$index"
      i6Addr=${i6Addrs[$mainIp6Index]}
    fi
  }
}

经过以上案例的输入,函数内各变量的输出结果如下:

# ${i6Addrs[@]}                         : 2606:a8c0:3:6f::b/64 2606:a8c0:3:6f::a/64 2606:a8c0:3::64/128
# ${allI6AddrsWithoutSuffix[@]}         : 2606:a8c0:3:6f::b 2606:a8c0:3:6f::a 2606:a8c0:3::64
# ${allI6AddrsWithUltimateFormat[@]}    : 2606:a8c0:0003:006f:0000:0000:0000:000b 2606:a8c0:0003:006f:0000:0000:0000:000a 2606:a8c0:0003:0000:0000:0000:0000:0064
# ${allI6AddrsWithOmittedClassesNum[@]} : 3 3 4
# $omittedClassesMaxNum                 : 4
# $mainIp6Index                         : 2
# $i6Addr                               : 2606:a8c0:3::64/128

很明显,经过转写后的 2606:a8c0:3::64 值为 2606:a8c0:0003:0000:0000:0000:0000:0064 ,拥有 4 个“0000”,而其余的 2606:a8c0:3:6f::a 和 2606:a8c0:3:6f::b 经过转写后,各只有 3 个“0000”,所以经过比较,得出结论:“2606:a8c0:3::64”是范围最大的那一个,我们应该将它作为重启配置 IPv6 网络的首选配置。

为新系统写入多 IPv6 条目的函数“writeMultipleIpv6Addresses”,也要做相关调整,完整代码如下:

function writeMultipleIpv6Addresses() {
  [[ "$1" -ge "2" && "$IPStackType" != "IPv4Stack" ]] && {
    if [[ "$linux_relese" == 'debian' ]] || [[ "$linux_relese" == 'kali' ]]; then
      [[ "$IPStackType" == "IPv6Stack" ]] && unset i6Addrs[$mainIp6Index]
      for writeIp6s in ${i6Addrs[@]}; do
        ip6AddrItem="up ip addr add $writeIp6s dev $interface6"
        tmpWriteIp6sCmd =''$2' sed -i '\''$a\t'$ip6AddrItem''\'' '$3'; '
      done
      writeIp6sCmd=$(echo $tmpWriteIp6sCmd)
      writeIp6GateCmd=''$2' sed -i '\''$a\tup ip -6 route add '$ip6Gate' dev '$interface6''\'' '$3'; '$2' sed -i '\''$a\tup ip -6 route add default via '$ip6Gate' dev '$interface6''\'' '$3';'
      addIpv6DnsForPreseed=''$2' sed -ri '\''s/'$ipDNS'/'$ipDNS' '$ip6DNS'/g'\'' '$3';'
      preferIpv6Access=''$2' sed -i '\''$alabel 2002::/16'\'' /etc/gai.conf; '$2' sed -i '\''$alabel 2001:0::/32'\'' /etc/gai.conf;'
      SupportIPv6orIPv4=''$writeIp6sCmd' '$writeIp6GateCmd' '$addIpv6DnsForPreseed' '$preferIpv6Access''
      [[ "$IPStackType" == "IPv6Stack" ]] && SupportIPv6orIPv4=''$writeIp6sCmd' '$preferIpv6Access''
    elif [[ "$linux_relese" == 'centos' ]] || [[ "$linux_relese" == 'rockylinux' ]] || [[ "$linux_relese" == 'almalinux' ]] || [[ "$linux_relese" == 'fedora' ]]; then
      for (( tmpI6Index="0"; tmpI6Index<"$1"; tmpI6Index   )); do
        writeIp6s="${i6Addrs[$tmpI6Index]}"
        ipv6AddressOrder=$(expr $tmpI6Index   1)
        ip6AddrItem ='address'$ipv6AddressOrder'='$writeIp6s','$ip6Gate'
'
      done
      ip6AddrItems=''$ip6AddrItem''
      addIpv6DnsForRedhat='dns='$ip6DNS1';'$ip6DNS2';'
      addIpv6AddrsForRedhat='sed -i '\''/addr-gen-mode=eui64/a\'$ip6AddrItems''$addIpv6DnsForRedhat''\'' '$3''
      setIpv6ConfigMethodForRedhat='sed -ri '\''s/method=auto/method=manual/g'\'' '$3''
      [[ "$IPStackType" == "IPv6Stack" ]] && { ip6AddrItems=$(echo $ip6AddrItem | sed 's/..$//'); deleteOriginalIpv6Coning='sed -ri '\''/address1.*/d'\'' '$3''; addIpv6AddrsForRedhat='sed -i '\''/addr-gen-mode=eui64/a\'$ip6AddrItems''\'' '$3''; setIpv6ConfigMethodForRedhat=""; }
    fi
  }
}

以下是涉及该函数调整的解释说明:

  • 该函数从外部接受的 3 个参数不变,仍然是“$i6AddrNum”,即原系统拥有的 IPv6 数量、“in-target”,即适用于 Debian preseed late_command 阶段,以新系统身份写入多条命令、第三个参数为新系统内的网络配置文件目录。
  • 对于 Debian/Kali ,多 IPv6 写入的情况,存储多条 IPv6 配置的数组“i6Addrs[*]”,需要通过“unset”命令,把其中用来配置重装时 IPv6 网络的条目删除,因为该条目已写入新系统网络配置文件,不能再被写入一次;
  • Debian/Kali late_command 阶段写入剩余多条 IPv6 的策略不变,不需要添加 IPv6 网关、也不需要更改 DNS,它们的母条目为:iface 网卡名 inet6 static;
  • 对于红帽 9 ,Fedora,生成添加多条 IPv6 的 sed 命令也不变,不过最后要去掉末尾的“
    ”,避免出现多余空行;
  • 对于红帽 9 ,Fedora,由于数组“i6Addrs[*]”中没有被删掉任何 IPv6 条目,所以针对 NetworkManager 的网络配置文件,需要把 anaconda 阶段在 [ipv6] 条目下写入的“address1=”先删除,然后把新的“address1= address2= address3=”写进去;
  • 对于红帽 9 ,Fedora,由于单栈多 IPv6 就是以静态来配置的,所以不需要像双栈那样,先把 [ipv6] 的 method 从 auto 改为 manual,所以变量“setIpv6ConfigMethodForRedhat”设定为空。

这样,Debian 系、红帽 9 ,Fedora 的单栈多条 IPv6 环境下,将原系统 IPv6 网络配置完整移植到新系统中的工作就顺利完成了,由于以上改动涉及单栈多 IPv6 的情况都用 if 判断式包裹起来,所以对脚本原有的双栈单 IPv4,配置多 IPv6 并无影响。

后记

以下是成果展示:

CentOS 9 stream 纯 IPv6 栈写入多条 IPv6 Kickstart 部分 1:

CentOS 9 stream 纯 IPv6 栈写入多条 IPv6 Kickstart 部分 2:

CentOS 9 stream 纯 IPv6 栈安装好后,写入多条 IPv6 NetworkManager 中网络配置 1:

CentOS 9 stream 纯 IPv6 栈安装好后,写入多条 IPv6 NetworkManager 中网络配置 2:

Debian 12 纯 IPv6 栈写入多条 IPv6 preseed 部分 1:

Debian 12 纯 IPv6 栈写入多条 IPv6 preseed 部分 2:

Debian 12 纯 IPv6 栈安装好后,写入多条 IPv6 if up down 中网络配置 1:

Debian 12 纯 IPv6 栈安装好后,写入多条 IPv6 if up down 中网络配置 2:

脚本安装到 Debian 12 前,相关系统配置展示部分,可以看到,范围最大的母段 2606:a8c0:3::64 ,被当做新系统安装时优先被配置的 IPv6 网络:

Kali rolling 纯 IPv6 栈写入多条 IPv6 preseed 部分 1:

Kali rolling 纯 IPv6 栈写入多条 IPv6 preseed 部分 2:

Kali rolling 纯 IPv6 栈安装好后,写入多条 IPv6 if up down 中网络配置 1:

Kali rolling 纯 IPv6 栈安装好后,写入多条 IPv6 if up down 中网络配置 2:

点赞
  1. miss说道:

    大佬,牛皮!

  2. huah6571说道:

    支持小内存吗 256M的

  3. chancat说道:

    @leitbogioro #9 就像你说的,懂的人可能会认为你这个哦牛逼,6666厉害,可是我就是因为不懂,只知道用,对于我这样的小白来说,简单快捷省事,一把嗦是最实用的。我就是表达这个意思。管你什么技术方案,白皮书巴啦啦一堆对我无效。,咋的戳到你什么了?这个那个火箭上天人类文明都出来了。真是搞笑,只能说好的,夸你是吧?我只是表达怎么这么复杂,什么别的连意见都没有,也许我说的话让你误解了。?你可以不用理我。

发表回复

电子邮件地址不会被公开。必填项已用 * 标注

×
订阅图标按钮