为虚拟云主机更换 Windows Server Core (以金山云为例)

Author Avatar
ciaoly 2020年07月15日
  • 在其它设备中阅读本文章

前两天上车了金山云190/年的廉价云主机, 本想装个Windows Server玩玩的, 然而金山云给的系统不知道因为何原因没法开启防火墙, 这使得很多依赖于防火墙的服务无法启动. 最后实在没有办法, 本着 重启重装重买 的原则走到了"重装系统"这一步.

解决方案

最终方案使用 微软原生镜像 + 硬盘安装 + Windows Boot Manager/MBR引导 的方式安装新系统. 本来尝试了使用 Linux + dd 的方式, 失败(可能是因为我操作有误). 最终决定还是自己手建引导, 用硬盘安装算了.

注意, 因为需要使用BCD引导, 因此本文记录的操作只适用于Windows系统的服务器, 就是说, 在 Windows Server服务器上重新安装 Windows Server.

PS: Linux换Windows也很简单, 自己写Grub2引导就可以了. (其实dd也行的)

准备工作

  1. Windows Server 镜像

    可以到这里申请试用: https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2019

  2. VirtIO驱动

    金山云用的是 KVM虚拟机, 需要安装专门的虚拟设备驱动. VirtIO驱动下载链接如下(Fedora版):

    https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/index.html

  3. (可选)Bootice

    不适用Bootice的话, 可以直接使用bcdedit命令. 也不知道有没有官网或者项目Release之类的, 我是在Softonic下载的(看上去就像是个国外版的ZOL下载): https://bootice.en.softonic.com/

  4. (可选)Dism++

    主要是不用自己敲命令行. 下载Dism++

操作

1. 处理镜像

因为是在 KVM 上安装系统, 由于原生镜像缺少 VirtIO驱动, 所以安装时是找不到硬盘的, 因此需要先注入驱动.

这里处理的"镜像"是Windows的安装部署镜像 WIM(Microsoft Windows Imaging Format), 不是下载的ISO, 因此需要先从 ISO 里提取出 WIM . 我是在云主机上直接操作的, 但是不知为何金山云提供的Windows Server在挂载已下载的 ISO 镜像时提示"磁盘格式错误"(可能是压缩格式不支持?), 最终我使用了 Bandizip 来解包 ISO. 解包后准备注入驱动.

有现成的驱动注入教程: https://hazx.hmacg.cn/server/windows-iso-add-driver.html, 命令行的, 不需要 Dism++.

当然我还是喜欢GUI的啦. Dism++ 官方的离线注入教程点此可至. 只需要建立一个空目录做挂载点> 文件/挂载镜像> 选"驱动管理"> 选"添加驱动"> 找到下载好的 VirtIO 驱动并注入> 文件/保存镜像> 选择"直接保存" 就可以啦.

当然这里还有那么几个地方要注意一下,

  1. Boot.WIM 是安装系统时的那个"安装向导", 如果它没有 VirtIO驱动, 那么安装系统时会出现"找不到硬盘"的现象. 因此务必为其注入 VirtIO驱动套件中的 vioscsi和viostor驱动(其它驱动也注入吧, 虽然可能没太有用). 简单说来就是: Boot.wim 和 Install.wim 都得注入驱动!
  2. 在 Fedoras 提供的 VirtIO驱动中包括了很多驱动文件, 其文件说明如此所述, 酌情注入\择优注入.

2. 备份

将服务器中必要的文件备份一下, 其中在金山云的云主机中, C:\boot.bat(好像是这个路径)里有KMS激活需要的信息, 建议备份.

当然Windows安装程序会自动将老系统的文件放到 Windows.old 目录里, 不备份也问题不大.

3. 磁盘分区 + 建立引导

按理说, 磁盘分区应该是多余的步骤. 因为Boot.WIM是加载到内存里的, 我们只要能把Install.WIM也加载到内存里不就可以了嘛. 可是怎么把Install.WIM放到内存里呢? 好像是个问题.(也许可以用Grub4DOS呢)

为防意外, 还是建立分区吧, 又不麻烦. "计算机管理"里选"磁盘管理", 对着C盘右击选"压缩卷", 大小能容纳下 Install.wim 即可(或者再大一些也行哈), 之后"新建简单卷", 一气呵成.

把 Install.wim 放到新建的分区里 (我是直接把整个ISO提取到新分区了, 省事). 之后打开 Bootice, 开始配置引导程序.

喜欢命令行的话, bcdedit.exe /? 冲冲冲. ref: https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/bcdedit-command-line-options

  1. Bootice打开> 选择"BCD编辑"> "当前系统BCD"> 点击"智能编辑模式":
  • 选择"新增"> "新建win7/8/8.1入口" (图中红色荧光笔标记);
  • 选择"Ramdisk"> 选择 Boot.WIM 所在的磁盘和分区 (图中蓝色荧光笔标记); 填写 Boot.wim 的路径和相应的SDI文件的路径; (图中绿色荧光笔标记)
  • 填写引导加载器中显示的标题/ 引导加载器的可执行文件(\windows\system32\boot\winload.exe)/ 系统根目录 (图中绿色荧光笔标记)
  • 勾选"检测硬件抽象层"和"启动到WinPE" (图中蓝色荧光笔标记)

  • 点"保存当前系统", 待其提示"修改成功"后关闭此编辑器
  1. (暂时未清楚此步骤的必要性) 同上述步骤1, 但此步点击"高级编辑模式"
  • 点击刚才新建的启动加载项, 检查其"应用设备"和"操作系统设备"是否为"以盘符开头的boot.wim的完整路径", 如果不是的话, 双击其编辑. (如下图中黄色荧光笔标记)

  • 检查其启动时的附加参数, 在我的系统里是叫做"ramdiskoptions". (如下图中蓝色荧光笔标记)

  • 在左侧树形目录里点击"ramdiskoptions"切换到附加参数的编辑页

  • 如上图示, 若SDI设备为[boot], 则单击[boot], 将其修改为SDI文件所在的磁盘路径(如下图示)

    本以为这一步可能是不需要的, 但是实测发现如果不进行这一步的话, Windows Boot Manager会报"启动文件丢失"的错误. 至于原因, 可能得去查看Windows Boot Manager/BCD 中关于[boot]ramdiskoptions的相关文档了.

4. 重启服务器, 执行安装

打开云主机的管理面板(例如, 金山云的管理控制台)> 打开tty(在金山云的管理控制台里点击"连接实例")> 待进入tty界面后设法执行重启> 等待操作系统进入引导加载器界面

在引导加载器(Windows Boot Manager)中选择刚才新建的启动加载项, 按下回车. 按照提示执行后续安装程序即可.

5. 安装驱动

如果在上述步骤中未注入必要的驱动(例如"网卡驱动"), 将刚才下载的 virtio驱动安装即可

PS: 驱动安装命令: pnputil /?