|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引言
随着Red Hat在2020年底宣布CentOS 8将于2021年底停止维护,并转向CentOS Stream滚动更新模式,许多企业和组织开始寻找稳定的企业级Linux替代方案。Rocky Linux作为由CentOS创始人Gregory Kurtzer发起的项目,旨在成为CentOS的直接继任者,提供与RHEL(Red Hat Enterprise Linux)二进制兼容的稳定版本。
对于企业而言,操作系统迁移是一项复杂且风险较高的任务。本文将详细介绍从其他Linux发行版(特别是CentOS)迁移到Rocky Linux的完整流程,分享实战经验,并提供避坑指南,帮助企业实现系统平滑过渡。
迁移前的准备工作
系统评估与兼容性检查
在开始迁移之前,全面评估现有系统环境至关重要。这包括:
1. 硬件兼容性检查:# 检查硬件信息
lscpu
lspci
lsblk
dmidecode -t system
2. 软件清单统计:# 生成已安装软件包列表
rpm -qa > installed_packages.txt
# 查找第三方仓库
yum repolist
3. 服务依赖分析:# 检查运行中的服务
systemctl list-units --type=service --state=running
# 查看服务依赖关系
systemctl list-dependencies
硬件兼容性检查:
- # 检查硬件信息
- lscpu
- lspci
- lsblk
- dmidecode -t system
复制代码
软件清单统计:
- # 生成已安装软件包列表
- rpm -qa > installed_packages.txt
- # 查找第三方仓库
- yum repolist
复制代码
服务依赖分析:
- # 检查运行中的服务
- systemctl list-units --type=service --state=running
- # 查看服务依赖关系
- systemctl list-dependencies
复制代码
数据备份策略
完整的备份是迁移安全的保障:
1. 系统级备份:
“`bash使用rsync进行文件系统备份rsync -aAXHv / –exclude=/dev/* –exclude=/proc/* –exclude=/sys/* –exclude=/tmp/* –exclude=/run/* –exclude=/mnt/* –exclude=/media/* /backup/location/
系统级备份:
“`bash
rsync -aAXHv / –exclude=/dev/* –exclude=/proc/* –exclude=/sys/* –exclude=/tmp/* –exclude=/run/* –exclude=/mnt/* –exclude=/media/* /backup/location/
# 使用tar进行压缩备份
tar -czpvf backup.tar.gz –exclude=/dev –exclude=/proc –exclude=/sys –exclude=/tmp –exclude=/run –exclude=/mnt –exclude=/media /
- 2. **配置文件备份**:
- ```bash
- # 备份重要配置目录
- cp -r /etc /backup/
- cp -r /var/spool/cron /backup/
- cp -r /home /backup/
复制代码
1. 数据库备份:
“`bashMySQL/MariaDB备份mysqldump –all-databases –single-transaction –routines –events > mysql_backup.sql
数据库备份:
“`bash
mysqldump –all-databases –single-transaction –routines –events > mysql_backup.sql
# PostgreSQL备份
pg_dumpall > pg_backup.sql
- ### 环境准备与测试计划
- 1. **搭建测试环境**:
- - 使用虚拟机或物理机创建与生产环境相似的测试环境
- - 确保有足够的硬件资源进行完整测试
- 2. **制定测试计划**:
- - 功能测试:验证所有关键应用和服务正常运行
- - 性能测试:比较迁移前后的系统性能
- - 安全测试:确保系统安全性没有降低
- - 灾难恢复测试:验证备份和恢复流程
- ### 团队培训与知识准备
- 1. **Rocky Linux特性培训**:
- - Rocky Linux与CentOS的异同
- - Rocky Linux的包管理机制
- - Rocky Linux的系统管理工具
- 2. **迁移技术培训**:
- - 迁移工具使用方法
- - 常见问题排查技巧
- - 回滚流程演练
- ## 迁移策略与方案选择
- ### 就地迁移 vs 全新安装
- #### 就地迁移
- **优点**:
- - 保留现有配置和数据
- - 迁移时间相对较短
- - 减少硬件投资
- **缺点**:
- - 风险较高,可能导致系统不稳定
- - 可能遗留旧系统的问题
- - 难以彻底解决配置冲突
- **适用场景**:
- - 系统复杂,难以重新配置
- - 停机时间窗口有限
- - 硬件资源受限
- #### 全新安装
- **优点**:
- - 系统干净,无历史遗留问题
- - 可以优化系统配置
- - 更容易实现标准化
- **缺点**:
- - 需要重新配置所有服务
- - 迁移时间长,停机时间长
- - 需要更多的测试和验证
- **适用场景**:
- - 有足够的停机时间
- - 系统相对简单
- - 追求系统最佳性能和稳定性
- ### 分阶段迁移 vs 一次性迁移
- #### 分阶段迁移
- 分阶段迁移是指将系统按功能模块或业务单元逐步迁移:
- 1. **迁移策略**:
- - 按业务重要性从低到高迁移
- - 按系统复杂度从简单到复杂迁移
- - 按服务依赖关系从底层到上层迁移
- 2. **实施步骤**:
- ```bash
- # 示例:分阶段迁移Web服务器
- # 第一阶段:迁移开发环境
- # 1. 搭建新的Rocky Linux开发服务器
- # 2. 迁移开发代码和配置
- # 3. 测试开发环境功能
-
- # 第二阶段:迁移测试环境
- # 1. 搭建新的Rocky Linux测试服务器
- # 2. 迁移测试代码和配置
- # 3. 执行全面测试
-
- # 第三阶段:迁移生产环境
- # 1. 在低峰期搭建生产环境
- # 2. 迁移生产数据和配置
- # 3. 切换流量并监控
复制代码
一次性迁移是指在预定时间内完成整个系统的迁移:
1. 迁移策略:选择业务低峰期进行准备详细的回滚计划提前通知所有相关方
2. 选择业务低峰期进行
3. 准备详细的回滚计划
4. 提前通知所有相关方
5. 实施步骤:
“`bash示例:一次性迁移计划1. 停止所有服务systemctl stop httpd nginx mysql postfix
迁移策略:
• 选择业务低峰期进行
• 准备详细的回滚计划
• 提前通知所有相关方
实施步骤:
“`bash
systemctl stop httpd nginx mysql postfix
# 2. 备份数据
mysqldump –all-databases > final_backup.sql
tar -czf final_config_backup.tar.gz /etc /home /var/spool
# 3. 执行系统迁移
# 使用迁移脚本或手动安装Rocky Linux
# 4. 恢复配置和数据
# 恢复配置文件
tar -xzf final_config_backup.tar.gz -C /
# 恢复数据库
mysql < final_backup.sql
# 5. 启动服务并验证
systemctl start httpd nginx mysql postfix
- ### 不同业务场景的迁移方案选择
- #### Web服务器迁移
- 1. **评估内容**:
- - Web服务器软件(Apache/Nginx等)版本兼容性
- - PHP/Python/Java等运行环境兼容性
- - Web应用依赖的库和模块
- 2. **迁移步骤**:
- ```bash
- # 备份网站数据和配置
- cp -r /var/www/html /backup/
- cp -r /etc/httpd /backup/ # Apache
- cp -r /etc/nginx /backup/ # Nginx
-
- # 备份数据库
- mysqldump -u root -p --all-databases > web_db_backup.sql
-
- # 在新系统上安装必要软件
- yum install httpd php php-mysqlnd mariadb-server
-
- # 恢复网站数据
- cp -r /backup/html /var/www/
- cp -r /backup/httpd /etc/
-
- # 恢复数据库
- systemctl start mariadb
- mysql < web_db_backup.sql
-
- # 启动服务并验证
- systemctl start httpd
复制代码
1. 评估内容:数据库版本兼容性(MySQL/MariaDB/PostgreSQL等)数据库大小和复杂度复制和高可用配置
2. 数据库版本兼容性(MySQL/MariaDB/PostgreSQL等)
3. 数据库大小和复杂度
4. 复制和高可用配置
5. 迁移步骤:
“`bashMySQL/MariaDB迁移1. 在原系统上备份数据mysqldump –single-transaction –routines –events –all-databases > db_backup.sql
评估内容:
• 数据库版本兼容性(MySQL/MariaDB/PostgreSQL等)
• 数据库大小和复杂度
• 复制和高可用配置
迁移步骤:
“`bash
mysqldump –single-transaction –routines –events –all-databases > db_backup.sql
# 2. 在新系统上安装数据库
yum install mariadb-server
systemctl start mariadb
mysql_secure_installation
# 3. 恢复数据
mysql < db_backup.sql
# 4. 验证数据完整性
mysql -e “SHOW DATABASES;”
mysql -e “SELECT COUNT(*) FROM mysql.user;”
- #### 应用服务器迁移
- 1. **评估内容**:
- - 应用服务器软件(Tomcat/JBoss/WebLogic等)版本兼容性
- - Java版本兼容性
- - 应用依赖的第三方库
- 2. **迁移步骤**:
- ```bash
- # Tomcat应用服务器迁移
- # 1. 备份应用和配置
- cp -r /opt/tomcat/webapps /backup/
- cp -r /opt/tomcat/conf /backup/
-
- # 2. 在新系统上安装Java和Tomcat
- yum install java-1.8.0-openjdk tomcat
-
- # 3. 恢复应用和配置
- cp -r /backup/webapps/* /opt/tomcat/webapps/
- cp -r /backup/conf/* /opt/tomcat/conf/
-
- # 4. 启动服务并验证
- systemctl start tomcat
- curl http://localhost:8080
复制代码
实际迁移步骤详解
从CentOS 7/8迁移到Rocky Linux
Rocky Linux官方提供了迁移脚本,可以帮助从CentOS 7/8系统迁移到Rocky Linux:
- # 下载迁移脚本
- curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh
- # 给脚本执行权限
- chmod +x migrate2rocky.sh
- # 运行迁移脚本
- ./migrate2rocky.sh -r
- # 或者使用以下命令进行预检查(不实际执行迁移)
- ./migrate2rocky.sh -r -v
复制代码
迁移脚本执行的主要步骤:
1. 检查系统兼容性
2. 备份当前的yum仓库配置
3. 替换为Rocky Linux的仓库配置
4. 移除CentOS特定的包
5. 安装Rocky Linux特定的包
6. 迁移内核和系统核心组件
7. 清理和优化系统
如果不使用迁移脚本,可以手动执行迁移:
- # 1. 更新系统到最新版本
- yum update -y
- # 2. 备份重要数据
- cp -r /etc/yum.repos.d /etc/yum.repos.d.bak
- cp /etc/hosts /etc/hosts.bak
- # 3. 移除CentOS特定包
- yum remove -y centos-logos centos-release centos-release-cr
- # 4. 下载并安装Rocky Linux release包
- # 对于CentOS 8
- dnf install -y https://dl.rockylinux.org/pub/rocky/8/extras/x86_64/os/Packages/r/rocky-release-8.4-1.el8.noarch.rpm
- # 对于CentOS 7
- yum install -y https://dl.rockylinux.org/pub/rocky/8/extras/x86_64/os/Packages/r/rocky-release-8.4-1.el8.noarch.rpm
- # 5. 清理yum缓存
- yum clean all
- # 6. 重建yum缓存
- yum makecache
- # 7. 执行系统迁移
- yum distro-sync -y
- # 8. 安装Rocky Linux内核
- yum install -y kernel kernel-core
- # 9. 更新GRUB配置
- grub2-mkconfig -o /boot/grub2/grub.cfg
- # 10. 重启系统
- reboot
复制代码
从其他RHEL衍生版迁移到Rocky Linux
- # 下载并运行迁移脚本
- curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh
- chmod +x migrate2rocky.sh
- ./migrate2rocky.sh -r
复制代码- # 1. 备份当前的yum仓库配置
- cp -r /etc/yum.repos.d /etc/yum.repos.d.bak
- # 2. 移除Oracle Linux特定的包
- yum remove -y oraclelinux-release oracle-logos
- # 3. 安装Rocky Linux release包
- yum install -y https://dl.rockylinux.org/pub/rocky/8/extras/x86_64/os/Packages/r/rocky-release-8.4-1.el8.noarch.rpm
- # 4. 清理并重建yum缓存
- yum clean all
- yum makecache
- # 5. 执行系统迁移
- yum distro-sync -y
- # 6. 重启系统
- reboot
复制代码- # 1. 备份当前的yum仓库配置
- cp -r /etc/yum.repos.d /etc/yum.repos.d.bak
- # 2. 移除Scientific Linux特定的包
- yum remove -y sl-release sl-logos
- # 3. 安装Rocky Linux release包
- yum install -y https://dl.rockylinux.org/pub/rocky/8/extras/x86_64/os/Packages/r/rocky-release-8.4-1.el8.noarch.rpm
- # 4. 清理并重建yum缓存
- yum clean all
- yum makecache
- # 5. 执行系统迁移
- yum distro-sync -y
- # 6. 重启系统
- reboot
复制代码
迁移过程中的关键命令与操作
- # 确认系统版本
- cat /etc/os-release
- # 确认内核版本
- uname -a
- # 确认已安装的软件包
- rpm -qa | grep -i centos
复制代码- # 检查仓库配置
- ls /etc/yum.repos.d/
- # 检查可用仓库
- yum repolist
- # 测试仓库连接
- yum makecache
复制代码- # 更新所有软件包
- yum update -y
- # 搜索软件包
- yum search package-name
- # 查看软件包信息
- yum info package-name
- # 安装软件包
- yum install package-name
- # 移除软件包
- yum remove package-name
复制代码- # 查看服务状态
- systemctl status service-name
- # 启动服务
- systemctl start service-name
- # 停止服务
- systemctl stop service-name
- # 重启服务
- systemctl restart service-name
- # 设置服务开机自启
- systemctl enable service-name
复制代码
迁移脚本的编写与使用
对于大规模迁移,可以编写自定义迁移脚本:
使用此脚本:
- # 保存脚本为migrate_to_rocky.sh
- chmod +x migrate_to_rocky.sh
- ./migrate_to_rocky.sh
复制代码
迁移后的验证与优化
系统功能验证
- # 检查系统版本
- cat /etc/os-release
- # 预期输出应包含"Rocky Linux"
- # 检查内核版本
- uname -a
- # 检查系统资源
- free -h
- df -h
- lscpu
- # 检查网络连接
- ping -c 4 8.8.8.8
- # 检查DNS解析
- nslookup google.com
- # 检查系统时间
- timedatectl
复制代码- # 检查关键服务状态
- systemctl status sshd
- systemctl status network
- systemctl status firewalld
- # 检查运行中的服务
- systemctl list-units --type=service --state=running
- # 检查服务启动日志
- journalctl -u service-name -n 50
复制代码- # Web服务器验证
- curl http://localhost
- # 数据库连接验证
- mysql -u root -p -e "SHOW DATABASES;"
- # 应用特定功能验证
- # 根据实际应用编写测试脚本
复制代码
性能测试与调优
- # 安装性能测试工具
- yum install -y sysbench epel-release
- yum install -y stress
- # CPU性能测试
- sysbench cpu --cpu-max-prime=20000 run
- # 内存性能测试
- sysbench memory --memory-block-size=1K --memory-total-size=10G run
- # 磁盘I/O性能测试
- sysbench fileio --file-total-size=1G --file-test-mode=rndrw prepare
- sysbench fileio --file-total-size=1G --file-test-mode=rndrw run
- sysbench fileio --file-total-size=1G --file-test-mode=rndrw cleanup
复制代码- # 内核参数调优
- # 编辑/etc/sysctl.conf文件
- cat >> /etc/sysctl.conf << EOF
- # 增加文件描述符限制
- fs.file-max = 100000
- # 优化网络参数
- net.core.rmem_max = 16777216
- net.core.wmem_max = 16777216
- net.ipv4.tcp_rmem = 4096 87380 16777216
- net.ipv4.tcp_wmem = 4096 65536 16777216
- EOF
- # 应用内核参数
- sysctl -p
- # 磁盘I/O调度器调优
- # 查看当前调度器
- cat /sys/block/sda/queue/scheduler
- # 设置调度器为deadline
- echo deadline > /sys/block/sda/queue/scheduler
- # 永久设置(添加到/etc/rc.local)
- echo 'echo deadline > /sys/block/sda/queue/scheduler' >> /etc/rc.local
- chmod +x /etc/rc.local
复制代码- # Apache/Nginx调优
- # 编辑Apache配置文件/etc/httpd/conf/httpd.conf
- # 调整MaxClients、ServerLimit等参数
- # 编辑Nginx配置文件/etc/nginx/nginx.conf
- # 调整worker_processes、worker_connections等参数
- # 数据库调优
- # 编辑MySQL/MariaDB配置文件/etc/my.cnf
- # 调整innodb_buffer_pool_size、max_connections等参数
复制代码
安全性检查与加固
- # 安装安全扫描工具
- yum install -y lynis rkhunter
- # 运行Lynis安全扫描
- lynis audit system
- # 运行Rootkit Hunter
- rkhunter --checkall
复制代码- # 更新系统
- yum update -y
- # 配置防火墙
- firewall-cmd --permanent --add-service=ssh
- firewall-cmd --permanent --remove-service=telnet
- firewall-cmd --reload
- # 禁用不必要的服务
- systemctl disable telnet.socket
- systemctl disable rsh.socket
- # 配置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
- # 安装和配置fail2ban
- yum install -y fail2ban
- cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
- systemctl enable fail2ban
- systemctl start fail2ban
复制代码- # 安装审计工具
- yum install -y audit
- # 配置审计规则
- cat >> /etc/audit/rules.d/audit.rules << EOF
- # 监控文件访问
- -w /etc/passwd -p wa -k identity
- -w /etc/shadow -p wa -k identity
- -w /etc/group -p wa -k identity
- # 监控权限变更
- -a always,exit -F arch=b64 -S chmod -F auid>=1000 -F auid!=-1 -k perm_mod
- -a always,exit -F arch=b64 -S chown -F auid>=1000 -F auid!=-1 -k perm_mod
- # 监控登录尝试
- -w /var/log/faillog -p wa -k logins
- -w /var/log/lastlog -p wa -k logins
- EOF
- # 重启审计服务
- systemctl restart auditd
复制代码
监控与日志系统配置
- # 安装监控工具
- yum install -y htop iotop iftop
- # 安装Zabbix监控代理
- rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
- yum install -y zabbix-agent
- # 配置Zabbix代理
- sed -i 's/Server=127.0.0.1/Server=zabbix-server-ip/' /etc/zabbix/zabbix_agentd.conf
- sed -i 's/ServerActive=127.0.0.1/ServerActive=zabbix-server-ip/' /etc/zabbix/zabbix_agentd.conf
- # 启动Zabbix代理
- systemctl enable zabbix-agent
- systemctl start zabbix-agent
复制代码- # 安装ELK日志系统组件
- yum install -y java-1.8.0-openjdk
- # 安装Elasticsearch
- rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
- cat > /etc/yum.repos.d/elasticsearch.repo << EOF
- [elasticsearch-7.x]
- name=Elasticsearch repository for 7.x packages
- baseurl=https://artifacts.elastic.co/packages/7.x/yum
- gpgcheck=1
- gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
- enabled=1
- autorefresh=1
- type=rpm-md
- EOF
- yum install -y elasticsearch
- # 安装Logstash
- cat > /etc/yum.repos.d/logstash.repo << EOF
- [logstash-7.x]
- name=Elastic repository for 7.x packages
- baseurl=https://artifacts.elastic.co/packages/7.x/yum
- gpgcheck=1
- gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
- enabled=1
- autorefresh=1
- type=rpm-md
- EOF
- yum install -y logstash
- # 安装Kibana
- cat > /etc/yum.repos.d/kibana.repo << EOF
- [kibana-7.x]
- name=Kibana repository for 7.x packages
- baseurl=https://artifacts.elastic.co/packages/7.x/yum
- gpgcheck=1
- gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
- enabled=1
- autorefresh=1
- type=rpm-md
- EOF
- yum install -y kibana
- # 配置并启动服务
- systemctl enable elasticsearch logstash kibana
- systemctl start elasticsearch logstash kibana
复制代码- # 配置日志轮转
- cat > /etc/logrotate.d/custom-app << EOF
- /var/log/custom-app/*.log {
- daily
- missingok
- rotate 52
- compress
- delaycompress
- notifempty
- create 644 root root
- postrotate
- /usr/bin/systemctl reload custom-app.service > /dev/null 2>&1 || true
- endscript
- }
- EOF
- # 测试日志轮转
- logrotate -f /etc/logrotate.d/custom-app
复制代码
常见问题与解决方案(避坑指南)
依赖包冲突解决
- # 错误信息示例
- Error: Transaction check error:
- file /usr/lib64/libssl.so.1.1.0 from install of openssl-libs-1:1.1.1g-15.el8_3.x86_64 conflicts with file from package openssl-libs-1:1.1.1k-1.el8.x86_64
复制代码
解决方案:
- # 1. 清理缓存
- yum clean all
- rm -rf /var/cache/yum/*
- # 2. 重建RPM数据库
- rpm --rebuilddb
- # 3. 更新系统
- yum update -y
- # 4. 如果仍有冲突,尝试手动解决
- # 查找冲突的包
- rpm -q --whatprovides /usr/lib64/libssl.so.1.1.0
- # 移除冲突的包
- yum remove openssl-libs-1:1.1.1k-1.el8.x86_64
- # 重新安装正确的包
- yum install openssl-libs
- # 5. 继续迁移过程
- yum distro-sync -y
复制代码
解决方案:
- # 1. 识别不兼容的包
- yum list installed | grep -v @rocky
- # 2. 查找Rocky Linux中的替代包
- yum search alternative-package-name
- # 3. 如果没有替代包,考虑以下选项:
- # a) 保留原包,但隔离运行
- yum install yum-plugin-versionlock
- yum versionlock incompatible-package
- # b) 使用容器或虚拟机运行
- yum install -y docker
- systemctl start docker
- docker pull centos:7
- docker run -it --name legacy-app centos:7 /bin/bash
- # c) 编译源代码安装
- yum groupinstall "Development Tools"
- wget source-code-url
- tar -xzf source-code.tar.gz
- cd source-code-directory
- ./configure
- make
- make install
复制代码
配置文件兼容性问题
解决方案:
- # 1. 备份当前配置
- cp /etc/service.conf /etc/service.conf.bak
- # 2. 比较新旧配置文件差异
- diff /etc/service.conf /etc/service.conf.rpmnew
- # 3. 合并配置
- # 使用vimdiff可视化合并
- vimdiff /etc/service.conf /etc/service.conf.rpmnew
- # 或使用meld(需要安装)
- yum install meld
- meld /etc/service.conf /etc/service.conf.rpmnew
- # 4. 重新加载配置
- systemctl reload service-name
复制代码
解决方案:
- # 1. 检查网络配置文件
- ls /etc/sysconfig/network-scripts/ifcfg-*
- # 2. 查看当前网络状态
- nmcli connection show
- ip addr show
- # 3. 重新配置网络
- # 使用nmcli(推荐)
- nmcli connection modify eth0 ipv4.addresses 192.168.1.100/24
- nmcli connection modify eth0 ipv4.gateway 192.168.1.1
- nmcli connection modify eth0 ipv4.dns "8.8.8.8 8.8.4.4"
- nmcli connection up eth0
- # 或直接编辑配置文件
- cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
- TYPE=Ethernet
- BOOTPROTO=static
- DEFROUTE=yes
- PEERDNS=yes
- PEERROUTES=yes
- IPV4_FAILURE_FATAL=no
- IPV6INIT=yes
- IPV6_AUTOCONF=yes
- IPV6_DEFROUTE=yes
- IPV6_PEERDNS=yes
- IPV6_PEERROUTES=yes
- IPV6_FAILURE_FATAL=no
- NAME=eth0
- UUID=$(uuidgen)
- DEVICE=eth0
- ONBOOT=yes
- IPADDR=192.168.1.100
- PREFIX=24
- GATEWAY=192.168.1.1
- DNS1=8.8.8.8
- DNS2=8.8.4.4
- EOF
- # 4. 重启网络服务
- systemctl restart network
复制代码
内核模块与驱动问题
解决方案:
- # 1. 检查硬件信息
- lspci -nnk
- lsusb
- # 2. 查找内核模块
- lsmod | grep driver-name
- # 3. 安装开发工具和内核头文件
- yum groupinstall "Development Tools"
- yum install kernel-devel kernel-headers
- # 4. 重新编译安装驱动
- # 示例:NVIDIA驱动
- # 添加ELRepo仓库
- rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
- yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
- # 安装NVIDIA驱动
- yum install -y kmod-nvidia
- # 5. 加载内核模块
- modprobe nvidia
- # 6. 验证驱动
- nvidia-smi
复制代码
解决方案:
- # 1. 检查模块信息
- modinfo module-name
- # 2. 查看系统日志
- journalctl -k | grep module-name
- dmesg | grep module-name
- # 3. 检查依赖关系
- modprobe --show-depends module-name
- # 4. 尝试手动加载
- insmod /path/to/module.ko
- # 或
- modprobe module-name
- # 5. 如果仍失败,检查模块签名
- # 查看内核签名要求
- cat /proc/sys/kernel/module.sig_enforce
- # 如果需要签名,可以临时禁用签名检查(仅用于测试)
- echo 0 > /proc/sys/kernel/module.sig_enforce
- # 6. 永久解决方案:为模块生成签名
- # 安装工具
- yum install -y openssl-devel
- # 生成签名密钥
- openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Custom Module/"
- # 注册密钥
- mokutil --import MOK.der
- # 签名模块
- /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 MOK.priv MOK.der /path/to/module.ko
- # 重启系统并按照提示完成MOK注册
- reboot
复制代码
第三方软件兼容性问题
解决方案:
- # 1. 检查软件的系统要求
- cat /path/to/software/README | grep -i "supported.*system"
- # 2. 检查软件的依赖库
- ldd /path/to/software/binary
- # 3. 安装兼容库
- # 安装兼容性库
- yum install -y compat-openssl10 compat-libstdc++-33
- # 4. 创建软链接解决库路径问题
- ln -s /usr/lib64/libssl.so.1.0.0 /usr/lib64/libssl.so.10
- ln -s /usr/lib64/libcrypto.so.1.0.0 /usr/lib64/libcrypto.so.10
- # 5. 使用容器或虚拟机运行
- # 安装Docker
- yum install -y docker
- systemctl start docker
- systemctl enable docker
- # 拉取原始系统镜像
- docker pull centos:7
- # 运行容器
- docker run -it -d --name legacy-app -v /path/to/software:/software centos:7
- docker exec -it legacy-app /bin/bash
- # 在容器内安装运行环境并启动软件
复制代码
解决方案:
- # 1. 检查二进制文件信息
- file /path/to/custom/binary
- ldd /path/to/custom/binary
- # 2. 检查编译环境差异
- # 记录当前系统的编译工具版本
- gcc --version
- g++ --version
- make --version
- # 3. 安装匹配的编译工具
- # 如果需要旧版本工具链,可以安装SCL
- yum install -y centos-release-scl
- yum install -y devtoolset-7
- # 启用SCL环境
- scl enable devtoolset-7 bash
- # 4. 重新编译软件
- cd /path/to/source/code
- make clean
- ./configure
- make
- make install
- # 5. 如果无法重新编译,尝试解决库依赖问题
- # 创建符号链接
- ln -s /usr/lib64/libstdc++.so.6.0.24 /usr/lib64/libstdc++.so.6.0.19
- # 或设置LD_LIBRARY_PATH
- export LD_LIBRARY_PATH=/path/to/compat/libs:$LD_LIBRARY_PATH
- echo 'export LD_LIBRARY_PATH=/path/to/compat/libs:$LD_LIBRARY_PATH' >> ~/.bashrc
复制代码
服务启动失败排查
解决方案:
- # 1. 检查服务状态
- systemctl status service-name
- # 2. 查看服务日志
- journalctl -u service-name -n 100
- # 或查看特定时间段的日志
- journalctl -u service-name --since "2023-01-01" --until "2023-01-02"
- # 3. 检查配置文件语法
- # Apache配置检查
- httpd -t
- # Nginx配置检查
- nginx -t
- # MySQL配置检查
- mysqld --help --verbose
- # 4. 检查端口占用
- netstat -tulnp | grep :port-number
- ss -tulnp | grep :port-number
- # 5. 检查SELinux状态
- getenforce
- sestatus
- # 临时禁用SELinux(仅用于测试)
- setenforce 0
- # 如果问题解决,调整SELinux策略
- # 查看拒绝日志
- grep AVC /var/log/audit/audit.log
- # 生成策略模块
- audit2allow -M mypolicy < /var/log/audit/audit.log
- semodule -i mypolicy.pp
- # 重新启用SELinux
- setenforce 1
- # 6. 检查文件权限
- ls -la /path/to/service/files
- chown -R user:group /path/to/service/files
- chmod -R 755 /path/to/service/files
- # 7. 检查资源限制
- ulimit -a
- cat /etc/security/limits.conf
- # 8. 重启服务
- systemctl restart service-name
复制代码
解决方案:
- # 1. 检查MySQL/MariaDB服务状态
- systemctl status mariadb
- # 2. 查看错误日志
- tail -n 100 /var/log/mariadb/mariadb.log
- # 3. 检查数据目录权限
- ls -la /var/lib/mysql/
- chown -R mysql:mysql /var/lib/mysql/
- # 4. 检查磁盘空间
- df -h /var/lib/mysql/
- # 5. 检查配置文件
- mysqld --help --verbose | grep "Default options"
- # 6. 尝试安全模式启动
- systemctl stop mariadb
- mysqld_safe --skip-grant-tables &
- # 7. 修复数据库
- mysqlcheck -r --all-databases
- mysqlcheck -o --all-databases
- # 8. 重启服务
- systemctl restart mariadb
复制代码
案例分析
互联网企业迁移案例
某中型互联网企业,拥有约200台物理服务器和500台虚拟机,主要运行CentOS 7和CentOS 8系统。业务包括Web应用、API服务、数据库、缓存和消息队列等。由于CentOS 8即将停止维护,企业决定将所有系统迁移到Rocky Linux。
1. 分阶段迁移:第一阶段:迁移开发和测试环境(约30%的系统)第二阶段:迁移非核心生产环境(约40%的系统)第三阶段:迁移核心生产环境(约30%的系统)
2. 第一阶段:迁移开发和测试环境(约30%的系统)
3. 第二阶段:迁移非核心生产环境(约40%的系统)
4. 第三阶段:迁移核心生产环境(约30%的系统)
5. 迁移方法:对于简单系统:使用官方迁移脚本进行就地迁移对于复杂系统:采用全新安装+配置迁移的方式对于关键业务系统:采用双机并行迁移,确保业务连续性
6. 对于简单系统:使用官方迁移脚本进行就地迁移
7. 对于复杂系统:采用全新安装+配置迁移的方式
8. 对于关键业务系统:采用双机并行迁移,确保业务连续性
分阶段迁移:
• 第一阶段:迁移开发和测试环境(约30%的系统)
• 第二阶段:迁移非核心生产环境(约40%的系统)
• 第三阶段:迁移核心生产环境(约30%的系统)
迁移方法:
• 对于简单系统:使用官方迁移脚本进行就地迁移
• 对于复杂系统:采用全新安装+配置迁移的方式
• 对于关键业务系统:采用双机并行迁移,确保业务连续性
1. 准备阶段:
“`bash1. 系统评估编写系统评估脚本cat > system_assessment.sh << ‘EOF’
#!/bin/bash
准备阶段:
“`bash
cat > system_assessment.sh << ‘EOF’
#!/bin/bash
OUTPUT_FILE=“systemassessment\((date +%Y%m%d).csv"
echo "Hostname,OS Version,Kernel Version,CPU Cores,Memory (GB),Disk (GB),Services" > \)OUTPUT_FILE
for host in $(cat host_list.txt); do
- ssh $host "
- hostnamectl | grep 'Operating System' | awk -F: '{print \$2}' | tr -d ' ' > /tmp/os_version
- uname -r > /tmp/kernel_version
- lscpu | grep 'CPU(s)' | head -1 | awk '{print \$2}' > /tmp/cpu_cores
- free -g | grep '^Mem:' | awk '{print \$2}' > /tmp_memory
- df -h --total | grep 'total' | awk '{print \$2}' > /tmp/disk_size
- systemctl list-units --type=service --state=running | wc -l > /tmp/services
- echo "$(hostname),$(cat /tmp/os_version),$(cat /tmp/kernel_version),$(cat /tmp/cpu_cores),$(cat /tmp/memory),$(cat /tmp/disk_size),$(cat /tmp/services)"
- " >> $OUTPUT_FILE
复制代码
done
echo “Assessment completed. Results saved to $OUTPUT_FILE”
EOF
chmod +x system_assessment.sh
./system_assessment.sh
- 2. **测试阶段**:
- ```bash
- # 1. 创建测试环境
- # 使用Ansible批量部署测试服务器
- cat > test_setup.yml << 'EOF'
- ---
- - name: Setup Rocky Linux test environment
- hosts: test_servers
- become: yes
- tasks:
- - name: Install Rocky Linux
- command: >
- rocky-install --hostname={{ inventory_hostname }}
- --root-password=secret
- --network-device=eth0
- --ip-address={{ ip_address }}
- --netmask=255.255.255.0
- --gateway={{ gateway }}
- --dns={{ dns_server }}
- args:
- creates: /etc/rocky-release
-
- - name: Update system
- yum:
- name: "*"
- state: latest
-
- - name: Install common packages
- yum:
- name:
- - vim
- - htop
- - net-tools
- - git
- state: present
-
- - name: Copy application files
- copy:
- src: /path/to/app/
- dest: /opt/app/
- owner: appuser
- group: appgroup
- mode: '0755'
-
- - name: Start services
- systemd:
- name: "{{ item }}"
- state: started
- enabled: yes
- loop:
- - httpd
- - mariadb
- - php-fpm
- EOF
-
- ansible-playbook test_setup.yml
复制代码
1. 迁移阶段:
“`bash1. 批量迁移脚本cat > batch_migrate.sh << ‘EOF’
#!/bin/bash
迁移阶段:
“`bash
cat > batch_migrate.sh << ‘EOF’
#!/bin/bash
# 读取主机列表
HOST_LIST=$1
if [ -z “$HOST_LIST” ]; then
- echo "Usage: $0 <host_list_file>"
- exit 1
复制代码
fi
# 创建日志目录
LOG_DIR=“migrationlogs\((date +%Y%m%d%H%M%S)"
mkdir -p \)LOG_DIR
# 迁移函数
migrate_host() {
- local host=$1
- local log_file="$LOG_DIR/${host}.log"
- echo "Starting migration for $host at $(date)" | tee -a $log_file
- # 预检查
- ssh $host "
- echo '=== Pre-migration check ==='
- uname -a
- cat /etc/os-release
- df -h
- free -h
- " >> $log_file 2>&1
- # 创建备份
- ssh $host "
- echo '=== Creating backup ==='
- mkdir -p /backup/pre_migration
- cp -r /etc /backup/pre_migration/
- rpm -qa > /backup/pre_migration/installed_packages.txt
- " >> $log_file 2>&1
- # 执行迁移
- ssh $host "
- echo '=== Starting migration ==='
- curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh
- chmod +x migrate2rocky.sh
- ./migrate2rocky.sh -r -v
- " >> $log_file 2>&1
- # 验证迁移
- ssh $host "
- echo '=== Verifying migration ==='
- cat /etc/os-release
- uname -a
- yum repolist
- " >> $log_file 2>&1
- echo "Migration for $host completed at $(date)" | tee -a $log_file
复制代码
}
# 并行迁移
MAX_PARALLEL=5
CURRENT=0
for host in\((cat \)HOST_LIST); do
- migrate_host $host &
- CURRENT=$((CURRENT + 1))
- if [ $CURRENT -ge $MAX_PARALLEL ]; then
- wait
- CURRENT=0
- fi
复制代码
done
wait
echo “All migrations completed. Logs available in $LOG_DIR”
EOF
chmod +x batch_migrate.sh
./batch_migrate.sh production_hosts.txt
- #### 结果与经验
- 1. **迁移结果**:
- - 成功迁移98%的系统
- - 迁移后系统性能稳定,无明显性能下降
- - 所有关键业务服务正常运行
- 2. **经验总结**:
- - **提前测试至关重要**:在正式迁移前,对各种类型的系统进行了充分测试,发现了多个兼容性问题
- - **备份是安全的保障**:完整的系统备份确保了在出现问题时能够快速回滚
- - **分阶段迁移降低风险**:通过分阶段迁移,能够逐步积累经验,降低全面迁移的风险
- - **自动化工具提高效率**:使用Ansible等自动化工具大大提高了迁移效率
- 3. **遇到的问题及解决方案**:
- - **问题**:某些自定义编译的应用在迁移后无法运行
- - **解决方案**:重新编译应用或创建符号链接解决库依赖问题
- - **问题**:部分系统的网络配置在迁移后丢失
- - **解决方案**:提前备份网络配置,迁移后手动恢复
- - **问题**:某些服务启动顺序问题导致服务依赖失败
- - **解决方案**:调整服务启动顺序或设置服务依赖关系
- ### 金融行业迁移案例
- #### 背景介绍
- 某大型金融机构,拥有严格的安全和合规要求,运行约1000台服务器,主要操作系统为CentOS 7。由于CentOS 7将于2024年停止维护,机构决定将系统迁移到Rocky Linux,同时确保数据安全和业务连续性。
- #### 迁移策略
- 1. **合规性评估**:
- - 评估Rocky Linux是否符合金融行业监管要求
- - 制定详细的迁移计划和风险评估报告
- - 获得监管机构批准
- 2. **迁移方案**:
- - 采用全新安装+数据迁移的方式,确保系统纯净性
- - 每个系统迁移前进行完整数据备份和验证
- - 迁移后进行严格的安全检查和合规验证
- #### 实施过程
- 1. **准备阶段**:
- ```bash
- # 1. 合规性评估脚本
- cat > compliance_check.sh << 'EOF'
- #!/bin/bash
-
- OUTPUT_FILE="compliance_report_$(date +%Y%m%d).csv"
- echo "Hostname,OS Version,Kernel Version,Security Updates,Open Ports,Services,Firewall Status,SELinux Status" > $OUTPUT_FILE
-
- for host in $(cat host_list.txt); do
- ssh $host "
- hostnamectl | grep 'Operating System' | awk -F: '{print \$2}' | tr -d ' ' > /tmp/os_version
- uname -r > /tmp/kernel_version
- yum check-update | grep 'Security' | wc -l > /tmp/security_updates
- ss -tuln | wc -l > /tmp/open_ports
- systemctl list-units --type=service --state=running | wc -l > /tmp/services
- systemctl is-active firewalld > /tmp/firewall_status
- getenforce > /tmp/selinux_status
-
- echo "$(hostname),$(cat /tmp/os_version),$(cat /tmp/kernel_version),$(cat /tmp/security_updates),$(cat /tmp/open_ports),$(cat /tmp/services),$(cat /tmp/firewall_status),$(cat /tmp/selinux_status)"
- " >> $OUTPUT_FILE
- done
-
- echo "Compliance check completed. Results saved to $OUTPUT_FILE"
- EOF
-
- chmod +x compliance_check.sh
- ./compliance_check.sh
复制代码
1. 安全加固:
“`bash1. 安全加固脚本cat > security_hardening.sh << ‘EOF’
#!/bin/bash
安全加固:
“`bash
cat > security_hardening.sh << ‘EOF’
#!/bin/bash
# 更新系统
yum update -y
# 安装安全工具
yum install -y firewalld fail2ban rkhunter lynis
# 配置防火墙
systemctl enable firewalld
systemctl start firewalld
firewall-cmd –permanent –add-service=ssh
firewall-cmd –permanent –remove-service=telnet
firewall-cmd –reload
# 配置fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sed -i ’s/bantime = 10m/bantime = 1h/’ /etc/fail2ban/jail.local
sed -i ’s/findtime = 10m/findtime = 30m/’ /etc/fail2ban/jail.local
sed -i ’s/maxretry = 5/maxretry = 3/’ /etc/fail2ban/jail.local
systemctl enable fail2ban
systemctl start fail2ban
# 配置SELinux
setenforce 1
sed -i ’s/SELINUX=disabled/SELINUX=enforcing/’ /etc/selinux/config
# 配置SSH安全
sed -i ’s/#PermitRootLogin yes/PermitRootLogin no/’ /etc/ssh/sshd_config
sed -i ’s/#PasswordAuthentication yes/PasswordAuthentication no/’ /etc/ssh/sshd_config
sed -i ’s/#Port 22/Port 2222/’ /etc/ssh/sshd_config
systemctl restart sshd
# 配置系统审计
yum install -y audit
cat >> /etc/audit/rules.d/audit.rules << ‘AUDIT_RULES’
# 监控文件访问
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
# 监控权限变更
-a always,exit -F arch=b64 -S chmod -F auid>=1000 -F auid!=-1 -k perm_mod
-a always,exit -F arch=b64 -S chown -F auid>=1000 -F auid!=-1 -k perm_mod
# 监控登录尝试
-w /var/log/faillog -p wa -k logins
-w /var/log/lastlog -p wa -k logins
AUDIT_RULES
systemctl restart auditd
# 配置系统密码策略
sed -i ’s/PASS_MIN_LEN\t5/PASS_MIN_LEN\t12/’ /etc/login.defs
sed -i ’s/PASS_MAX_DAYS\t99999/PASS_MAX_DAYS\t90/’ /etc/login.defs
# 禁用不必要的服务
systemctl disable telnet.socket
systemctl disable rsh.socket
systemctl disable rexec.socket
systemctl disable rlogin.socket
# 配置内核参数
cat >> /etc/sysctl.conf << ‘SYSCTL_CONF’
# IP forwarding
net.ipv4.ip_forward = 0
# Source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
# Ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Bad error message protection
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Enable TCP SYN cookies
net.ipv4.tcp_syncookies = 1
# Log martian packets
net.ipv4.conf.all.log_martians = 1
SYSCTL_CONF
sysctl -p
echo “Security hardening completed”
EOF
chmod +x security_hardening.sh
./security_hardening.sh
- 3. **数据迁移**:
- ```bash
- # 1. 数据迁移脚本
- cat > data_migration.sh << 'EOF'
- #!/bin/bash
-
- SOURCE_HOST=$1
- TARGET_HOST=$2
- DATA_DIR=$3
-
- if [ -z "$SOURCE_HOST" ] || [ -z "$TARGET_HOST" ] || [ -z "$DATA_DIR" ]; then
- echo "Usage: $0 <source_host> <target_host> <data_directory>"
- exit 1
- fi
-
- # 创建备份目录
- BACKUP_DIR="/backup/migration_$(date +%Y%m%d%H%M%S)"
- ssh $SOURCE_HOST "mkdir -p $BACKUP_DIR"
-
- # 备份数据
- echo "Backing up data from $SOURCE_HOST:$DATA_DIR"
- ssh $SOURCE_HOST "rsync -av $DATA_DIR $BACKUP_DIR/"
-
- # 验证备份
- echo "Verifying backup on $SOURCE_HOST"
- ssh $SOURCE_HOST "diff -rq $DATA_DIR $BACKUP_DIR/$(basename $DATA_DIR)"
-
- # 迁移数据
- echo "Migrating data from $SOURCE_HOST to $TARGET_HOST"
- ssh $SOURCE_HOST "rsync -av $BACKUP_DIR/$(basename $DATA_DIR)/ $TARGET_HOST:$DATA_DIR/"
-
- # 验证迁移
- echo "Verifying data migration"
- ssh $TARGET_HOST "ls -la $DATA_DIR"
-
- # 设置权限
- echo "Setting permissions on $TARGET_HOST"
- ssh $SOURCE_HOST "find $DATA_DIR -printf '%m %u %g %p\\n'" > /tmp/permissions.txt
- ssh $TARGET_HOST "while read mode user group path; do chmod \$mode "\$path"; chown \$user:\$group "\$path"; done < /tmp/permissions.txt"
-
- echo "Data migration completed"
- EOF
-
- chmod +x data_migration.sh
- ./data_migration.sh source.example.com target.example.com /data/app
复制代码
1. 迁移结果:成功迁移100%的系统所有系统均通过安全审计和合规检查业务系统运行稳定,性能指标满足要求
2. 成功迁移100%的系统
3. 所有系统均通过安全审计和合规检查
4. 业务系统运行稳定,性能指标满足要求
5. 经验总结:合规性优先:在金融行业,合规性是首要考虑因素,必须在迁移前进行全面的合规评估安全加固必不可少:迁移后必须进行全面的安全加固,确保系统符合金融行业的安全标准数据完整性验证:对迁移的数据进行严格的完整性验证,确保数据不会丢失或损坏文档记录详尽:详细记录每个步骤的操作和结果,便于审计和问题追溯
6. 合规性优先:在金融行业,合规性是首要考虑因素,必须在迁移前进行全面的合规评估
7. 安全加固必不可少:迁移后必须进行全面的安全加固,确保系统符合金融行业的安全标准
8. 数据完整性验证:对迁移的数据进行严格的完整性验证,确保数据不会丢失或损坏
9. 文档记录详尽:详细记录每个步骤的操作和结果,便于审计和问题追溯
10. 遇到的问题及解决方案:问题:某些加密算法在Rocky Linux上不可用解决方案:安装兼容性库或更新应用以使用新的加密算法问题:审计日志格式发生变化,影响日志分析系统解决方案:更新日志分析系统配置,适配新的日志格式问题:某些合规检查工具在Rocky Linux上无法运行解决方案:与工具供应商合作,更新工具以支持Rocky Linux
11. 问题:某些加密算法在Rocky Linux上不可用解决方案:安装兼容性库或更新应用以使用新的加密算法
12. 解决方案:安装兼容性库或更新应用以使用新的加密算法
13. 问题:审计日志格式发生变化,影响日志分析系统解决方案:更新日志分析系统配置,适配新的日志格式
14. 解决方案:更新日志分析系统配置,适配新的日志格式
15. 问题:某些合规检查工具在Rocky Linux上无法运行解决方案:与工具供应商合作,更新工具以支持Rocky Linux
16. 解决方案:与工具供应商合作,更新工具以支持Rocky Linux
迁移结果:
• 成功迁移100%的系统
• 所有系统均通过安全审计和合规检查
• 业务系统运行稳定,性能指标满足要求
经验总结:
• 合规性优先:在金融行业,合规性是首要考虑因素,必须在迁移前进行全面的合规评估
• 安全加固必不可少:迁移后必须进行全面的安全加固,确保系统符合金融行业的安全标准
• 数据完整性验证:对迁移的数据进行严格的完整性验证,确保数据不会丢失或损坏
• 文档记录详尽:详细记录每个步骤的操作和结果,便于审计和问题追溯
遇到的问题及解决方案:
• 问题:某些加密算法在Rocky Linux上不可用解决方案:安装兼容性库或更新应用以使用新的加密算法
• 解决方案:安装兼容性库或更新应用以使用新的加密算法
• 问题:审计日志格式发生变化,影响日志分析系统解决方案:更新日志分析系统配置,适配新的日志格式
• 解决方案:更新日志分析系统配置,适配新的日志格式
• 问题:某些合规检查工具在Rocky Linux上无法运行解决方案:与工具供应商合作,更新工具以支持Rocky Linux
• 解决方案:与工具供应商合作,更新工具以支持Rocky Linux
• 解决方案:安装兼容性库或更新应用以使用新的加密算法
• 解决方案:更新日志分析系统配置,适配新的日志格式
• 解决方案:与工具供应商合作,更新工具以支持Rocky Linux
制造业系统迁移案例
某大型制造企业,拥有多个生产基地和数据中心,运行约500台服务器,包括生产控制系统、MES系统、ERP系统和办公系统等。系统主要基于CentOS 7和少量CentOS 8。企业决定将所有系统迁移到Rocky Linux,以确保系统的长期稳定性和安全性。
1. 系统分类:关键生产系统:需要零停机迁移重要业务系统:可接受短时间停机一般系统:可接受较长时间停机
2. 关键生产系统:需要零停机迁移
3. 重要业务系统:可接受短时间停机
4. 一般系统:可接受较长时间停机
5. 迁移方案:关键生产系统:采用双机并行迁移,确保业务连续性重要业务系统:采用快照迁移,减少停机时间一般系统:采用标准迁移流程
6. 关键生产系统:采用双机并行迁移,确保业务连续性
7. 重要业务系统:采用快照迁移,减少停机时间
8. 一般系统:采用标准迁移流程
系统分类:
• 关键生产系统:需要零停机迁移
• 重要业务系统:可接受短时间停机
• 一般系统:可接受较长时间停机
迁移方案:
• 关键生产系统:采用双机并行迁移,确保业务连续性
• 重要业务系统:采用快照迁移,减少停机时间
• 一般系统:采用标准迁移流程
1. 系统评估:
“`bash1. 系统分类脚本cat > system_classification.sh << ‘EOF’
#!/bin/bash
系统评估:
“`bash
cat > system_classification.sh << ‘EOF’
#!/bin/bash
CRITICAL_FILE=“critical_systems.txt”
IMPORTANT_FILE=“important_systems.txt”
GENERAL_FILE=“general_systems.txt”
# 清空分类文件
\(CRITICAL_FILE
\)IMPORTANT_FILE
$GENERAL_FILE
# 系统分类
for host in $(cat all_systems.txt); do
- # 获取系统信息
- ssh $host "
- hostname
- systemctl list-units --type=service --state=running | grep -E '(mes|erp|production|scada)' | wc -l
- uptime | awk -F'load average:' '{print \$2}' | awk '{print \$1}' | tr -d ','
- df -h / | tail -1 | awk '{print \$5}' | tr -d '%'
- " | {
- read hostname
- read critical_services
- read load_avg
- read disk_usage
- # 分类逻辑
- if [ "$critical_services" -gt 0 ]; then
- echo "$hostname" >> $CRITICAL_FILE
- echo "Classified $hostname as CRITICAL (services: $critical_services, load: $load_avg, disk: $disk_usage%)"
- elif [ "$(echo "$load_avg > 2.0" | bc -l)" -eq 1 ] || [ "$disk_usage" -gt 80 ]; then
- echo "$hostname" >> $IMPORTANT_FILE
- echo "Classified $hostname as IMPORTANT (services: $critical_services, load: $load_avg, disk: $disk_usage%)"
- else
- echo "$hostname" >> $GENERAL_FILE
- echo "Classified $hostname as GENERAL (services: $critical_services, load: $load_avg, disk: $disk_usage%)"
- fi
- }
复制代码
done
echo “System classification completed:”
echo “Critical systems:\((wc -l < \)CRITICAL_FILE)”
echo “Important systems:\((wc -l < \)IMPORTANT_FILE)”
echo “General systems:\((wc -l < \)GENERAL_FILE)”
EOF
chmod +x system_classification.sh
./system_classification.sh
- 2. **关键系统迁移**:
- ```bash
- # 1. 关键系统迁移脚本
- cat > critical_system_migration.sh << 'EOF'
- #!/bin/bash
-
- SOURCE_HOST=$1
- TARGET_HOST=$2
-
- if [ -z "$SOURCE_HOST" ] || [ -z "$TARGET_HOST" ]; then
- echo "Usage: $0 <source_host> <target_host>"
- exit 1
- fi
-
- # 创建备份目录
- BACKUP_DIR="/backup/migration_$(date +%Y%m%d%H%M%S)"
- ssh $SOURCE_HOST "mkdir -p $BACKUP_DIR"
-
- # 备份系统配置
- echo "Backing up system configuration from $SOURCE_HOST"
- ssh $SOURCE_HOST "
- rsync -av /etc $BACKUP_DIR/
- rsync -av /home $BACKUP_DIR/
- rsync -av /var/spool/cron $BACKUP_DIR/
- rpm -qa > $BACKUP_DIR/installed_packages.txt
- "
-
- # 准备目标系统
- echo "Preparing target system $TARGET_HOST"
- ssh $TARGET_HOST "
- # 安装Rocky Linux
- yum install -y https://dl.rockylinux.org/pub/rocky/8/extras/x86_64/os/Packages/r/rocky-release-8.4-1.el8.noarch.rpm
- yum update -y
-
- # 安装必要软件
- yum install -y rsync
- "
-
- # 同步系统配置
- echo "Syncing system configuration to $TARGET_HOST"
- rsync -av $SOURCE_HOST:$BACKUP_DIR/etc/ $TARGET_HOST:/etc/
- rsync -av $SOURCE_HOST:$BACKUP_DIR/home/ $TARGET_HOST:/home/
- rsync -av $SOURCE_HOST:$BACKUP_DIR/cron/ $TARGET_HOST:/var/spool/cron/
-
- # 安装软件包
- echo "Installing software packages on $TARGET_HOST"
- ssh $SOURCE_HOST "cat $BACKUP_DIR/installed_packages.txt" | ssh $TARGET_HOST "xargs yum install -y"
-
- # 同步应用数据
- echo "Syncing application data"
- ssh $SOURCE_HOST "
- # 获取需要同步的目录列表
- find /data -type d -name 'app*' 2>/dev/null
- " | while read app_dir; do
- echo "Syncing $app_dir"
- rsync -av $SOURCE_HOST:$app_dir/ $TARGET_HOST:$app_dir/
- done
-
- # 验证迁移
- echo "Verifying migration"
- ssh $TARGET_HOST "
- # 检查系统版本
- cat /etc/os-release
-
- # 检查关键服务
- systemctl status httpd mysql nginx
-
- # 检查应用状态
- for app in \$(find /data -maxdepth 1 -type d -name 'app*'); do
- if [ -f "\$app/status.sh" ]; then
- \$app/status.sh
- fi
- done
- "
-
- # 切换流量
- echo "Switching traffic to $TARGET_HOST"
- # 这里需要根据实际负载均衡器或DNS配置进行调整
- # 例如,更新负载均衡器配置
- ssh $LOAD_BALANCER "
- sed -i 's/server $SOURCE_HOST/server $TARGET_HOST/g' /etc/nginx/conf.d/upstream.conf
- nginx -s reload
- "
-
- echo "Critical system migration completed"
- EOF
-
- chmod +x critical_system_migration.sh
- ./critical_system_migration.sh production01.example.com production01-rocky.example.com
复制代码
1. 一般系统迁移:
“`bash1. 一般系统批量迁移脚本cat > general_system_batch_migration.sh << ‘EOF’
#!/bin/bash
一般系统迁移:
“`bash
cat > general_system_batch_migration.sh << ‘EOF’
#!/bin/bash
SYSTEM_LIST=\(1
MAX_PARALLEL=\){2:-5}
if [ -z “$SYSTEM_LIST” ]; then
- echo "Usage: $0 <system_list_file> [max_parallel]"
- exit 1
复制代码
fi
# 迁移函数
migrate_system() {
- local host=$1
- local log_file="migration_logs/${host}.log"
- mkdir -p migration_logs
- echo "Starting migration for $host at $(date)" | tee $log_file
- # 预检查
- ssh $host "
- echo '=== Pre-migration check ==='
- uname -a
- cat /etc/os-release
- df -h
- free -h
- " >> $log_file 2>&1
- # 创建备份
- ssh $host "
- echo '=== Creating backup ==='
- mkdir -p /backup/pre_migration
- cp -r /etc /backup/pre_migration/
- cp -r /home /backup/pre_migration/
- cp -r /var/spool/cron /backup/pre_migration/
- rpm -qa > /backup/pre_migration/installed_packages.txt
- " >> $log_file 2>&1
- # 通知用户
- ssh $host "
- echo 'System migration will start in 10 minutes. Please save your work and log out.'
- wall 'System migration will start in 10 minutes. Please save your work and log out.'
- sleep 600
- " >> $log_file 2>&1
- # 停止服务
- ssh $host "
- echo '=== Stopping services ==='
- systemctl stop httpd mysql nginx postfix
- " >> $log_file 2>&1
- # 执行迁移
- ssh $host "
- echo '=== Starting migration ==='
- curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh
- chmod +x migrate2rocky.sh
- ./migrate2rocky.sh -r
- " >> $log_file 2>&1
- # 重启系统
- ssh $host "reboot" >> $log_file 2>&1
- # 等待系统重启
- echo "Waiting for $host to reboot..." | tee -a $log_file
- sleep 120
- # 验证迁移
- ssh $host "
- echo '=== Verifying migration ==='
- cat /etc/os-release
- uname -a
- yum repolist
- echo '=== Starting services ==='
- systemctl start httpd mysql nginx postfix
- systemctl status httpd mysql nginx postfix
- " >> $log_file 2>&1
- echo "Migration for $host completed at $(date)" | tee -a $log_file
复制代码
}
# 导出函数以便xargs使用
export -f migrate_system
# 并行迁移
cat\(SYSTEM_LIST | xargs -n 1 -P \)MAX_PARALLEL -I {} bash -c ‘migrate_system “{}”’
echo “All migrations completed. Logs available in migration_logs/”
EOF
chmod +x general_system_batch_migration.sh
./general_system_batch_migration.sh general_systems.txt 5
1. - 实施监控系统:
- “`bash安装Zabbix监控代理rpm -Uvhhttps://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpmyum install -y zabbix-agent
复制代码
实施监控系统:
“`bash
rpm -Uvhhttps://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpmyum install -y zabbix-agent
# 配置Zabbix代理
sed -i ’s/Server=127.0.0.1/Server=zabbix-server-ip/’ /etc/zabbix/zabbix_agentd.conf
sed -i ’s/ServerActive=127.0.0.1/ServerActive=zabbix-server-ip/’ /etc/zabbix/zabbix_agentd.conf
# 启动Zabbix代理
systemctl enable zabbix-agent
systemctl start zabbix-agent
- 3. **定期安全审计**:
- ```bash
- # 配置定期安全扫描
- cat > /etc/cron.weekly/security-audit << 'EOF'
- #!/bin/bash
-
- # 安装Lynis
- if ! which lynis > /dev/null; then
- yum install -y lynis
- fi
-
- # 运行安全扫描
- lynis audit system > /var/log/lynis-$(date +%Y%m%d).log
-
- # 发送报告
- mail -s "Security audit report for $(hostname)" admin@example.com < /var/log/lynis-$(date +%Y%m%d).log
- EOF
-
- chmod +x /etc/cron.weekly/security-audit
复制代码
1. 建立备份策略:
“`bash配置自动备份cat > /etc/cron.daily/system-backup << ‘EOF’
#!/bin/bash
建立备份策略:
“`bash
cat > /etc/cron.daily/system-backup << ‘EOF’
#!/bin/bash
BACKUP_DIR=”/backup/system-\((date +%Y%m%d)"
mkdir -p \)BACKUP_DIR
# 备份系统配置
rsync -av /etc\(BACKUP_DIR/
rsync -av /home \)BACKUP_DIR/
rsync -av /var/spool/cron $BACKUP_DIR/
# 备份软件包列表
rpm -qa > $BACKUP_DIR/installed_packages.txt
# 备份数据库
mysqldump –all-databases –single-transaction –routines –events > $BACKUP_DIR/mysql_backup.sql
# 清理旧备份(保留最近30天)
find /backup -type d -name “system-*” -mtime +30 -exec rm -rf {} \;
EOF
chmod +x /etc/cron.daily/system-backup
“`
1. 文档管理:建立系统配置文档,记录所有关键配置维护变更日志,记录所有系统变更定期更新操作手册,确保操作流程的准确性
2. 建立系统配置文档,记录所有关键配置
3. 维护变更日志,记录所有系统变更
4. 定期更新操作手册,确保操作流程的准确性
• 建立系统配置文档,记录所有关键配置
• 维护变更日志,记录所有系统变更
• 定期更新操作手册,确保操作流程的准确性
通过以上措施,企业可以确保Rocky Linux系统的长期稳定运行,充分发挥其作为企业级Linux发行版的优势,为业务发展提供坚实的技术基础。 |
|