- Внутреннее устройство памяти Microsoft Hyper-V
- Простая, быстрая и безопасная оптимизация Windows 10 за 10 минут в 2020 году
- реклама
- реклама
- реклама
- реклама
- Отключаем автозапуск браузера EDGE
- Уменьшаем объем телеметрии
- Переводим обновления Windows в ручной режим
- Отключение зарезервированного хранилища Windows 10
- Выводы
Внутреннее устройство памяти Microsoft Hyper-V
В статье были описаны методы доступа к памяти гостевых разделов Hyper-V, создаваемых в самых разных случаях
Память гостевых ОС.
Программное обеспечение, используемое в статье (операционные системы с патчами от августа 2019):
Windows 10, build 1903 x64
Windows Server 2019
Windows Server 2016
Visual Studio 2019
PyKd плагин для WinDBG
Термины и определения:
— WDAG – Windows Defender Application Guard.
— Full VM (виртуальная машина) – обычная полноценная виртуальная машина, созданная в Hyper-V manager. В отличие от контейнеров WDAG, Windows Sandbox, docker в режиме изоляции Hyper-V.
— Root ОС – операционная система, в которой установлена серверная часть Hyper-V.
— Гостевая ОС – операционная система, которая работает в контексте эмуляции Hyper-V, в т.ч. используя виртуальные устройства, предоставляемые гипервизором. В контексте статьи, это могут быть как Full VM, так и контейнеры.
— TLFS – документ Hypervisor Top-Level Functional Specification 5.0.
— GPA (guest physical address) – физический адрес памяти гостевой операционной системы.
— SPA (system physical address) – физический адрес памяти root ОС.
— Гипервызов (hypercall) – сервис гипервизора, вызываемый посредством выполнения команды vmcall с указанием номера гипервызова.
Исходники драйвера доступны на github.com:
Python-скрипт для вывода информации о GPAR и MBlock-объектах
Технологии виртуализации компании Microsoft давно и прочно вошли в нашу жизнь как в серверном сегменте, так и в клиентских ОС. Они используются не только для запуска гостевых ОС, но и для работы защитных механизмов, таких как Virtualization Based Security (VBS), Credential Guard, Device Guard, Hypervisor Code integrity (HVCI).
Компонент Hyper-V впервые появился в Windows Server 2008 и предоставлял достаточно простые на тот момент возможности по созданию гостевых операционных систем. Но Microsoft активно развивает эту технологию, и в настоящее время она глубоко интегрирована в ядро операционной системы Windows. Корневым компонентом является модуль hvix64.exe для процессоров Intel, hvax64.exe для процессоров Amd и hvaa64.exe для ARM.
Также хочется сказать отдельное спасибо компании Microsoft за то, что она опубликовала символы практически для всех основных компонентов Hyper-V (https://docs.microsoft.com/en-us/virtualization/community/team-blog/2018/20180425-hyper-v-symbols-fo. . Без символьной информации анализ работы подсистемы памяти был бы достаточно сложен.
Также описание архитектуры памяти Hyper-V (помимо TLFS) было сделано Andrea Allievi (www.andrea-allievi.com/files/Recon_2017_Montreal_HyperV_public.pptx) на конференции Recon 2017. Но слайды довольно абстрактно описывают модель реализации, и сопоставить эту информацию с реальным кодом, понять, что и как работает, очень сложно. Презентация была сделана до того, как Microsoft опубликовала символьную информацию компонентов виртуализации, так что, возможно, причина в этом.
В 2018 году Microsoft выпустила WDAG, которые представляет из себя надстройку к браузеру, запускающую браузер Microsoft Edge в контейнере Hyper-V со slim RDP-фронтендом, что создаёт ощущение, как будто вы работаете непосредственно в браузере. Подобные технологии очень давно использовала компания Citrix в своих терминальных решениях. У меня появилось желание понять, как же работает WDAG.
Проблема была в том, что было невозможно подключиться отладчиком WinDBG к контейнеру, поскольку запустить bcdedit внутри контейнера и тем более сохранить настройки отладки не представлялось возможным. Также не получалось запустить внутри какое-либо приложение типа Process Explorer для просмотра технической информации, поскольку запуск почти всех приложений внутри контейнера блокировался. Вместе с этим Microsoft сломали совместимость утилиты LiveKd из Sysinternals Suite (опцию -hv) в части подключения отладчика WinDBG (точнее, его консольной версии – kd.exe) к гостевым операционным системам через интерфейсы гипервизора. Честно говоря, это был тупик, но получилось так, что Matt Suiche (@msuiche) из Сomae поделился исходниками своей программы LiveCloudKd, за что ему огромное спасибо! Эта программа позволяла подключаться с помощью отладчика WinDBG напрямую к виртуальной машине через интерфейсы библиотеки vid.dll (Microsoft Hyper-V Virtualization Infrastructure Driver Library), представляя физическую память виртуальная сервера как дамп памяти. Проблема в том, что Microsoft заблокировала выполнения этих функций в последних версиях Hyper-V (в Windows 10 и Windows Server 2019), а WDAG работает только в Windows 10. Плюс утилиту нужно было адаптировать под Windows 10, т.к. некоторые используемые LiveCloudKd приёмы работать перестали. Исходники LiveClouKd Matt вскоре выложил на github (https://github.com/comaeio/LiveCloudKd).
Доработка этой утилиты помогла лучше понять, каким образом работают виртуальные машины и контейнеры Hyper-V, а также каким образом получить доступ к памяти гостевых ОС различными способами.
Сперва я планировал написать отдельную статью про контейнеры Hyper-V, но учитывая количество компонентов (см. скриншот), провести полное исследование слишком трудоёмко.
Сам гипервизор находится в изолированной области памяти, память root-ОС отображается 1 в 1, возможность чтения памяти средствами гипервизора с помощью гипервызова HvReadGpa отсутствует (отдельная блокировка в коде для раздела с идентификатором, равным 0, т.е. для root-ОС). Основные моменты работы подсистемы памяти описаны в TLFS.
Так что основной упор будет сделан на методы доступа к памяти гостевых ОС. Будут описаны механизмы работы памяти для обычных виртуальных машин Microsoft и контейнеров WDAG и Windows Sandbox. Docker будет упомянут кратко и только в контексте Hyper-V, т.к. это отдельная экосистема, которой и так посвящено огромное количество ресурсов.
В ходе исследования был создан драйвер hvmm.sys, который может читать содержимое памяти гостевой ОС напрямую из root-ОС минуя интерфейсы гипервизора и драйвера vid.sys. Драйвер hvmm.sys был интегрирован в проект LiveCloudKd.
В целом статья представляет материал в стиле Windows Internals и описывает то, как работает память ОС. Зачем? Чтобы узнать, как работает достаточно популярная технология Microsoft. Также может пригодиться специалистам, увлекающимся форензикой и разбирающим дампы памяти. Andrea Allievi готовит детальное описание актуальной версии Hyper-V для 2-й части 7-й версии книги Windows Internals, но пока книга не была издана, можно будет почитать эту статью и кратко ознакомиться с архитектурой памяти.
К сожалению, информация о структурах в символах для vid.sys отсутствует, поэтому название таких структур в статье выполнено произвольно исходя из сигнатур, которые в них присутствуют. Andrea Allievi упоминал “bucket” структуры в своей презентации, но как конкретно они реализованы в драйвере vid.sys – неизвестно. Если в следующей части Windows Internals будет детальное описание этих структур, то наименования будут исправлены, технические детали работы от этого не изменятся.
Работа с памятью Full VM и контейнеров посредством прямого доступа
Основным процессом, который управляет работой виртуальной машины, является vmwp.exe. Его запускает vmms.exe в случае запуска полноценной виртуальной машины, или vmcompute.exe в случае запуска контейнеров. При запуске процесс vmwp.exe через интерфейс vid.dll обращается к интерфейсам гипервизора – гипервызовам (hypercalls). Я собрал статистику гипервызовов для VM Windows Server 2019, контейнера Docker в режиме изоляции Hyper-V (образ nanoserver:1809) и контейнера WDAG. WDAG-контейнер генерирует слишком много гипервызовов, поэтому из-за торможения, вызванным записью результатов отладчиком, контейнер сразу начал выключаться после включения (управляющее приложение контролирует таймауты выполнения некоторых процедур), в связи с чем результаты по WDAG содержат общий показатель (надеюсь попробовать dtrace, относительно недавно доработанный под Windows, для сбора подобной статистики – по идее, он должен снизить издержки на запись собранных данных). Отдельно зафиксирован показатель по выключению, так что порядок оценить можно. По сравнению с обычными виртуальными машинами он достаточно большой:
Какие категории гипервызовов можно выделить? Создание раздела, установка его свойств, создание, виртуальных процессоров, виртуальных портов (используются для отправки сигналов, сообщений), установка перехватов (interceptions), и различные гипервызовы для работы с памятью.
Функция winhvr!WinHvMapGpaPagesFromMbpArrayScanLargePages. В Rdx указывается номер страницы, в rsi – размер (так же в страницах).
При запуске Windows Server 2019 с 1500 Mb оперативной памяти получаем.
При запуске Windows Server 2019 с 2300 Mb оперативной памяти получаем
1-й вызов: rdx=0000000000000000 rsi=000000000008fc00
2-й вызов: rdx=00000000000f8000 rsi=0000000000000800
3-й вызов: rdx=0000000000fff800 rsi=000000000000024a
Простая, быстрая и безопасная оптимизация Windows 10 за 10 минут в 2020 году
Большая проблема ОС Windows 10 состоит в том, что она окончательно превратилась в сервис и множество изменений в версиях делают неактуальными старые гайды по ее настройке. И эта же текучесть версий делает бессмысленной серьезную работу по глубокой оптимизации Windows 10 с внесением изменений в ее iso-образ, с применением таких средств, как MSMG ToolKit, NTLite или Win Toolkit.
реклама
Посудите сами, уже через полгода созданный с таким трудом iso-образ устареет, а через год станет совсем неактуальным, а внесенные в него изменения переключатся или откатятся большими обновлениями Windows.
Исключение составляют версии Windows 10 LTSB и LTSC, сохраняющие актуальность годами, но они и так довольно минималистичны в плане функций и особой доработки не требуют.
реклама
Выход из этой ситуации прост — делать быструю оптимизацию Windows сразу после установки, затрачивая минимум сил и получая максимум результата. Ведь как гласит Закон Парето, применимый к любой человеческой деятельности — «20 % усилий дают 80 % результата, а остальные 80 % усилий — лишь 20 % результата».
В этом блоге мы сделаем простую, быструю, и, что главное — безопасную оптимизацию Windows 10 с использованием встроенных средств или утилит, в чьей безопасности можно не сомневаться.
реклама
Мы будем использовать только групповые политики Windows 10, редактор реестра и утилиту Dism++. Утилита Dism++ является всего лишь удобной графической надстройкой над средством Dism, встроенным в Windows со времен Windows Vista.
Dism++ утилита портабельная, бесплатная и открытым исходным кодом. Скачать ее можно с сайта разработчика. Старайтесь всегда пользоваться самой свежей версией утилиты для новых выпусков Windows 10. А если пользоваться такими утилитами запрещено, например, на предприятии или в фирме, то все аналоги команд Dism++ можно сделать в Dism через командную строку.
реклама
Но давайте приступим к оптимизации и начнем с групповых политик. Групповые политики — это мощнейшее средство настройки Windows для администраторов и опытных пользователей. Многие популярные утилиты, по сути просто переключают настройки групповых политик, но вы легко можете сделать это и сами, вручную, в самой новой версии Windows 10.
Запускаются они через команду «выполнить» -> gpedit.msc. Если у вас Windows 10 Домашняя (Home), то по умолчанию редактор групповых политик в ней отсутствует, но это не беда, он легко интегрируется в эту версию Windows 10 с помощью Dism.
Для этого создаем на рабочем столе bat-файл «InstGPE.bat» с вот таким содержанием:
Запускаем «InstGPE.bat» с правами администратора.
После завершения работы Dism появится уведомление: «The operation completed successfully. Press any key to continue . . .».
Отключаем автозапуск браузера EDGE
Теперь можно приступать к настройке Windows 10 и начнем мы с отключения запуска браузера EDGE. По умолчанию он автоматически стартует после запуска Windows или в простое и висит в процессах, забивая ОЗУ. Если же вы им пользуетесь, то пропустите этот пункт.
Запускаем редактор локальных групповых политик. Переходим в «Конфигурация компьютера\Административные шаблоны\Компоненты Windows\Microsoft Edge«.
Далее выбираем пункт «Разрешить предварительный запуск Microsoft Edge при загрузке Windows, когда система простаивает, и каждый раз при закрытии Microsoft Edge» и настраиваем его вот так.
А пункт «Разрешить Microsoft Edge запускать и загружать начальную страницу и страницу новой вкладки при запуске Windows и каждый раз при закрытии Microsoft Edge» настраиваем вот так.
Уменьшаем объем телеметрии
Именно уменьшаем, а не отключаем, поскольку отключить ее полностью довольно сложно. Переходим в пункт:
«Конфигурация компьютера > Административные шаблоны > Компоненты Windows > Сборки для сбора данных и предварительные сборки«.
В пункте «Разрешить телеметрию» ставим «включена» и уровень — 0. Большинство утилит отключения телеметрии, при переключении телеметрии в «off» всего лишь меняют этот параметр групповых политик.
Переводим обновления Windows в ручной режим
Обновления Windows превратились в головную боль для многих пользователей. Совсем недавно в СМИ прошел скандал с новым бесполезным обновлением, которое всего лишь добавляет в меню «Пуск» ярлыки на облачные офисные продукты Microsoft и при этом перезагружает(!) компьютер без спроса.
Такое поведение можно было бы простить бесплатной ОС Андроид, но платная ОС так не должна вести себя. Обновления, выполняемые такими агрессивными и беспардонными методами, обязательно должны быть под вашим ручным контролем.
В редакторе групповых политик переходим по адресу «Конфигурация компьютера\Административные шаблоны\Компоненты Windows\Центр обновления Windows«.
Можно поставить данный пункт в режим «Отключено».
При этом центр обновления будет выглядеть вот так.
Это только малая часть полезных настроек Windows в редакторе групповых политик. Ну а мы переходим к средству Dism++.
Первое, на что стоит обратить внимание, так это удобная очистка Windows, включая папку WinSxS.
В управлении Appx вы можете удалить встроенные UWP-приложения, превратив вашу систему в аналог LTSC.
Я удалил около половины UWP-приложений Windows 10 May 2020 Update, получив экономию около 1 Гб на системном диске. Оставил я только вот такие (кортана отключена).
Еще более тонкую настройку и удаление ненужных компонентов можно выполнить в разделе «Компоненты Windows».
Раздел «Обновления» поможет удалить проблемное обновление.
И наконец раздел «Оптимизация». В нем можно сделать множество настроек, для которых обычно используют сторонние утилиты.
Все изменения в Windows через Dism++ происходят быстро и наш план действий будет такой. После переустановки Windows скачиваем актуальную версию Dism++, делаем полезные твики, удаляем ненужные UWP-приложения, останавливаем ненужные службы. Все это займет не больше 10 минут.
Список твиков у каждого будет разный, но испортить Windows с помощью Dism++ или групповых политик нельзя, все изменения можно вернуть к первоначальному состоянию. А вот испортить Windows сторонним твикером — элементарно. Иногда достаточно даже одной чистки реестра с помощью CCleaner.
Отключение зарезервированного хранилища Windows 10
Еще одна полезная настройка, которую я обязательно делаю — отключение зарезервированного хранилища Windows 10. Места на SSD всегда не хватает и тратить на нужды обновлений Windows 10 7 Гб я не собираюсь.
Для отключения надо будет запустить редактор реестра regedit от администратора.
В расположении «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ReserveManager» меняем параметр ShippedWithReserves с 1 на 0.
Выводы
Самое главное при настройке Windows 10 при помощи групповых политик и Dism++ — это безопасность и возможность вернуть все как было. Так же вам не понадобятся сомнительные утилиты настройки, которые, начиная с определенной версии, становятся иногда и вредоносными.
Пишите в комментарии, как и чем вы настраиваете Windows 10?