龙空技术网

基于正向/逆向二进制差分的Windows累积更新

爱编程的里奥大叔 110

前言:

如今看官们对“window回到上个版本”大体比较珍视,大家都需要分析一些“window回到上个版本”的相关内容。那么小编在网络上搜集了一些对于“window回到上个版本””的相关资讯,希望兄弟们能喜欢,大家一起来学习一下吧!

0x00 引言

众所周知,Windows 10以及后续的Windows 11每个月都会准时地收到来自微软官方推送的累积更新。所谓累积更新,是指当前的更新内包含之前已经发布的针对该版本的所有更新的内容。因此,只需要安装当前的累积更新,就等于是安装了之前所有的更新。

关于累积更新,这里咱们就不展开聊了,如果有同学想要更加详细的了解累积更新的来龙去脉,可以参考咱们的《Windows Update 技术详解系列》的其他文章。细心的同学会问了,累积更新既然包含了之前发布的针对该版本Windows的所有更新,那累积更新的体积岂不是越来越大?答案是:是的。Windows操作系统在其生命周期内,每个月都会收到微软各个功能模块开发组发布的针对某个组件的更新。因此,经年累月下来,更新的体积是越来越大,那么到底有大多呢?举个例子,在Windows 10 1809 (10.0.17763.1)之前,Windows 10的累积更新还没有使用基于正向/逆向二进制差分技术,那会儿的累积更新通常会有大于1 GB的体积:

如图所示,Windows 10 1703的某个累积更新,体积竟然高达1558 MB,相当于1.5 GB。而Windows 10 1703的安装镜像也不过4个GB。一次更新就有小半个安装镜像的大小,对于某些带宽不富裕的用户来说,简直不可接受。如何减小累积更新的体积这个问题因此就浮上了水面。

0x01 全量更新与增量更新

如何减小更新的体积呢?

通常来说,替换一个二进制文件有以下两个思路:

使用完整的一个新文件直接覆盖旧的文件。只替换新旧文件之间的差异。通过算法去计算新旧文件之间的差异,然后将差异部分移动到目标机器上。

其中方法一制作的更新就叫做全量更新(Full Update)。而方法二就是二进制差分方式,即增量更新(Delta Update)。

0x02 方式对比

全量更新方法的优点是简单,不用考虑旧文件的状态,也就是说不用管旧文件的版本,任何版本甚至是已经遭到破坏的旧文件都可以,替换完之后就是新的文件了。

但是缺点是体积大,比如新文件1GB,替换之前就要先将这1GB的文件移动到目标机器上。如果是通过网络传输的话,需要大量的带宽资源。

增量更新这个方式的优点是,如果两个文件差异不大的话,需要移动的部分会很小。

但是缺点是对于就文件的状态有严格的要求,这是因为不同版本之间的二进制差异不同。举个例子:某个新的文件A的版本是3,需要更新到用户的机器上。但是部分用户机器上安装的文件A版本是1,部分用户的文件A是版本2。这种情况下,就需要分别计算版本3和版本1的差异,以及版本3和版本2的差异。然后根据不同用户的情况分别发送不同的二进制差异文件。

在此之前,为了解决Windows累积更新体积过大的问题,微软使用的是Express Update技术。Express技术确实减小了累积更新的体积,但是却极大的增加了Window更新服务器的计算压力与存储压力。Express更新文件在更新服务器上通常会有大于10GB的体积。心思缜密的同学一定发现了,Express Update正是使用的增量更新方式,并且把所有文件的所有版本差异都存储到了更新服务器上(海量的文件)。关于Express技术,我们还是不在这里赘述,感兴趣的同学请参考《Windows Update技术详解系列》的相关文章。

现在,Windows 10 1809版本之后引入了一种全新的技术来安装Windows累积更新。这种技术就是基于二进制的正向/逆向差分技术。那么,什么是基于二进制的正向/逆向差分技术呢?它带来了哪些好处呢?

0x03 正向/逆向二进制差分

在讲解这个技术之前,我们先明确一个基本概念:

Windows RTM:可以理解为正式发布版。比如Windows 10 1809的RTM,可以理解为Windows 10 1809的正式发布版本。基线版本:正式发布版的版本号。比如Windows 10 1809的基线版本是10.0.17763.1。在Windows 11中,基线版本基本上就是RTM。

明确了上述两个概念,现在我们来讲讲正向/逆向二进制差分的基本工作原理。

现在我们知道,二进制差分是需要严格比对文件的版本信息的。如果被替换文件的版本不确定,那么就无法应用二进制差分。如果本替换文件的版本非常多,那么就需要针对每一个版本分别计算二进制差分,这样一来,不同版本的二进制差分的总和体积也必然不会小,因此就抵消掉差分带来的体积优势。

因此,正向/逆向差分技术的核心思路是:将被替换文件的版本固定,这样就能唯一确定一个二进制差分了。那么,将被替换的文件版本固定成什么版本呢?Windows更新用的方法是,将所有需要被更新的文件版本回到Windows 10 基线版本 。然后,从基线版本安装二进制差分,完成文件的更新。这里,从当前的文件版本回退到基线版本的过程被称为逆向,从基线版本更新到最新的版本的过程称为正向,也被称为注水(hydration)。制作差分二进制叫做脱水(dehydration)。这两次文件更新的行为都使用差分二进制来完成,因此这就是正向/逆向二进制差分技术。

我们假定基线版本为V0,更新后的版本为VR,当前的版本为VN,逆向二进制差分为ΔN->0,正向二进制差分Δ0->R。

用户机器得到更新后,首先当前文件根据系统内存储的ΔN->0回退到基线版本V0,再通过Δ0->R从V0更新到VR。

正向/逆向二进制差分的优点:

增量更新,更新体积小客户机器任何版本都适用制作更新所需的差分二进制简单安装方便便于分发

以上是对于需要更新的文件来说的。对于完全新增的文件,就自然没有差分二进制了,就是使用完整的文件拷贝。

接下来,让我们看一下使用了新技术后的效果如何。效果展示:

使用了新的正向/逆向差分二进制技术后,Windows累积更新的体积减小了很多。如图中显示,Windows 10 1809累积了4年后,累积更新体积大约是600 MB。与Windows 10 1709相比,减小约1 GB的体积,效果还是很不错的。而且,累积更新是按月发布的,每个月减小几百个MB,一年下来至少减小几个GB的带宽资源。

0x04 Windows 10累积更新文件格式

基于正向/逆向二进制差分的Windows累积更新内部包含以下内容:

从基线版本到最新版本N的正向二进制差分文件回退到基线版本所需的逆向二进制差分文件更新文件清单(Manifest)更新文件Metadata

如果是离线更新MSU,还会多一些版本以及操作系统适应性判断的内容:

0x05 参考资料

[1] Windows Updates using forward and reverse differentials, 06/17/2022,

标签: #window回到上个版本