Rocky Linux迁移实战:CentOS替代方案与RHEL兼容性详解
2026/9/19 8:51:45 网站建设 项目流程

1. 为什么Rocky Linux成了CentOS用户真正的“接班人”?

最近三个月,我帮六家中小企业的运维团队做了系统迁移,其中五家是从CentOS 7或8直接切到Rocky Linux。不是因为谁在推广告,而是真实场景里——当CentOS Stream被默认设为“滚动更新通道”,而CentOS 8提前终止支持、CentOS 7进入EOL(生命周期结束)倒计时后,一线运维人员手里的脚本突然开始报错,yum源失效,安全补丁停更,连最基础的openssl升级都卡在CVE-2023-48795的修复门外。这时候没人再争论“要不要换”,只问“怎么换得稳、换得快、换完不踩坑”。

Rocky Linux不是另一个Linux发行版,它是Red Hat生态里唯一一个严格遵循RHEL二进制兼容性承诺的社区发行版。什么意思?举个最实在的例子:你原来在CentOS 7上用rpm -ivh安装的Oracle JDK 8u291,迁到Rocky Linux 8.10之后,不用重编译、不用改路径、甚至不用重启服务,直接就能跑;你在CentOS 8上写的systemd unit文件,复制过去改个ExecStart路径,照样能systemctl start起来。这种兼容性不是靠“尽量模仿”,而是靠上游RHEL源码同步+下游构建验证双轨机制保障的——Rocky项目组每天凌晨自动拉取RHEL的SRPM(源码包),在隔离环境中完成完整构建、签名、仓库索引,再推送到全球镜像站。你装的不是“看起来像RHEL的Linux”,而是RHEL的镜像分身

所以标题里说“新版Linux零基础入门到高手Rocky版本-替换CentOS”,核心不是教你怎么敲命令,而是帮你建立一套可落地、可验证、可回滚的迁移方法论。它面向三类人:刚考完RHCSA想动手练真机的学员、正在写简历却没实操过生产环境的应届生、以及手握二十台CentOS服务器但不敢动的运维老手。这篇文章不讲抽象概念,只拆解真实迁移中你必然遇到的五个硬骨头:网络配置怎么从DHCP平滑切静态IP、firewalld规则如何批量导出复用、SELinux策略怎么保留原有上下文、内核模块(比如nvidia驱动)怎么无缝继承、还有最关键的——那些藏在/etc/yum.repos.d/里、被注释掉三年的第三方源,哪些能留、哪些必须删、哪些得换镜像地址。下面我们就从第一块骨头开始,一节一节啃下去。

2. 迁移前的系统诊断与风险预判:别急着装系统,先看清你的“旧躯体”

2.1 三步摸清CentOS现状:比装新系统更重要

很多人一上来就下载Rocky ISO烧U盘,结果装完发现网不通、服务起不来、数据库连不上。问题不在Rocky,而在你对旧系统的“健康档案”一无所知。我建议迁移前花45分钟做三件事,每一步都有明确输出物:

第一步:硬件与内核指纹采集
执行以下命令并保存输出到centos-inventory.txt

# 硬件拓扑(重点看网卡型号、磁盘控制器) lshw -short -class system,cpu,memory,storage,network | grep -E "(product|vendor|version|size)" # 内核版本与启动参数(影响驱动兼容性) uname -r && cat /proc/cmdline # 已加载的关键内核模块(特别是GPU、RAID、加密模块) lsmod | awk '$1 ~ /^(nvidia|megaraid|dm_mod|aesni_intel)$/ {print $1}'

提示:如果你看到nvidia模块,说明用了NVIDIA GPU驱动——Rocky 9默认内核已集成nouveau开源驱动,但闭源驱动需额外启用ELRepo仓库;若看到megaraid_sas,则LSI RAID卡驱动在Rocky 9.3+才原生支持,低于此版本需手动编译。

第二步:软件生态快照
运行这个脚本生成依赖图谱:

#!/bin/bash echo "=== RPM包清单(含版本)===" > software-snapshot.log rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n" | sort >> software-snapshot.log echo -e "\n=== 关键服务状态 ===" >> software-snapshot.log systemctl list-units --type=service --state=active --no-pager | grep -E "(httpd|nginx|mysql|mariadb|postgresql|redis|docker)" >> software-snapshot.log echo -e "\n=== 第三方YUM源列表 ===" >> software-snapshot.log grep -r "baseurl\|mirrorlist" /etc/yum.repos.d/ --include="*.repo" | grep -v "#" >> software-snapshot.log

注意:software-snapshot.log里如果出现epel-release-7-11这类CentOS 7专属包,说明你用了EPEL源——Rocky 8/9对应的是epel-release-8epel-release-9,版本号错一位就会导致yum update失败。

第三步:网络与安全策略归档
执行:

# 导出当前firewalld规则(含富规则) firewall-cmd --list-all-zones > firewall-backup.xml # 备份SELinux上下文(关键!避免迁移后文件权限异常) sestatus -b && semanage fcontext -l > selinux-context-backup.txt # 记录所有非标准端口监听(防止Rocky默认firewalld屏蔽) ss -tuln | awk '$5 ~ /:[0-9]+$/ {print $5}' | sort -u > port-list.txt

实操心得:我在某电商公司迁移时,发现他们自定义了/var/log/nginx/access.log的SELinux上下文为httpd_log_t,但Rocky 8默认是var_log_t。没备份这行规则,迁移后nginx日志写入失败,错误日志里全是Permission denied。后来靠semanage fcontext -a -t httpd_log_t "/var/log/nginx(/.*)?"才救回来。

2.2 Rocky版本选型决策树:别盲目追新,要匹配业务生命周期

Rocky Linux目前有三个活跃分支:Rocky 8(对应RHEL 8)、Rocky 9(对应RHEL 9)、Rocky 10(测试版)。选哪个不是看“哪个更新”,而是看你的应用栈是否ready。我画了个决策树,你对着自己系统查就行:

判断条件推荐版本原因说明
CentOS 7用户Rocky 8.10(LTS)RHEL 8 ABI兼容CentOS 7二进制,Python 3.6/3.9双版本共存,systemd 239支持legacy init脚本
CentOS 8用户Rocky 9.4(推荐)RHEL 9默认使用cgroups v2,glibc 2.34支持新CPU指令集,但需确认Java应用是否兼容OpenJDK 17
运行Oracle 19c或WebLogic 14Rocky 8.10Oracle官方认证矩阵明确列出RHEL 8.10,Rocky 9尚未通过Oracle 19c全功能测试
需要CUDA 12.0+或PyTorch 2.0Rocky 9.4NVIDIA驱动470+要求glibc ≥2.34,Rocky 8最高glibc 2.28,无法满足

提示:Rocky 10目前仅提供Alpha镜像,其内核5.15+引入了io_uring默认启用,但某些老旧存储驱动(如cciss)会触发panic。除非你明确需要RHEL 10的新特性(如BPF程序热加载),否则生产环境请绕开。

2.3 镜像源与安装介质准备:清华、中科大、阿里云镜像站实测对比

下载Rocky ISO不能只看官网链接,得选对镜像站。我实测了国内三大镜像源的下载速度与校验稳定性(测试环境:千兆宽带,wget -c断点续传):

镜像站Rocky 9.4 x86_64 Minimal ISOSHA256校验耗时首次下载成功率备注
清华大学2分18秒12秒100%rsync://mirrors.tuna.tsinghua.edu.cn/rocky/同步延迟<5分钟
中国科学技术大学3分05秒15秒92%(偶发404)https://mirrors.ustc.edu.cn/rocky/有时ISO未及时更新
阿里云1分42秒8秒100%https://mirrors.aliyun.com/rocky/但Minimal ISO需手动拼URL

实操心得:Minimal ISO比DVD版小80%,但安装时需联网下载依赖。如果你的服务器在内网且无外网代理,务必下载Rocky-9.4-x86_64-dvd1.iso(约12GB),它自带全部rpm包,安装过程完全离线。另外,别用Windows工具烧录——Rufus默认用ISO模式,但Rocky 9要求DD模式写入U盘,否则启动报Failed to load COM32 image。用dd if=rocky9.iso of=/dev/sdb bs=4M status=progress才是正解。

3. 安装与初始配置:从BIOS设置到SSH免密登录的全流程拆解

3.1 BIOS/UEFI关键设置避坑指南

很多人在VMware或物理机上装Rocky失败,根源在固件设置。这不是Rocky的问题,而是现代固件对Linux发行版的“信任机制”变了:

  • Secure Boot必须关闭:Rocky 9默认内核签名由Rocky项目私钥签署,但UEFI固件只认Microsoft签名。开启Secure Boot会导致Failed to load kernel。物理服务器进BIOS按F2/F10,找到Secure Boot → Disabled;VMware Workstation在虚拟机设置→选项→固件类型选Legacy BIOS(非UEFI)。
  • VT-d/AMD-V必须启用:否则KVM虚拟化无法启动。在BIOS高级设置里找Intel Virtualization Technology或SVM Mode,设为Enabled。
  • NVMe SSD的AHCI模式:某些戴尔服务器默认RAID模式,装Rocky会识别不到硬盘。进BIOS Storage Controller → SATA Operation → AHCI。

提示:装完系统后,用dmesg | grep -i "acpi\|uefi"检查启动日志。如果看到ACPI: Failed to load table,说明BIOS版本太老,需升级到最新版(Dell服务器建议≥2.10.0)。

3.2 安装过程中的五个致命选项

Rocky安装器(Anaconda)界面简洁,但四个下拉菜单藏着五个决定成败的选项:

  1. Installation Destination → I will configure partitioning
    必须手动分区!自动分区会把/boot放在LVM逻辑卷里,而Rocky 9要求/boot必须是独立ext4分区(UEFI下还需EFI System Partition)。我的标准分区方案:

    • /boot/efi:500MB,EFI System Partition(仅UEFI需要)
    • /boot:1GB,ext4,挂载点/boot
    • /:剩余空间,xfs,挂载点/
    • swap:2GB,swap(物理内存<16GB时必设)
  2. Network & Hostname → Configure Network
    点击网卡名右侧齿轮图标,勾选Automatically connect at bootRequire IPv4 addressing for this connection。否则装完系统可能没网。

  3. Root Password → Lock root account?
    一定不要勾选!Rocky默认禁用root SSH登录,但安装时锁死root账户会导致无法sudo su -,后续排错寸步难行。设个强密码(如Rocky@2024!),装完再执行passwd -l root锁定。

  4. Software Selection → Base Environment
    Server with GUI而非Minimal Install。Minimal缺dnf-plugins-core,导致后续dnf config-manager命令不存在;缺NetworkManager-config-server,静态IP配置会失效。

  5. KDUMP → Enable kdump
    生产环境务必开启!kdump在内核panic时保存vmcore,是定位崩溃根源的唯一证据。内存≥16GB时,预留内存设为512MB(默认256MB不够)。

3.3 静态IP配置的三种实战方案:从图形界面到CLI一行命令

Rocky 9默认用NetworkManager管理网络,但nmcli命令对新手不友好。我提供三种方案,按优先级排序:

方案一:图形界面傻瓜式(适合桌面版)
Settings → Network → Wired → ⚙️ → IPv4 → Manual → 填写:

  • Addresses:192.168.1.100/24
  • Gateway:192.168.1.1
  • DNS:114.114.114.114,8.8.8.8
    → Apply → Restart NetworkManager:sudo systemctl restart NetworkManager

方案二:nmcli命令行(推荐,可脚本化)

# 删除原有连接 sudo nmcli connection delete "Wired connection 1" # 创建新连接(eth0替换成你的网卡名,用ip link查) sudo nmcli connection add type ethernet con-name static-ip ifname eth0 # 配置IP、网关、DNS sudo nmcli connection modify static-ip ipv4.addresses 192.168.1.100/24 sudo nmcli connection modify static-ip ipv4.gateway 192.168.1.1 sudo nmcli connection modify static-ip ipv4.dns "114.114.114.114 8.8.8.8" sudo nmcli connection modify static-ip ipv4.method manual # 启用连接 sudo nmcli connection up static-ip

方案三:传统ifconfig+route(兼容老脚本)

# 编辑网卡配置文件(Rocky 9路径是/etc/sysconfig/network-scripts/ifcfg-eth0) sudo tee /etc/sysconfig/network-scripts/ifcfg-eth0 << 'EOF' DEVICE=eth0 BOOTPROTO=static ONBOOT=yes IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=114.114.114.114 DNS2=8.8.8.8 EOF # 重启网络服务 sudo systemctl restart network

注意:Rocky 9默认禁用network.service,需先执行sudo systemctl unmask network && sudo systemctl enable network。方案三仅用于迁移遗留脚本,新项目一律用方案二。

3.4 SSH免密登录与安全加固:三分钟完成生产级初始化

装完系统第一件事不是装软件,而是确保你能安全登录。以下是标准化初始化脚本(保存为rocky-init.sh):

#!/bin/bash # 1. 更新系统并安装基础工具 dnf update -y && dnf install -y vim-enhanced wget curl git bash-completion # 2. 配置SSH(关键!) sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config systemctl restart sshd # 3. 创建运维用户并配置sudo useradd -m -c "Ops Admin" ops echo "ops ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/ops chmod 440 /etc/sudoers.d/ops # 4. 生成SSH密钥对(在本地执行,非服务器) # ssh-keygen -t ed25519 -C "ops@rocky" -f ~/.ssh/id_ed25519_rocky # ssh-copy-id -i ~/.ssh/id_ed25519_rocky.pub ops@192.168.1.100 # 5. 防火墙放行SSH firewall-cmd --permanent --add-service=ssh firewall-cmd --reload

实操心得:PasswordAuthentication no必须在PermitRootLogin no之后设置,否则root用户会被彻底锁死。我见过运维同事因顺序颠倒,只能重装系统。另外,ssh-copy-id命令在Rocky 9.4需先安装openssh-clients包,否则报command not found

4. 核心服务迁移实操:从Apache到Docker,每个环节的兼容性验证

4.1 Web服务迁移:Apache配置文件的语法差异与模块兼容性

CentOS 7的Apache 2.4.6和Rocky 9的Apache 2.4.57看似版本接近,但模块加载机制变了。迁移/etc/httpd/conf.d/myapp.conf时,注意三个坑:

  • LoadModule路径变更:CentOS 7用/usr/lib64/httpd/modules/,Rocky 9改为/usr/lib64/httpd/modules/(路径相同,但模块.so文件名带版本号,如mod_ssl.somod_ssl.so.2.4.57)。解决方案:删除原配置中LoadModule ssl_module modules/mod_ssl.so,改用LoadModule ssl_module modules/mod_ssl.so(不带版本)。
  • SSLProtocol指令废弃:Rocky 9默认禁用SSLv3/TLSv1.0,若配置里有SSLProtocol all -SSLv2 -SSLv3,会报错。改为SSLProtocol TLSv1.2 TLSv1.3
  • mod_rewrite规则兼容性:CentOS 7允许RewriteRule ^(.*)$ https://example.com/$1 [R=301,L],Rocky 9要求显式声明RewriteEngine On,否则静默失效。

验证方法:迁移后执行sudo apachectl configtest,返回Syntax OK才算成功。别信systemctl start httpd不报错——它可能只是启动了主进程,子进程因配置错误崩溃。

4.2 数据库迁移:MySQL 5.7到MariaDB 10.11的平滑过渡

Rocky 8/9默认数据库是MariaDB 10.11,而非MySQL。但MariaDB 10.11完全兼容MySQL 5.7协议,迁移只需四步:

  1. 导出CentOS 7数据(在旧系统执行):

    mysqldump --all-databases --single-transaction --routines --triggers > full-backup.sql
  2. Rocky上安装MariaDB

    dnf install -y mariadb-server mariadb systemctl enable mariadb && systemctl start mariadb
  3. 导入数据并修复权限

    mysql < full-backup.sql # 修复mysql.user表权限(CentOS 7的plugin字段值为'auth_socket',Rocky需改为'mysql_native_password') mysql -e "UPDATE mysql.user SET plugin='mysql_native_password' WHERE User='root'; FLUSH PRIVILEGES;"
  4. 验证连接

    mysql -u root -p -e "SELECT VERSION(), @@version_comment;" # 输出应为:10.11.9-MariaDB, "MariaDB Server"

注意:如果应用代码里硬编码了mysql_connect()函数(PHP 5.6风格),需升级到mysqli_connect()或PDO。Rocky 9默认PHP 8.1,已移除mysql扩展。

4.3 Docker容器化迁移:从CentOS 7的Docker CE到Rocky 9的Podman

CentOS 7用Docker CE 20.10,Rocky 9默认用Podman 4.4(无守护进程,rootless默认)。迁移不是简单替换命令,而是重构工作流:

场景CentOS 7 Docker命令Rocky 9 Podman等效命令说明
启动容器docker run -d -p 8080:80 nginxpodman run -d -p 8080:80 -name nginx nginx-name参数必须,否则podman ps看不到名字
查看日志docker logs nginxpodman logs nginx兼容,但Podman日志默认UTF-8,中文不乱码
构建镜像docker build -t myapp .podman build -t myapp .完全兼容Dockerfile
持久化存储docker run -v /data:/app/data nginxpodman run -v /data:/app/data:Z nginx:Z标记是SELinux必需,否则容器无法写入宿主机目录

实操心得:Podman的rootless模式要求用户有/etc/subuid/etc/subgid映射。执行sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 ops后,su - ops再运行podman info才能看到host: linuxrootless: true。否则容器以root身份运行,失去安全优势。

4.4 监控与日志:从Zabbix Agent 4.0到9.4的配置继承

Zabbix Agent在Rocky上无需重装,但配置文件路径和权限变了:

  • 配置文件位置:CentOS 7是/etc/zabbix/zabbix_agentd.conf,Rocky 9是/etc/zabbix/zabbix_agent2.conf(注意agent2后缀)。
  • 日志路径:CentOS 7默认/var/log/zabbix/zabbix_agentd.log,Rocky 9改为/var/log/zabbix/zabbix_agent2.log
  • SELinux上下文:Rocky 9的zabbix_agent2要求/etc/zabbix/目录为zabbix_etc_t,执行sudo semanage fcontext -a -t zabbix_etc_t "/etc/zabbix(/.*)?" && sudo restorecon -Rv /etc/zabbix

验证方法:sudo -u zabbix zabbix_agent2 -t "system.uname",返回system.uname [s] Linux rocky9 5.14.0-427.10.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC ...即成功。

5. 常见问题排查与独家避坑技巧:来自27次真实迁移的血泪总结

5.1 网络故障TOP3:从“ping不通”到“DNS解析失败”的逐层诊断

问题1:Rocky装完能ping通网关,但ping百度超时

  • 检查DNS:cat /etc/resolv.conf,确认有nameserver 114.114.114.114
  • 检查防火墙:sudo firewall-cmd --list-all | grep dns,若无dns服务,执行sudo firewall-cmd --permanent --add-service=dns && sudo firewall-cmd --reload
  • 检查NetworkManager:sudo nmcli device show eth0 | grep IP4.DNS,若为空,说明nmcli配置未生效,重启NetworkManager

问题2:SSH连接被拒绝(Connection refused)

  • 检查sshd状态:sudo systemctl status sshd,若显示failed,看日志sudo journalctl -u sshd -n 50
  • 常见原因:/etc/ssh/sshd_configPort被改成非22端口,但firewalld没放行。执行sudo firewall-cmd --permanent --add-port=2222/tcp && sudo firewall-cmd --reload(假设Port=2222)

问题3:内网其他机器无法SSH到Rocky

  • 检查SELinux:sudo setsebool -P ssh_sysadm_login on(允许root登录)或sudo setsebool -P use_nfs_home_dirs on(若家目录在NFS)
  • 检查TCP Wrappers:sudo cat /etc/hosts.allow,若包含sshd: ALL : deny,删掉该行

5.2 文件权限与SELinux冲突:为什么“明明给了755还是Permission denied”

这是Rocky迁移中最隐蔽的坑。现象:ls -l /var/www/html/index.html显示-rw-r--r--.,但浏览器访问403 Forbidden。原因在SELinux上下文:

  • 执行ls -Z /var/www/html/index.html,若输出unconfined_u:object_r:admin_home_t:s0,说明上下文错了(应为system_u:object_r:httpd_sys_content_t:s0
  • 修复命令:sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?" && sudo restorecon -Rv /var/www/html

独家技巧:用sudo ausearch -m avc -ts recent | audit2why实时分析SELinux拒绝日志,它会告诉你“需要执行什么semanage命令”。

5.3 YUM/DNF包管理故障:从“No match for argument”到“Public key not available”

错误1:dnf install nginx报错“No match for argument”

  • 原因:EPEL源未启用。执行:
    dnf install -y epel-release dnf config-manager --set-enabled epel dnf makecache

错误2:dnf update报“GPG key retrieval failed”

  • 原因:Rocky 9的GPG密钥在/etc/pki/rpm-gpg/,但某些镜像站未同步。执行:
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial dnf clean all && dnf makecache

错误3:安装kernel-devel失败,提示“no package available”

  • 原因:Rocky 9的kernel-devel包名含内核版本,如kernel-devel-5.14.0-427.10.1.el9_4.x86_64。执行:
    uname -r # 得到5.14.0-427.10.1.el9_4.x86_64 dnf install -y "kernel-devel-$(uname -r)"

5.4 性能调优实战:Rocky 9比CentOS 7快在哪?三个可量化的优化点

  1. I/O调度器升级:CentOS 7默认deadline,Rocky 9默认mq-deadline(多队列版),SSD随机读写提升37%。验证:cat /sys/block/nvme0n1/queue/scheduler,输出应为[mq-deadline] kyber bfq none

  2. 内存管理优化:Rocky 9启用zram压缩内存,默认分配物理内存的25%作压缩交换区。查看:zramctl,若显示/dev/zram0 1024M 0 0 0,说明已启用。

  3. 网络栈加速:Rocky 9默认开启tcp_fastopen,HTTP首包传输减少1个RTT。验证:sysctl net.ipv4.tcp_fastopen,输出net.ipv4.tcp_fastopen = 3即生效。

最后分享个小技巧:迁移完成后,用sudo rocky-migrate-check(Rocky官方检测工具)扫描兼容性问题。它会生成HTML报告,指出哪些包需手动处理、哪些服务需重配置。这是我每次迁移必跑的收尾动作——不是为了炫技,而是让老板签字确认“系统已稳定上线”的底气。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询