Skip to content

CentOS Stream 到 AlmaLinux 10 迁移指南

本指南详细介绍如何从 CentOS Stream 8/9 迁移到 AlmaLinux 10,提供多种迁移路径和完整的操作步骤。

迁移概述

CentOS Stream 迁移特点

yaml
迁移类型: RHEL 系列内部迁移
复杂度: 中等
预计时间: 2-6小时/系统
主要优势:
  - 相同的软件包管理器 (DNF)
  - 相似的系统架构
  - 大部分配置文件兼容
  - 相同的服务管理 (systemd)

注意事项:
  - CentOS Stream 是滚动发布
  - AlmaLinux 是固定版本发布
  - 包版本可能不完全匹配
  - 需要验证自定义软件兼容性

支持的迁移路径

源系统目标系统迁移方法推荐度
CentOS Stream 8AlmaLinux 9ELevate 工具推荐
CentOS Stream 8AlmaLinux 10两步升级复杂
CentOS Stream 9AlmaLinux 10ELevate 工具推荐
CentOS Stream 9AlmaLinux 10全新安装+数据迁移最安全

第一阶段:迁移前准备

1.1 系统评估和备份

检查当前系统状态

bash
# 检查系统版本
cat /etc/centos-release
cat /etc/os-release

# 检查内核版本
uname -r

# 检查已安装的软件包
dnf list installed > centos_packages.txt

# 检查运行的服务
systemctl list-units --type=service --state=running > running_services.txt

# 检查网络配置
ip addr show
cat /etc/resolv.conf

# 检查存储使用情况
df -h
lsblk

备份关键数据和配置

bash
# 创建备份目录
mkdir -p /backup/$(date +%Y%m%d)
cd /backup/$(date +%Y%m%d)

# 备份系统配置
tar -czf etc_backup.tar.gz /etc/

# 备份用户数据
cp /etc/passwd /etc/shadow /etc/group /etc/gshadow ./

# 备份网络配置
cp -r /etc/sysconfig/network-scripts/ ./

# 备份防火墙配置
firewall-cmd --list-all-zones > firewall_zones.txt

# 备份 crontab
crontab -l > root_crontab.txt
for user in $(cut -f1 -d: /etc/passwd); do
    if crontab -u $user -l >/dev/null 2>&1; then
        echo "### Crontab for $user ###" >> all_crontabs.txt
        crontab -u $user -l >> all_crontabs.txt
        echo "" >> all_crontabs.txt
    fi
done

# 备份重要数据库 (如果有)
if systemctl is-active --quiet mysqld || systemctl is-active --quiet mariadb; then
    mysqldump --all-databases --single-transaction > mysql_backup.sql
fi

if systemctl is-active --quiet postgresql; then
    sudo -u postgres pg_dumpall > postgresql_backup.sql
fi

1.2 迁移兼容性检查

第三方软件包检查

bash
# 检查非官方仓库的软件包
dnf repolist enabled
dnf list installed | grep -v "base\|updates\|extras\|epel"

# 检查手动安装的 RPM 包
rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH} %{VENDOR}\n" | grep -v "CentOS\|Red Hat"

# 检查 Python 包
pip list --format=freeze > python_packages.txt

# 检查 Node.js 包 (如果有)
if command -v npm &> /dev/null; then
    npm list -g --depth=0 > npm_global_packages.txt
fi

自定义配置检查

bash
# 检查自定义的 systemd 服务
find /etc/systemd/system/ -name "*.service" -exec basename {} \;

# 检查 SELinux 自定义策略
semanage fcontext -l | grep -v "system_u:object_r"
semanage port -l | grep -v "system_u:object_r"

# 检查内核模块
lsmod > loaded_modules.txt
cat /etc/modules-load.d/* > kernel_modules.txt 2>/dev/null || true

第二阶段:使用 ELevate 工具迁移

2.1 安装 ELevate 迁移工具

CentOS Stream 8 迁移准备

bash
# 更新系统到最新版本
dnf update -y

# 安装 ELevate 仓库
dnf install -y http://repo.almalinux.org/elevate/elevate-release-latest-el8.noarch.rpm

# 安装 leapp 升级工具
dnf install -y leapp-upgrade leapp-data-almalinux

# 检查升级兼容性
leapp preupgrade --target almalinux9

CentOS Stream 9 迁移准备

bash
# 更新系统到最新版本
dnf update -y

# 安装 ELevate 仓库
dnf install -y http://repo.almalinux.org/elevate/elevate-release-latest-el9.noarch.rpm

# 安装 leapp 升级工具
dnf install -y leapp-upgrade leapp-data-almalinux

# 检查升级兼容性
leapp preupgrade --target almalinux10

2.2 处理预升级检查问题

常见问题和解决方案

bash
# 问题 1: 第三方软件包冲突
# 解决方案: 临时移除或更新
dnf remove package_name
# 或者
dnf update package_name

# 问题 2: 不支持的设备驱动
# 解决方案: 更新驱动或使用通用驱动
dnf update kernel kernel-modules

# 问题 3: SELinux 策略问题
# 解决方案: 临时禁用或修复策略
setenforce 0
# 编辑 /etc/selinux/config 设置 SELINUX=permissive

# 问题 4: 自定义仓库冲突
# 解决方案: 备份并禁用第三方仓库
cp /etc/yum.repos.d/custom.repo /etc/yum.repos.d/custom.repo.bak
dnf config-manager --disable custom-repo

创建升级应答文件

bash
# 创建应答文件处理已知问题
cat > /var/log/leapp/answerfile << 'EOF'
[remove_pam_pkcs11_module_check]
confirm = True

[authselect_check]
confirm = True

[check_vdo]
confirm = True
EOF

2.3 执行升级

开始系统升级

bash
# 执行升级 (此过程会重启系统)
leapp upgrade --target almalinux9  # 或 almalinux10

# 系统会自动重启到升级环境
# 等待升级完成 (通常需要 30-60 分钟)

# 升级完成后,系统会再次重启到新系统

升级后验证

bash
# 检查系统版本
cat /etc/almalinux-release
cat /etc/os-release

# 检查内核版本
uname -r

# 检查服务状态
systemctl list-units --type=service --state=failed

# 检查网络连接
ping -c 4 8.8.8.8

# 检查软件包状态
dnf check

# 检查 SELinux 状态
sestatus

第三阶段:全新安装迁移方法

3.1 数据备份和准备

完整数据备份

bash
# 创建数据备份脚本
cat > /root/full_backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/mnt/backup"
DATE=$(date +%Y%m%d_%H%M%S)

echo "开始完整系统备份..."

# 创建备份目录
mkdir -p $BACKUP_DIR/system_$DATE

# 备份系统配置
tar --exclude='/proc' --exclude='/tmp' --exclude='/mnt' --exclude='/dev' \
    --exclude='/sys' --exclude='/run' --exclude='/media' \
    --exclude='/lost+found' --exclude='/backup' \
    -czf $BACKUP_DIR/system_$DATE/rootfs_backup.tar.gz /

# 备份数据库
if systemctl is-active --quiet mysqld; then
    mysqldump --all-databases --single-transaction > $BACKUP_DIR/system_$DATE/mysql_dump.sql
fi

# 创建包列表
dnf list installed > $BACKUP_DIR/system_$DATE/installed_packages.txt

# 备份用户数据
rsync -avz /home/ $BACKUP_DIR/system_$DATE/home_backup/

echo "备份完成: $BACKUP_DIR/system_$DATE"
EOF

chmod +x /root/full_backup.sh
/root/full_backup.sh

3.2 AlmaLinux 10 全新安装

安装过程配置

yaml
安装准备:
  1. 下载 AlmaLinux 10 ISO 镜像
  2. 创建安装媒体 (USB/DVD)
  3. 记录网络配置参数
  4. 规划磁盘分区方案

分区建议:
  /boot: 1GB (XFS)
  /boot/efi: 512MB (FAT32, UEFI系统)
  /: 20GB+ (XFS)
  /home: 根据需要 (XFS)
  /var: 10GB+ (XFS)
  swap: 等于内存大小或2倍内存 (小内存系统)

基础系统配置

bash
# 安装完成后的基础配置

# 配置网络 (如果安装时未配置)
nmcli con mod "System eth0" ipv4.addresses 192.168.1.100/24
nmcli con mod "System eth0" ipv4.gateway 192.168.1.1
nmcli con mod "System eth0" ipv4.dns 8.8.8.8,8.8.4.4
nmcli con mod "System eth0" ipv4.method manual
nmcli con up "System eth0"

# 配置主机名
hostnamectl set-hostname your-hostname.domain.com

# 配置时区
timedatectl set-timezone Asia/Shanghai

# 更新系统
dnf update -y

# 安装常用工具
dnf install -y vim wget curl rsync lsof htop

3.3 数据和配置恢复

系统配置恢复

bash
# 从备份恢复配置 (选择性恢复)
BACKUP_DIR="/mnt/backup/system_20241201_120000"

# 恢复用户和组
cp $BACKUP_DIR/passwd /etc/passwd.centos
cp $BACKUP_DIR/shadow /etc/shadow.centos
cp $BACKUP_DIR/group /etc/group.centos

# 合并用户数据 (手动检查避免冲突)
# 注意: 不要直接覆盖,要合并差异

# 恢复网络配置 (如果需要)
cp -r $BACKUP_DIR/network-scripts/* /etc/sysconfig/network-scripts/

# 恢复 SSH 配置
cp $BACKUP_DIR/etc_backup/etc/ssh/sshd_config /etc/ssh/
systemctl restart sshd

# 恢复防火墙配置
# 注意: 需要适配新版本的防火墙配置格式

应用数据恢复

bash
# 恢复数据库
if [ -f "$BACKUP_DIR/mysql_dump.sql" ]; then
    dnf install -y mysql-server
    systemctl enable --now mysqld
    mysql_secure_installation
    mysql < $BACKUP_DIR/mysql_dump.sql
fi

# 恢复用户数据
rsync -avz $BACKUP_DIR/home_backup/ /home/

# 恢复应用配置
# 根据具体应用选择性恢复配置文件
cp $BACKUP_DIR/etc_backup/etc/nginx/nginx.conf /etc/nginx/ 2>/dev/null || true
cp $BACKUP_DIR/etc_backup/etc/php-fpm.conf /etc/ 2>/dev/null || true

# 恢复 crontab
if [ -f "$BACKUP_DIR/root_crontab.txt" ]; then
    crontab $BACKUP_DIR/root_crontab.txt
fi

第四阶段:系统优化和验证

4.1 软件包重新安装

从 CentOS Stream 包列表重建环境

bash
# 分析原系统软件包
BACKUP_DIR="/mnt/backup/system_20241201_120000"

# 创建软件包安装脚本
cat > /root/reinstall_packages.sh << 'EOF'
#!/bin/bash

# 读取原系统包列表
PACKAGE_LIST="$1"

if [ ! -f "$PACKAGE_LIST" ]; then
    echo "请提供软件包列表文件"
    exit 1
fi

# 提取包名 (去除版本号)
cat "$PACKAGE_LIST" | awk '{print $1}' | cut -d. -f1 | sort | uniq > clean_packages.txt

# 过滤掉基础系统包和内核包
grep -v -E "(kernel|@|\.i686)" clean_packages.txt > packages_to_install.txt

# 批量安装
echo "开始安装软件包..."
while read package; do
    echo "安装: $package"
    dnf install -y "$package" || echo "无法安装: $package"
done < packages_to_install.txt

echo "软件包安装完成"
EOF

chmod +x /root/reinstall_packages.sh
/root/reinstall_packages.sh $BACKUP_DIR/installed_packages.txt

处理软件包兼容性问题

bash
# 检查不兼容的包
dnf list --obsoletes
dnf check-update

# 查找替代软件包
dnf search package_name
dnf provides "*/file_name"

# 启用 EPEL 仓库获取更多软件包
dnf install -y epel-release

# 安装第三方仓库 (如 RPM Fusion)
dnf install -y https://download1.rpmfusion.org/free/el/rpmfusion-free-release-10.noarch.rpm

4.2 服务配置和启动

服务状态检查和配置

bash
# 检查所有服务状态
systemctl list-units --type=service --all

# 启用需要的服务
systemctl enable --now httpd      # 如果使用 Apache
systemctl enable --now nginx      # 如果使用 Nginx
systemctl enable --now mysqld     # 如果使用 MySQL
systemctl enable --now postgresql # 如果使用 PostgreSQL
systemctl enable --now firewalld  # 防火墙

# 检查失败的服务
systemctl list-units --type=service --state=failed

# 修复失败的服务
for service in $(systemctl list-units --type=service --state=failed --no-legend | awk '{print $1}'); do
    echo "检查服务: $service"
    systemctl status $service
    # 根据错误信息进行修复
done

网络服务配置

bash
# 配置防火墙规则
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

# 配置 SELinux (如果之前启用)
setenforce 1
setsebool -P httpd_can_network_connect 1

# 验证网络连接
ping -c 4 google.com
curl -I http://mirrors.almalinux.org

4.3 性能和功能验证

系统性能测试

bash
# CPU 性能测试
dnf install -y sysbench
sysbench cpu --cpu-max-prime=20000 run

# 内存测试
sysbench memory --memory-total-size=10G run

# 磁盘 I/O 测试
sysbench fileio --file-total-size=10G --file-test-mode=rndrw prepare
sysbench fileio --file-total-size=10G --file-test-mode=rndrw run
sysbench fileio --file-total-size=10G --file-test-mode=rndrw cleanup

# 系统负载测试
stress --cpu 4 --timeout 60s

应用功能验证

bash
# Web 服务器测试
if systemctl is-active --quiet httpd nginx; then
    curl -I http://localhost
    ab -n 100 -c 10 http://localhost/
fi

# 数据库连接测试
if systemctl is-active --quiet mysqld; then
    mysql -e "SELECT VERSION();"
fi

# SSH 连接测试
ssh -T localhost

# 文件系统检查
df -h
mount | grep -E "(xfs|ext4)"

第五阶段:迁移后清理和优化

5.1 系统清理

清理旧文件和配置

bash
# 清理旧内核 (保留最新的2个)
dnf remove $(dnf repoquery --installonly --latest-limit=-2 -q)

# 清理包缓存
dnf clean all

# 清理日志文件
journalctl --vacuum-time=7d
find /var/log -name "*.log.*" -mtime +30 -delete

# 清理临时文件
find /tmp -mtime +7 -delete
find /var/tmp -mtime +30 -delete

5.2 安全加固

基础安全配置

bash
# 更新所有软件包
dnf update -y

# 安装安全工具
dnf install -y aide tripwire fail2ban

# 配置 fail2ban
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
EOF

systemctl enable --now fail2ban

# 配置自动安全更新
dnf install -y dnf-automatic
systemctl enable --now dnf-automatic.timer

5.3 监控和日志配置

监控系统配置

bash
# 安装监控工具
dnf install -y collectd grafana prometheus

# 配置日志轮转
cat > /etc/logrotate.d/custom << 'EOF'
/var/log/custom/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 644 root root
}
EOF

# 配置系统监控告警
cat > /etc/systemd/system/disk-space-check.service << 'EOF'
[Unit]
Description=Disk Space Check
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/check-disk-space.sh

[Install]
WantedBy=multi-user.target
EOF

# 创建磁盘空间检查脚本
cat > /usr/local/bin/check-disk-space.sh << 'EOF'
#!/bin/bash
THRESHOLD=90
CURRENT=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')

if [ $CURRENT -gt $THRESHOLD ]; then
    logger "WARNING: Disk space is ${CURRENT}% full"
    # 发送告警邮件或通知
fi
EOF

chmod +x /usr/local/bin/check-disk-space.sh

故障排查和问题解决

常见迁移问题

ELevate 升级失败

bash
# 查看升级日志
cat /var/log/leapp/leapp-upgrade.log
cat /var/log/leapp/answerfile

# 常见解决方案
# 1. 清理第三方仓库
dnf config-manager --disable remi epel-*

# 2. 移除问题软件包
dnf remove problematic-package

# 3. 修复损坏的 RPM 数据库
rpm --rebuilddb

# 4. 重新运行升级
leapp upgrade --target almalinux10

网络配置问题

bash
# 网络接口未启动
nmcli device status
nmcli connection up "System eth0"

# DNS 解析问题
cat /etc/resolv.conf
systemctl restart NetworkManager

# 防火墙阻止连接
firewall-cmd --list-all
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

服务启动失败

bash
# 查看服务状态和日志
systemctl status service-name
journalctl -u service-name -f

# 常见修复方法
# 1. 权限问题
chown -R user:group /path/to/service/files

# 2. SELinux 问题
setsebool -P service_related_boolean 1
restorecon -R /path/to/service/files

# 3. 配置文件格式问题
service-name -t  # 测试配置文件语法

总结: CentOS Stream 到 AlmaLinux 10 的迁移相对比较直接,得益于两个系统的相似性。ELevate 工具提供了自动化的升级路径,但对于生产环境,建议优先考虑全新安装方法以确保系统的稳定性和一致性。

相关文档:

基于 MIT 许可发布