Skip to content

从 CentOS 7 迁移到 AlmaLinux 10 指南

本指南提供从 CentOS 7 迁移到 AlmaLinux 10 的完整解决方案。由于版本跨度较大,推荐采用全新安装并迁移数据的方式。

重要提醒

CentOS 7 到 AlmaLinux 10 没有直接升级路径,必须进行全新安装。请务必做好完整备份!

迁移概览

迁移策略对比

策略优点缺点推荐度
全新安装系统清洁、性能最佳需要重新配置⭐⭐⭐⭐⭐
双机迁移风险较低、可逐步切换需要额外硬件⭐⭐⭐⭐
虚拟化迁移便于测试和回滚性能有损失⭐⭐⭐

版本差异概览

特性CentOS 7AlmaLinux 10影响程度
内核版本3.10.x6.6+🔴 高
systemdv219v255+🟡 中
Python2.7/3.63.12🔴 高
OpenSSL1.0.23.0+🟡 中
默认防火墙firewalldfirewalld (增强)🟢 低

第一阶段:迁移准备

1. 系统评估

1.1 硬件兼容性检查

bash
# 检查 CPU 架构
lscpu | grep Architecture
# 确保是 x86_64

# 检查内存
free -h
# AlmaLinux 10 建议至少 2GB 内存

# 检查磁盘空间
df -h
# 建议至少 20GB 可用空间

# 检查网络接口
ip addr show

1.2 服务清单盘点

bash
# 列出所有运行的服务
systemctl list-units --type=service --state=running > services_list.txt

# 列出自启动服务
systemctl list-unit-files --type=service --state=enabled > autostart_services.txt

# 检查已安装的包
yum list installed > installed_packages.txt

# 检查自定义 RPM 包
rpm -qa --last | head -20

1.3 配置文件备份清单

bash
# 创建配置备份脚本
cat > backup_configs.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/backup/centos7-configs"
mkdir -p $BACKUP_DIR

# 系统配置
cp -r /etc $BACKUP_DIR/
cp -r /var/spool/cron $BACKUP_DIR/
cp -r /opt $BACKUP_DIR/

# Web 服务器配置
[ -d /etc/httpd ] && cp -r /etc/httpd $BACKUP_DIR/
[ -d /etc/nginx ] && cp -r /etc/nginx $BACKUP_DIR/

# 数据库配置  
[ -d /etc/mysql ] && cp -r /etc/mysql $BACKUP_DIR/
[ -d /var/lib/mysql ] && mysqldump --all-databases > $BACKUP_DIR/mysql_backup.sql

# 用户数据
cp -r /home $BACKUP_DIR/

echo "配置备份完成:$BACKUP_DIR"
EOF

chmod +x backup_configs.sh
./backup_configs.sh

2. 数据备份策略

2.1 关键数据备份

bash
# 创建完整数据备份脚本
cat > full_backup.sh << 'EOF'
#!/bin/bash
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_ROOT="/backup/centos7_migration_$BACKUP_DATE"
mkdir -p $BACKUP_ROOT

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

# 1. 系统配置
echo "备份系统配置..."
tar -czf $BACKUP_ROOT/etc_backup.tar.gz /etc

# 2. 用户数据
echo "备份用户数据..."
tar -czf $BACKUP_ROOT/home_backup.tar.gz /home

# 3. 应用数据
echo "备份应用数据..."
[ -d /var/www ] && tar -czf $BACKUP_ROOT/www_backup.tar.gz /var/www
[ -d /opt ] && tar -czf $BACKUP_ROOT/opt_backup.tar.gz /opt

# 4. 数据库备份
if systemctl is-active mariadb &>/dev/null; then
    echo "备份 MariaDB 数据库..."
    mysqldump --all-databases --single-transaction > $BACKUP_ROOT/mariadb_full.sql
fi

if systemctl is-active postgresql &>/dev/null; then
    echo "备份 PostgreSQL 数据库..."
    su - postgres -c "pg_dumpall" > $BACKUP_ROOT/postgresql_full.sql
fi

# 5. 生成系统信息报告
echo "生成系统信息..."
{
    echo "=== 系统信息 ==="
    uname -a
    cat /etc/centos-release
    echo ""
    echo "=== 网络配置 ==="
    ip addr show
    echo ""
    echo "=== 磁盘使用 ==="
    df -h
    echo ""
    echo "=== 运行服务 ==="
    systemctl list-units --type=service --state=running
} > $BACKUP_ROOT/system_info.txt

echo "备份完成:$BACKUP_ROOT"
ls -la $BACKUP_ROOT
EOF

chmod +x full_backup.sh
./full_backup.sh

第二阶段:AlmaLinux 10 部署

1. 安装准备

1.1 获取 AlmaLinux 10 镜像

bash
# 下载 AlmaLinux 10 ISO(使用国内镜像)
# 阿里云镜像源
wget https://mirrors.aliyun.com/almalinux/10/isos/x86_64/AlmaLinux-10-x86_64-minimal.iso

# 验证校验和
sha256sum AlmaLinux-10-x86_64-minimal.iso

1.2 安装介质准备

bash
# 制作启动 U 盘
sudo dd if=AlmaLinux-10-x86_64-minimal.iso of=/dev/sdX bs=4M status=progress
sync

2. 全新安装 AlmaLinux 10

2.1 基础安装配置

进行标准安装流程,建议配置:

  • 分区方案

    /boot      : 1GB  (ext4)
    /          : 20GB (xfs)
    /home      : 剩余空间 (xfs)
    swap       : 2GB
  • 网络配置:保持与原服务器相同的 IP 设置

  • 时区设置:Asia/Shanghai

  • 语言环境:简体中文

2.2 初始化脚本

bash
# 创建初始化脚本
cat > almalinux10_init.sh << 'EOF'
#!/bin/bash

echo "AlmaLinux 10 初始化配置..."

# 1. 更新系统包
dnf update -y

# 2. 安装必要工具
dnf install -y \
    vim wget curl git \
    rsync screen tmux \
    htop iotop lsof \
    firewalld fail2ban \
    policycoreutils-python-utils

# 3. 配置防火墙
systemctl enable --now firewalld
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload

# 4. 设置时区
timedatectl set-timezone Asia/Shanghai

# 5. 配置 DNF 使用国内镜像源
cp /etc/dnf/dnf.conf /etc/dnf/dnf.conf.bak
cat >> /etc/dnf/dnf.conf << 'DNFCONF'
fastestmirror=True
max_parallel_downloads=10
keepcache=True
DNFCONF

# 6. 创建恢复目录
mkdir -p /migration/{configs,data,scripts}

echo "AlmaLinux 10 初始化完成"
EOF

chmod +x almalinux10_init.sh
./almalinux10_init.sh

第三阶段:数据迁移

1. 配置文件迁移

1.1 网络配置恢复

bash
# CentOS 7 使用 network-scripts,AlmaLinux 10 使用 NetworkManager
# 需要转换配置格式

# 1. 查看 CentOS 7 的网络配置
cat /backup/centos7-configs/etc/sysconfig/network-scripts/ifcfg-eth0

# 2. 在 AlmaLinux 10 上重新配置
nmcli con add type ethernet con-name eth0 ifname eth0 \
    ip4 192.168.1.100/24 gw4 192.168.1.1

# 3. 配置 DNS
nmcli con mod eth0 ipv4.dns "8.8.8.8 114.114.114.114"

# 4. 激活连接
nmcli con up eth0

1.2 SSH 配置迁移

bash
# 备份当前 SSH 配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 从备份恢复 SSH 配置(需要适配)
# CentOS 7 和 AlmaLinux 10 的 SSH 配置大部分兼容
grep -v "^#" /backup/centos7-configs/etc/ssh/sshd_config > ssh_config_clean.txt

# 检查配置兼容性
sshd -t -f ssh_config_clean.txt

# 应用配置并重启服务
cp ssh_config_clean.txt /etc/ssh/sshd_config
systemctl restart sshd

2. Web 服务迁移

2.1 Apache/Nginx 配置迁移

bash
# 安装 Web 服务器
dnf install -y httpd nginx php php-fpm mariadb-server

# 迁移 Apache 配置
if [ -d /backup/centos7-configs/etc/httpd ]; then
    echo "迁移 Apache 配置..."
    
    # 复制主配置文件(需要检查路径差异)
    cp /backup/centos7-configs/etc/httpd/conf/httpd.conf /etc/httpd/conf/
    
    # 复制虚拟主机配置
    cp -r /backup/centos7-configs/etc/httpd/conf.d/* /etc/httpd/conf.d/
    
    # 检查配置语法
    httpd -t
    
    # 启动服务
    systemctl enable --now httpd
fi

# 迁移网站文件
if [ -d /backup/www_backup ]; then
    tar -xzf /backup/www_backup.tar.gz -C /
    chown -R apache:apache /var/www
    restorecon -Rv /var/www
fi

2.2 数据库服务迁移

bash
# 安装并配置 MariaDB
dnf install -y mariadb-server
systemctl enable --now mariadb

# 安全初始化
mysql_secure_installation

# 恢复数据库
if [ -f /backup/mariadb_full.sql ]; then
    echo "恢复 MariaDB 数据..."
    mysql < /backup/mariadb_full.sql
fi

# 检查数据完整性
mysql -e "SHOW DATABASES;"

3. 用户数据恢复

3.1 用户账户迁移

bash
# 从备份恢复用户账户
# 注意:不要直接覆盖 passwd、shadow 文件,需要合并

# 1. 提取用户账户信息(UID >= 1000 的普通用户)
awk -F: '$3 >= 1000 && $3 != 65534' /backup/centos7-configs/etc/passwd > users_to_migrate.txt

# 2. 逐个创建用户
while IFS=: read -r username password uid gid gecos home shell; do
    echo "创建用户: $username"
    useradd -u $uid -g $gid -c "$gecos" -d $home -s $shell $username
done < users_to_migrate.txt

# 3. 恢复用户家目录
tar -xzf /backup/home_backup.tar.gz -C /
chown -R --reference=/backup/centos7-configs/home /home

3.2 应用程序迁移

bash
# 恢复 /opt 目录下的应用
if [ -f /backup/opt_backup.tar.gz ]; then
    tar -xzf /backup/opt_backup.tar.gz -C /
    
    # 重新设置权限和 SELinux 上下文
    restorecon -Rv /opt
fi

# 重新安装必要的应用程序包
# 根据 installed_packages.txt 安装兼容的包
while read package; do
    dnf install -y $package 2>/dev/null || echo "Package $package not available"
done < installed_packages.txt

第四阶段:服务验证

1. 系统服务检查

1.1 基础服务验证

bash
# 创建服务验证脚本
cat > verify_services.sh << 'EOF'
#!/bin/bash

echo "=== AlmaLinux 10 服务验证 ==="

# 1. 系统信息
echo "系统版本:"
cat /etc/almalinux-release
uname -a

# 2. 网络连接
echo -e "\n网络测试:"
ping -c 3 8.8.8.8
curl -s http://httpbin.org/ip

# 3. 重要服务状态
echo -e "\n服务状态检查:"
services=("sshd" "firewalld" "chronyd" "NetworkManager")
for service in "${services[@]}"; do
    if systemctl is-active $service &>/dev/null; then
        echo "✅ $service - 运行中"
    else
        echo "❌ $service - 停止"
    fi
done

# 4. 磁盘空间
echo -e "\n磁盘使用:"
df -h

# 5. 内存使用
echo -e "\n内存使用:"
free -h

# 6. SELinux 状态
echo -e "\nSELinux 状态:"
sestatus
EOF

chmod +x verify_services.sh
./verify_services.sh

1.2 Web 服务验证

bash
# Web 服务测试脚本
cat > test_web_services.sh << 'EOF'
#!/bin/bash

echo "=== Web 服务测试 ==="

# 测试 Apache
if systemctl is-active httpd &>/dev/null; then
    echo "✅ Apache 运行中"
    curl -s -o /dev/null -w "Apache 响应时间: %{time_total}s\n" http://localhost
else
    echo "❌ Apache 未运行"
fi

# 测试数据库连接
if systemctl is-active mariadb &>/dev/null; then
    echo "✅ MariaDB 运行中"
    mysql -e "SELECT VERSION();" 2>/dev/null && echo "数据库连接正常"
else
    echo "❌ MariaDB 未运行"
fi

# 测试 PHP
if command -v php &>/dev/null; then
    php_version=$(php -v | head -1)
    echo "PHP 版本: $php_version"
fi
EOF

chmod +x test_web_services.sh
./test_web_services.sh

2. 性能对比测试

2.1 系统性能基准测试

bash
# 安装性能测试工具
dnf install -y sysbench fio

# CPU 性能测试
echo "CPU 性能测试:"
sysbench cpu --threads=4 run

# 内存性能测试  
echo "内存性能测试:"
sysbench memory run

# 磁盘 I/O 测试
echo "磁盘 I/O 测试:"
fio --name=random-write --ioengine=posixaio --rw=randwrite --bs=4k --size=1G --runtime=60 --time_based --end_fsync=1

第五阶段:切换上线

1. DNS 切换准备

1.1 切换前检查清单

bash
# 创建切换前检查脚本
cat > pre_switch_checklist.sh << 'EOF'
#!/bin/bash

echo "=== 切换前检查清单 ==="

checks_passed=0
total_checks=10

# 1. 系统运行时间
uptime_hours=$(awk '{print int($1/3600)}' /proc/uptime)
if [ $uptime_hours -gt 1 ]; then
    echo "✅ 系统稳定运行 $uptime_hours 小时"
    ((checks_passed++))
else
    echo "❌ 系统运行时间不足"
fi

# 2. 所有服务状态
critical_services=("sshd" "httpd" "mariadb" "firewalld")
service_ok=true
for service in "${critical_services[@]}"; do
    if ! systemctl is-active $service &>/dev/null; then
        echo "❌ 关键服务 $service 未运行"
        service_ok=false
    fi
done

if $service_ok; then
    echo "✅ 所有关键服务运行正常"
    ((checks_passed++))
fi

# 3. 网站可访问性
if curl -s -f http://localhost &>/dev/null; then
    echo "✅ 网站可正常访问"
    ((checks_passed++))
else
    echo "❌ 网站访问异常"
fi

# 4. 数据库连接
if mysql -e "SELECT 1;" &>/dev/null; then
    echo "✅ 数据库连接正常"
    ((checks_passed++))
else
    echo "❌ 数据库连接失败"
fi

# 5. 磁盘空间
root_usage=$(df / | awk 'NR==2{print int($5)}')
if [ $root_usage -lt 80 ]; then
    echo "✅ 磁盘空间充足 (${root_usage}%)"
    ((checks_passed++))
else
    echo "❌ 磁盘空间不足 (${root_usage}%)"
fi

echo -e "\n检查结果: $checks_passed/$total_checks 通过"

if [ $checks_passed -eq $total_checks ]; then
    echo "🎉 所有检查通过,可以进行切换"
    exit 0
else
    echo "⚠️  存在问题,不建议立即切换"
    exit 1
fi
EOF

chmod +x pre_switch_checklist.sh
./pre_switch_checklist.sh

2. 回滚方案

2.1 快速回滚脚本

bash
# 创建回滚脚本
cat > rollback_plan.sh << 'EOF'
#!/bin/bash

echo "=== 紧急回滚方案 ==="

# 如果新系统出现问题,快速回滚到原 CentOS 7 服务器
# 1. 停止新服务器上的服务
systemctl stop httpd mariadb

# 2. 更新 DNS 记录指向原服务器
echo "请手动将 DNS 记录指向原 CentOS 7 服务器:"
echo "原服务器 IP: [原服务器IP地址]"

# 3. 记录回滚时间和原因
echo "回滚时间: $(date)" >> /var/log/migration_rollback.log
echo "回滚原因: $1" >> /var/log/migration_rollback.log

echo "回滚操作完成,请检查服务恢复情况"
EOF

chmod +x rollback_plan.sh

常见问题排查

1. 网络配置问题

bash
# 问题:网络连接异常
# 解决方案:
nmcli device status
nmcli connection show
systemctl restart NetworkManager

# 问题:DNS 解析失败
# 解决方案:
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
systemctl restart systemd-resolved

2. 服务启动问题

bash
# 问题:Apache 启动失败
# 解决方案:
httpd -t  # 检查配置语法
systemctl status httpd  # 查看详细错误
journalctl -u httpd  # 查看日志

# 问题:MariaDB 启动失败
# 解决方案:
systemctl status mariadb
cat /var/log/mariadb/mariadb.log

3. SELinux 权限问题

bash
# 问题:网站文件访问被拒绝
# 解决方案:
setsebool -P httpd_read_user_content 1
restorecon -Rv /var/www
chcon -t httpd_exec_t /var/www/html/*.php

迁移验收标准

1. 功能验收

  • [ ] 所有原有网站正常访问
  • [ ] 数据库数据完整性验证通过
  • [ ] 用户账户和权限正确
  • [ ] 定时任务正常执行
  • [ ] 邮件服务正常(如有)

2. 性能验收

  • [ ] 网站响应时间不超过原系统 120%
  • [ ] 系统负载在正常范围内
  • [ ] 内存使用率 < 80%
  • [ ] 磁盘 I/O 性能满足要求

3. 安全验收

  • [ ] 防火墙规则正确配置
  • [ ] SELinux 正常启用
  • [ ] SSL 证书正常工作
  • [ ] 漏洞扫描通过

完成迁移后,建议阅读 AlmaLinux 10 安全加固指南 进一步提升系统安全性。

基于 MIT 许可发布