自从 Linode 支持 KVM 后,按理说运行 Windows 是可行的,一篇 官方博客 也非常模糊地印证了这一点,因此准备上手折腾一下。
如果在网上搜索,不难找到一些制作好的 RAW 镜像,直接用 dd
把镜像烧录好,把虚拟模式设置为全虚拟后即可顺利启动。然而问题有两个,第一是我不相信别人做好的镜像;第二,也是最重要的一点,这些系统是运行在全虚拟模式下的,性能比半虚拟差一些,尤其是虚拟网卡,全虚拟时是模拟成 Intel 千兆网卡,半虚拟时是 VirtIO 的万兆网卡。具体的差别,请参考 这篇文章。我希望自己制作一个适用于半虚拟模式下的镜像,由于网络带宽小,从本机向云端传输动辄数 GB 的镜像很不实际,因此我尽量用最小的花费把所有涉及大量传输的操作都转移到云端进行,最后还要把镜像打包好方便下次使用。
是否合法
我为此专门开 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,花不了多少时间,而实例每小时收费仅仅是三美分而已,折合只需几毛钱就能解决问题,何乐而不为。
最终需要在 Vultr 上准备好两个自定义镜像。
安装系统
我采用的是在 Vultr 上安装,然后全盘烧录到 Linode 的方法。新建一个 Vultr 实例,选择 10 刀一个月的 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。
打包系统
上面的实例装了 Windows 已经没有空间了,于是我另开了一个 Vultr 实例来做打包。选择月费 5 刀的储存型即可,系统我选择了 Debian 8,也就用一个小时不到,折算过来一毛钱都不用。
修改 root 密码后,在 Finnix 这边把整个硬盘镜像过去,速度有 25 MB/S 左右。复制 20 GB 的硬盘也就几分钟的事情,我就懒得考虑硬盘末端都是空白内容而无需传输这样的问题了。假设 Linux 实例的 IP 是 1.2.3.4。
1
|
dd if=/dev/vda | pv | ssh [email protected] "dd of=/root/windows.raw" |
而 Linode 上的硬盘是 24 GB 的,为了方便日后部署,我在这个 Linux 实例上先对刚刚获得的 RAW 镜像扩容,这样省得部署好后再扩容。
1
2
|
fdisk /root/windows.raw p |
确认大小是 20 GB,无误则退出,追加 4 GB 空白到文件末端。
1
|
dd if=/dev/zero bs=1k count=4194304 >> /root/windows.raw |
再用 fdisk
重新划分分区。打开 RAW 镜像,删除分区,再新建分区,基本上保持默认参数即可,分区会占满所有空间。按 t
把新分区类型设置为原本的 7
即 NTFS,按 a
标记 Boot,最后按 w
写入更改。
准备 Linode
创建一个 Linode 1024 实例。
新建一个磁盘。
- 名称 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 已经准备好接受烧录了。
烧录系统
回到那个 Vultr 的 Linux 实例上,用 dd
把 RAW 镜像烧录到 Linode 上。假设 Linode 的 IP 是 4.3.2.1。
1
|
dd if=/root/windows.raw | pv | ssh [email protected] "dd of=/dev/sda" |
wget –O– http://xxx.com/windows2003.32bit.raw | dd of=/dev/sda
因为烧录的是 24 GB 的镜像,完成后 Linode 那边无需额外的扩容操作,直接用刚刚创建的配置重启即可。打开一个 Glish Web Console 就能看见安装程序在 Linode 上继续了,短暂的等待后会再重启一次,之后便可设置管理员密码登录系统了。Glish 并不是那么好用,登录后可能需要配合键盘操作,把远程桌面打开便可。
在 cmd
上执行 netsh interface ipv6 set global randomizeidentifiers=disabled
即可正常使用 IPv6。
镜像打包
在 Vultr 实例上 tar
压缩即可,RAW 镜像末端都是空白,压缩后占用空间会大幅减少。之后随便装一个 Web 服务器,在本机把压缩好的镜像下载回来即可。
按照此流程部署最快只需要半小时,额外的花费极少,也免去了本机上传大容量镜像的麻烦。
原文地址:https://www.dommyet.me/windows-on-linode#comment-716