[Перевод] Как Windows 11 уменьшила размер кумулятивных обновлений на 40%

image-loader.svg

Раз в месяц Microsoft выпускает кумулятивное обновление Windows, которое включают в себя все предыдущие. То есть для приведения системы в актуальное состояние требуется установка единственного апдейта.

Учитывая огромное количество исправлений в Windows, кумулятивное обновление без оптимизации может сильно вырасти в размере, что неприемлемо. Например, его не смогут скачать пользователи с медленным подключением к интернету, а только в США таких 20%. Поэтому уменьшение размера обновлений — приоритетная задача. Теперь для неё нашлось решение.

Если вкратце, то раньше каждое обновление включало в себя прямую дельту изменений системы, а также обратную дельту для приведения системы к базовой RTM, чтобы установить новую прямую дельту через месяц. Однако выяснилось, что обратную дельту можно вычислить в процессе установки обновления. Теперь Microsoft намерена запатентовать этот алгоритм.


С переходом сотрудников на удалённую работу большой размер апдейтов стал создавать проблемы для многих компаний. У них нет скоростного интранета. Сотрудники подключаются к корпоративному VPN и скачивают обновления через домашний интернет. Для оперативного распространения патчей безопасности очень важно свести к минимуму сетевой трафик, чтобы обеспечить защиту удалённых сотрудников, где бы они ни находились.

В этой статье рассказывается о новой технологии сжатия, которая позволила уменьшить размер кумулятивных обновлений в Windows 11 на 40% (аналогичная система реализована в Windows 10).


Разработчикам была поставлена задача уменьшить размер обновлений Windows 11 со следующими условиями:

  • Уменьшить размер трафика
  • Не увеличивать время установки
  • Сохранить совместимость со всеми каналами распространения без каких-либо изменений конфигурации, то есть без лишней головной боли для сисадминов


Windows 10 с версии 1809 использовала одновременно прямое и обратное разностное сжатие, где учитываются прямая и обратная разности (дельты) между тремя версиями системы: текущая $V_N$, целевая $V_R$ и базовая исходная $V_0$.

image-loader.svg

Таким образом, в качестве промежуточного состояния Windows возвращается к своей базовой версии, поэтому с каждым обновлением поставлялись прямая и обратная дельты.

Хотя прямая и обратная дельты симметричны по функции, их содержимое в значительной степени отличается. Это значит, что двунаправленная дельта, которая содержит и новые, и старые данные, не намного меньше по размеру, чем старые файлы Patch Storage Files (PSF) в версиях Windows 10 1803 и старше, куда записывались прямые дельты для всех возможных сочетаний $V_N$ и $V_R$, то есть без использования обратных дельт и промежуточной базы $V_0$.

К примеру, если в октябрьском ежемесячном обновлении изменился файл Notepad.exe, то генерировались дельты для изменений файла Notepad.exe с сентября по октябрь, с августа по октябрь, с июля по октябрь, с июня по октябрь, а также с первоначального RTM по октябрь. Таким образом, кумулятивные обновления с каждым месяцем всё увеличивались в размере. Поэтому разработчикам поставили задачу оптимизировать их.

Начиная с Windows 10 1809 механизм изменили — и ввели обратную дельту, благодаря которому размер кумулятивных обновлений всегда оставался практически одинаковым.

image-loader.svg
Дельта-пары в Windows Update. Чтобы создать целевую ревизию, к базовой версии файла применяется прямая дельта (forward delta). Затем к целевой ревизии применяется обратная дельта (reverse delta), чтобы создать промежуточную базовую версию для следующей прямой дельты через месяц


Дельты создают целевую версию путём преобразований и исправлений базовой версии. В одних случаях данные добавляются, в других — удаляются. Поэтому двунаправленная дельта хранит и добавленное, и удалённое содержимое. Поскольку данные в прямой и обратной дельтах сильно не совпадают, двунаправленная дельта не слишком эффективна.
Разработчики Microsoft нашли способ «зафиксировать» на этапе применения дельты все преобразования и исправления — и эффективно перекодировать их из прямой в обратную дельту (n→0), что избавляет от необходимости распространять обратные дельты в паре.

Примечание. Microsoft пишет, что предварительная заявка на патент США № 63/160,284 с описанием этого механизма «Генерация данных для обратного обновления» подана 12 марта 2021 года. К сожалению, найти заявку на сайте патентного ведомства не удалось.

image-loader.svg

image-loader.svg
Генерация данных для обратного обновления происходит в процессе применения прямой дельты с инструкциями вставки и удаления данных


Архитектурно продвинутые алгоритмы дельта-сжатия, такие как MSDelta от Microsoft, при изменении адреса функции изменяют также виртуальные адреса в ассемблере (маппинг виртуальных адресов). Это важно, поскольку даже небольшие исправления в ассемблерном коде сдвигают адреса последующих функций в бинарной программе. Без ремаппинга виртуальных адресов изменение ассемблерного кода в одной строке может привести к тому, что придётся изменять виртуальные адреса для десятков тысяч вызовов.

Маппинг выполняется путём побайтового дизассемблирования кода программы и идентификации виртуальных адресов. Виртуальные адреса логически соответствуют точкам входа для функций ассемблерного кода и смещаются, когда ассемблерный код обновляется в патче. Дельта-движок отслеживает эти сдвиги — и они фиксируются в таблице сопоставления. Маппинг во время применения дельты — одна из важных причин, почему современные архитектурно продвинутые алгоритмы дельта-сжатия настолько эффективны.

image-loader.svg
Пример, как все инструкции call в ассемблере x86 сдвигаются после добавления всего одной инструкции mov по адресу 0×18000097D3 (строка 17)


Как и обычные изменения данных, преобразования адресов можно «зафиксировать» и отменить. При этом возникают небольшие накладные расходы, поскольку не всегда отображение выполняется в точности. Если прямое отображение конфликтует с наблюдаемым обратным, то для выравнивания необходимо использовать дополнительную инструкцию исправления. Это можно сделать сразу на месте, и тогда обратный маппинг обеспечит почти такую же производительность, как обратная дельта с прямым маппингом из дельты, сгенерированной на сервере.
Возможность сгенерировать обратное обновление обеспечивает эффективный способ распространения прямых дельт с возможностью вернуть систему в исходное состояние. Microsoft пишет, что в Windows 11 такой подход сократил размер обновлений на 40%.



Можно добавить, что все файлы Windows Update подписаны цифровой подписью Microsoft с соответствующим цифровым сертификатом. Наличие у программы сертификата подписи кода гарантирует беспроблемную установку под Windows, потому что Windows Defender SmartScreen учитывает репутацию издателя и не выдаёт предупреждений безопасности при установке программы с сертификатом.

© Habrahabr.ru