背景介绍

根据Microsoft官方的生命周期, Windows 2012 R2 将于2023.10.10结束延长后的支持(主线支持已于2018.10.9停止) :
https://docs.microsoft.com/en-us/lifecycle/products/windows-server-2012-r2

对于许多已经服役多年的EC2实例, 如果可以不改变原系统中已经安装配置好的业务环境直接就地升级到新的2016版本, 将可以节省大量的迁移成本, 本文将围绕这个目标进行实战演练.

注意事项和主要步骤

参考AWS官方文档:
https://docs.amazonaws.cn/en_us/AWSEC2/latest/WindowsGuide/os-inplaceupgrade.html

注意事项

  • 推荐的实例配置至少得是2 vCPUs和4G以上内存, 要不然可能会带不动, 如有必要的话可以先变更为高配置的实例类型, 升级完成后再改回来.
  • 实例的系统卷得留足可用空间, 按照微软文档里描述的应该是至少32GB.
  • 只能在相同CPU架构的系统之间进行升级, 不能从32位升级到64位
  • 升级前先禁用杀毒软件, 升完再开, 减少幺蛾子
  • 如有需要, 得先更新驱动

主要步骤

  1. 当前实例创建AMI用于备份或测试
  2. 确定当前实例安装了最新的网卡驱动, 参见注意事项最后一条
  3. 打开EC2控制台: https://console.amazonaws.cn/ec2/
  4. 左侧功能面板中进入Instances, 定位到要升级的实例, 记录下来它对应的instance IDAvailability Zone, 后面会用到
  5. Windows Server 2012/2012 R2 升级到2016或2019, 在进行升级前务必进行下面操作:
    a. 卸载EC2Config服务, 参考: Stop, restart, delete, or uninstall EC2Config b. 安装EC2Launch服务
    c. 安装Amazon System Manager SSM Agent客户端, 参考: Working with SSM Agent
  6. 使用Windows Server installation media snapshot创建卷, 这个卷在后面用于挂载到要升级的实例上作为新系统安装镜像
    a. 控制台依次进入Elastic Block Store - Snapshots, 搜索条选择Public Snapshots b. 添加Owner alias: amazon的过滤条件
    c. 添加Description: Windows的过滤条件
    d. 选择要升级到新版本的系统条目
    e. 点击Actions - Create Volume f. 在弹出的Create Volume对话框中选择与当前实例相同的Availability Zone, 然后点击Create Volume
  7. Create Volume Request Successed消息中点击创建好的卷
  8. 点击Actions - Attach Volume
  9. 选择当前实例的instance ID, 点击Attach
  10. 确认新卷挂载成功并能在Windows资源管理器中显示出来, 参考: Make an Amazon EBS volume available for use on Windows
  11. 打开Windows PowerShell, 假设新挂载的卷盘符为D
    a. 执行下面命令
d:\setup.exe /auto upgrade

b. 选择适当的产品版本(主要区分是否包含桌面体验)
c. 安装类型选择"升级"
d. 完成安装向导

实战过程记录

先用官方AMI创建了一台运行Windows Server 2012 R2t3.medium实例, 下面就对它进行就地升级

winserver2016 镜像 windows server 2016镜像文件下载_winserver2016 镜像


如果是传统物理机进行就地系统升级, 只需要准备好新系统的安装盘, 用ISO挂载或解压或做成U盘, 然后在现有系统中执行setup.exe进行就地安装升级就行了. 而AWS中并没有像VMware或oVirt的虚拟化一样可以额外将ISO镜像文件当成光驱设备进行挂载, 而是官方提供了常用系统安装盘镜像的Snapshot, 我们可以找到要安装的新系统对应的Snapshot生成卷, 然后挂载到当前实例中实现类似ISO解压后的效果.

卸载EC2Config

右键点击开始按钮 > 运行 > appwiz.cpl, 在程序和功能中找到并卸载EC2ConfigService

安装EC2Launch v2

在Windows PowerShell中运行下面命令下载并运行安装包

Invoke-WebRequest -Uri https://s3.cn-north-1.amazonaws.com.cn/amazon-ec2launch-v2/windows/amd64/latest/AmazonEC2Launch.msi -OutFile $home/Desktop/AmazonEC2Launch.msi
msiexec /i $home/Desktop/AmazonEC2Launch.msi ADDLOCAL="Basic,Clean" /q

安装Amazon SSM Agent

Invoke-WebRequest -Uri https://s3.cn-north-1.amazonaws.com.cn/amazon-ssm-cn-north-1/latest/windows_amd64/AmazonSSMAgentSetup.exe -OutFile $home/Desktop/SSMAgent_latest.exe
Start-Process -FilePath $home/Desktop/SSMAgent_latest.exe -ArgumentList "/S"

使用官方系统安装盘Snapshot创建卷

打开EC2控制台, 从左侧功能菜单中进入Elastic Block Store-Snapshots, 顶部搜索框切换为Public snapshots, 条件: Owner Alias: amazon, 关键词Windows 2016 Chinese, 结果筛选如下:

winserver2016 镜像 windows server 2016镜像文件下载_Server_02


直接在相中的SnapshotWindows 2016 Chinese_simplified Installation Media上面点击鼠标右键 - Create volume from snapshot创建卷, 这里注意创建Volume settings的Availability Zone务必保持与现有实例在相同的AZ, 同时别忘了打上标签, 后面好找:

winserver2016 镜像 windows server 2016镜像文件下载_AWS_03

挂载卷到现有实例

控制台进入Elastic Block Store - Volumes, 根据Tag找到上面创建的卷, 右键点击 - Attach volume

winserver2016 镜像 windows server 2016镜像文件下载_AWS_04


选择挂载到2012的实例

winserver2016 镜像 windows server 2016镜像文件下载_winserver2016 镜像_05


挂载完成后即可在实例中查看到:

winserver2016 镜像 windows server 2016镜像文件下载_windows_06

开始升级

打开新挂载卷中的setup.exe启动Windows安装程序 千万不要这样做, 否则后面会卡在许可条款无法交互继续

在PowerShell中运行下面命令启动安装程序(注意盘符换成挂载上以后的实际字符):

D:\setup.exe /auto upgrade

winserver2016 镜像 windows server 2016镜像文件下载_winserver2016 镜像_07


等待Windows Server 2016 安装程序启动完毕, 根据实际需要选择是否包含桌面体验的映像, 其他基本上就是一路下一步

winserver2016 镜像 windows server 2016镜像文件下载_AWS_08


winserver2016 镜像 windows server 2016镜像文件下载_windows_09


然后就是漫长的等待了, 中间实例会重启, 远程桌面也会断开无法查看桌面, 这时候在AWS控制台Get instance screenshot查看实例屏幕截图来观察更新进度

winserver2016 镜像 windows server 2016镜像文件下载_Server_10


在屏幕截图中刷出来升级完成后的登陆界面

winserver2016 镜像 windows server 2016镜像文件下载_Server_11


尝试远程桌面访问, 密码正确的情况下出现报错:

winserver2016 镜像 windows server 2016镜像文件下载_Windows_12


查了下资料, 主要是少了 KB 4093120 的更新, 可以直接用SSM中的Run Command执行名为AWS-InstallWindowsUpdates的Command Document

winserver2016 镜像 windows server 2016镜像文件下载_windows_13


经过漫长的等待后, 执行完毕

winserver2016 镜像 windows server 2016镜像文件下载_AWS_14


再次远程桌面连接成功!

winserver2016 镜像 windows server 2016镜像文件下载_windows_15

结束语

至此EC2中就地升级Windows Server 2012至2016就完成了, 当然上面的实验是基于纯系统没装任何第三方应用的状态下实现的, 实际情况中很有可能会由于第三方应用对2016不兼容或老系统驱动没有更新导致就地升级失败, 推荐的升级方式还是新建一个高版本的实例, 然后手动对数据和应用进行迁移.