«

»

Jun 06 2021

在 2021 年在虚拟机里安装 Win7

搞这个主要是因为我遇到了个奇怪的 Vmware Workstation Bug 导致我的 Win7 虚拟机崩了,磁盘文件丢失,快照崩溃(这问题我结尾再说)。而我检查硬盘却发现几年前为公司做的 OVF 虚拟机文件也不知哪去了,所以只能重装一个虚拟机,结果被一堆坑卡住了。

至于为啥要一个 Win7 的虚拟机,作为一个 Linux 桌面用户,如果有不得已而使用 Windows 但又只是临时需求(比如网银)且不想把垃圾软件(比如QQ)引入机器造成卡顿的,在 Windows 系统里当然是首选 Win7 了,毕竟 Win10 浮肿的要死,XP 又确实跑不起来啥了。

面临的问题

(注1:以下内容皆以 Win7 SP1 x64 为准。部分补丁有 x64 与 x86 的区别,如果你装的是 Win7 SP1 x86 虚拟机,补丁不兼容,请手动替换成 x86 补丁)
(注2:补丁对应 Knowledge Base 皆以英文版为准,因为有些页面的中文版真的比……我TM真的找不出个干净点的形容词)

主要问题是,Win7 SP1 是 2013 年发布的。这么多年下来,很多事情都变了。

  • 自动更新服务器的变更
  • 自动更新累计过大导致的内存溢出
  • IE8至IE11的更新
  • SHA1的不安全性问题
  • CA更新
  • .NET更新

假如系统是从很久以前一直跟着自动更新升级上来的,那这些问题都不会遇到。但是假如是全新安装,那么光是第一步就会直接卡死。

假如你说我不考虑这些问题行不行?那你就要面临以下一堆问题:

第一:vmtools安装不上:因为现在的 vmtools 是 SHA2 签名的,而 Win7 SP1 默认只支持 SHA1 签名,导致一堆虚拟机驱动装不上,一堆功能乱七八糟
第二:各种网页打不开:因为CA库早就变了,你就算装个 Chrome 也没用(前提是你还能装得上)(装火狐可以,因为火狐自己维护证书库)
第三:.NET装不上:基于.NET的软件也打不开

screenshot_by_flameshot_at_20210605173852
screenshot_by_flameshot_at_20210605173902

其实严重的问题也就两个:一个是SHA1,一个是CA。

但,说白了,这些问题原本都可以用自动更新解决,前提是微软没搞砸。

但但,微软搞砸不也是意料之中的事情么。

自动更新错误代码 80072EFE

首先第一个问题,就是 Win7 SP1 自动更新完全连不上服务器。

screenshot_by_flameshot_at_20210605150434

报错代码是 80072EFE。

这个现象很多年前就有了,但是一直没找到什么好的解释。以前搜的话微软会给一个 Windows Update Troubleshooter。但是现在点开链接就是 Win10 的广告了。

screenshot_by_flameshot_at_20210605150503

screenshot_by_flameshot_at_20210605150509

我目前认为,就是微软自己把自动更新的服务器配置改了,导致根本就连不上服务器。抓包的确能看到成功连接到服务器了,但是就是报错。

抓包能看到明文的HTTP请求都成功了,但是密文的就直接被RST

screenshot_by_flameshot_at_20210605173459

screenshot_by_flameshot_at_20210605182222

修复手段就是装一个更新补丁。(修复无法自动更新问题需要使用自动更新来更新,死循环)

比较讨厌的是,微软的所有自动更新文档页面上从来不写哪个新的更新覆盖掉了哪个旧的更新,而我在网上找到的最新的只有 KB3138612: Windows Update Client for Windows 7 and Windows Server 2008 R2: March 2016。我之前还找到过个 KB3135445,但这个是 2016 年 2 月份的,没有 KB3138612 新。

反正能用就行了。

screenshot_by_flameshot_at_20210605182411

screenshot_by_flameshot_at_20210605182437

请求的域名都不一样了。

自动更新卡死

这个问题其实在我还没有台式机的时候就遇到过了。我以前的笔记本是32位架构的,也只有2G内存。自动更新在运行的时候释放内存不正常,导致很容易出现自动更新进程内存超过2G。在32位主机上进程超过2G后就会直接爆掉,之后进程重启,之后再爆掉,无限死循环。这个问题在64位系统上并且内存大于2G的机器上不太明显,但是如果内存比较小的话就会疯狂写虚拟内存,会把机器搞得很卡。现在一般主机内存在2G的不太多,所以一般用户不会遇到,但是虚拟机不一样,一般人不会给虚拟机分配太多内存,所以也容易遇到这个问题。

screenshot_by_flameshot_at_20210605152352

解决办法是靠这个补丁:KB3102810: Installing and searching for updates is slow and high CPU usage occurs in Windows 7 and Windows Server 2008 R2

(这是个可选项,你不装也没问题,就是慢点)

安装 2019 年后的自动更新补丁

这个时候检查更新,应该能在读条大概几十分钟后,看到一堆补丁了。

screenshot_by_flameshot_at_20210601134104

问题是看不到2019年之后的重要补丁,有些你虽然能看见,但是点击安装也是会失败的。

因为从2019年的某个时刻后之后,自动更新补丁开始基于SHA2签名,而SHA2签名补丁,一个是 KB4474419,另一个 KB4490628 则完全没显示在列表里,猜测需要手动安装旧版的汇总更新才能装上。

还不如自己下一个自己装完了。

KB4474419: SHA-2 code signing support update for Windows Server 2008 R2, Windows 7, and Windows Server 2008: September 23, 2019
KB4490628: Servicing stack update for Windows 7 SP1 and Windows Server 2008 R2 SP1: March 12, 2019

装完这两个补丁之后,就能看到后面的补丁汇总了。

screenshot_by_flameshot_at_20210601144106

安装自动更新

其实装完 KB4474419 之后,系统就支持 SHA2 签名了,像 vmtools 就可以安装了。不想装系统补丁可以跳过了。

不过我不知道关于 CA 的补丁是哪个,以及安装 .NET 虽然可以下到离线安装包,但是又需要一些修复补丁才能正常安装 .NET,比如KB4019990: Update for the d3dcompiler_47.dll component on Windows Server 2012, Windows 7, and Windows Server 2008 R2,所以我的做法就是把所有系统补丁都打了。

screenshot_by_flameshot_at_20210601152651

反正失败的会有一大堆,安装完一批之后检查更新还会跳出来又一批,重启,接着装,接着重启。反正就是最后会装到检查不到补丁就拉倒了。

后续

装完所有系统补丁后我立刻打了一个 OVF 包出来。因为 Win7 自 2020 年 1 月 EOL 之后,除了自带杀软的定义更新之后,延伸支援也没了,只有企业和机构客户额外付费才有机会继续拿到系统补丁。

所以这差不多就是 Win7 最终版的虚拟机文件了。

纯净版,全补丁,IE11,.NET4.8,无 pagefile.sys,无 hiberfil.sys,无系统还原,使用自带磁盘清理删除所有可删除的垃圾文件后,也有10.4GB大。

screenshot_by_flameshot_at_20210605184605

没安装 vmtools,也没安装 USB3.0 驱动,不过因为自动更新所以被微软引入了部分 vmware 的专属驱动。

原本是想共享出来的,OVF格式可以轻松移植到任何一个虚拟机环境下。但是目前大陆内除百度一家之外,没有哪家能装得下 10G 大的文件供分享下载,腾讯微云最大只有 10G,蓝奏把我的帐号封了后我也注册不了登录不上,而百度云那垃圾速度,下载 10G 最快也得需要 30 个小时,都够装好几遍虚拟机的了。想想看我有 80Mbps(10MBps) 的上传速度,却只有 800Kbps (100KBps)的下载,谁用百度谁有病。

目前只能是继续自用了。(其实我之前就有一份,可能是因为工作黄了之后就一怒之下给删了)

结尾

最后说一下为什么我之前的虚拟机会损坏。

说实话我没找到原因,就是在一次恢复快照的时候突然文件缺失了。

screenshot_by_flameshot_at_20210531120028

screenshot_by_flameshot_at_20210531120041

出现这个问题之前我有两个关于虚拟机的操作

一是因为 Linux 下 vmware 把 Intel 核显列入黑名单导致不能启用硬件加速,所以我在 ~/.vmware/preferences 中添加了 mks.gl.allowBlacklistedDrivers = "TRUE"。我也一度怀疑是这个参数导致的,而且带着这个参数的时候这个现象连续出现了3次(导致我损失了2个虚拟机并装了2次Win7)。

screenshot_by_flameshot_at_20210531222455

我甚至还以为是 VMware-Workstation-Full-16.1.0-17198959.x86_64 的 Bug 还升级到了 VMware-Workstation-Full-16.1.2-17966106.x86_64,但还是有这个问题。然而今天再尝试的时候却不复现了。

screenshot_by_flameshot_at_20210602103548

二是在我调整虚拟机的时候,对应硬盘的分区剩余空间被窝搞没了。理论上这个问题只会导致新的操作损坏,而不是损坏已有的镜像。但事情就是这么发生了,我也不太想再搞一次。

而且我去 VMware 官网查询的时候又正好又赶上 VMware 官网嗝屁。

screenshot_by_flameshot_at_20210531120517

不是很想研究,罢了罢了。

4 comments

Skip to comment form

  1. 老张博客
    Microsoft Edge 91.0.864.41 Microsoft Edge 91.0.864.41 Windows 10 x64 Edition Windows 10 x64 Edition

    我现在是虚拟机里安装的win7,直接另外网卡连接政府内网使用。方便

  2. jim
    Microsoft Edge 91.0.864.59 Microsoft Edge 91.0.864.59 Windows 10 x64 Edition Windows 10 x64 Edition

    没办法微软自己从来没发布过包含SHA2和服务堆栈更新的ISO,大家都只能拿远古RTM镜像做起点。
    Microsoft Update Catalog的下载页面的Package Details可以看到取代和被取代的补丁包号,网站查不到的补丁基本就是被取代的补丁,基本可以忽略。
    现在微软依然有发布win7更新,不过是给ESU订阅的。一般用户不能自动更新但可以去catalog手动下载,而且都是累积更新,装完SHA2和服务堆栈更新之后可以直接装最新的累积更新就行。
    例如现在的2021-06累积更新发布页( https://support.microsoft.com/help/5003667 )也列明的所有要手动安装的前置补丁,不过没搞过的人确实不知道要这样做。

    1. 石樱灯笼
      Firefox 89.0 Firefox 89.0 Ubuntu x64 Ubuntu x64

      其实解决办法是微软应该在2016年左右发布一个Win7-SP2,就像Vista一样。问题是微软急着把Win7弄死。
      我也是才知道ESU补丁竟然可以手动下载和安装,而且各种国产安全工具全都没提供这种补丁安装方式,过分奇葩了。

      1. 石樱灯笼
        Firefox 89.0 Firefox 89.0 Ubuntu x64 Ubuntu x64

        刚才试了一下, 手动下载是不能成功安装的,因为没有 ESU MAK add-on key。
        按照官方文档的说法,只有Windows Virtual Desktop能免费获得security updates。

石樱灯笼进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据