Amazon Linux 2 迁移至 Amazon Linux 2023 全攻略:从规划到实践
Amazon Linux 2(AL2)作为 AWS 推出的广受欢迎的 Linux 发行版,自 2017 年发布以来,凭借其稳定性、安全性和对 AWS 服务的深度优化,成为了众多云上应用的首选操作系统。然而,随着技术迭代,AWS 于 2022 年推出了下一代发行版 Amazon Linux 2023(AL2023),带来了更现代的架构、更长期的支持周期和更强大的安全特性。
根据 AWS 官方公告,Amazon Linux 2 的标准支持将于 2025 年 6 月 30 日结束,扩展支持将持续至 2028 年 6 月 30 日。为避免业务受限于旧版本的安全漏洞和功能缺失,提前规划并执行从 AL2 到 AL2023 的迁移至关重要。
本文将详细介绍迁移的全流程,包括核心差异分析、迁移规划、实操步骤、常见问题解决及最佳实践,帮助您平稳完成升级。
目录#
1. Amazon Linux 2 与 Amazon Linux 2023 核心差异#
在开始迁移前,需先理解两者的核心差异,以便针对性调整配置和应用。
1.1 发行模型与生命周期#
| 特性 | Amazon Linux 2 | Amazon Linux 2023 |
|---|---|---|
| 发布模型 | 单一长期支持(LTS)版本 | 年度版本(如 AL2023、AL2024)+ 5 年支持周期 |
| 支持周期 | 标准支持至 2025.6.30,扩展支持至 2028.6.30 | 每个版本提供 5 年安全更新(如 AL2023 至 2028) |
| 内核版本 | 基于 Linux 4.14(长期维护) | 基于 Linux 6.1(最新稳定版,支持现代硬件) |
| 架构支持 | x86_64、ARM64(Graviton2) | x86_64、ARM64(Graviton3)、未来扩展 |
1.2 核心组件变更#
1.2.1 包管理器:从 yum 到 dnf#
AL2 使用 yum(Yellowdog Updater Modified)作为包管理器,而 AL2023 采用 dnf(Dandified YUM)—— yum 的继任者,提供更快的速度、更好的依赖解析和并行下载支持。两者命令语法相似,但 dnf 功能更强大。
示例对比:
# AL2 安装包
sudo yum install httpd
# AL2023 安装包(dnf 兼容 yum 命令,也可直接用 dnf)
sudo dnf install httpd # 推荐
sudo yum install httpd # 兼容,但实际调用 dnf1.2.2 初始化系统:systemd 进一步强化#
AL2 和 AL2023 均使用 systemd,但 AL2023 基于更新的 systemd 版本(如 v252),提供更强的服务管理、日志集成和资源控制能力。
1.2.3 安全增强:SELinux 与默认强化#
- SELinux:AL2023 中 SELinux 默认启用并设为
enforcing模式(AL2 默认permissive),提供更严格的访问控制。 - 加密:默认启用
/tmp和/var/tmp的 tmpfs 加密,增强临时文件安全性。 - 最小化攻击面:默认关闭不必要的服务(如
telnet),仅保留核心组件。
1.2.4 预装软件版本升级#
AL2023 预装了更现代的开发工具和运行时环境,例如:
- Python 3.9+(AL2 为 Python 2.7/3.7)
- GCC 12+(AL2 为 GCC 7.3)
- OpenSSL 3.0(AL2 为 OpenSSL 1.0.2k)
2. 迁移前规划#
迁移前需系统性评估当前环境,明确目标和风险,避免业务中断。
2.1 环境评估#
2.1.1 资产盘点#
使用 AWS Systems Manager Inventory 或自定义脚本收集 AL2 实例信息:
- 实例规格(CPU、内存、存储)、网络配置(VPC、安全组、子网)。
- 已安装包列表:
rpm -qa > al2_packages.txt。 - 自定义配置文件:
find /etc -type f -mtime -365(近一年修改的文件)。 - 运行中服务:
systemctl list-unit-files --type=service --state=enabled。
2.1.2 应用兼容性验证#
AL2023 的软件版本升级可能导致应用依赖冲突,需重点验证:
- 运行时环境:例如 Python 2.7 应用需迁移至 Python 3.9+,Node.js 10.x 需升级至 16.x+。
- 系统库依赖:通过
ldd /path/to/app检查应用依赖的动态库,确保 AL2023 中存在对应版本。 - 第三方软件:联系供应商确认是否提供 AL2023 兼容版本(如数据库、监控工具)。
2.2 迁移策略选择#
AWS 推荐 “蓝绿迁移”(新建 AL2023 实例,验证后切换流量),而非“原地升级”(in-place upgrade),原因如下:
- AL2 与 AL2023 基于不同的底层架构(如 glibc 版本差异),原地升级易导致兼容性问题。
- 蓝绿迁移可保留回滚能力,降低业务中断风险。
2.3 定义成功标准#
明确迁移后需满足的指标:
- 核心服务(如 Nginx、MySQL)启动成功率 100%。
- 数据完整性(文件校验和一致,数据库无丢失)。
- 应用性能(响应时间、吞吐量)不低于 AL2 环境。
- 安全合规(SELinux 策略生效,漏洞扫描无高危项)。
3. 迁移前准备工作#
3.1 数据备份#
迁移前必须备份关键数据,推荐以下方案:
- EBS 快照:为 AL2 实例的根卷和数据卷创建快照(通过 AWS Console 或 CLI):
aws ec2 create-snapshot --volume-id vol-123456 --description "AL2 root volume backup before migration" - 应用数据备份:数据库(如 MySQL)通过
mysqldump导出,静态文件通过rsync同步至 S3:mysqldump -u root -p --all-databases > al2_db_backup.sql aws s3 sync /data s3://my-backup-bucket/al2-data/
3.2 构建 AL2023 测试环境#
在非生产环境(如 staging)部署 AL2023 实例,模拟生产配置:
-
启动 AL2023 实例(通过 AWS Console 或 CLI):
aws ec2 run-instances \ --image-id ami-0abcdef1234567890 # AL2023 AMI ID(需替换为目标区域 AMI) \ --instance-type t3.medium \ --security-group-ids sg-123456 \ --subnet-id subnet-123456 \ --key-name my-key-pair \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=AL2023-Staging}]'注意:AL2023 AMI ID 需通过 AWS Systems Manager Parameter Store 获取:
aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2023-ami-hvm-x86_64-gp2 --query "Parameters[0].Value" --output text -
复制 AL2 实例的安全组、IAM 角色和网络配置至测试实例,确保环境一致性。
3.3 预迁移兼容性测试#
在测试环境中执行以下步骤:
- 安装 AL2 中已部署的包(参考
al2_packages.txt):# 将 AL2 包列表转换为 dnf 安装命令(排除 AL2 特有包,如 amazon-linux-extras) cat al2_packages.txt | grep -v "amazon-linux-extras" | awk '{print $1}' | xargs sudo dnf install -y - 迁移应用代码和配置文件,启动服务并验证功能:
# 从 AL2 实例复制应用代码(假设已配置 SSH 免密登录) scp -r ec2-user@al2-instance-ip:/opt/myapp /opt/ # 启动服务并检查状态 sudo systemctl start myapp && sudo systemctl status myapp - 修复兼容性问题(如依赖缺失、配置文件路径变更),记录解决方案。
4. 迁移实施步骤#
4.1 步骤 1:部署生产环境 AL2023 实例#
基于测试环境验证结果,启动生产用 AL2023 实例,确保:
- 实例规格、存储配置与 AL2 一致(或根据性能需求调整)。
- 网络配置(VPC、子网、安全组)与 AL2 一致,避免网络不通。
- 挂载数据卷(如需要),并格式化(如使用新卷):
sudo mkfs.xfs /dev/nvme1n1 # 格式化新卷(假设设备名为 nvme1n1) sudo mount /dev/nvme1n1 /data # 挂载至 /data # 添加至 /etc/fstab 实现开机自动挂载 echo "/dev/nvme1n1 /data xfs defaults 0 0" | sudo tee -a /etc/fstab
4.2 步骤 2:迁移应用与配置#
4.2.1 安装依赖包#
根据测试环境经验,在 AL2023 实例安装应用所需依赖:
# 示例:安装 Python 3.9、Node.js 18 和 Nginx
sudo dnf install -y python39 nodejs nginx4.2.2 迁移数据与配置文件#
使用 rsync 或 scp 同步 AL2 实例的应用数据和配置:
# 同步应用代码(保留权限和软链接)
rsync -avz --delete ec2-user@al2-instance-ip:/opt/myapp /opt/
# 同步关键配置文件(如 /etc/nginx/nginx.conf、/etc/my.cnf)
scp ec2-user@al2-instance-ip:/etc/nginx/nginx.conf /etc/nginx/注意:AL2023 的部分配置文件路径可能变更(如
dnf仓库配置位于/etc/yum.repos.d/,与 AL2 一致),需手动核对并调整。
4.2.3 服务与权限配置#
- 用户与组:迁移
/etc/passwd、/etc/group和/home目录下的用户数据,确保应用运行权限一致:# 复制用户账号(需谨慎,避免覆盖系统用户) scp ec2-user@al2-instance-ip:/etc/passwd /tmp/al2_passwd grep "myapp-user" /tmp/al2_passwd | sudo tee -a /etc/passwd - 服务自启动:通过
systemctl启用应用服务:sudo systemctl enable --now myapp # 启用并立即启动服务
4.3 步骤 3:流量切换与回滚准备#
- 流量切换:通过负载均衡器(如 ALB)逐步将流量切至 AL2023 实例(例如先切 10% 流量,观察无异常后全量切换)。
- 回滚机制:保留 AL2 实例至少 1 周,确保出现问题时可快速切回流量。
5. 迁移后验证#
5.1 基础功能验证#
- 服务状态:
systemctl list-units --type=service --state=active,确保核心服务(如httpd、mysqld)正常运行。 - 数据完整性:通过校验和(如
md5sum)或数据库查询验证数据一致性:# 对比文件校验和 md5sum /opt/myapp/data/file.txt # AL2023 实例 md5sum /opt/myapp/data/file.txt # AL2 实例(应一致) - 网络连通性:测试内外网访问(如
curl http://localhost、从公网访问应用),检查安全组和 NACL 规则是否生效。
5.2 性能与安全验证#
- 性能监控:通过 CloudWatch 监控 CPU、内存、磁盘 I/O 和网络吞吐量,确保与 AL2 环境持平或更优。
- SELinux 状态:检查 SELinux 日志(
/var/log/audit/audit.log),修复denied事件:sudo ausearch -m AVC -ts recent # 查看最近的 SELinux 拒绝事件 - 漏洞扫描:使用 Amazon Inspector 或
dnf audit扫描系统漏洞:sudo dnf audit # 检查已安装包的安全漏洞
6. 常见问题与解决方案#
6.1 问题 1:依赖包缺失或版本冲突#
现象:dnf install 提示“未找到包”或“依赖关系不满足”。
解决方案:
- 搜索包名:
sudo dnf search <package-name>(如sudo dnf search python3-devel)。 - 启用额外仓库:AL2023 默认启用
amazonlinux和amazonlinux-updates仓库,可添加 EPEL 仓库(需手动配置):sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm # EPEL 9 适用于 AL2023
6.2 问题 2:SELinux 导致服务启动失败#
现象:服务启动时报错“Permission denied”,audit.log 中有 avc: denied 记录。
解决方案:
- 临时切换至
permissive模式排查:sudo setenforce 0,验证服务是否正常启动。 - 生成并应用 SELinux 策略模块:
sudo audit2allow -a -M myapp-policy # 从日志生成策略模块 sudo semodule -i myapp-policy.pp # 加载模块 sudo setenforce 1 # 恢复 enforcing 模式
6.3 问题 3:Python 应用因版本不兼容报错#
现象:Python 应用启动时报 SyntaxError 或模块缺失(如 imp 模块在 Python 3.9+ 中移除)。
解决方案:
- 使用
pyenv或virtualenv管理多版本 Python:# 安装 pyenv curl https://pyenv.run | bash # 安装 Python 3.7(假设应用依赖 3.7) pyenv install 3.7.17 pyenv local 3.7.17 # 在应用目录启用 3.7
7. 最佳实践总结#
-
优先使用 IaC 自动化迁移
通过 Terraform 或 CloudFormation 定义 AL2023 实例配置,确保环境一致性和可重复性:# Terraform 示例:定义 AL2023 实例 resource "aws_instance" "al2023_prod" { ami = data.aws_ssm_parameter.al2023_ami.value instance_type = "t3.large" # 其他配置:安全组、密钥对、标签... } data "aws_ssm_parameter" "al2023_ami" { name = "/aws/service/ami-amazon-linux-latest/amzn2023-ami-hvm-x86_64-gp2" } -
分阶段迁移,先非核心后核心业务
从低优先级服务(如测试环境、监控节点)开始迁移,积累经验后再迁移核心业务,降低风险。 -
利用 AWS 工具简化迁移
- AWS Application Migration Service:自动化从 AL2 到 AL2023 的迁移,支持批量实例复制。
- Systems Manager Run Command:远程执行命令(如安装包、同步配置),避免手动操作。
-
文档化迁移过程
记录迁移步骤、问题及解决方案,形成内部知识库,为后续版本升级(如 AL2024)提供参考。