在阿里云 ECS 上“自定义安装操作系统镜像”,这个说法其实有点歧义。通常大家想问的不是去重装一个现成的系统(那叫“更换操作系统”),而是如何基于现有的 ECS 实例,制作一个包含特定软件环境、配置或数据的私有镜像(Custom Image),以便后续快速创建相同环境的实例。
或者,你是指通过 ISO 文件手动安装非标准/自定义 OS?
鉴于国内云计算场景,90% 的需求是前者:制作自定义镜像。下面我分两种情况,把最实操、最容易踩坑的地方讲清楚。
情况一:我想把当前 ECS 的环境打包成镜像,供其他机器复用(最常见)
这是云原生运维的标准流程。不要试图去“安装”一个镜像到运行中的实例,而是应该停止实例 -> 制作镜像 -> 用镜像启动新实例。
核心步骤
-
清理现场(关键!)
- 清除日志和临时文件:
/var/log/*,/tmp/*,/var/tmp/*。这些文件体积大且无意义,会拖慢镜像制作速度并增加存储成本。 - 清除 SSH 主机密钥:
rm -f /etc/ssh/ssh_host_*。否则所有用此镜像创建的实例会有相同的 Host Key,导致 SSH 客户端报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED。 - 清除 MAC 地址绑定信息:如果是 CentOS/RHEL,检查
/etc/sysconfig/network-scripts/ifcfg-eth0(或类似网卡名),确保HWADDR或UUID被注释或删除,否则新实例可能无法获取 IP。 - 卸载非必要软件包:比如测试用的 debuginfo 包,减小镜像体积。
- 执行
sync命令:确保文件系统数据全部写入磁盘,避免元数据不一致。
- 清除日志和临时文件:
-
停止实例
- 登录阿里云控制台,找到目标 ECS 实例。
- 必须选择“停止”(Stop),不能选“重启”。只有实例处于“已停止”状态,才能创建自定义镜像。
- 等待实例状态变为“已停止”。
-
创建自定义镜像
- 在实例详情页,点击“更多” -> “云盘和镜像” -> “创建自定义镜像”。
- 名称:起个有意义的名字,如
my-app-centos7-v1。 - 描述:记录关键信息,如“安装了 Nginx 1.20 + MySQL 5.7,时间戳 2023-10”。
- 标签:建议打上业务线、环境等标签,方便后续管理。
- 点击确定,等待进度条完成。
-
使用镜像创建新实例
- 进入“镜像”列表,找到刚创建的镜像。
- 点击“创建实例”,选择该镜像作为操作系统来源。
- 此时新实例会自动拥有你之前的所有软件环境和配置。
⚠️ 高级技巧:Sysprep 与 Cloud-Init
- Linux 系统:阿里云默认使用
cloud-init来处理首次启动的配置(如 hostname、SSH key、root 密码)。只要你在制作镜像前清除了网络配置中的硬编码 MAC 地址,cloud-init通常能自动适配新实例的网卡。 - Windows 系统:强烈建议在制作镜像前,在 Windows 系统中运行 Sysprep 工具。这会清除 SID 和激活信息,防止克隆后出现冲突。如果不做 Sysprep,直接创建的新 Windows 实例可能会因为 SID 重复而无法加入域或出现授权问题。
情况二:我想从 ISO 文件手动安装操作系统(非常规需求)
这种情况极少见,通常只用于:
- 需要安装阿里云官方市场没有的特殊版本 Linux(如某些老旧版本或特殊发行版)。
- 需要预装特殊的硬件驱动或内核模块,且无法通过 RPM/DEB 包解决。
操作步骤
-
准备 ISO 文件
- 将你的 ISO 文件上传到 OSS Bucket。
- 或者,如果你有本地 ISO,可以通过 VNC 远程连接方式挂载(但阿里云 ECS 不支持直接挂载本地 ISO 作为光驱,除非使用专有云或特定场景)。
-
创建临时 ECS 实例
- 创建一个小型 ECS 实例(如 ecs.t6-c1m1.large),用于承载安装过程。
-
通过 VNC 进行安装
- 在控制台找到实例,点击“远程连接” -> “VNC 连接”。
- 你需要一种方法让 ISO 对 VNC 可见。阿里云官方支持的方式有限,通常建议:
- 方案 A(推荐):在实例内搭建一个 HTTP/NFS 服务器,指向 OSS 上的 ISO 文件,然后在安装过程中指定网络源。
- 方案 B(复杂):使用
virt-install或 KVM 在实例内部虚拟化安装(不推荐,性能差且复杂)。 - 方案 C(最简单):直接使用阿里云提供的“自定义镜像导入”功能(见下文)。
-
更优解:使用“镜像导入”功能
- 如果你已经有一个完整的虚拟机镜像文件(qcow2/vhd/raw),而不是 ISO:
- 将镜像文件上传到 OSS。
- 在阿里云控制台 -> “镜像” -> “导入镜像”。
- 填写 OSS 路径,设置 RAM 角色权限。
- 阿里云会在后台帮你转换成内部格式,生成自定义镜像。
- 然后用这个新镜像创建 ECS 实例。
- 这是处理“非标准 OS”最正规、最稳定的方式。
- 如果你已经有一个完整的虚拟机镜像文件(qcow2/vhd/raw),而不是 ISO:
常见坑点与避指南
-
镜像太大怎么办?
- 自定义镜像有大小限制(目前普通镜像最大 50GB,高效镜像可达 1TB,具体看实例类型)。
- 如果镜像超过 50GB,考虑使用“高效镜像”或拆分部署(基础镜像 + 应用层镜像)。
- 定期清理
/var/cache/yum或/var/lib/apt/lists。
-
为什么新实例 IP 变了?
- 正常现象。ECS 每次创建都会分配新的弹性公网 IP(EIP)和内网 IP。
- 如果你的应用绑定了固定 IP,请使用 EIP 并将其绑定到新实例,而不是依赖实例自带的 IP。
-
为什么新实例 SSH 连不上?
- 检查安全组规则是否开放了 22 端口。
- 检查是否清除了旧的 SSH host keys。
- 检查
cloud-init是否正确生成了新用户或重置了 root 密码(取决于你创建实例时选择的密钥对或密码模式)。
-
数据盘如何处理?
- 自定义镜像只包含系统盘。
- 如果有数据盘,需要在创建新实例时,单独挂载一块同规格的数据盘,然后手动恢复数据或使用备份快照。
- 最佳实践:将数据和代码分离。系统盘只装系统和配置,数据存在 OSS 或 NAS 中,实现真正的无状态化。
总结
- 日常运维:停止实例 -> 清理痕迹(日志、MAC、SSH Key)-> 创建自定义镜像 -> 用镜像启动新实例。
- 特殊 OS:准备 qcow2/vhd 镜像 -> 上传 OSS -> 使用“导入镜像”功能 -> 生成自定义镜像。
- 绝对不要:在运行中的实例上尝试“热替换”系统盘,这会导致数据丢失和实例崩溃。
记住,云的核心是不可变基础设施(Immutable Infrastructure)。不要试图修改正在运行的实例来“升级”它,而是销毁旧实例,用新镜像创建新实例。这才是正确的云原生思维。
云技术博客