1. 这不是一份“安装完就扔”的配置手册而是一套能扛住生产环境拷问的 Rocky Linux 9.1 网络底盘Rocky Linux 9.1 是 CentOS 停更后企业级服务器领域最被寄予厚望的稳定替代方案。它不是 Red Hat Enterprise Linux 的简单复刻而是由社区主导、完全开源、二进制兼容 RHEL 9 的“真·企业级发行版”。我接手过三套从 CentOS 7 升级到 Rocky 9.1 的核心业务系统——一套是金融行业的实时风控平台一套是医疗影像的 PACS 存储网关还有一套是制造业的 MES 数据采集中台。它们共同的痛点不是“装不上”而是“配不稳”NetworkManager 和传统 ifconfig 混用导致网络时断时续firewalld 规则一重启就失效SELinux 在启用后让 Nginx 报错“Permission denied”却查不出源头DNF 更新时卡在 metadata 下载或者误删了关键依赖包导致 sshd 直接崩掉。这些都不是理论问题是凌晨三点你接到告警电话时必须在 5 分钟内定位并解决的实战压力。这篇指南就是我把这三年在真实生产环境里踩过的所有坑、记下的所有参数、写下的所有检查脚本全部掏出来整理成的一套可落地、可验证、可审计的 Rocky Linux 9.1 网络与系统配置方法论。它不讲“什么是 SELinux”而是告诉你怎么用sealert -a /var/log/audit/audit.log三步定位一个被拒绝的 socket 绑定行为它不罗列nmcli connection show的所有字段而是教你用nmcli c mod System eth0 ipv4.addresses 192.168.10.50/24加上ipv4.gateway 192.168.10.1再加ipv4.dns 8.8.8.8,114.114.114.114一次性写死静态 IP且确保重启不失效它不泛泛而谈 firewalld而是给出一套“先封死所有端口再按服务白名单逐个放行”的最小权限策略模板并附上firewall-cmd --permanent --add-servicehttp --add-servicehttps后必须执行firewall-cmd --reload的血泪教训。如果你正在部署一套需要连续运行 365 天无宕机的后台服务或者正为新上线的 Kubernetes 集群节点网络稳定性发愁又或者只是想把家里的 NAS 服务器从 Ubuntu 换成更稳的 Rocky那你手里的这份指南就是你打开系统底层控制权的第一把钥匙。它不承诺“一键搞定”但保证每一步操作都有明确意图、可逆路径和验证手段。2. 整体设计逻辑为什么放弃“图形界面向导式配置”而选择命令行驱动的声明式管理Rocky Linux 9.1 的底层网络栈本质上是一套高度模块化、分层清晰的协作体系。它不是单点工具而是一个由 NetworkManager负责连接生命周期管理、systemd-networkd轻量级替代方案、firewalldnetfilter 的策略封装层、SELinux强制访问控制引擎和 DNF软件包与依赖关系的权威仲裁者共同构成的“五边形防御阵型”。很多新手会本能地去/etc/sysconfig/network-scripts/ifcfg-eth0手动改 IP结果发现 NetworkManager 自动覆盖了它或者用iptables -A INPUT -p tcp --dport 22 -j ACCEPT加规则却发现 firewalld 重启后全没了又或者setenforce 0临时关闭 SELinux 解决了问题却在第二天发现 audit.log 里堆满了被拒绝的 avc 日志根本不知道哪个服务偷偷开了 root 权限。这些混乱根源在于没有理解 Rocky 9.1 的设计哲学它默认采用“声明式配置”而非“命令式操作”。声明式意味着你告诉系统“我要什么状态”而不是“执行哪条命令”。比如你不是说“把 eth0 的 IP 设成 192.168.10.50”而是说“我声明名为 ‘Production LAN’ 的连接其 IPv4 地址应为 192.168.10.50/24网关为 192.168.10.1DNS 为 114.114.114.114”。NetworkManager 会持续监控这个声明并在网卡热插拔、DHCP 租约到期、甚至系统重启后自动将底层设备拉回到你声明的状态。这种模式天然具备幂等性——你执行十次nmcli c mod结果都一样也天然具备可审计性——所有连接配置都存于/etc/NetworkManager/system-connections/下的加密文件中ls -lZ一眼就能看出 SELinux 上下文是否正确。所以本指南彻底放弃 GUI 配置工具和零散的 shell 命令拼凑。我们只做三件事第一用nmcli或编辑.nmconnection文件完成网络连接的“声明”第二用firewall-cmd的--permanent参数完成防火墙策略的“持久化声明”第三用semanage和restorecon完成 SELinux 上下文的“策略声明”。DNF 则作为整个系统的“契约执行者”它下载的每一个 RPM 包都附带了该包对 SELinux 类型、firewalld 服务定义、NetworkManager 配置片段的完整声明。当你运行dnf install nginx它不只是复制文件而是自动注册http服务到 firewalld自动设置/usr/share/selinux/targeted/nginx.te策略模块并在/etc/firewalld/services/下生成nginx.xml。这套机制才是 Rocky Linux 9.1 稳定性的真正基石。你越早接受“声明即配置”的思维就越少遇到“配置生效了但重启就丢”的幻觉。2.1 NetworkManager不是“替代 ifconfig”而是“接管整个网络生命周期”NetworkManager 在 Rocky 9.1 中已不再是可选组件而是 systemd 服务NetworkManager.service的默认启动项。它的核心价值远不止于“图形界面里点几下就能连 Wi-Fi”。它是一套完整的网络状态机引擎管理着从物理网卡探测、链路层协商LLDP/CDP、IP 地址分配DHCP/Static/IPv6 RA、路由表维护、DNS 解析器配置/etc/resolv.conf 的动态生成到连接故障自动恢复如主备网卡切换、Wi-Fi 信号弱时自动重连的全链条。很多人误以为ifconfig或ip addr是“底层”NetworkManager 是“上层包装”这是致命误解。实际上在 Rocky 9.1 中ip addr显示的是 NetworkManager 的“当前执行结果”而nmcli device status显示的是 NetworkManager 的“内部状态缓存”。两者不一致那一定是 NetworkManager 的某个子模块出了问题而不是ip命令错了。举个典型场景你用nmcli c add type ethernet con-name Backup WAN ifname eth1创建了一个新连接但ip a s eth1里始终看不到 IP。这时别急着ip addr add先看nmcli c show Backup WAN—— 如果GENERAL.STATE是unmanaged说明 NetworkManager 根本没接管 eth1可能因为/etc/NetworkManager/conf.d/99-unmanaged.conf里写了keyfile unmanaged-devicesinterface-name:eth1如果状态是disconnected那就得查nmcli c show Backup WAN | grep ipv4.method确认是不是autoDHCP但 DHCP 服务器没响应还是manual但漏写了ipv4.addresses。这种排查路径是ifconfig永远给不了你的。NetworkManager 的日志journalctl -u NetworkManager -f会实时输出类似device (eth0): state change: ip-config - ip-check (reason none)的状态流转这才是诊断网络问题的黄金线索。提示nmcli的所有修改只要没加--temporary参数都是永久生效的。nmcli c mod MyConn ipv4.addresses 10.0.0.100/24这条命令会直接写入/etc/NetworkManager/system-connections/MyConn.nmconnection文件。你可以用cat /etc/NetworkManager/system-connections/MyConn.nmconnection查看原始配置里面ipv4.addresses10.0.0.100/24这一行就是你声明的“事实”。NetworkManager 启动时会读取这个文件并据此驱动内核网络栈。所以备份这个目录就等于备份了你所有的网络连接配置。2.2 firewalld不是“iptables 的图形界面”而是“策略即代码”的安全中枢firewalld 的本质是一个运行在用户空间的策略编排器。它不直接操作 netfilter 规则而是通过libnfnetlink库将你声明的“服务”、“端口”、“富规则”翻译成一组标准化的、可复用的 iptables/nftables 规则链。它的核心优势在于“区域zone”模型。Rocky 9.1 默认有public、internal、trusted等 9 个 zone每个 zone 都预定义了一套基础策略。比如publiczone 默认拒绝所有入站连接只允许 SSHinternalzone 则允许 SSH、DHCPv6-client、mdns 等更多服务。你不需要记住iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT这种易错的语法只需firewall-cmd --permanent --zonepublic --add-servicehttpfirewalld 就会自动加载/usr/lib/firewalld/services/http.xml里定义的port protocoltcp port80/并将其注入到publiczone 的规则集中。更重要的是firewalld 支持“运行时”和“永久”两个配置层。firewall-cmd --add-port8080/tcp是运行时生效重启 firewalld 服务就丢失而firewall-cmd --permanent --add-port8080/tcp是写入/etc/firewalld/zones/public.xml下次firewall-cmd --reload或服务重启时才生效。这个分离设计是防止误操作导致服务中断的关键。我见过太多人firewall-cmd --remove-servicessh后忘了加--permanent结果systemctl restart firewalldSSH 连接直接断开只能靠控制台硬重启。所以我的铁律是所有firewall-cmd操作必须同时带上--permanent和--reload。firewall-cmd --permanent --add-servicehttps firewall-cmd --reload两步缺一不可。--reload不是“重新加载”而是“原子性地切换到新配置”旧规则瞬间清空新规则瞬间生效中间没有毫秒级的“无防护窗口”。注意firewall-cmd --list-all显示的是当前运行时的完整策略包括所有--permanent和--add的叠加效果。而firewall-cmd --permanent --list-all只显示/etc/firewalld/下的持久化配置。两者不一致说明你执行了--add但没--reload或者执行了--reload但没--permanent。用firewall-cmd --state确认服务是否在运行用firewall-cmd --get-active-zones确认网卡绑定的 zone这是排查防火墙问题的起点。2.3 SELinux不是“鸡肋安全模块”而是“进程行为的宪法”SELinux 是 Rocky Linux 9.1 安全模型的基石但它常被妖魔化为“麻烦制造者”。真相是当它工作时你感觉不到当它报错时你才意识到它一直在默默守护。它的核心是“类型强制TE”模型。每个进程、每个文件、每个端口都被打上一个“安全上下文security context”标签比如system_u:system_r:httpd_t:s0Nginx 进程、system_u:object_r:httpd_sys_content_t:s0网站根目录/var/www/html。SELinux 策略规定httpd_t类型的进程只能读取httpd_sys_content_t类型的文件只能绑定http_port_t类型的端口80/443不能写入user_home_t类型的家目录。这种细粒度的控制远超传统 Linux DAC自主访问控制的rwx权限。所以当你setenforce 0后 Nginx 能启动了那不是 SELinux “错了”而是它精准地拦截了一个非法行为。真正的解法不是关掉它而是修复上下文或策略。比如你把网站文件放在/home/myuser/wwwNginx 就会因avc: denied { read } for ... scontextsystem_u:system_r:httpd_t:s0 tcontextunconfined_u:object_r:user_home_t:s0被拒。这时chcon -R -t httpd_sys_content_t /home/myuser/www就能修复。或者你用semanage port -a -t http_port_t -p tcp 8080就能让 SELinux 认可 8080 端口为 HTTP 服务端口。sealert -a /var/log/audit/audit.log是你的终极武器它能把晦涩的 avc 日志翻译成一句人话“SELinux 阻止了 httpd 访问 /home/myuser/www/index.html。建议运行chcon -t httpd_sys_content_t /home/myuser/www/index.html”。这才是高效运维的正确姿势。3. 核心实操从裸机安装到高可用网络的七步闭环Rocky Linux 9.1 Minimal ISO 安装后系统处于一个“干净但脆弱”的状态。它没有图形界面没有预装任何服务网络默认是 DHCP 获取firewalld 和 SELinux 都是启用状态。我们的目标是把它变成一台随时可以上线的生产服务器。整个过程分为七个不可跳过的步骤每一步都对应一个可验证的状态点。3.1 步骤一初始化系统与网络声明5分钟安装完成后首次登录第一件事不是装软件而是固化网络。Minimal ISO 默认启用 NetworkManager但连接名是随机的如Wired connection 1。我们需要一个语义清晰、便于管理的连接名。# 1. 查看当前所有连接 nmcli connection show # 2. 重命名默认连接假设网卡名是 ens192 nmcli connection modify Wired connection 1 connection.id Prod-LAN # 3. 声明静态 IP替换为你的真实网段 nmcli connection modify Prod-LAN \ ipv4.method manual \ ipv4.addresses 192.168.10.50/24 \ ipv4.gateway 192.168.10.1 \ ipv4.dns 114.114.114.114,8.8.8.8 \ ipv4.ignore-auto-routes yes \ ipv4.ignore-auto-dns yes # 4. 关闭 DHCP 获取的 DNS 和路由避免冲突 nmcli connection modify Prod-LAN ipv4.ignore-auto-routes yes ipv4.ignore-auto-dns yes # 5. 激活连接 nmcli connection up Prod-LAN执行完ip a s ens192应该显示inet 192.168.10.50/24ip r应该有default via 192.168.10.1 dev ens192。ping -c 3 192.168.10.1和ping -c 3 114.114.114.114必须全通。这是整个网络的“锚点”后续所有配置都基于此 IP 展开。如果失败请立即journalctl -u NetworkManager | tail -30查看错误常见原因是网卡名不对用ip link show确认或网关不可达。3.2 步骤二加固防火墙策略3分钟Rocky 9.1 默认publiczone只开放 SSH。我们必须显式声明所有需要的服务端口其他一律拒绝。# 1. 确保 firewalld 运行 systemctl enable --now firewalld # 2. 检查当前 active zone firewall-cmd --get-active-zones # 3. 将 Prod-LAN 连接绑定到 public zone如果还没绑定 firewall-cmd --permanent --zonepublic --change-interfaceens192 # 4. 开放必要服务HTTP/HTTPS/SSH firewall-cmd --permanent --zonepublic --add-servicehttp firewall-cmd --permanent --zonepublic --add-servicehttps firewall-cmd --permanent --zonepublic --add-servicessh # 5. 如果需要自定义端口如 Docker API 2376 firewall-cmd --permanent --zonepublic --add-port2376/tcp # 6. 重载防火墙关键 firewall-cmd --reload # 7. 验证 firewall-cmd --list-allfirewall-cmd --list-all输出中services:行应该包含http https sshports:行应该有你添加的自定义端口。此时从外部telnet 192.168.10.50 80应该能连上即使 Nginx 没装telnet 192.168.10.50 22也能连上。telnet 192.168.10.50 3306MySQL则应该超时证明默认拒绝策略生效。3.3 步骤三验证并调优 SELinux2分钟SELinux 默认是enforcing模式这是安全底线。我们不做关闭只做验证和微调。# 1. 确认状态 sestatus # 2. 查看当前上下文以 root 为例 ls -Z /root # 3. 检查 audit.log 是否有近期 avc 拒绝无输出表示一切正常 ausearch -m avc -ts recent | head -5 # 4. 如果有拒绝日志用 sealert 分析假设有日志 sealert -a /var/log/audit/audit.log | head -20sestatus输出Current mode: enforcing和Mode from config file: enforcing是理想状态。ausearch无输出说明没有新的 SELinux 拒绝事件。如果有sealert会给出具体修复建议。这一步的意义在于建立基线我们知道系统当前是“干净”的后续任何服务安装引发的 SELinux 报错都是那个服务本身的问题而非系统配置错误。3.4 步骤四DNF 配置与基础软件安装5分钟Rocky 9.1 的 DNF 源默认指向官方镜像但在国内速度可能很慢。我们使用阿里云镜像源并启用 fastestmirror 插件自动选择最优节点。# 1. 备份原 repo cp -r /etc/yum.repos.d /etc/yum.repos.d.bak # 2. 替换 baseos 和 appstream repoRocky 9.1 sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/rocky*.repo sed -i s|#baseurlhttp://dl.rockylinux.org|baseurlhttps://mirrors.aliyun.com/rocky|g /etc/yum.repos.d/rocky*.repo # 3. 启用 fastestmirror sed -i s/enabled0/enabled1/g /etc/dnf/plugins/fastestmirror.conf # 4. 清理缓存并生成新元数据 dnf clean all dnf makecache # 5. 安装基础工具vim, wget, curl, htop, net-tools dnf install -y vim-enhanced wget curl htop net-tools # 6. 验证安装 which vim which htopdnf makecache成功后dnf repolist应该显示rocky-baseos和rocky-appstream两个仓库status为enabled。dnf install完成后vim --version应该输出版本号证明包管理器工作正常。这一步看似简单却是后续所有操作的基础。如果dnf卡住90% 的原因是网络或镜像源问题而不是 DNF 本身。3.5 步骤五配置时间同步NTP/Chrony2分钟Rocky 9.1 默认使用chronyd作为 NTP 客户端比老式的ntpd更精准、更省资源。我们只需确保它启用并同步。# 1. 启用并启动 chronyd systemctl enable --now chronyd # 2. 查看同步状态 chronyc tracking # 3. 查看源服务器 chronyc sources -v # 4. 强制立即同步可选 chronyc makestepchronyc tracking输出中System clock offset应该在-100ms到100ms之间Leap status应该是Normal。chronyc sources应该列出至少一个^*当前主同步源和几个^备用源。时间不同步会导致 SSL 证书校验失败、Kubernetes 节点无法加入集群、日志时间戳混乱等一系列连锁问题。这是最容易被忽视却最致命的配置。3.6 步骤六创建标准运维用户3分钟绝不使用 root 进行日常操作。我们创建一个具有 sudo 权限的普通用户并禁用 root 密码登录。# 1. 创建用户替换 yourname useradd -m -c Ops Admin yourname # 2. 设置密码 passwd yourname # 3. 将用户加入 wheel 组sudo 权限组 usermod -aG wheel yourname # 4. 编辑 sudoers推荐用 visudo安全 visudo # 5. 确保以下行未被注释Rocky 9.1 默认已存在 %wheel ALL(ALL) ALL # 6. 禁用 root 密码登录编辑 sshd_config sed -i s/#PermitRootLogin yes/PermitRootLogin no/g /etc/ssh/sshd_config systemctl restart sshdsu - yourname切换后sudo whoami应该输出root。ssh yourname192.168.10.50应该能成功登录而ssh root192.168.10.50应该被拒绝。这一步建立了最小权限原则的第一道防线。3.7 步骤七生成系统快照与配置清单2分钟最后一步不是安装软件而是记录。我们生成一份可审计、可回滚的系统快照。# 1. 记录网络配置 nmcli c show Prod-LAN /root/config/network-prod-lan.txt # 2. 记录防火墙策略 firewall-cmd --list-all /root/config/firewall-public.txt # 3. 记录 SELinux 状态 sestatus /root/config/selinux-status.txt # 4. 记录已安装包关键 dnf list installed /root/config/dnf-installed-list.txt # 5. 记录关键服务状态 systemctl list-unit-files --stateenabled /root/config/enabled-services.txt # 6. 打包备份 tar -czf /root/config/rocky91-initial-snapshot-$(date %Y%m%d).tgz /root/config/这个rocky91-initial-snapshot-20240520.tgz文件就是你这台服务器的“数字基因图谱”。它包含了所有声明式配置的原始状态。未来任何变更你都可以用diff对比这个快照快速定位是哪条nmcli命令、哪个firewall-cmd参数、哪次dnf update导致了问题。这才是专业运维的起点。4. 高频问题排查与独家避坑技巧实录在上百台 Rocky Linux 9.1 服务器的部署和维护中我总结出一套“问题现象 → 排查路径 → 根本原因 → 修复命令”的速查表。这些不是教科书上的通用答案而是我在现场掐表计时、反复验证后提炼出的“黄金组合”。问题现象排查命令根本原因修复命令实操心得nmcli c show显示连接unmanagednmcli device statuscat /etc/NetworkManager/NetworkManager.confNetworkManager 配置文件中unmanaged-devices项屏蔽了该网卡sed -i /unmanaged-devices/d /etc/NetworkManager/NetworkManager.confsystemctl restart NetworkManager避坑Minimal ISO 安装后有时会自动生成99-unmanaged.conf专门屏蔽某些虚拟网卡。不要盲目删文件先grep -r unmanaged /etc/NetworkManager/conf.d/找到具体文件再删。firewall-cmd --list-all显示http服务但curl http://localhost返回Connection refusedss -tlnp | grep :80systemctl status nginx防火墙放行了端口但 Nginx 服务根本没启动或监听地址不对如只监听127.0.0.1:80systemctl start nginxecho listen 0.0.0.0:80; /etc/nginx/nginx.conf避坑firewall-cmd只管“门”不管“屋里有没有人”。永远先确认服务进程在运行再查防火墙。ss -tlnp比netstat更快、更准。dnf update卡在Downloading Packages...dnf makecachecurl -I https://mirrors.aliyun.com/rocky/9/BaseOS/x86_64/os/repodata/repomd.xml镜像源配置错误或 DNS 解析失败或网络策略阻止了 HTTPS 连接dnf clean alldnf makecacheping -c 3 mirrors.aliyun.com避坑dnf makecache失败时dnf不会报错只会静默退出。务必手动curl测试镜像源 URL 是否可达。国内云厂商 VPC 内有时需额外开通公网 NAT 网关。sestatus显示disabled但/etc/selinux/config是enforcingcat /proc/sys/kernel/grsecurity/ls /sys/fs/selinux/内核启动参数selinux0覆盖了配置文件或系统使用了不支持 SELinux 的内核grubby --info /boot/vmlinuz-$(uname -r)grep selinux /proc/cmdline避坑/etc/selinux/config只是“愿望”/proc/cmdline才是“现实”。grep selinux /proc/cmdline是唯一权威判断。若输出selinux0需grubby --update-kernelALL --argsselinux1并重启。sudo dnf install docker-ce报错No match for argument: docker-cednf search dockerdnf repolist --all | grep dockerRocky 9.1 官方仓库不包含docker-ce它被移到了crbCodeReady Builder仓库需手动启用dnf config-manager --set-enabled crbdnf install docker-ce避坑docker-ce不是 Rocky 的“核心”包而是“开发工具”包放在crb仓库。dnf config-manager是启用仓库的唯一正确方式不要手动编辑 repo 文件。4.1 独家技巧用nmcli实现“网卡热备”的三行脚本生产环境要求网络高可用。Rocky 9.1 原生支持 Bonding链路聚合但配置复杂。一个更轻量、更灵活的方案是用nmcli实现主备网卡自动切换。# 创建主连接eth0 nmcli c add type ethernet con-name Primary-LAN ifname eth0 nmcli c mod Primary-LAN ipv4.method manual ipv4.addresses 192.168.10.50/24 ipv4.gateway 192.168.10.1 ipv4.dns 114.114.114.114 # 创建备连接eth1不设网关只设 IP用于检测 nmcli c add type ethernet con-name Backup-LAN ifname eth1 nmcli c mod Backup-LAN ipv4.method manual ipv4.addresses 192.168.20.50/24 # 关键设置主连接的 autoconnect-priority越高越优先 nmcli c mod Primary-LAN connection.autoconnect-priority 100 nmcli c mod Backup-LAN connection.autoconnect-priority 50NetworkManager 会自动监控Primary-LAN的链路状态。一旦eth0断开网线拔掉它会在几秒内自动down主连接并up优先级更低的Backup-LAN。此时ip r会显示default via 192.168.20.1 dev eth1前提是 eth1 网关已配置。整个过程无需脚本是 NetworkManager 内置的 failover 机制。这是我在线上用过的最稳定的“软切换”方案。4.2 独家技巧firewalld的“服务白名单”模板为避免firewall-cmd --add-port造成端口泛滥我制定了一套“服务白名单”模板。所有新服务必须走这个流程定义服务文件在/etc/firewalld/services/下创建myapp.xml?xml version1.0 encodingutf-8? service shortMyApp/short descriptionMy Custom Application API/description port protocoltcp port8080/ port protocoltcp port8081/ destination address192.168.10.0/24/ /service重载 firewalldfirewall-cmd --reload在指定 zone 中启用firewall-cmd --permanent --zonepublic --add-servicemyapp firewall-cmd --reload这样myapp就成了一个可复用的、带描述的、带源地址限制的安全单元。firewall-cmd --list-services会显示myappfirewall-cmd --info-servicemyapp会显示其详细定义。比一堆--add-port命令清晰一万倍。4.3 独家技巧dnf的“安全更新”三步法dnf update会升级所有包风险极高。生产环境必须只升级安全补丁。# 1. 列出所有可用的安全更新 dnf updateinfo list security all # 2. 查看某个包的安全详情如 kernel dnf updateinfo info security kernel # 3. 仅安装安全更新 dnf update --securitydnf update --security是 Rocky 9.1 的标配功能它只拉取标记为security的 errata。dnf updateinfo list security的输出中Critical和Important级别的更新必须在 24 小时内完成。这是合规审计的硬性要求。5. 后续演进从单机配置到集群治理的平滑路径这套 Rocky Linux 9.1 的配置方法论其价值不仅在于单台服务器的稳定更在于它为大规模集群治理铺平了道路。当你把nmcli、firewall-cmd、semanage的所有操作都抽象成 YAML 声明例如 Ansible 的nmcli模块、firewalld模块你就拥有了基础设施即代码IaC的雏形。一个rocky91-base.ymlplaybook可以秒级部署 100 台完全一致的节点。更进一步Rocky
