自从 Linode 支持 KVM 后,按理说运行 Windows 是可行的,一篇 官方博客 也非常模糊地印证了这一点,因此准备上手折腾一下。

如果在网上搜索,不难找到一些制作好的 RAW 镜像,直接用 dd 把镜像烧录好,把虚拟模式设置为全虚拟后即可顺利启动。然而问题有两个,第一是我不相信别人做好的镜像;第二,也是最重要的一点,这些系统是运行在全虚拟模式下的,性能比半虚拟差一些,尤其是虚拟网卡,全虚拟时是模拟成 Intel 千兆网卡,半虚拟时是 VirtIO 的万兆网卡。具体的差别,请参考 这篇文章。我希望自己制作一个适用于半虚拟模式下的镜像,由于网络带宽小,从本机向云端传输动辄数 GB 的镜像很不实际,因此我尽量用最小的花费把所有涉及大量传输的操作都转移到云端进行,最后还要把镜像打包好方便下次使用。

是否合法

windows-on-linode-1.png

我为此专门开 Ticket 咨询了客服,答案是可以运行,前提是系统必须正版。

准备镜像

我选择把 Linode 开在 Fremont 区,打算用 Los Angeles 区的 Vultr 服务器准备镜像。Vultr 支持从用户自定义的 ISO 启动,给我们提供了很多便利,它最多可以给用户存放两个自定义 ISO,刚好能满足我的需求。

第一个要准备的镜像是 Finnix,这是一个 Linux 环境的装机必备工具集。在 Vlutr 的 ISO 管理页面上,直接添加 http://www.finnix.org/releases/111/finnix-111.iso 即可,Vlutr 会在后台下载这个镜像。

第二个是 Windows 镜像,我安装的是 Windows Server 2012 R2,镜像名 en_windows_server_2012_r2_vl_with_update_x64_dvd_4065221.iso ,我发现在 Google Drive 上已经有人上传了一份镜像,地址 在这里。此外还需要一份 VirtIO 驱动,地址 在这里,我们需要把驱动解包后放进系统 ISO 内。我的解决方案是直接开一台 Windows 实例,关闭 IE ESC 后直接用浏览器下载系统镜像和驱动,然后集成好驱动后打包好新的 ISO,开启 IIS 把镜像提供给 Vultr。此方法最为迅速简便,从 Google Drive 下载系统镜像的速度可达 60 MB/S,花不了多少时间,而实例每小时收费仅仅是三美分而已,折合只需几毛钱就能解决问题,何乐而不为。

windows-on-linode-2.png

最终需要在 Vultr 上准备好两个自定义镜像。

安装系统

我采用的是在 Vultr 上安装,然后全盘烧录到 Linode 的方法。新建一个 Vultr 实例,选择最便宜的 5 刀一个月的 SSD 实例即可,选择从自定义 Windows 镜像引导,然后开机,打开 VNC 在上面操作。

文件载入后就进入了 Windows 安装界面了。我选择了带 GUI 的 Server 2012 R2 标准版,接受了许可证之后进入分区界面,因为没有驱动,所以没有认出硬盘。点击加载驱动,分别加载 Balloon NetKVM viorng vioscsi vioserial viostor 内的驱动,注意不要隐藏不兼容驱动,上面列出的都要加载,否则虽然在 Vultr 上能正常运行,但到了 Linode 上就会报错。

之后如无意外能认出硬盘了,我为了方便,并不希望把引导和系统分开两个分区。因此需要手动分区, Shift + F10 打开黑框框:

1

2

3

4
diskpart
select disk 0
create partition primary
exit

刷新一下,选择已经创建好的分区,点击下一步。此时安装程序开始解包内部的 WIM 镜像,完成后会重启一次从硬盘引导继续安装,这时所有的操作都和 ISO 无关了。我们要做的是,在 WIM 镜像解包完成后重启的时候,在从硬盘引导之前把它拦截下来,对此时的硬盘做镜像。

具体的操作就是,完成解包重启时,VNC 会断开而且不会自动重连,需要马上刷新网页让 VNC 连线,这样用户可以看见虚拟机 POST 的界面,此时会有提示说按 Ctrl + B 进入 iPXE,我们照做,进入后启动过程就被拦截下来了。

接下来在 Vultr 的控制面板上把系统 ISO 卸载下来,这个操作会触发实例重启,如同上一步一样,把启动拦截下来。再在控制面板上把 Finnix ISO 挂载上去,这个操作同样也会触发实例重启,这次选择引导进入 Finnix。

新的拦截办法在这里。近日打包 Server 2016 发现 Vultr 似乎把 iPXE 的等待时间调短了,结果就是几乎没有办法在系统从硬盘启动之前把过程中断。解决办法是,安装系统第一部分完成,在提示倒数 10 秒然后重启的时候,在控制面板直接关机。待关机完成后,打开挂载镜像设置,选择移除镜像,此时系统会自动开机。点击移除镜像后,无需等待网页刷新完毕,马上点击关机。待网页加载完毕后,Windows 安装镜像已被移除,系统电源为关闭状态。此时再加载 Finnix 镜像进行下一步即可。

打包系统

上面的实例装了 Windows 已经没有空间了,于是我另开了一个 Vultr 实例来做打包。选择月费 5 刀的储存型即可,系统我选择了 Debian 8,也就用一个小时不到,折算过来一毛钱都不用。

修改 root 密码后,在 Finnix 这边把整个硬盘镜像过去,由于两个实例都在同一个数据中心,传输速度可以达到 90 MB/S。复制 15 GB 的硬盘需时不超过五分钟,因此就懒得考虑硬盘末端都是空白内容而无需传输这样的问题了。这里假设 Linux 实例的 IP 是 1.2.3.4。

1
dd if=/dev/vda | pv -s 15G | ssh root@1.2.3.4 "dd of=/root/windows.raw"

传输完成后,安装了 Windows 的实例就可以删除了,使用时间不到一个小时,花费不过是几毛钱。

准备 Linode

创建一个 10 刀每月的 Linode 2048 实例。

新建一个磁盘。

  • 名称 System
  • 容量 24576 MB
  • Type 选择 RAW

新建一个自定义的 Profile。

  • VM Mode 选择 Paravirtualization
  • Kernel 选择 Direct Disk
  • /dev/sda 挂载刚刚创建的 System
  • initrd 选择 No initrd
  • root / boot device 选择 /dev/sda
  • 下方的 Filesystem/Boot Helpers 一律选择 No

同样是因为网速快,我就不考虑复制整个硬盘是不是高效了,反正都是几分钟就能完成的事情。点击上方的 Rescue,把 /dev/sda 挂载为之前创建的 System,然后重启进入救援模式,这里 Linode 自带的救援模式用的也是 Finnix。在 Remote Access 页面打开一个 Lish Console。

1

2
passwd root
service ssh start

修改 root 密码并打开 ssh 服务,至此这个 Linode 已经准备好接受烧录了。

windows-on-linode-3.png

烧录系统

回到那个 Vultr 的 Linux 实例上,用 dd 把 RAW 镜像烧录到 Linode 上。假设 Linode 的 IP 是 4.3.2.1。

1
dd if=/root/windows.raw | pv -s 15G | ssh root@4.3.2.1 "dd of=/dev/sda"

烧录的镜像大小是 15 GB,根据实际测试来看,Vultr 在 Los Angeles 的机房与 Linode 在 Fremont 的机房之间连接速度大概是 200 Mbps 左右,这个步骤需时 15 分钟左右。完成后我们在 Linode 上进行分区大小调整。使用 parted 把分区扩展到整个硬盘大小即 24 GB 即可。

之后在 Linode 控制面板使用之前创建的配置文件重启引导实例即可,安装程序的后半部分会在 Linode 上执行完毕,之后就可以使用了,打开一个 Glish 窗口可以监视整个过程。

安装程序运行完毕后,需要在 Glish 上设置管理员密码。进入桌面后,由于目前的 Glish 非常不好用,鼠标操作非常别扭,因此最初始的设置需要通过键盘操作。

关于选择网络位置,此处如果选择 Private Network 的话,则下一步打开远程桌面连接后就可以通过远程桌面登录管理了;如果选择了 Public Network 或者根本没有做出选择而错过了设置的话,之后开启远程桌面连接后,需要打开防火墙设置启用规则,否则无法连接。

windows-on-linode-4.png

解决不能使用 IPv6 的问题:

1

2

3

4
netsh int teredo set state disabled
netsh int ipv6 6to4 set state disabled
netsh int ipv6 isatap set state disabled
netsh int ipv6 set global randomizeidentifiers=disabled

另外,在 Vultr 上安装时系统盘大小只有 15 GB,到了 Linode 上变成了 24 GB,如果不进行扩充的话,虽然分区大小已经是 24 GB 了,但是 C 盘的大小还是原来的数值,因此需要扩充系统盘:

1

2

3

4
diskpart
select disk 0
select partition 1
extend filesystem

无需重启,刷新即可见系统盘容量变成 24 GB。

我们再打开设备管理器,将无法使用的软驱和光驱禁用。这样在我的电脑面板就不会看到这两个无用的设备了。

镜像打包

在 Vultr 实例上 tar 压缩即可,RAW 镜像末端都是空白,压缩后占用空间会大幅减少。之后随便装一个 Web 服务器,在本机把压缩好的镜像下载回来即可。

因为要压缩的文件很大,如果在压缩的时候能显示进度就好了:

1
tar cf - windows.raw -P | pv -s $(du -sb windows.raw | awk '{print $1}') | gzip > windows.tar.gz

用打包后的镜像对 Linode 烧录:

1
tar zxOf windows.tar.gz | pv -s 15G | ssh root@4.3.2.1 "dd of=/dev/sda"

按照此流程部署最快只需要半小时,额外的花费极少,也免去了本机上传大容量镜像的麻烦。

 

 

via。https://www.dommyet.me/windows-on-linode