努力
加油

如何在阿里云ECS上自定义安装操作系统镜像?

在阿里云 ECS 上“自定义安装操作系统镜像”,这个说法其实有点歧义。通常大家想问的不是去重装一个现成的系统(那叫“更换操作系统”),而是如何基于现有的 ECS 实例,制作一个包含特定软件环境、配置或数据的私有镜像(Custom Image),以便后续快速创建相同环境的实例。

或者,你是指通过 ISO 文件手动安装非标准/自定义 OS?

鉴于国内云计算场景,90% 的需求是前者:制作自定义镜像。下面我分两种情况,把最实操、最容易踩坑的地方讲清楚。


情况一:我想把当前 ECS 的环境打包成镜像,供其他机器复用(最常见)

这是云原生运维的标准流程。不要试图去“安装”一个镜像到运行中的实例,而是应该停止实例 -> 制作镜像 -> 用镜像启动新实例。

核心步骤

  1. 清理现场(关键!)

    • 清除日志和临时文件:/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 命令:确保文件系统数据全部写入磁盘,避免元数据不一致。
  2. 停止实例

    • 登录阿里云控制台,找到目标 ECS 实例。
    • 必须选择“停止”(Stop),不能选“重启”。只有实例处于“已停止”状态,才能创建自定义镜像。
    • 等待实例状态变为“已停止”。
  3. 创建自定义镜像

    • 在实例详情页,点击“更多” -> “云盘和镜像” -> “创建自定义镜像”。
    • 名称:起个有意义的名字,如 my-app-centos7-v1。
    • 描述:记录关键信息,如“安装了 Nginx 1.20 + MySQL 5.7,时间戳 2023-10”。
    • 标签:建议打上业务线、环境等标签,方便后续管理。
    • 点击确定,等待进度条完成。
  4. 使用镜像创建新实例

    • 进入“镜像”列表,找到刚创建的镜像。
    • 点击“创建实例”,选择该镜像作为操作系统来源。
    • 此时新实例会自动拥有你之前的所有软件环境和配置。

⚠️ 高级技巧:Sysprep 与 Cloud-Init

  • Linux 系统:阿里云默认使用 cloud-init 来处理首次启动的配置(如 hostname、SSH key、root 密码)。只要你在制作镜像前清除了网络配置中的硬编码 MAC 地址,cloud-init 通常能自动适配新实例的网卡。
  • Windows 系统:强烈建议在制作镜像前,在 Windows 系统中运行 Sysprep 工具。这会清除 SID 和激活信息,防止克隆后出现冲突。如果不做 Sysprep,直接创建的新 Windows 实例可能会因为 SID 重复而无法加入域或出现授权问题。

情况二:我想从 ISO 文件手动安装操作系统(非常规需求)

这种情况极少见,通常只用于:

  • 需要安装阿里云官方市场没有的特殊版本 Linux(如某些老旧版本或特殊发行版)。
  • 需要预装特殊的硬件驱动或内核模块,且无法通过 RPM/DEB 包解决。

操作步骤

  1. 准备 ISO 文件

    • 将你的 ISO 文件上传到 OSS Bucket。
    • 或者,如果你有本地 ISO,可以通过 VNC 远程连接方式挂载(但阿里云 ECS 不支持直接挂载本地 ISO 作为光驱,除非使用专有云或特定场景)。
  2. 创建临时 ECS 实例

    • 创建一个小型 ECS 实例(如 ecs.t6-c1m1.large),用于承载安装过程。
  3. 通过 VNC 进行安装

    • 在控制台找到实例,点击“远程连接” -> “VNC 连接”。
    • 你需要一种方法让 ISO 对 VNC 可见。阿里云官方支持的方式有限,通常建议:
      • 方案 A(推荐):在实例内搭建一个 HTTP/NFS 服务器,指向 OSS 上的 ISO 文件,然后在安装过程中指定网络源。
      • 方案 B(复杂):使用 virt-install 或 KVM 在实例内部虚拟化安装(不推荐,性能差且复杂)。
      • 方案 C(最简单):直接使用阿里云提供的“自定义镜像导入”功能(见下文)。
  4. 更优解:使用“镜像导入”功能

    • 如果你已经有一个完整的虚拟机镜像文件(qcow2/vhd/raw),而不是 ISO:
      • 将镜像文件上传到 OSS。
      • 在阿里云控制台 -> “镜像” -> “导入镜像”。
      • 填写 OSS 路径,设置 RAM 角色权限。
      • 阿里云会在后台帮你转换成内部格式,生成自定义镜像。
      • 然后用这个新镜像创建 ECS 实例。
    • 这是处理“非标准 OS”最正规、最稳定的方式。

常见坑点与避指南

  1. 镜像太大怎么办?

    • 自定义镜像有大小限制(目前普通镜像最大 50GB,高效镜像可达 1TB,具体看实例类型)。
    • 如果镜像超过 50GB,考虑使用“高效镜像”或拆分部署(基础镜像 + 应用层镜像)。
    • 定期清理 /var/cache/yum 或 /var/lib/apt/lists。
  2. 为什么新实例 IP 变了?

    • 正常现象。ECS 每次创建都会分配新的弹性公网 IP(EIP)和内网 IP。
    • 如果你的应用绑定了固定 IP,请使用 EIP 并将其绑定到新实例,而不是依赖实例自带的 IP。
  3. 为什么新实例 SSH 连不上?

    • 检查安全组规则是否开放了 22 端口。
    • 检查是否清除了旧的 SSH host keys。
    • 检查 cloud-init 是否正确生成了新用户或重置了 root 密码(取决于你创建实例时选择的密钥对或密码模式)。
  4. 数据盘如何处理?

    • 自定义镜像只包含系统盘。
    • 如果有数据盘,需要在创建新实例时,单独挂载一块同规格的数据盘,然后手动恢复数据或使用备份快照。
    • 最佳实践:将数据和代码分离。系统盘只装系统和配置,数据存在 OSS 或 NAS 中,实现真正的无状态化。

总结

  • 日常运维:停止实例 -> 清理痕迹(日志、MAC、SSH Key)-> 创建自定义镜像 -> 用镜像启动新实例。
  • 特殊 OS:准备 qcow2/vhd 镜像 -> 上传 OSS -> 使用“导入镜像”功能 -> 生成自定义镜像。
  • 绝对不要:在运行中的实例上尝试“热替换”系统盘,这会导致数据丢失和实例崩溃。

记住,云的核心是不可变基础设施(Immutable Infrastructure)。不要试图修改正在运行的实例来“升级”它,而是销毁旧实例,用新镜像创建新实例。这才是正确的云原生思维。