Настройка virtualbox на windows 7 x64

Содержание:

  • 1 Установка VirtualBox для Windows
  • 2 Создание и базовая настройка виртуальной машины
  • 3 Настройка сети Интернет и общих папок
  • 4 Запуск ВМ и установка операционной системы
  • 5 Основные проблемы при работе с VirtualBox

Установка на компьютер программного обеспечения, особенно малоизвестного, всегда связана с определенным риском. Программа может содержать влияющие на стабильность работы системы ошибки, встроенные рекламные или следящие модули и прочие нежелательные элементы. К тому же любой софт оставляет в системе следы, которые могут оказывать на ее работу не самое лучшее влияние. Что касается экспериментов с Windows, то тут всё еще более рискованно, ведь порой даже незначительное с виду изменение данных реестра или модификация системных файлов могут привести к самым неприятным последствиям.

Спросите, как их избежать? Очень просто, используйте системы виртуализации, например, виртуальную машину VirtualBox – специальную программу, позволяющую устанавливать, запускать и тестировать разные операционные системы в изолированной среде. С такими виртуальными компьютерами можно делать что угодно – устанавливать на них программы, настраивать, модифицировать системные файлы, работать с дисками и разделами, одним словом, производить любые эксперименты. Если виртуальная ОС будет повреждена, вы сможете ее восстановить из снимка или вообще удалить – на хостовую, то есть основную рабочую систему, это не окажет никакого влияния.

Установка VirtualBox для Windows

Возможно, кому-то всё это может показаться сложным, но на самом деле в работе с Виртуалбокс нет ничего такого, с чем бы ни справился начинающий пользователь. Итак, как пользоваться VirtualBox? Как обычно, всё начинается с установки. Идем на сайт разработчика www.oracle.com/virtualization/virtualbox/index.html и скачиваем последнюю версию программы.

Скачивание VirtualBox

Установка VirtualBox на Windows 7/10 почти ничем не отличается от инсталляции большинства других программ, нужно просто следовать указаниям мастера и ничего не менять в его параметрах. По завершении процедуры вы получите готовую платформу виртуализации.

Установка VirtualBox фото 1

Установка VirtualBox фото 2

Установка VirtualBox фото 3

Интерфейс VirtualBox

Создание и базовая настройка виртуальной машины

Как и установка VirtualBox, создание и настройка виртуального компьютера не представляет особой сложности, программа автоматически выбирает наилучшую конфигурацию в зависимости от устанавливаемой операционной системы. Контроль со стороны пользователя, однако, не помешает.

Создадим для примера виртуальную машину для Windows 10 32-бит. Запускаем VirtualBox и жмем на панели инструментов кнопку «Создать». В открывшемся окошке даем машине имя (может быть произвольным), в выпадающих списках выбираем операционную систему и ее версию.

Создание новой виртуальной машины

На следующем этапе будет предложено указать объем выделяемой виртуальной машине оперативной памяти. Строгих правил относительно выделяемой ОЗУ не существует, для 32-битных Windows желательно резервировать не менее 1 Гб памяти, для 64-битных – не менее 1.8-2 Гб.

Выделение оперативной памяти

На третьем этапе создается виртуальный жесткий диск, здесь всё оставляем по умолчанию. Жмем «Создать», тип диска выбираем VDI или VHD.

Создание виртуального жесткого диска

Выбираем тип диска VDI

Что касается формата хранения, лучше выбрать «Динамический», так вы сэкономите время и место на физическом диске, потеряв, правда, немного в производительности.

Задаем формат хранения

Размер виртуального диска устанавливаем по желанию, но не меньше, чем указано в требованиях операционной системы. Жмем «Создать».

Задаем размер диска

Виртуальная машина создана и теперь можно быстро пробежаться по ее настройкам. Первым делом, однако, зайдите в настройки самой программы VirtualBox и на вкладке «Общие» измените путь к каталогу хранения виртуальных машин. Лучше всего выделить для них папку на диске D, где места больше всего.

Изменяем папку для машин

Теперь зайдите в настройки созданной ВМ и проверьте следующие параметры:

  • В разделе «Общие» на вкладке «Дополнительно» измените при необходимости путь к файлам снимков ВМ (желательно размещать в папке с основным файлом-контейнером ВМ). Здесь же вы можете включить общий буфер обмена для хостовой и виртуальной машин.
  • Если вы хотите установить систему в режиме EFI/GPT, в разделе «Система» обязательно поставьте галочку в чекбоксе «Включить EFI (только специальные ОС)».
  • Чтобы иметь возможность запускать на виртуальной машине 3D-приложения, в разделе «Дисплей» отметьте птичкой чекбокс «Включить 3D-ускорение».

Задаем папку для снимков

Включение EFI

Включение 3D-ускорения

Настройка сети Интернет и общих папок

Далее убедитесь, что в разделе «Сеть» у вас включен сетевой адаптер и тип подключения выбран «NAT».

Настройка сети

Если же вы планируете предоставить доступ к ВМ другим пользователям локальной физической сети, в настройках сети VirtualBox следует выбирать тип подключения «Сетевой мост». Для обеспечения взаимодействия между разными виртуальными машинами используется режим «Виртуальный адаптер хоста», для подключения гостевых ОС к единой внутренней сети – режим «Внутренняя сеть». Есть еще тип подключения «Универсальный драйвер», но он используется гораздо реже.

Особый интерес представляют собой общие папки в VirtualBox, благодаря которым пользователь может обмениваться между хостовой и виртуальной машинами любыми файлами. Подключить такой каталог можно в разделе «Общие папки». Для этого кликаем по плюсику напротив пункта «Папки машины», выбираем через обзор папку на жестком диске и подцепляем ее, не забыв установить птичку в чекбоксе «Авто-подключение».

Настройка общих папок

Запуск ВМ и установка операционной системы

Теперь вы знаете, как настроить VirtualBox и созданную ВМ. Далее посмотрим, как установить на нее операционную систему. Процедура установки ОС на Виртуалбокс практически ничем не отличается от ее установки на физический компьютер, разве что вместо загрузочной флешки или DVD-диска здесь используется установочный образ ISO. Запустите созданную виртуальную машину и укажите в открывшемся окошке путь к загрузочному ISO-образу с системой.

Установка операционной системы шаг 1

Начнется стандартная процедура установки, в ходе которой будет предложено принять лицензионное соглашение, произвести разбивку диска, а по завершении копирования системных файлов создать учетную запись пользователя.

Установка операционной системы шаг 2

Установка операционной системы шаг 3

Установка операционной системы шаг 4

Установка операционной системы шаг 5

Гостевая операционная система установлена, но некоторые функции, в частности, общие папки и буфер обмена, работать не будут, пока вы не установите специальный плагин – дополнения гостевой ОС. Кроме того, без этих дополнений вы не сможете настраивать разрешение экрана, подключать к виртуальной машине флешки и т.д. Скачивать, к счастью, ничего не нужно, дополнения гостевой ОС поставляются вместе с VirtualBox. Всё, что вам необходимо сделать, это выбрать в меню виртуальной операционной системы опцию Устройства – Подключить образ диска дополнений гостевой ОС.

Подключение образа диска дополнений гостевой ОС

Перейдите в раздел «Этот компьютер» в виртуальной ОС, откройте дисковод VirtualBox Guest Additions и, если система не предложит этого сделать сама, запустите исполняемый файл VBoxWindowsAdditions.exe.

Открываем VirtualBox Guest Additions

Запускаем VBoxWindowsAdditions.exe

Установите дополнения как обычную программу, приняв соглашение безопасности, и перезагрузите виртуальный компьютер.

Установка VirtualBox Guest Additions шаг 1

Установка VirtualBox Guest Additions шаг 2

Установка VirtualBox Guest Additions шаг 3

Перезагрузка ВМ

Гостевая система готова к использованию, осталось только проверить работу сети. Останавливаться подробно на том, как настроить интернет в VirtualBox мы не будем. Если вы выбрали NAT, ВМ подключится к интернету автоматически. С другими типами подключений, скорее всего, придется немного повозиться. Помните главное, если IP-адрес для вашего основного компьютера выдается роутером автоматически, те же самые настройки должны быть выставлены в параметрах сетевого адаптера виртуальной системы. Если настройки назначаются вручную, то и в параметрах сетевого адаптера гостевой системы они также должны быть назначены вручную.

Настройка сети ВМ

VirtualBox – стабильный и качественный программный продукт, и если пользователям приходится сталкиваться с проблемами в процессе его эксплуатации, то причинами последних чаще всего становятся ошибки самих пользователей. Так, с ошибкой «Не удалось открыть сессию для виртуальной машины» (код E_FAIL 0x80004005) придется столкнуться тем, кто попытается запустить виртуальные машины на VirtualBox при активном Hyper-V. Причина заключается в несовместимости этих платформ виртуализации. Если вы собрались пользоваться VirtualBox, будьте добры отключить Hyper-V и наоборот.

Ошибка 0x80004005

Отключение Hyper-V

Впрочем, к той же ошибке может привести отключенная функция виртуализации в BIOS. На это будет указывать недоступность опций аппаратной виртуализации в настройках виртуальных машин (VT-x/AMD-V и Nested Paging в разделе Система – Ускорение). Кстати, данные опции должны быть включены даже при активной виртуализации в BIOS, в противном случае ВМ также не запустится.

Включение виртуализации в БИОСе

Падение ВМ в BSOD при запуске – распространенная проблема, вызываемая нехваткой выделяемых гостевой операционной системе ресурсов физического компьютера. При создании виртуальной машины в VirtualBox нужно следить, чтобы выделяемые ресурсы соответствовали требованиям операционной системы.

Синий экран BSOD

Синий экран смерти также может быть вызван включенной в хостовой системе Hyper-V и несоответствием типов контроллера. Если раньше виртуальный диск был подключен к SATA, а затем вы подключили его к IDE, работа гостевой ОС завершится критической ошибкой с падением в BSOD. Решается вопрос созданием нового совместимого контроллера и подключением к нему файла-контейнера с гостевой системой.

К невозможности запуска ВМ может привести случайное удаление пользователем файлов снимков. Удалять снапшоты нужно правильно – через раздел «Снимки», в противном случае вам придется полностью переустанавливать гостевую систему. Если же у вас не запускается сам VirtualBox или при его запуске выдается ошибка «Cannot access the kernel driver!», скорее всего, программу придется удалить, а потом заново установить.

Андрей Хамлюк

Эксперт по ремонту и настройке ПК с более чем 5-летним опытом работы. Имеет профильное образование по специальности оператор ЭВМ.

Задать вопрос

VirtualBox — это средство, позволяющее создавать на ПК виртуальную машину со своей собственной операционной системой.

Виртуальные машины используются для тестирования ПО на разных платформах: Microsoft Windows, Linux, macOS. Без виртуализации разработчикам пришлось бы держать под рукой отдельную ЭВМ под каждую ОС.

Всем виртуальным машинам выделяется пространство на физическом диске. Их операционные системы называются гостевыми, а ОС физического ПК — хостовой.

VirtualBox распространяется бесплатно и устанавливается на компьютеры под управлением операционных систем Windows, macOS и Linux.

Создадим виртуальную машину, работающую на Debian — ОС на базе Linux, которая используется для работы на ПК и серверах.

Из этой статьи вы узнаете:

  • Как установить VirtualBox
  • Как создать виртуальную машину
  • Как её настроить
  • Как правильно её запустить

Запуск и настройка программы проста и не требует специальных знаний. Для скачивания переходим по ссылке. Это не самая последняя версия VirtualBox, но для удобства мы будем работать с ней.

На странице находится список дистрибутивов для загрузки на ПК под управлением разных ОС. Мы будем устанавливать программу на ПК под управлением Windows — следовательно, выбираем версию Windows hosts. Она первая в списке.

Скриншот: VirtualBox / Skillbox Media

Скачиваем её на свой ПК. По завершении процесса появляется приветствие:

Скриншот: Skillbox Media

Приступаем к установке VirtualBox. В процессе могут выплывать разные предупреждения. Игнорируем их и нажимаем Next. В финале нам откроется главный экран программы с приветствием на русском языке:

Скриншот: Skillbox Media

Вверху страницы нажимаем кнопку «Создать». В появившемся окне программа предлагает дать машине имя и выбрать ОС. По умолчанию задан VirtualBox под управлением Windows.

Скриншот: Skillbox Media

Назовём нашу виртуальную машину ВМ-1. Так как она будет управляться ОС на базе Linux, в выпадающем окне «Тип» выбираем Linux. Затем, в окне «Версия», — Debian (x64-bit).

Скриншот: Skillbox Media

Указываем объём памяти, который мы выделим нашей ВМ-1: оставляем заданный по умолчанию или вводим своё значение.

Объём памяти напрямую влияет на работу виртуальной машины. Лучше всего придерживаться простого правила: выделять не более половины RAM физического ПК. Также можно отталкиваться от рекомендации VirtualBox, которая отмечает зелёным фоном рекомендуемый объём памяти.

Скриншот: Skillbox Media

Создаём виртуальный жёсткий диск. По умолчанию программа предлагает новый диск с рекомендуемым объёмом. Принимаем параметры или задаём свои.

Скриншот: Skillbox Media

Выбираем тип файла жёсткого диска. По умолчанию VirtualBox предлагает VDI. Ок, соглашаемся. VHD и VMDK — это форматы, предназначенные для виртуальных машин на базе аналогов VirtualBox: VMWare и Virtual PC. Использование VHD и VMDK приведёт к снижению производительности нашей виртуальной машины.

Скриншот: Skillbox Media

Указываем формат хранения: динамический или фиксированный. Для большинства задач подходит динамический: его размер будет увеличиваться или уменьшаться в зависимости от содержимого. Для задач, где нужна максимальная производительность (например, обработка видео) подходит фиксированный формат.

Скриншот: Skillbox Media

Выбираем размер диска. В нашем случае это 16 ГБ. При желании в VirtualBox можно задать больший объём. Именуем новый диск так, как предлагает программа.

Скриншот: Skillbox Media

Мы создали виртуальную машину. На экране указаны её параметры: название, операционная система, оперативная и видеопамять.

Скриншот: Skillbox Media

Сейчас у нашей машины параметры, заданные по умолчанию. Если мы хотим их изменить, наводим мышку на виртуальную машину ВМ-1 слева на экране, кликаем по ней правой кнопкой и в выпадающем меню выбираем «Настроить».

Скриншот: Skillbox Media

Выбираем вкладку «Система», затем — «Процессор». Сразу в VirtualBox значения заданы по умолчанию, при желании меняем их на другие. Например, увеличиваем количество задействованных процессоров. Помните, что не стоит устанавливать значения за пределами рекомендуемой зелёной зоны. Как видно на скриншоте, это два ядра из имеющихся четырёх. Если установить больше, это негативно скажется на работе нашего ПК.

Скриншот: Skillbox Media

Во вкладке «Ускорение» настраиваем режим виртуализации и дополнительные параметры для ускорения работы. Они подбираются автоматически и зависят от выбранной гостевой ОС. Ничего не меняем, оставляем параметры по умолчанию.

Вариант «Минимальный» выбирают для гостевых систем macOS. «Hyper-V» — для Windows, а «KVM» — для Linux. Вариант «Отсутствует» выбираем, когда мы хотим скрыть от гостевой ОС, что она работает на виртуальной машине, а не на физическом ПК. «Совместимый» создан для поддержки виртуальных машин, созданных на устаревших версиях VirtualBox.

Функция «Включить PAE/NX» предназначена для поддержки 4 и более ГБ ОЗУ в 32-битных системах. Мы работаем в 64-битной системе, поэтому для нас это неактуально.

Из вкладки «Система» переходим во вкладку «Дисплей», чтобы установить параметры видеопамяти. Она определяет объём ресурсов, выделенный для виртуального графического адаптера гостевой ОС. Адаптер, в свою очередь, отвечает за обработку графических операций и вывод изображения на экран. Если выделенный объём ресурсов недостаточен, производительность может снизиться. У нашей виртуальной машины значение видеопамяти по умолчанию задано 16 МБ. Это немного, поэтому лучше сразу указать его максимальное рекомендуемое значение. В нашем случае это 128 МБ.

Скриншот: Skillbox Media

Для подключения к интернету VirtualBox по умолчанию использует сеть NAT. Этот вариант хорошо работает в большинстве ситуаций. Машине присваивается один и тот же IP-адрес, и она полагает, что находится в своей изолированной сети. Важно, что это будет работать, даже если ПК перемещается из одной сети в другую. Например, ноутбук меняет местоположение и подключения вместе со своим владельцем.

Если мы захотим создать связь между ВМ и ПК, выбираем и настраиваем тип подключения «Сетевой мост».

Когда нужна сеть из нескольких виртуальных машин, выбираем и настраиваем «Виртуальный адаптер хоста». Доступа к интернету не будет, но зато машины смогут взаимодействовать между собой. Подробно типы подключений рассматривать не будем — это тема отдельной статьи.

Ко всем настройкам всегда можно вернуться и изменить их согласно изменившимся задачам.

Пора установить в VirtualBox ОС. Скачиваем образ Debian 11.6 на флешку или прямо на ПК с официального сайта. Несмотря на предупреждение, контрольную сумму можно не проверять.

Скриншот: Debian / Skillbox Media

Нажимаем кнопку «Запустить» в интерфейсе VirtualBox.

Скриншот: Skillbox Media

Нажимаем на значок папки либо в выпадающем окне находим и выбираем папку с образом Debian и продолжаем.

Скриншот: Skillbox Media

Выбираем «Сетевой интерфейс» и ждём, пока произойдёт настройка сети. В процессе время от времени будут появляться всплывающие окна. Не вникая в их содержание, просто нажимаем «Далее» или «Продолжить».

После завершения настройки VirtualBox на экране появится меню со списком способов инсталляции. Выбираем первый — Graphical Install.

Скриншот: Skillbox Media

После инсталляции программа предлагает выбрать язык. Выбираем русский или оставляем предложенный английский.

Затем система предлагает выбрать местонахождение. Выбираем РФ или другую страну, в которой находимся.

Скриншот: Skillbox Media

Переходим к настройке клавиатуры. Первым делом устанавливаем язык клавиатуры — русский или другой на выбор из списка.

Скриншот: Skillbox Media

Затем выбираем способ переключения языков с русского на английский и обратно. По умолчанию стоит Alt + Shift.

Скриншот: Skillbox Media

После этого система самостоятельно загружает компоненты с установочного носителя и настраивает сеть.

Скриншот: Skillbox Media

Пора дать нашей машине имя, под которым она будет известна в сети. По умолчанию предлагается назвать её debian. Сохраняем имя или вводим свой вариант.

Скриншот: Skillbox Media

Затем система предлагает задать имя домена. Делать это необязательно, ведь мы устанавливаем ОС на виртуальную машину и домена у нас нет. Оставляем поле пустым.

Скриншот: Skillbox Media

Переходим к установке паролей. В Debian есть два типа пользователей:

  • Суперпользователь с правами администратора.
  • Пользователь.

Для нас разница между пользователями не важна, так как VirtualBox находится на нашем частном компьютере. Однако доступ лучше всё же разграничить, чтобы случайно ничего не сломать.

Задаём пароль суперпользователя.

Скриншот: Skillbox Media

Переходим к настройке учётных записей обычного пользователя. Сначала даём ему имя. У нас это First User, но можно придумать свой вариант.

Скриншот: Skillbox Media

Теперь придумываем имя пользователя, под которым он будет известен в системе, например user, а затем задаём для него пароль.

После установки паролей нам нужно выбрать время, которое будет отображаться при работе нашей машины. Устанавливаем свой часовой пояс.

Скриншот: Skillbox Media

Переходим к разметке дисков. Система предлагает несколько опций на выбор. Наша цель — потестировать виртуальную машину, поэтому выбираем первый вариант: «Авто — использовать весь диск».

Скриншот: Skillbox Media

Появляется предупреждение о стирании всех данных на диске. Подтверждаем.

Скриншот: Skillbox Media

Выбираем схему разметки. По умолчанию система рекомендует первый вариант — «Все файлы в одном разделе (рекомендуется новичкам)». Соглашаемся и продолжаем.

Скриншот: Skillbox Media

В появившемся окне ничего не меняем, только подтверждаем завершение разметки и запись изменений на диск.

Скриншот: Skillbox Media

В конце процедуры разметки в отдельном окне подтверждаем сохранение изменений на диске. Ставим «Да» и нажимаем «Продолжить».

Скриншот: Skillbox Media

Начинается установка базовой системы.

Скриншот: Skillbox Media

В процессе установки система может сообщить о найденной метке и предложить просканировать другой диск. Этого делать не надо — оставляем «Нет» и нажимаем «Продолжить».

Скриншот: Skillbox Media

По окончании установки система предлагает выбрать зеркало архива. Страну выбираем на своё усмотрение.

Скриншот: Skillbox Media

В списке зеркал архива оставляем предложенный по умолчанию deb.debian.org.

Если отказаться от выбора зеркала, будет загружена система с минимальными настройками. Она содержит только базовые компоненты и не имеет предустановленного графического интерфейса пользователя. Работа с такой системой требует хороших навыков администрирования и не подходит для новичков.

Скриншот: Skillbox Media

Система предлагает ввести информацию об HTTP-прокси. Оставляем поле пустым и продолжаем.

Скриншот: Skillbox Media

Система предлагает настроить менеджер пакетов. Нам это не нужно, поэтому просто идём дальше к установке базового пакета. По завершении установки система предложит отправлять разработчикам дистрибутива анонимные сообщения со статистикой используемых пакетов. Это ни на что не влияет, поэтому соглашаемся или отказываемся.

Скриншот: Skillbox Media

Переходим к выбору ПО. Система предлагает установить один из вариантов окружения рабочего стола. Мы установим GNOME. Он и KDE Plasma — два наиболее популярных варианта рабочего стола. У него минималистичный дизайн с фокусом на удобство использования. Интерфейс напоминает macOS.

KDE Plasma имеет более насыщенный интерфейс с различными панелями инструментов и меню. Интерфейс напоминает Windows.

Если есть желание разобраться, то можно установить на разные машины GNOME и KDE Plasma, сравнить и выбрать рабочий стол на свой вкус.

Мы установим GNOME, поэтому выбираем комбинацию, как на скриншоте, и продолжаем.

Скриншот: Skillbox Media

Установка в среднем занимает 10–15 минут.

Скриншот: Skillbox Media

По завершении установки ПО система предлагает установить загрузчик GRUB.

Выбираем «Да» и продолжаем.

Скриншот: Skillbox Media

Теперь нам надо выбирать устройство, куда мы установим наш загрузчик. Под устройством система подразумевает виртуальный диск с образом ОС Debian. У нас есть диск по умолчанию, его и выбираем.

Скриншот: Skillbox Media

По завершении установки загрузчика появляется экран с предложением извлечь установочные носители, чтобы загрузить систему. Нажимаем «Продолжить».

Скриншот: Skillbox Media

Установка завершена, и появляется экран с предложением запустить систему. Нажимаем «Продолжить».

Загрузка занимает 1–2 минуты, по её окончании появляется экран с именем нашего пользователя — First User. Наша виртуальная машина готова к работе.

Скриншот: Skillbox Media

Для входа используем пароль и логин, которые мы до этого установили.

Так выглядит интерфейс нашей виртуальной машины.

Скриншот: Skillbox Media

Поздравляем: мы установили виртуальную машину с операционной системой Debian.

Linux и его дистрибутивы: Debian, Ubuntu, Fedora и другие — поддерживают различные языки программирования, что делает их идеальной средой для использования в самых разных областях IT. Самый наглядный пример — операционная система Android, работающая на ядре Linux. Знание Linux необходимо в работе системных администраторов, сетевых инженеров и разработчиков.

Has anyone managed to install VirtualBox on Windows 7 64-bit ? While VirtualBox installs on Windows 7 32-bit, the installer eventually fails under Windows 7 64-bit — are there any tricks I need to be aware of?

I’m already running the installer as Administrator.

The installer stops at this point for about 3-4 minutes:

alt text

And eventually fails with:

alt text

Gaff's user avatar

Gaff

18.6k15 gold badges57 silver badges68 bronze badges

asked Sep 13, 2009 at 14:40

nos's user avatar

2

The latest version of Virtualbox, 3.0.6, is said to work on 64bit.
Generally, error 1603 involves account permissions on the target system, free disk space on the target system, or bad file download or locked/inaccessable file.

So question: While running the installer, did you do «Run as administrator»?

Note: Check the BIOS to ensure that your CPU supports VT-x and that it is enabled.

answered Sep 13, 2009 at 15:14

harrymc's user avatar

harrymcharrymc

459k31 gold badges533 silver badges935 bronze badges

7

I received weird error messages (like Files corrupted) also while installing Windows in VirtualBox.

If things are going really weird, lack of disk space is often the problem like harrymc already mentioned and in my case, that was exactly the problem.

I’ve moved my images onto another partition that had plenty of space and Windows just installed fine.

slhck's user avatar

slhck

224k71 gold badges607 silver badges594 bronze badges

answered Jun 14, 2010 at 17:18

rhalff's user avatar

You must log in to answer this question.

Not the answer you’re looking for? Browse other questions tagged

.

Время на прочтение
40 мин

Количество просмотров 35K

 Введение

Как известно большинству пользователей Windows-версии VirtualBox (далее — VB, не путать с Visual Basic), в релизе 4.3.14 разработчики этой программы добавили дополнительный механизм защиты, называемый «hardening» (что можно перевести как «упрочнение»), который привёл к многочисленным проблемам совместимости VB с антивирусами, драйверами крипто-модулей и даже отдельными обновлениями самой Windows, в результате чего виртуальные машины попросту отказываются запускаться. В лучшем случае пользователю приходится ждать около месяца, пока проблемная программа, о которой он сообщит разработчикам, окажется учтена в следующем релизе VB. В худшем случае придётся либо удалять конфликтующую программу (или системное обновление), либо откатывать VB до версии 4.3.12 — последней, в которой не было этой защиты. Многочисленные предложения к разработчикам о добавлении пользовательского списка исключений или опции, отключающей защиту целиком, остаются без внимания. Единственный внятный ответ с их стороны звучит так: «не хотите защиту — компилируйте из исходников сами». Что ж, придётся этим заняться.

Несмотря на то, что процедура сборки описана на официальной вики, она неполна и кое в чём устарела, а сама сборка так и норовит выдать странные ошибки. Поэтому когда я всё-таки пробился до конца сей процедуры, я решил, что её описание заслуживает отдельной статьи. Инструкция время от времени обновляется и на текущий момент адаптирована для VB версии 6.1.18, но если кого-то заинтересует сборка более ранних версий VB или библиотек, информацию можно выцарапать из истории правок.

 Содержание

» Постановка задачи
» Пара предупреждений
» Готовим окружение
» Особенности установки программ
» Последние штрихи
» Собираем VirtualBox
» Послесловие
» Дополнения

 Постановка задачи

Изначально я планировал упростить себе задачу и обойтись минимальной пересборкой, чтобы устанавливать официальный дистрибутив и просто подменять в нём бинарные файлы. Однако оказалось, что такой подход не сработает, поскольку не учитывает использование системных механизмов установки и регистрации драйверов и COM-компонентов. Можно было бы попытаться разобраться в деталях и написать автоматизирующий скрипт, но я решил замахнуться на более крупную дичь: самостоятельно собрать полноценный дистрибутив, максимально близкий к официальному и отличающийся от него только отсутствием hardening’а.

Сразу скажу, что на 100% задачу решить не удалось. Слабым звеном оказались гостевые дополнения, которые в официальном пакете собраны под Windows (32- и 64-битную), OS/2, Linux и некоторые другие *NIX-системы. В комментариях соответствующего Makefile указано, что сборка осуществляется удалённо на разных машинах, а настраивать такой комплект виртуалок мне не улыбалось. В итоге я решил собирать из исходных кодов всё, кроме дополнений, ISO-образ которых буду просто скачивать с сервера Oracle. Я пока не исследовал вопрос наличия hardening’а в дополнениях, но даже если он там есть, сообщений о вызванных им проблемах мне до сих пор не попадалось.

 Пара предупреждений

• Проблемы безопасности

Про hardening известно, что добавили его не просто так, а для закрытия некой уязвимости VB. Подробно рассказать о сути уязвимости Oracle категорически отказывается, несмотря на то, что в официальных дистрибутивах проблема исправлена много лет назад. В общих чертах речь идёт о том, что системный механизм внедрения библиотек в чужие процессы в случае VB может приводить к неавторизованному повышению привилегий на хостовой машине, и что для этой уязвимости VB есть реально использующиеся эксплойты. Если это вас не пугает, можете продолжать чтение, но я вас предупредил.

• Подписывание драйверов

Как известно, начиная с Vista, 64-битная Windows в обычном режиме запрещает загрузку драйверов, не подписанных сертификатом с цепочкой доверия, ведущей до корневого сертификата Microsoft (а в Windows 10 при загрузке с включённым Secure Boot драйверы и вовсе должны быть подписаны непосредственно самой Microsoft). Поэтому прежде чем компилировать VB даже для личного использования, необходимо продумать решение этой проблемы: либо купить сертификат, либо попробовать найти сервисы, предоставляющие услугу подписывания драйверов для разработчиков open source (если они, конечно, согласятся подписать заведомо уязвимый драйвер), либо перевести свою Windows в тестовый режим и использовать самоподписанный тестовый сертификат.

Далее я буду ориентироваться на этот последний вариант, но в нужных местах укажу, как поменяется процедура при наличии полноценного сертификата.

• Прекращение поддержки 32-битных хостовых систем

Начиная с версии 6.0 в VirtualBox была официально прекращена поддержка 32-битных хостов (к гостевым системам это не относится), однако сама возможность работы в этих системах ещё оставалась. В версии 6.1 сделан следующий шаг, и 32-битная версия пакета окончательно удалена из инсталлятора (за исключением библиотеки программного интерфейса). Я в своей сборке применил аналогичные модификации, а из статьи удалил все ставшие неактуальными инструкции. Если вам нужна поддержка таких систем, вы можете попробовать самостоятельно собрать 32-битный вариант, воспользовавшись предыдущими версиями статьи из репозитория. Но нужно понимать, что чем дальше, тем больше проблем будет возникать, и не все из них можно будет решить самостоятельно. Разумным выходом будет либо оставаться на предыдущих версиях VirtualBox, либо перейти на 64-битную систему.

 Готовим окружение

Официально в качестве сборочной системы рекомендуется Windows версии 8.1 или 10. Моя сборочная система построена на базе Windows 7 SP1 x64 ещё с тех времён, когда это была рекомендуемая версия, и проблем пока что не возникало. Если вы выделяете для сборки отдельную машину (реальную или виртуальную), имейте в виду, что ей необходим доступ в Интернет.

Для создания сборочного окружения потребуется немаленький набор программ. Если для программы присутствует портабельная версия, я использую её, а не инсталлятор.

Следующий набор программ поставляется только в виде инсталляторов (по крайней мере, официально). Для Visual Studio и SDK/WDK важно соблюдать порядок установки, как указано ниже. После установки крайне желательно установить обновления через Windows Update с включённой опцией поддержки всех продуктов Microsoft.

  • Visual Studio 2010 Professional
    Для полноценной сборки требуется именно 2010, причём не ниже Professional. В версии 2010 Express нет библиотеки ATL, необходимой для сборки COM API, через который работают фронт-энды. Я сделал несколько попыток перенести проект на VS 2013 или 2015 Community Edition, чтобы избавиться от необходимости платной лицензии (которую к тому же сейчас крайне проблематично купить), но, увы, безуспешно.
  • Windows SDK v7.1
  • Visual Studio 2010 SP1
  • Visual C++ 2010 SP1 Compiler Update for SDK 7.1
  • Windows Driver Development Kit (WDK) v7.1
  • Windows SDK v8.1
  • ActivePerl
  • ActivePython 2.7
  • Cygwin

Остальные программы скачиваются в виде архивов или исходных кодов:

  • Qt 5.6.3 (исходные коды)
  • MinGW-w64 4.5.4 x86_64
  • SDL v1.2.x (development-пакет для Visual C++)
  • cURL (исходные коды)
  • OpenSSL 1.1.1 (исходные коды)
  • gSOAP 2.8.x (рекомендуется 2.8.41 или выше)
  • libvpx 1.7.0 (исходные коды; более новые версии не поддерживают VS 2010)
  • libopus 1.3.1 (исходные коды)
  • MiKTeX Portable
  • NASM
    Рекомендую 64-битную портативную версию.
  • WiX
    Рекомендую портативный набор (архив с именем вида wix311-binaries.zip).

Также потребуются два архива:

  • DocBook XML DTD 4.5
  • DocBook XSL Stylesheets 1.69.1

Зачем оно всё?

Если вы не планируете собирать такой же пакет, как я, то некоторые из перечисленных инструментов могут вам не потребоваться. Здесь я вкратце перечислю, какую роль они выполняют.

  • SDK 8.1
    Для сборки будет использоваться SDK версии 7.1, версия 8.1 требуется только для утилиты SignTool: в 7.1 отсутствует поддержка двойного подписывания SHA-1/SHA-256. Если у вас есть компьютер с установленным SDK версии 8.1 или более поздней, можно просто скопировать утилиту signtool.exe оттуда (со всеми зависимостями) и указать соответствующий путь в файле LocalConfig.kmk (см. ниже).
  • WiX
    Это инструмент для создания MSI-инсталляторов. Хоть финальный вариант инсталлятора и является EXE-файлом, внутри он содержит MSI, так что WiX тут необходим. Если вам достаточно простой компиляции бинарников, то этот пакет не понадобится.
  • SDL
    На этой библиотеке основан фронт-энд VBoxSDL.exe — минималистичная альтернатива стандартной оболочке VirtualBoxVM.exe. Если вам не требуется VBoxSDL, то, может быть, удастся обойтись без библиотеки SDL, но я это не проверял.
  • gSOAP
    Этот компонент необходим для сборки сервиса удалённого управления VB: VBoxWebSrv.exe. Отсутствие gSOAP не является критической ошибкой, VB успешно соберётся без этого сервиса.
  • libvpx, libopus
    Видео- и аудиокодек, использующиеся для записи видео с экрана виртуальной машины. При их отсутствии VirtualBox собирается и работает корректно, а функция записи просто игнорируется (хотя и показывает анимацию, будто запись выполняется).
  • Cygwin
    Требуется для сборки libvpx.
  • MiKTeX
    При помощи MiKTeX компилируется справочник в формате PDF (doc\UserManual.pdf). Отсутствие MiKTeX не является критической ошибкой, VB успешно соберётся без PDF-документации.
  • NASM
    Этот ассемблер будет использоваться для сборки OpenSSL. Поддерживается и сборка без внешнего ассемблера, но с ним будет создан более оптимальный код.

Чтобы легче было отслеживать потенциальные источники проблем сборки, привожу здесь сводную таблицу всех инструментов с их версиями и путями установки в созданном мной окружении. Обозначение «{x32|x64}» указывает, что пакет устанавливается в два разных каталога для 32- и 64-битной версии.

 Особенности установки программ

В этом разделе я привожу указания или инструкции для отдельных пакетов, где процедура неочевидна или требует дополнительных шагов.

• Windows SDK v7.1

При установке могут возникнуть проблемы из-за устаревших версий компиляторов и рантайма: они не могут установиться поверх более новых версий, установленных с VS 2010, и инсталлятор считает это критической ошибкой. Необходимо либо отключить соответствующие галочки, либо предварительно удалить из системы пакеты с именами вида «Microsoft Visual C++ 2010 <arch> Redistributable», «Microsoft Visual C++ 2010 <arch> Runtime», «Microsoft Visual C++ Compilers…» (SDK установит старые версии пакетов, а Windows Update потом обновит их до актуальных).

Также обратите внимание, что для финальной сборки MSI-пакетов потребуется установить примеры программ (Windows Native Code Development -> Samples): в их составе идут скрипты, использующиеся сборочными правилами.

• Windows SDK v8.1

Достаточно установить только средства разработки (Windows Software Development Kit).

• WDK v7.1

Достаточно установить только сборочные окружения (Build Environments).

• Qt 5.6.3

Начиная с версии Qt 5.7.0 прекращена поддержка сборки в MSVC версий ниже 2012, поэтому используем 5.6.x.
Для Visual Studio 2010 официальные сборки отсутствуют, поэтому необходимо сначала собрать библиотеку из исходных кодов.

  1. Распаковываем архив с исходным кодом Qt в каталог C:\Programs\Qt\ и переименовываем полученный подкаталог qt-everywhere-opensource-src-5.6.3 в 5.6.3-src.
  2. Рядом создаём каталог build-x64, в котором будет происходить сборка.
  3. Открываем консоль, выполняем следующие команды для подготовки окружения:
    md C:\Programs\Qt\build-x64
    cd /d C:\Programs\Qt\build-x64
    SET QTVER=5.6.3
    "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7
    COLOR 07
    SET QTDIR=C:\Programs\Qt\%QTVER%-x64
    SET PATH=%QTDIR%\bin;%PATH%
    SET QMAKESPEC=win32-msvc2010

    Команда color отключает зелёный цвет шрифта, устанавливаемый скриптом SetEnv.Cmd.

  4. Теперь запускаем configure.bat из каталога 5.6.3-src. Поскольку бо́льшая часть Qt в VB не используется, можно сильно ускорить сборку, отключив ненужные компоненты, но необходимо учитывать, что к некоторым опциям VB относится очень щепетильно. В частности, я наткнулся на следующее:
    • OpenGL ES 2 не поддерживается (компиляция VB не может увидеть некоторые заголовочные файлы).
    • Поддержка FreeType должна быть включена (без неё не соберётся плагин qoffscreen, использующийся в VB).

    Вот итоговая команда, которую я использовал у себя:

    ..\5.6.3-src\configure.bat -prefix c:\Programs\Qt\5.6.3-x64 -mp -opensource -confirm-license -nomake tests -nomake examples -no-compile-examples -release -shared -pch -no-ltcg -accessibility -no-sql-sqlite -opengl desktop -no-openvg -no-nis -no-iconv -no-evdev -no-mtdev -no-inotify -no-eventfd -largefile -no-system-proxies -qt-zlib -qt-pcre -no-icu -qt-libpng -qt-libjpeg -qt-freetype -no-fontconfig -qt-harfbuzz -no-angle -incredibuild-xge -no-plugin-manifests -qmake -qreal double -rtti -strip -no-ssl -no-openssl -no-libproxy -no-dbus -no-audio-backend -no-wmf-backend -no-qml-debug -no-direct2d -directwrite -no-style-fusion -native-gestures -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdeclarative -skip qtdoc -skip qtenginio -skip qtgraphicaleffects -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtquickcontrols -skip qtquickcontrols2 -skip qtscript -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns
  5. Указанный каталог установки (опция -prefix) Qt записывает внутрь генерируемых промежуточных файлов исходного кода при конфигурировании, так что собранная библиотека будет помнить этот путь. Это приводит к тому, что при запуске Qt-приложение по умолчанию будет искать плагины по этому пути, и только если ничего не нашлось, обратится к собственному каталогу. В большинстве ситуаций это работает корректно, но если вдруг на целевой машине в каталоге c:\Programs\Qt\5.6.3-x64 окажется отличающаяся сборка Qt (с другими флагами), то VB при запуске свалится с ошибкой.
    Избежать этого можно двумя путями: либо добавить в каталог VB файл qt.conf с содержимым:

    [Paths]
    Plugins=.

    либо подправить сохранённый в Qt путь установки, чтобы он по умолчанию указывал на каталог программы. Я пошёл по второму пути, чтобы итоговая установка VB выглядела более аккуратной. Для этого нужно открыть файл C:\Programs\Qt\build-x64\qtbase\src\corelib\global\qconfig.cpp, который создался конфигуратором, найти там строчку вида:

    static const char qt_configure_prefix_path_str       [512 + 12] = "qt_prfxpath=c:/Programs/Qt/5.6.3-x64";

    и заменить там весь путь на точку, чтобы получилось следующее:

    static const char qt_configure_prefix_path_str       [512 + 12] = "qt_prfxpath=.";

    Установка Qt при этом по-прежнему будет выполнена в указанный ранее каталог, потому что он уже сохранён в Makefile-ах. Это изменение затронет только поведение Qt-программ при их запуске.

  6. Далее запускаем сборку командой nmake
  7. Устанавливаем скомпилированную библиотеку командой nmake install

После завершения установки каталоги build-x64 и 5.6.3-src можно удалять.

• MinGW

Архив просто распаковывается в выбранный каталог установки.

• Cygwin

При установке необходимо отметить пакеты make и yasm.

• SDL
  1. Распаковываем SDL в каталог C:\Programs\SDL\x64\.
  2. Перемещаем всё содержимое C:\Programs\SDL\x64\lib\x64\ на уровень выше (в C:\Programs\SDL\x64\lib\), каталоги C:\Programs\SDL\x64\lib\x86 и x64 удаляем.

• NASM

Распаковываем архив nasm-2.14.02-win64.zip в C:\Programs\, переименовываем полученный каталог nasm-2.14.02 в nasm.

• OpenSSL
  1. Для этой библиотеки нам по-прежнему нужны сборки под 32- и 64-битную архитектуру. Распаковываем архив OpenSSL два раза в каталог C:\Programs\OpenSSL\, переименовывая полученный подкаталог из openssl-1.1.1i, соответственно, в openssl-1.1.1i-x32 и openssl-1.1.1i-x64.
  2. Открываем консоль, собираем и устанавливаем 32-битную версию:
    "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x86 /win7
    COLOR 07
    set PATH=%PATH%;C:\Programs\nasm
    cd /d C:\Programs\OpenSSL\openssl-1.1.1i-x32\
    perl Configure VC-WIN32 no-shared --prefix=C:\Programs\OpenSSL\x32 --openssldir=C:\Programs\OpenSSL\x32\ssl
    nmake
    nmake test
    nmake install

    Конфигуратор может выдать страшное сообщение, что, дескать, не может найти компилятор. Не обращайте внимания, это он слегка не в себе.
    Если вы не хотите использовать NASM, исключите отсюда модификацию переменной PATH и добавьте к вызову Configure параметр no-asm.

  3. Открываем новую консоль, собираем и устанавливаем 64-битную версию:
    "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7
    COLOR 07
    set PATH=%PATH%;C:\Programs\nasm
    cd /d C:\Programs\OpenSSL\openssl-1.1.1i-x64\
    perl Configure VC-WIN64A no-shared --prefix=C:\Programs\OpenSSL\x64 --openssldir=C:\Programs\OpenSSL\x64\ssl
    nmake
    nmake test
    nmake install

    Отказ от NASM делается аналогично 32-битной версии.

  4. Каталоги C:\Programs\OpenSSL\openssl-1.1.1i-x32 и openssl-1.1.1i-x64 можно удалять.

• cURL
  1. Как и с OpenSSL, здесь нам потребуется не только 64-битный, но и 32-битный вариант. Распаковываем архив cURL в каталог C:\Programs\curl\, переименовываем получившийся подкаталог из curl-7.74.0 в curl-7.74.0-x32.
  2. Открываем в редакторе файл C:\Programs\curl\curl-7.74.0-x32\winbuild\MakefileBuild.vc, находим там в районе строк 61–69 условный блок вида:
    !IF "$(VC)"=="6"
    CC_NODEBUG  = $(CC) /O2 /DNDEBUG
    CC_DEBUG    = $(CC) /Od /Gm /Zi /D_DEBUG /GZ
    CFLAGS      = /I. /I../lib /I../include /nologo /W4 /wd4127 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL
    !ELSE
    CC_NODEBUG  = $(CC) /O2 /DNDEBUG
    CC_DEBUG    = $(CC) /Od /D_DEBUG /RTC1 /Z7 /LDd
    CFLAGS      = /I. /I ../lib /I../include /nologo /W4 /wd4127 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL
    !ENDIF

    и добавляем после него строчку:

    CFLAGS      = $(CFLAGS) /DCURL_DISABLE_LDAP

    Если этого не сделать, то при сборке VB полезут ошибки линковки.

  3. Открываем файл C:\Programs\curl\curl-7.74.0-x32\winbuild\gen_resp_file.bat, после первой строчки в нём (@echo OFF) вставляем команду:
    cd .

    Это фиктивная команда, которая ничего не делает, и задача её лишь в том, чтобы сбросить код ERRORLEVEL. В противном случае может возникнуть ситуация, когда этот код оказывается ненулевым ещё до запуска батника, а сам батник не выполняет ни одной команды, меняющей код возврата. В результате nmake считает, что батник вернул ошибку, и прерывает сборку.

  4. Делаем копию каталога curl-7.74.0-x32 под именем curl-7.74.0-x64.
  5. Открываем консоль, собираем 32-битную версию и копируем необходимые файлы в целевой каталог:
    "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x86 /win7
    COLOR 07
    cd /d C:\Programs\curl\curl-7.74.0-x32\winbuild
    md C:\Programs\curl\x32
    nmake /f Makefile.vc mode=static WITH_SSL=static DEBUG=no MACHINE=x86 SSL_PATH=C:\Programs\OpenSSL\x32 ENABLE_SSPI=no ENABLE_WINSSL=no ENABLE_IDN=no
    copy ..\builds\libcurl-vc-x86-release-static-ssl-static-ipv6\lib\libcurl_a.lib ..\..\x32\libcurl.lib
    xcopy /E ..\builds\libcurl-vc-x86-release-static-ssl-static-ipv6\include\curl ..\..\x32\include\curl\
  6. Собираем 64-битную версию, открыв новую консоль и выполнив команды:
    "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7
    COLOR 07
    cd /d C:\Programs\curl\curl-7.74.0-x64\winbuild
    md C:\Programs\curl\x64
    nmake /f Makefile.vc mode=static WITH_SSL=static DEBUG=no MACHINE=x64 SSL_PATH=C:\Programs\OpenSSL\x64 ENABLE_SSPI=no ENABLE_WINSSL=no ENABLE_IDN=no
    copy ..\builds\libcurl-vc-x64-release-static-ssl-static-ipv6\lib\libcurl_a.lib ..\..\x64\libcurl.lib
    xcopy /E ..\builds\libcurl-vc-x64-release-static-ssl-static-ipv6\include\curl ..\..\x64\include\curl\
    copy ..\builds\libcurl-vc-x64-release-static-ssl-static-ipv6\bin\curl.exe ..\..\x64\curl.exe

    Обратите внимание, что, в отличие от 32-битной версии, здесь мы копируем ещё и curl.exe, он нам потом понадобится для скачивания образа гостевых дополнений.

  7. Каталоги C:\Programs\curl\curl-7.74.0-x32 и curl-7.74.0-x64 можно удалять.

• libvpx
  1. Распаковываем архив libvpx в каталог C:\Programs\libvpx-build\.
  2. Запускаем Cygwin, в нём будем выполнять конфигурирование, сборку и установку библиотеки. В качестве целевой платформы будет указана Visual Studio 2010. При этом сборочная система попытается автоматически запустить сборку, но будет делать это с использованием msbuild.exe, который мне не удалось заставить работать корректно в имеющемся окружении. Вместо этого оказалось проще запустить отдельным шагом сборку самой Студией, благо она позволяет работать из командной строки. Впрочем, можно этот шаг выполнить и при помощи графической среды, если кому-то она привычнее, но в этом случае вам придётся к переменной PATH добавить путь C:\Programs\cygwin64\bin (или как-то иначе задать его в проекте), потому что там располагается ассемблер yasm.exe, необходимый для сборки. Итак, в терминале Cygwin выполняем следующие команды:
    mkdir -p /cygdrive/c/Programs/libvpx-build/build64
    cd /cygdrive/c/Programs/libvpx-build/build64
    ../libvpx-1.7.0/configure --target=x86_64-win64-vs10 --disable-install-bins --disable-examples --disable-tools --disable-docs --prefix=../../libvpx
    make
    "/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 10.0/Common7/IDE/devenv.com" vpx.sln /Project vpx.vcxproj /Rebuild "Release|x64"
    make install
  3. Закрываем терминал Cygwin, больше он нам не понадобится. Каталог C:\Programs\libvpx-build можно удалять.

• libopus
  1. Распаковываем архив opus в каталог C:\Programs\libopus-build\, переходим в подкаталог opus-1.3.1\win32\VS2015.
  2. Проект рассчитан на более новую версию Visual Studio, и в 2010-й просто так не соберётся, надо внести немножко правок. Можно это сделать как через IDE, так в обычном текстовом редакторе. Я предпочёл второй путь. Итак, открываем в редакторе файл opus.vcxproj (остальные проекты нам не нужны) и проделываем следующие манипуляции:
    1. Находим все строки с текстом
      <PlatformToolset>v140</PlatformToolset>

      и меняем версию с v140 на v100. Если вы работаете в IDE, то эта опция в настройках проекта располагается на странице Configuration Properties -> General и называется «Platrofm Toolset». Не забудьте выбрать конфигурации и архитектуры в выпадающих списках в верхней части диалога.

    2. Далее находим блок:
        <ItemDefinitionGroup>
          <ClCompile>

      и добавляем туда тег:

            <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>

      В настройках проекта Visual Studio это делается на странице Configuration Properties -> C/C++ -> General выставлением опции «Debug Information Format» в «ProgramDatabase (/Zi)». Собственно говоря, подойдёт и любое другое валидное значение из списка, база отладочной информации нас не интересует, просто при невалидном значении проект отказывается собираться.

  3. Теперь собираем Release-конфигурацию для обеих архитектур (из оболочки VS или из командной строки) и копируем собранную библиотеку opus.lib и подкаталог include\ в целевой каталог установки:
    cd /d C:\Programs\libopus-build\opus-1.3.1\win32\VS2015
    md C:\Programs\libopus\lib\x64
    xcopy /E C:\Programs\libopus-build\opus-1.3.1\include C:\Programs\libopus\include\
    
    "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.com" opus.sln /Project opus.vcxproj /Rebuild "Release|x64"
    copy x64\Release\opus.lib C:\Programs\libopus\lib\x64\
  4. Каталог C:\Programs\libopus-build можно удалять.

• gSOAP

Открываем архив, заходим в подкаталог gsoap-2.8\gsoap и распаковываем содержимое этого подкаталога в C:\Programs\gSOAP\. Для корректной сборки с OpenSSL 1.1.x требуется версия 2.8.41 или выше. Для более ранних версий потребуется наложить специальный патч (автор: Mattias Ellert). Можно это сделать вручную (формат достаточно очевидный: открываем поочерёдно указанные файлы, удаляем строчки, отмеченные минусами, и добавляем отмеченные плюсами; остальные строки помогают определить контекст), а можно взять стандартную утилиту patch, портированную для Windows, и натравить её.

• MiKTeX
  1. Распаковываем архив в C:\Programs\MiKTeX\.
  2. Открываем консоль и запускаем установку дополнительных модулей:
    "C:\Programs\MiKTeX\texmfs\install\miktex\bin\mpm.exe" --verbose --install=koma-script --install=ucs --install=tabulary --install=url --install=fancybox --install=fancyvrb --install=bera --install=charter --install=mptopdf

• DocBook

Для распаковки архива XML DTD нужно создать отдельный каталог и поместить туда все файлы. Архив с XSL Stylesheets уже содержит нужный подкаталог, поэтому достаточно его просто распаковать и переименовать полученный подкаталог.

 Последние штрихи

Подготовка к сборке почти завершена, остались несколько шагов. Если вы этого ещё не сделали, нужно скачать архив с исходными кодами VirtualBox нужной версии и распаковать его в удобное место. В качестве рабочего каталога я выбрал C:\Devel\; в него я распаковал архив исходных кодов и переименовал полученный каталог в VirtualBox-src.

• Добавление сертификатов

Если у вас нет полноценного сертификата, то рекомендуется создать хотя бы персональный (с ним проще загружать драйверы, чем совсем без подписи). Для этого нужно открыть консоль с повышенными привилегиями и выполнить в ней следующие команды, которые создадут и добавят в личное хранилище два сертификата (SHA-1 и SHA-256):

"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7
COLOR 07
makecert.exe -a sha1 -r -pe -ss my -n "CN=Roga and Kopyta Ltd" C:\Devel\testcert_1.cer
makecert.exe -a sha256 -r -pe -ss my -n "CN=Roga and Kopyta Ltd" C:\Devel\testcert_256.cer
certmgr.exe -add C:\Devel\testcert_1.cer -s -r localMachine root
certmgr.exe -add C:\Devel\testcert_256.cer -s -r localMachine root

Имя для сертификатов («Roga and Kopyta Ltd») и путь к файлам можно выбирать по своему усмотрению. Также нам потребуются цифровые отпечатки сгенерированных сертификатов. Откройте консоль управления сертификатами (запустите certmgr.msc), откройте там список персональных сертификатов. Дважды щёлкните на первом из сертификатов «Roga and Kopyta Ltd», в открывшемся диалоге перейдите на вкладку Состав. В поле «Алгоритм подписи» будет указано sha256RSA или sha1RSA. Далее, в самом конце списка будет поле «Отпечаток» со значением в виде последовательности шестнадцатеричных чисел. Скопируйте это значение куда-нибудь. То же самое повторите для второго из сертификатов. Не забудьте отметить, какой из них был SHA-256, а какой — SHA-1.

• Сборка xmllint

На одном из этапов потребуется также программа xmllint. Я не указывал её в списке требований, потому что необходимые исходники уже присутствуют в архиве VB. Сборочные правила не рассчитаны на автоматическую сборку этой утилиты, поэтому придётся сделать это самостоятельно. В качестве целевого каталога я выбрал C:\Programs\xmllint.

  1. Копируем каталог C:\Devel\VirtualBox-src\src\libs\libxml2-2.9.4 в C:\Programs\ (это необходимо, чтобы промежуточные объектные файлы не мешали сборке самого VB).
  2. Открываем консоль и выполняем команды:
    "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7
    COLOR 07
    cd /d C:\Programs\libxml2-2.9.4\win32
    cscript.exe configure.js cruntime=/MT prefix=C:\Programs\xmllint iconv=no
    nmake /f Makefile.msvc
    nmake /f Makefile.msvc install
  3. Удаляем каталог C:\Programs\libxml2-2.9.4.

• Различные правки VB

Прежде чем приступать к сборке, нам ещё потребуется внести кое-какие правки в исходные коды самого VirtualBox. Полный набор всех изменений выложен мной в виде отдельного патча, который можно просто наложить целиком на дерево VB (вручную или используя утилиту patch, которую потребуется скачать отдельно):

» vbox_build.patch

Если всё наложилось корректно, то можно переходить к следующему пункту. Если же что-то не состыковалось и требуется разобраться с конкретным изменением, или просто вас интересуют подробности, какие именно правки были внесены и зачем, читайте далее. Имейте в виду, что описания здесь могут идти в не в том порядке, как в патче. Пути к файлам указаны относительно каталога с исходниками VB, C:\Devel\VirtualBox-src.

  1. Файл configure.vbs:
    • Строка кода:
      if Shell(DosSlashes(strPathVC & "/bin/cl.exe"), True) <> 0 then

      заменяется на:

      if Shell(DosSlashes(strPathVC & "/bin/cl.exe") & " /?", True) <> 0 then

      Этот код отвечает за поиск и проверку компилятора, но не учитывает, что вызов cl.exe без аргументов возвращает ошибку (что трактуется как неподходящий компилятор). Добавление параметра «/?» запрашивает вывод справки, и код возврата перестаёт быть ошибочным.

    • Теперь переходим к функции CheckForCurlSub и находим в ней следующий код:
         if   LogFileExists(strPathCurl, "include/curl/curl.h") _
          And LogFindFile(strPathCurl, "libcurl.dll") <> "" _
          And LogFindFile(strPathCurl, "libcurl.lib") <> "" _

      Этот код выполняет поиск и проверку пути к libcurl, но он рассчитан только на использование динамически линкуемой версии библиотеки и, если не находит соответствующий DLL-файл, ругается некультурными словами. Поскольку мы собираем со статической версией, эту проверку надо поправить, удалив строчку с libcurl.dll, чтобы получилось:

         if   LogFileExists(strPathCurl, "include/curl/curl.h") _
          And LogFindFile(strPathCurl, "libcurl.lib") <> "" _
    • Следующая функция — CheckForPython, там есть генерация переменной VBOX_BLD_PYTHON:
            CfgPrint "VBOX_BLD_PYTHON       := " & strPathPython & "\python.exe"

      Здесь нужно обратный слэш перед python.exe заменить на прямой: "/python.exe" (иначе некоторые проверки падают; вроде бы, для сборки это некритично, но выглядит неаккуратно).

    • В Windows-версии конфигуратор не поддерживает libvpx и libopus, я добавляю их поддержку самостоятельно. Можно было, конечно, просто прохардкодить пути установки библиотек, но я предпочёл, чтобы конфигуратор проверял корректность установки и принимал путь через аргументы командной строки, как уже сделано для остальных компонентов. Поэтому я реализовал две проверочные функции, выглядящие следующим образом:
      ''
      ' Checks for libvpx
      sub CheckForVpx(strOptVpx)
         dim strPathVpx, str
         strVpx = "libvpx"
         PrintHdr strVpx
      
         if strOptVpx = "" then
            MsgError "Invalid path specified!"
            exit sub
         end if
      
         if g_strTargetArch = "amd64" then
            strVsBuildArch = "x64"
         else
            strVsBuildArch = "Win32"
         end if
         strLibPathVpx = "lib/" & strVsBuildArch & "/vpxmd.lib"
      
         strPathVpx = ""
         if   LogFileExists(strOptVpx, "include/vpx/vpx_encoder.h") _
          And LogFileExists(strOptVpx, strLibPathVpx) _
            then
               strPathVpx = UnixSlashes(PathAbs(strOptVpx))
               CfgPrint "SDK_VBOX_VPX_INCS := " & strPathVpx & "/include"
               CfgPrint "SDK_VBOX_VPX_LIBS := " & strPathVpx & "/" & strLibPathVpx
            else
               MsgError "Can't locate " & strVpx & ". " _
                      & "Please consult the configure.log and the build requirements."
               exit sub
            end if
      
         PrintResult strVpx, strPathVpx
      end sub
      
      
      
      ''
      ' Checks for libopus
      sub CheckForOpus(strOptOpus)
         dim strPathOpus, str
         strOpus = "libopus"
         PrintHdr strOpus
      
         if strOptOpus = "" then
            MsgError "Invalid path specified!"
            exit sub
         end if
      
         if g_strTargetArch = "amd64" then
            strVsBuildArch = "x64"
         else
            strVsBuildArch = "Win32"
         end if
         strLibPathOpus = "lib/" & strVsBuildArch & "/opus.lib"
      
         strPathOpus = ""
         if   LogFileExists(strOptOpus, "include/opus.h") _
          And LogFileExists(strOptOpus, strLibPathOpus) _
            then
               strPathOpus = UnixSlashes(PathAbs(strOptOpus))
               CfgPrint "SDK_VBOX_OPUS_INCS := " & strPathOpus & "/include"
               CfgPrint "SDK_VBOX_OPUS_LIBS := " & strPathOpus & "/" & strLibPathOpus
            else
               MsgError "Can't locate " & strOpus & ". " _
                      & "Please consult the configure.log and the build requirements."
               exit sub
            end if
      
         PrintResult strOpus, strPathOpus
      end sub

      Далее в функции usage, где печатается справка по аргументам, приписывается вывод двух свежедобавленных:

         Print "  --with-libvpx=PATH    "
         Print "  --with-libopus=PATH   "

      В начале функции Main находятся переменные, хранящие всевозможные пути к программам и библиотекам — там создаются две новых переменных:

         strOptVpx = ""
         strOptOpus = ""

      Ниже идёт блок select-case с обработкой параметров командной строки, здесь добавляется код для двух новых аргументов:

               case "--with-libvpx"
                  strOptVpx = strPath
               case "--with-libopus"
                  strOptOpus = strPath

      И наконец, практически в конце файла идёт цепочка вызовов всех проверочных функций, отвечающих за разные компоненты, и туда вписываются вызовы наших новых обработчиков:

         CheckForVpx strOptVpx
         CheckForOpus strOptOpus
  2. Следующий файл — src\VBox\Runtime\Makefile.kmk. Находим там определения переменных VBoxRT_LIBS.win и VBoxRT-x86_LIBS.win и добавляем к ним crypt32.lib и bcrypt.lib. А именно, код:
    VBoxRT_LIBS.win                = \
    	$(PATH_SDK_$(VBOX_WINDDK)_LIB)/vccomsup.lib \
    	$(PATH_SDK_$(VBOX_WINDDK)_LIB)/wbemuuid.lib \
    	$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib

    заменяется на:

    VBoxRT_LIBS.win                = \
    	$(PATH_SDK_$(VBOX_WINDDK)_LIB)/vccomsup.lib \
    	$(PATH_SDK_$(VBOX_WINDDK)_LIB)/wbemuuid.lib \
    	$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib \
    	$(PATH_SDK_$(VBOX_WINPSDK)_LIB)/crypt32.lib \
    	$(PATH_SDK_$(VBOX_WINPSDK)_LIB)/bcrypt.lib

    (не пропустите обратный слэш после delayimp.lib!); и аналогично:

    VBoxRT-x86_LIBS.win                = \
    	$(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/vccomsup.lib \
    	$(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/wbemuuid.lib \
    	$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/delayimp.lib

    заменяется на:

    VBoxRT-x86_LIBS.win                = \
    	$(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/vccomsup.lib \
    	$(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/wbemuuid.lib \
    	$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/delayimp.lib \
    	$(PATH_SDK_$(VBOX_WINPSDK)_LIB.x86)/crypt32.lib \
    	$(PATH_SDK_$(VBOX_WINPSDK)_LIB.x86)/bcrypt.lib

    Это требуется для успешной линковки библиотеки VBoxRT.dll. Я не до конца разобрался в этой особенности: в дистрибутиве Oracle нет зависимости от библиотеки crypt32.dll, она там загружается динамически во время выполнения, поэтому, теоретически, LIB-файл добавлять не нужно. Однако если этого не сделать, линковщик не может найти некоторые функции и отказывается собирать библиотеку. Предполагаю, что это как-то связано с опциями сборки OpenSSL, но детально не разбирался, проще было добавить эту библиотеку в список. А зависимость от bcrypt.dll появилась при переходе на OpenSSL 1.1.1.

  3. Если вы используете gSOAP версии 2.8.79 или выше, то требуется подправить файл src\VBox\Runtime\r3\win\VBoxRT-openssl-1.1plus.def, добавив куда-нибудь в общий список следующий набор строк:
        OpenSSL_version_num
        DH_generate_parameters_ex
        DH_new
        ASN1_STRING_get0_data

    Этот список определяет набор функций, экспортируемых библиотекой VBoxRT.dll, включающей в себя OpenSSL. При линковке утилиты VBoxWebSrv.exe, в зависимости от используемой версии gSOAP, имеющихся экспортов может оказаться недостаточно, и тогда линковщик дополнительно подключает OpenSSL и тут же начинает материться из-за того, что эта внешняя OpenSSL начинает драться со своей копией, внедрённой внутрь VBoxRT. Добавление отсутствующих экспортов устраняет эту проблему.

  4. Как я упомянул в начале статьи, сборку гостевых дополнений я пропускаю, но их ISO-образ в составе дистрибутива должен присутствовать. Сборочные файлы VB на такую конструкцию в целом рассчитаны, но они ожидают, что сам ISO-файл магическим образом появится в нужном месте в нужное время. У меня эта магия реализована в файле src\VBox\Makefile.kmk. Находим там блок кода вида:
      ifdef VBOX_WITH_ADDITIONS
       include $(PATH_SUB_CURRENT)/Additions/Makefile.kmk
      endif

    и после него добавляем определение сборочного правила для загрузки образа:

     ifndef VBOX_WITHOUT_ADDITIONS_ISO
      $(VBOX_PATH_ADDITIONS_ISO)/VBoxGuestAdditions.iso:
    	$(QUIET)$(MKDIR) -p $(@D)
    	$(VBOX_RETRY) $(TOOL_CURL_FETCH) http://download.virtualbox.org/virtualbox/$(VBOX_VERSION_STRING_RAW)/VBoxGuestAdditions_$(VBOX_VERSION_STRING_RAW).iso -o $@
     endif

    Если вы правите файлы самостоятельно, а не готовым патчем, учтите, что строки-команды должны начинаться с символа табуляции.

  5. Сборка документации — одно из больных мест этого проекта. До версий 6.0 с ней не было никаких проблем, а потом вдруг полезли сплошные несостыковки. Я не знаю, в каких условиях документация собирается в Oracle (возможно, они используют *NIX-подобную систему), но у меня различные компоненты то и дело теряли слэши в путях или, наоборот, получали лишние, и в итоге не могли найти нужные файлы из-за сбившихся соответствий в каталожных файлах. Методом научного тыка мне удалось в итоге подобрать комбинацию, с которой документация собралась без ошибок. В первую очередь была исправлена ошибка отсутствия одного из промежуточных целевых каталогов, из-за чего некоторые файлы не могли быть созданы. Это делается в файле doc\manual\Makefile.kmk в блоке кода:
    define def_vbox_refentry_to_user_sect1
    $$(VBOX_PATH_MANUAL_OUTBASE)/$(1)/user_$(2): $(3) \
    		$$(VBOX_PATH_MANUAL_SRC)/docbook-refentry-to-manual-sect1.xsl \
    		$$(VBOX_XML_CATALOG) $$(VBOX_XML_CATALOG_DOCBOOK) $$(VBOX_XML_CATALOG_MANUAL) \
    		$$(VBOX_XML_ENTITIES) $$(VBOX_VERSION_STAMP) | $$$$(dir $$$$@)
    	$$(call MSG_TOOL,xsltproc $$(notdir $$(filter %.xsl,$$^)),,$$(filter %.xml,$$^),$$@)
    	$$(QUIET)$$(RM) -f "$$@"
    	$$(QUIET)$$(call VBOX_XSLTPROC_WITH_CAT) --output $$@ $$(VBOX_PATH_MANUAL_SRC)/docbook-refentry-to-manual-sect1.xsl $$<
    endef

    Здесь после строчки с $$(RM) я добавил команду создания целевого каталога:

    	$$(QUIET)$$(MKDIR) -p "$$(@D)"

    Битва со слэшами происходит в файле doc\manual\Config.kmk. Нормального решения проблемы мне найти не удалось, поэтому в качестве обходного пути я просто добавил инструкции для обработки «кривых» путей. Сначала после строки:

      VBOX_FILE_URL_MAYBE_SLASH = $(if $(eq $(KBUILD_HOST),win),/,)

    я создаю две новых переменных, которые дублируют существующие переменные, но превращают одиночный слэш после имени диска в тройной:

     VBOX_PATH_MANUAL_SRC_SLASHED = $(subst :/,:///,$(VBOX_PATH_MANUAL_SRC))
     VBOX_PATH_MANUAL_OUTBASE_SLASHED = $(subst :/,:///,$(VBOX_PATH_MANUAL_OUTBASE))

    Чуть ниже находится правило для создания каталожного файла:

     $(VBOX_XML_CATALOG): $(VBOX_PATH_MANUAL_SRC)/Config.kmk | $$(dir $$@)
    	$(call MSG_L1,Creating catalog $@)
    	$(QUIET)$(APPEND) -tn "$@" \
    		'<?xml version="1.0"?>' \
    		'<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">' \
    		'<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">' \
    		'  <delegatePublic publicIdStartString="-//OASIS/ENTITIES DocBook XML"      catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegatePublic publicIdStartString="-//OASIS/DTD DocBook XML"           catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegateSystem systemIdStartString="http://www.oasis-open.org/docbook/" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegateSystem systemIdStartString="http://docbook.org/"                catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegateURI uriStartString="http://www.oasis-open.org/docbook/"         catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegateURI uriStartString="http://docbook.org/"                        catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_SRC)"            catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_OUTBASE)"        catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateURI uriStartString="$(VBOX_PATH_MANUAL_SRC)"                    catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateURI uriStartString="$(VBOX_PATH_MANUAL_OUTBASE)"                catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateURI uriStartString="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)"     catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateURI uriStartString="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_OUTBASE)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'</catalog>'

    Для каждой строки, использующей переменные VBOX_PATH_MANUAL_SRC и VBOX_PATH_MANUAL_OUTBASE, я добавил такую же, но с заменой этих переменных на определённые выше (строки с префиксом file:// можно пропустить). В итоге получилось:

     $(VBOX_XML_CATALOG): $(VBOX_PATH_MANUAL_SRC)/Config.kmk | $$(dir $$@)
    	$(call MSG_L1,Creating catalog $@)
    	$(QUIET)$(APPEND) -tn "$@" \
    		'<?xml version="1.0"?>' \
    		'<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">' \
    		'<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">' \
    		'  <delegatePublic publicIdStartString="-//OASIS/ENTITIES DocBook XML"      catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegatePublic publicIdStartString="-//OASIS/DTD DocBook XML"           catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegateSystem systemIdStartString="http://www.oasis-open.org/docbook/" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegateSystem systemIdStartString="http://docbook.org/"                catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegateURI uriStartString="http://www.oasis-open.org/docbook/"         catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegateURI uriStartString="http://docbook.org/"                        catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_DOCBOOK)"/>' \
    		'  <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_SRC)"            catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_SRC_SLASHED)"    catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_OUTBASE)"        catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateSystem systemIdStartString="$(VBOX_PATH_MANUAL_OUTBASE_SLASHED)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateURI uriStartString="$(VBOX_PATH_MANUAL_SRC)"                    catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateURI uriStartString="$(VBOX_PATH_MANUAL_SRC_SLASHED)"            catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateURI uriStartString="$(VBOX_PATH_MANUAL_OUTBASE)"                catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateURI uriStartString="$(VBOX_PATH_MANUAL_OUTBASE_SLASHED)"        catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateURI uriStartString="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)"     catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'  <delegateURI uriStartString="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_OUTBASE)" catalog="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_XML_CATALOG_MANUAL)"/>' \
    		'</catalog>'

    Ещё ниже присутствует правило для генерации вспомогательного каталожного файла, начинающееся со строки:

     $(VBOX_XML_CATALOG_MANUAL): $(VBOX_PATH_MANUAL_SRC)/Config.kmk | $$(dir $$@)

    В нём выполняется аналогичная операция (одно из вхождений находится внутри for-макроса, там нужно быть внимательным со скобками). Кроме этого, в начале файла идут несколько строчек, ссылающихся на файлы в подкаталоге common/:

    		'  <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-accessibility-en.xml"            uri="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-accessibility-en.xml"/>' \
    		'  <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-diversity.xml"					uri="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-diversity.xml"/>' \
    		'  <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-support-en.xml"                  uri="file://$(VBOX_FILE_URL_MAYBE_SLASH)$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-support-en.xml"/>' \

    С ними наблюдается обратная проблема — исчезновение слэшей после протокола. Это я смог обойти, поменяв целевой адрес (атрибут uri) на обычный путь вместо file-протокола, так что, с учётом предыдущей правки, эти строки превратились в следующий набор соответствий:

    		'  <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-accessibility-en.xml"            uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-accessibility-en.xml"/>' \
    		'  <system systemId="$(VBOX_PATH_MANUAL_SRC_SLASHED)/common/oracle-accessibility-en.xml"            uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-accessibility-en.xml"/>' \
    		'  <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-diversity.xml"					uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-diversity.xml"/>' \
    		'  <system systemId="$(VBOX_PATH_MANUAL_SRC_SLASHED)/common/oracle-diversity.xml"					uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-diversity.xml"/>' \
    		'  <system systemId="$(VBOX_PATH_MANUAL_SRC)/common/oracle-support-en.xml"                  uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-support-en.xml"/>' \
    		'  <system systemId="$(VBOX_PATH_MANUAL_SRC_SLASHED)/common/oracle-support-en.xml"                  uri="$(VBOX_PATH_MANUAL_SRC)/en_US/oracle-support-en.xml"/>' \
  6. Если VB собирается с подписыванием, то для большинства исполняемых файлов выставляется флаг принудительной проверки подписи (опция компоновщика /IntegrityCheck). При наличии полноценного сертификата это не проблема. Однако если у вас самоподписанный сертификат, VB просто откажется запускаться после установки (даже в тестовом режиме). Я модифицировал файл Config.kmk таким образом, чтобы флаг добавлялся только при использовании полноценного сертификата (в качестве критерия «полноценности» я выбрал наличие кросс-сертификата в файле LocalConfig.kmk; см. ниже). Набор исправлений заключается в следующем.
    • Вставлен блок определения переменной VBOX_INTEGRITY_CHECK, которая будет использоваться вместо фиксированной опции:
      if defined(VBOX_SIGNING_MODE) && defined(VBOX_CROSS_CERTIFICATE_FILE)
      	VBOX_INTEGRITY_CHECK := /IntegrityCheck
      else
      	VBOX_INTEGRITY_CHECK := /IntegrityCheck:NO
      endif
    • Чуть ниже идёт вызов утилиты editbin:
      	$(VBOX_VCC_EDITBIN) /LargeAddressAware /DynamicBase /NxCompat /Release /IntegrityCheck \
      		/Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
      		"$@"

      В нём безусловный /IntegrityCheck заменяется на новую переменную $(VBOX_INTEGRITY_CHECK).

    • Далее ищутся все вхождения следующего вида:
      ifdef VBOX_SIGNING_MODE
       TEMPLATE_XXXXXX_LDFLAGS          += -IntegrityCheck
      endif

      или

      if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING)
       TEMPLATE_XXXXXX_LDFLAGS          += -IntegrityCheck
      endif

      где вместо «XXXXXX» могут быть различные имена компонентов. Всего таких вхождений — 6 штук, по три каждого вида. Здесь добавляется условие, что переменная кросс-сертификата определена. В итоге первая строчка превращается, соответственно, в одну из нижеследующих:

      if defined(VBOX_SIGNING_MODE) && defined(VBOX_CROSS_CERTIFICATE_FILE)

      или

      if defined(VBOX_SIGNING_MODE) && defined(VBOX_CROSS_CERTIFICATE_FILE) && defined(VBOX_WITH_HARDENING)
  7. Ещё один файл, который я поправил, не имеет прямого отношения к сборке VB. Это вспомогательный скрипт src\VBox\Installer\win\Scripts\UnpackBlessedDrivers.cmd, предназначенный для распаковки ZIP-архива с драйверами, полученного из Microsoft после получения подписей под Windows 10. Я там добавил возможность задания пути к утилите signtool, а также избавился от утилиты unzip.exe, реализовав распаковку архива Perl-скриптом. О самой процедуре подписывания я расскажу чуть ниже. Если же вы не планируете получать подпись от Microsoft, то можете просто игнорировать эти правки.

• Файл конфигурации сборки VB

Осталось только создать в корне каталога с исходниками VB файл с именем LocalConfig.kmk, куда прописываются различные пути и параметры сборки. В качестве шаблона можно взять следующий код:

VBOX_WITH_HARDENING :=
VBOX_PATH_WIX := C:\Programs\WiX
VBOX_GSOAP_INSTALLED := 1
VBOX_PATH_GSOAP := C:\Programs\gSOAP
VBOX_WITH_COMBINED_PACKAGE :=
VBOX_WITH_QT_PAYLOAD := 1
VBOX_WITH_QTGUI_V5 := 1
VBOX_SIGNING_MODE := release
VBOX_CERTIFICATE_SUBJECT_NAME := Roga and Kopyta Ltd
VBOX_CERTIFICATE_FINGERPRINT := XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
VBOX_CERTIFICATE_SHA2_SUBJECT_NAME := Roga and Kopyta Ltd
VBOX_CERTIFICATE_SHA2_FINGERPRINT := XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
VBOX_TSA_URL := http://timestamp.digicert.com
VBOX_TSA_SHA2_URL := http://timestamp.digicert.com
VBOX_TSA_URL_ARGS := /t "$(VBOX_TSA_URL)"
VBOX_TSA_SHA2_URL_ARGS := /tr "$(VBOX_TSA_SHA2_URL)" /td sha256
VBOX_CROSS_CERTIFICATE_FILE :=
VBOX_CROSS_CERTIFICATE_FILE_ARGS :=
VBOX_CROSS_CERTIFICATE_SHA2_FILE :=
VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS :=
VBOX_PATH_SIGN_TOOLS := C:\Programs\DevKits\8.1\bin\x64
VBOX_PATH_SELFSIGN := C:\WinDDK\7600.16385.1\bin\selfsign
VBOX_PATH_WISUMINFO := "C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\sysmgmt\msi\scripts\WiSumInf.vbs"
VBOX_PATH_WISUBSTG  := "C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\sysmgmt\msi\scripts\WiSubStg.vbs"
VBOX_WITH_DOCS := 1
VBOX_WITH_DOCS_CHM := 1
VBOX_WITH_DOCS_PACKING := 1
VBOX_WITH_ADDITIONS :=
VBOX_WITH_ADDITIONS_PACKING := 1
VBOX_HAVE_XMLLINT := 1
VBOX_XMLLINT := C:\Programs\xmllint\bin\xmllint.exe
VBOX_PATH_DOCBOOK := C:/Programs/DocBook/xsl
VBOX_PATH_DOCBOOK_DTD := C:/Programs/DocBook/xml
VBOX_PATH_HTML_HELP_WORKSHOP := "C:\Program Files (x86)\HTML Help Workshop"
VBOX_PDFLATEX := C:\Programs\MiKTeX\texmfs\install\miktex\bin\pdflatex.exe
VBOX_PDFLATEX_CMD := $(VBOX_PDFLATEX) -halt-on-error -interaction batchmode
TOOL_CURL_FETCH := C:\Programs\curl\x64\curl.exe
PATH_TOOL_NASM := C:/Programs/nasm
VBOX_INSTALLER_LANGUAGES := en_US
VBOX_WITH_TESTCASES :=
VBOX_WITH_VALIDATIONKIT :=
VBOX_WITH_VBOX_IMG := 1
VBOX_WITH_RECORDING := 1
VBOX_WITH_AUDIO_RECORDING := 1
SDK_VBOX_VPX := 1
VBOX_WITH_LIBVPX := 1
SDK_VBOX_OPUS := 1
VBOX_WITH_LIBOPUS := 1
VBOX_BUILD_PUBLISHER := _OSE

В этом шаблоне необходимо кое-что подправить:

  • В переменных VBOX_CERTIFICATE_SUBJECT_NAME и VBOX_CERTIFICATE_SHA2_SUBJECT_NAME потребуется указать имена используемых вами сертификатов для подписи SHA-1 и SHA-256, соответственно.
  • В переменных VBOX_CERTIFICATE_FINGERPRINT и VBOX_CERTIFICATE_SHA2_FINGERPRINT пропишите цифровые отпечатки, которые были скопированы ранее из консоли управления сертификатами.
  • Если у вас не самоподписанный сертификат, а покупной, то удалите строчки с переменными VBOX_CROSS_CERTIFICATE_FILE_ARGS и VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS, а в переменных VBOX_CROSS_CERTIFICATE_FILE и VBOX_CROSS_CERTIFICATE_SHA2_FILE (без «_ARGS») задайте полный путь к файлу кросс-сертификата (без него драйверы не будут считаться подписанными). Его можно найти на сайте компании, выпустившей сертификат, или у Microsoft.
  • Для более тонкой настройки подписывания имеется множество других переменных, с помощью которых можно задать хранилище, адрес сервера для наложения временно́й метки или вообще задать произвольный дополнительный набор аргументов для утилиты signtool. В файле Config.kmk под комментарием «Code Signing» можно посмотреть, какие там переменные определяются и как они используются.
  • Если вы устанавливали какие-то из программ в каталоги, отличающиеся от моих, нужно поправить пути в соответствующих переменных. Крайне желательно использовать тот же стиль слэшей (прямые/обратные), что приведён в шаблоне для каждой переменной: для некоторых из них это критично.
  • Для WiX необходимо указывать путь к исполняемым файлам. В портативной версии это каталог, куда был распакован архив; в установленной версии это подкаталог bin. Обратите внимание, что если путь содержит пробелы, то необходимо преобразовать его в формат 8.3. Для этого можно воспользоваться командой dir /x. Трюк со взятием в кавычки здесь, увы, не работает.
  • Переменная VBOX_BUILD_PUBLISHER задаёт брэндированный суффикс в номере версии. По умолчанию это «_OSE» (т. е. продукт имеет версию «6.1.18_OSE»). Здесь вы можете поменять его на что-то другое или даже на пустую строку, чтобы убрать суффикс совсем (если переменная отсутствует, применится суффикс «_OSE»).

Остальные переменные используются в основном для выбора собираемых компонентов. Ну и главная строка, ради которой всё и затевалось, идёт самой первой: отключаем hardening.

 Собираем VirtualBox

Ну вот, теперь, наконец, можно и приступать к сборке собственно VirtualBox. Поскольку подписывание драйверов под Windows 10 доступно немногим, я сначала расскажу, как выполняется сборка в «простом» режиме, а дополнительные промежуточные шаги для получения подписи от Microsoft вынесу в отдельный пункт.

  1. Открываем консоль, выполняем следующие команды:
    cd /d C:\Devel\VirtualBox-src
    "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /Release /x64 /win7
    COLOR 07
    set BUILD_TARGET_ARCH=amd64
    cscript configure.vbs --with-DDK=C:\WinDDK\7600.16385.1 --with-MinGW-w64=C:\Programs\mingw64 --with-libSDL=C:\Programs\SDL\x64 --with-openssl=C:\Programs\OpenSSL\x64 --with-openssl32=C:\Programs\OpenSSL\x32 --with-libcurl=C:\Programs\curl\x64 --with-libcurl32=C:\Programs\curl\x32 --with-Qt5=C:\Programs\Qt\5.6.3-x64 --with-libvpx=C:\Programs\libvpx --with-libopus=C:\Programs\libopus --with-python=C:/Programs/Python
    env.bat
    kmk
    kmk C:/Devel/VirtualBox-src/out/win.amd64/release/bin/VirtualBox-6.1.18_OSE-r142142-MultiArch.exe

    Скрипт configure.vbs проверяет окружение и создаёт файлы конфигурации (AutoConfig.kmk и env.bat). Первый запуск kmk выполняет сборку бинарных компонентов и помещает их в каталог out\win.amd64\bin\. Последняя команда собирает из этих компонентов промежуточный MSI-пакет и итоговый инсталлятор. Важные моменты:

    • Слэши в последней команде должны быть обязательно прямыми. С обратными kmk не найдёт сборочные правила.
    • Если вы меняли суффикс версии, то «_OSE» в имени файла инсталлятора необходимо поправить на то, что вы задали в переменной VBOX_BUILD_PUBLISHER.
    • Ревизию в имени MSI-файла (142142) можно найти в файле Version.kmk в определении переменной VBOX_SVN_REV_VERSION_FALLBACK.
  2. Даже при наличии полноценного сертификата полученный таким образом дистрибутив не установится в Windows 10, если она загружена с включённым Secure Boot. Для этого драйверы должны быть подписаны непосредственно компанией Microsoft. Сама процедура описана на многих ресурсах и прямого отношения к теме моей статьи не имеет, поэтому здесь я только обозначу ключевые моменты и шаги, необходимые для интеграции процедуры в процесс сборки VB.
    • Необходимое условие: у вас должен иметься сертификат категории EV (Extended Validation), обычный здесь уже не подойдёт. Кроме того, вам нужно зарегистрироваться на портале Hardware Dev Center и привязать этот сертификат к аккаунту.
    • После завершения сборки бинарных компонентов (первый запуск kmk, без параметров) необходимо создать CAB-архив с драйверами. Для этого в VB имеется шаблон скрипта, который сборочная система к этому моменту подредактировала в соответствии с текущей задачей и положила в подкаталог out\win.amd64\release\repack\. Нужно перейти туда и запустить следующую команду:
      PackDriversForSubmission.cmd -x

      По завершении работы скрипта в этом же каталоге появится файл с именем вида VBoxDrivers-6.1.18r142142-amd64.cab.

    • Полученный CAB-архив нужно подписать EV-сертификатом. Затем на портале Microsoft Hardware Dev Center создаётся новая заявка, загружается этот подписанный архив, выбирается желаемая целевая система (обязательно 64-битная), и заявка отправляется на выполнение.
    • Через несколько минут система должна выдать ZIP-архив, в котором драйверы в дополнение к имеющейся подписи имеют подпись Microsoft, а CAT-файлы сгенерированы заново. Этот архив скачивается и помещается куда-нибудь, где у сборочной системы будет к нему доступ.
    • Драйверы в этом архиве разложены по подкаталогам. Требуется все эти файлы извлечь, избавиться от всех этих подкаталогов и полученный набор скопировать в out\win.amd64\release\bin\, перезаписывая существующие файлы. Для этого удобно воспользоваться другим скриптом в том же каталоге out\win.amd64\release\repack\, его использование выглядит так:
      set _MY_SIGNTOOL=C:\Programs\DevKits\8.1\bin\x64\signtool.exe
      UnpackBlessedDrivers.cmd -n -i path\to\signed.zip

      Пути к signtool.exe и ZIP-архиву, разумеется, нужно подставить свои.

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

Если ни я, ни вы ничего не перепутали, то после всех этих перипетий у вас должен получиться инсталлятор VirtualBox, отличающийся от Oracle-версии только значком исполняемого файла, картинкой в диалоге «О программе» и, конечно же, отключённым hardening’ом. При желании значок и картинку тоже можно поменять, но это тема отдельного разговора.

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

Добавлю ещё лишь пару слов об установке полученного дистрибутива с самоподписанным сертификатом. В современных системах (Windows 8/10) одного лишь включения тестового режима, как оказалось, недостаточно, при установке выводится сообщение о невалидной подписи. Чтобы обойти эту проблему, необходимо добавить использовавшиеся сертификаты в корневое хранилище:

  1. Откройте свойства скачанного файла дистрибутива: правый щелчок → Свойства, перейдите на вкладку Цифровые подписи. Там будут две подписи от «Roga and Kopyta Ltd»: sha1 и sha256. Выделяем первую, жмём Сведения.
  2. В открывшемся диалоге жмём кнопку Просмотр сертификата.
  3. В новом диалоге жмём Установить сертификат.
  4. Выбираем для установки «Локальный компьютер», нажимаем Далее. Подтверждаем UAC-запрос. Отмечаем пункт «Поместить все сертификаты в следующее хранилище», нажимаем Обзор и выбираем хранилище «Доверенные корневые центры сертификации». Далее, Готово. Сертификат установлен.
  5. Закрываем все диалоги, кроме самого первого, выделяем подпись sha256, повторяем для неё шаги 2–4.
  6. Закрываем все диалоги, запускаем установку. Теперь она должна пройти успешно.

 Послесловие

Размер статьи оказался неожиданностью для меня самого. Когда я начинал её писать, то намеревался подробно рассказывать, почему на каждом этапе было выбрано то или иное решение, какие конкретно ошибки выскакивают, если не применить очередную правку, и какие могут быть альтернативные подходы к решению этих ошибок. Но постепенно понял, что если бы я всё это описывал, статья получилась бы и вовсе неприподъёмной. Поэтому прошу прощения за встречающийся кое-где стиль «делай так, а почему — не скажу». Сам недолюбливаю такие инструкции, но тут не видел иного выхода. Впрочем, в отдельных местах я всё-таки постарался хотя бы вкратце пояснить суть происходящего.

Огромное количество аспектов сборочной системы VB осталось за кадром: как из-за нежелания раздувать текст, так и по причине моей лени, когда, найдя какой-то обходной путь для очередной проблемы, я не лез в глубины системы сборки, а поскорее переходил к следующему этапу. В конце концов, моей главной задачей было не найти оптимальный путь, а собрать, наконец, свой вариант актуального VirtualBox’а: сидеть на 4.3.12 уже поднадоело, но я не мог обновлять один из своих основных рабочих инструментов на нечто, что в любой момент может просто отказаться работать на неопределённый срок. Правда, по мере выхода новых версий я иногда узнаю о каких-нибудь новых возможностях сборочной системы и, опробовав их, добавляю соответствующую информацию в статью.

Надеюсь всё же, что, несмотря на недостатки, эта статья окажется кому-нибудь полезной. Для тех, кому лень поднимать всё вышеописанное нагромождение программ, но интересно расковырять получающийся в итоге дистрибутив, я выложил инсталлятор на Яндекс-диск: 6.1.18. Все драйверы в них (да и остальные файлы) подписаны недоверенным сертификатом, так что в 64-битной Windows этот вариант VB заработает только в тестовом режиме. Если имеются вопросы, пожелания, предложения — велкам в комментарии или в личку. И да пребудет с вами Open Source!

 Дополнения

Архив

• Публикация статьи, 21.01.2016
  1. VirtualBox 5.0.12.

• Обновление статьи от 24.05.2016
  1. Внесены уточнения с учётом изменений в VB 5.0.20, в частности, двойное подписывание SHA-1/SHA-256.
  2. Добавлено отключение флага принудительной проверки подписей, если собирается самоподписанный дистрибутив.
  3. Добавлена инструкция по обходу ошибки установки самоподписанного дистрибутива.
  4. Обновлены версии используемых библиотек.
  5. Для ускорения сборки отключены некоторые неиспользуемые компоненты.
  6. Исправлены мелкие недочёты.

• Обновление статьи от 29.07.2016
  1. Внесены уточнения с учётом изменений в VB 5.1.2, в частности, переход на Qt5. Отличия от процедуры сборки для 5.0.x оставлены в виде уточнений.
  2. Обновлены версии используемых библиотек.
  3. В итоговый сборочный скрипт добавлена проверка на корректность завершения каждой стадии.
  4. Исправлены мелкие недочёты.

• Обновление статьи от 15.09.2016
  1. Внесены уточнения с учётом изменений в VB 5.1.6.
  2. Обновлены версии используемых библиотек.
  3. Добавлено использование NASM для сборки OpenSSL.
  4. cURL теперь собирается с поддержкой OpenSSL, потому что иначе не работают функции проверки обновлений и загрузки пакета расширений.
  5. Доработан комбинированный скрипт сборки, чтобы версия определялась автоматически.
  6. Различные мелкие правки.

• Обновление статьи от 30.11.2016
  1. Внесены уточнения с учётом изменений в VB 5.1.10.
  2. Обновлены версии используемых библиотек, в частности, выполнен переход на OpenSSL 1.1.x.
  3. Исправлены ошибки инсталляции:
    • путь к плагинам Qt заменён на каталог установки приложения;
    • добавлены забытые библиотеки OpenSSL к 32-битным компонентам 64-битной версии VB.
  4. Удалена информация о сборке старых версий. Статья лежит в GitHub-проекте, поэтому всё сохранено в истории коммитов.

• Обновление статьи от 2.12.2016
  1. Использование статической версии OpenSSL.

• Обновление статьи от 20.06.2017
  1. Внесены уточнения с учётом изменений в VB 5.1.22.
  2. Актуализированы версии cURL, OpenSSL, gSOAP; поправлены сборочные инструкции для cURL, gSOAP и самого VB.

• Обновление статьи от 1.12.2017
  1. Внесены уточнения с учётом изменений в VB 5.2.2.
  2. Переход с MinGW-32 3.3.3 на 4.5.4.
  3. Актуализированы версии Qt, cURL, OpenSSL, gSOAP и некоторых сборочных инструментов; поправлены инструкции для cURL, gSOAP и самого VB.
  4. Использование локальных архивов DocBook XML/XSL вместо онлайн-версий.
  5. Переход с wget на cURL для скачивания образа гостевых дополнений.
  6. Различные мелкие правки.

• Обновление статьи от 4.12.2017
  1. Исправлена версия libxml в инструкциях.

• Обновление статьи от 4.09.2018
  1. Внесены уточнения с учётом изменений в VB 5.2.18.
  2. Актуализированы версии cURL, OpenSSL, gSOAP и некоторых сборочных инструментов; поправлены инструкции для cURL.

• Обновление статьи от 12.12.2018
  1. Внесены уточнения с учётом изменений в VB 5.2.22.
  2. Добавлена поддержка записи экрана, которая по умолчанию отключена в OSE-версии; используются библиотеки libopus и libvpx.
  3. Актуализированы версии cURL, OpenSSL, gSOAP.
  4. Добавлен единый патч-файл для внесения всех описанных изменений в дерево исходников VirtualBox.

• Обновление статьи от 25.01.2019
  1. Внесены уточнения с учётом изменений в VB 6.0.2.
  2. Улучшен механизм отключения сборки гостевых дополнений.
  3. Актуализированы версии cURL, gSOAP; откат DocBook XSL Stylesheets к версии 1.69.1 (точнее соответствующей структуре документации).
  4. Батник для сборки вынесен из текста статьи в загружаемый файл.

• Обновление статьи от 8.04.2019
  1. Статья переведена на английский язык; попутно внесено множество разнообразных правок в русскоязычную версию.
  2. Добавлена информация о подписывании драйверов для Windows 10.
  3. Внесены уточнения с учётом изменений в VB 6.0.4.
  4. Актуализированы версии cURL, OpenSSL, gSOAP и некоторые утилиты.
  5. Батник для сборки больше не привязан к конкретному пути проета, а также включает в себя базовый шаблон для автоматизации Win10-подписывания.

• Обновление статьи от 17.02.2021
  1. Внесены уточнения с учётом изменений в VB 6.0.24.
  2. Обновлены различные умершие ссылки.

• Обновление статьи от 19.02.2021
  1. Внесены уточнения с учётом изменений в VB 6.1.18.
  2. Удалены инструкции по сборке неиспользуемых 32-битных библиотек.
  3. Актуализированы версии cURL, OpenSSL, gSOAP, libopus.

Виртуальные машины VirtualBoxВиртуальные машины представляют собой эмуляцию устройств на другом устройстве или, в контексте этой статьи и упрощенно, позволяют запускать виртуальный компьютер (как обычную программу) с нужной операционной системой на вашем компьютере с той же или отличающейся ОС. Например, имея на своем компьютере Windows, вы можете запустить Linux или другую версию Windows в виртуальной машине и работать с ними как с обычным компьютером.

В этой инструкции для начинающих подробно о том, как создать и настроить виртуальную машину VirtualBox (полностью бесплатное ПО для работы с виртуальными машинами в Windows, MacOS и Linux), а также некоторые нюансы по использованию VirtualBox, которые могут оказаться полезными. Кстати, в Windows 10 Pro и Enterprise есть встроенные средства для работы с виртуальными машинами, см. Виртуальные машины Hyper-V в Windows 10. Примечание: если на компьютере установлены компоненты Hyper-V, то VirtualBox будет сообщать об ошибке Не удалось открыть сессию для виртуальной машины, о том как это обойти: Запуск VirtualBox и Hyper-V на одной системе.

Для чего это может потребоваться? Чаще всего, виртуальные машины используют для запуска серверов или для тестирования работы программ в различных ОС. Для начинающего пользователя такая возможность может быть полезна как для того, чтобы попробовать в работе незнакомую систему или, например, для запуска сомнительных программ без опасности получить вирусы на своем компьютере.

Установка VirtualBox

Вы можете бесплатно скачать ПО для работы с виртуальными машинами VirtualBox с официального сайта https://www.virtualbox.org/wiki/Downloads где представлены версии для Windows, Mac OS X и Linux. Несмотря на то, что сайт на английском, сама программа будет на русском языке. Запустите загруженный файл и пройдите простой процесс установки (в большинстве случаев достаточно оставить все параметры по умолчанию).

Установка VirtualBox

Во время установки VirtualBox, если вы оставите включенным компонент для доступа к Интернету из виртуальных машин, вы увидите предупреждение «Warning: Network Interfaces», которое сообщает о том, что в процессе настройки ваше Интернет-подключение будет временно разорвано (и восстановится автоматически после установки драйверов и настройки подключений).

По завершении установки можете запустить Oracle VM VirtualBox.

Создание виртуальной машины в VirtualBox

Примечание: для работы виртуальных машин требуется, чтобы на компьютере была включена виртуализация VT-x или AMD-V в БИОС. Обычно она включена по умолчанию, но, если что-то пойдет не так, учитывайте этот момент.

Теперь давайте создадим свою первую виртуальную машину. В примере далее используется VirtualBox, запущенная в Windows, в качестве гостевой ОС (той, которая виртуализируется) будет Windows 10.

  1. Нажмите «Создать» в окне Oracle VM VirtualBox Менеджер. Главное окно VirtualBox
  2. В окне «Укажите имя и тип ОС» задайте произвольное имя виртуальной машины, выберите тип ОС, которая будет на нее установлена и версию ОС. В моем случае — Windows 10 x64. Нажмите «Далее». Создание виртуальной машины в VirtualBox
  3. Укажите объем оперативной памяти, выделяемой для вашей виртуальной машины. В идеале — достаточный для её работы, но не слишком большой (так как память будет «отниматься» от вашей основной системы, когда виртуальная машина будет запущена). Рекомендую ориентироваться на значения в «зелёной» зоне. Установка размера оперативной памяти для VirtualBox
  4. В следующем окне выберите «Создать новый виртуальный жесткий диск». Создать новый виртуальный жесткий диск
  5. Выберите тип диска. В нашем случае, если этот виртуальный диск не будет использоваться за пределами VirtualBox — VDI (VirtualBox Disk Image).
  6. Укажите, динамический или фиксированный размер жесткого диска использовать. Я обычно использую «Фиксированный» и вручную задаю его размер.
  7. Укажите размер виртуального жесткого диска и место его хранения на компьютере или внешнем накопителе (размер должен быть достаточным для установки и работы гостевой операционной системы). Нажмите «Создать» и дождитесь завершения создания виртуального диска. Сохранение виртуального диска VDI
  8. Готово, виртуальная машина создана и отобразится в списке слева в окне VirtualBox. Чтобы увидеть информацию о конфигурации, как на скриншоте, нажмите по стрелке справа от кнопки «Машины» и выберите пункт «Детали». Виртуальная машина VirtualBox создана

Виртуальная машина создана, однако, если её запустить, вы не увидите ничего кроме черного экрана со служебной информацией. Т.е. создан пока только «виртуальный компьютер» и никакая операционной система на нём не установлена.

Установка Windows в VirtualBox

Для того, чтобы установить Windows, в нашем случае Windows 10, в виртуальной машине VirtualBox вам потребуется образ ISO с дистрибутивом системы (см. Как скачать образ ISO Windows 10). Дальнейшие шаги будут выглядеть следующим образом.

  1. Вставьте образ ISO в виртуальный привод DVD. Для этого выберите виртуальную машину в списке слева, нажмите кнопку «Настроить», перейдите в пункт «Носители», выберите диск, нажмите по кнопке с диском и стрелкой и выберите пункт «Выбрать образ оптического диска». Укажите путь к образу. Затем в пункте настроек «Система» в разделе «Порядок загрузки» установите «Оптический диск» на первое место в списке. Нажмите «Ок». Вставить ISO образ в VirtualBox
  2. В главном окне нажмите «Запустить». Запустится созданная ранее виртуальная машина, при этом загрузка будет выполнена с диска (с образа ISO), можно выполнить установку Windows так, как это делается на обычном физическом компьютере. Все шаги первоначальной установки аналогичны таковым на обычном компьютере, см. Установка Windows 10 с флешки. Установка Windows 10 в VirtualBox
  3. После того, как Windows была установлена и запущена, следует установить некоторые драйверы, которые позволят гостевой системе правильно (и без лишних тормозов) работать в виртуальной машине. Для этого выберите в меню «Устройства» — «Подключить образ диска дополнений VirtualBox», откройте компакт-диск внутри виртуальной машины и запустите файл VBoxWindowsAdditions.exe для установки этих драйверов. При ошибке подключения образа, завершите работу виртуальной машины и подключите образ из C:\ Program Files\ Oracle\ VirtualBox\ VBoxGuestAdditions.iso в настройках носителей (как в первом шаге) и снова запустите виртуальную машину, а затем произведите установку с диска.

По завершении установки и перезагрузки виртуальной машины она полностью будет готова к работе. Однако, возможно, вы захотите выполнить некоторые дополнительные настройки.

Windows установлена в VirtualBox

Основные настройки виртуальной машины VirtualBox

В настройках виртуальной машины (учтите, что многие настройки недоступны, пока виртуальная машина запущена) вы можете изменить следующие основные параметры:

  1. В пункте «Общие» на вкладке «Дополнительно» можно включить общий с основной системой буфер обмена и функцию Drag-n-Drop для перетаскивания файлов в гостевую ОС или из неё.
  2. В пункте «Система» — порядок загрузки, режим EFI (для установки на GPT диск), размер оперативной памяти, количество ядер процессора (не следует указывать число более количества физических ядер процессора вашего компьютера) и допустимый процент их использования (низкие значения часто приводят к тому, что гостевая система «тормозит»).
  3. На вкладке «дисплей» можно включить 2D и 3D ускорение, задать объем видеопамяти для виртуальной машины.
  4. На вкладке «Носители» — добавить дополнительные приводы дисков, виртуальные жесткие диски.
  5. На вкладке USB — добавить USB устройства (которые физически подключены к вашему компьютеру), например, флешку, к виртуальной машине (нажмите по значку USB с «плюсом» справа). Для использования контроллеров USB 2.0 и USB 3.0 установите Oracle VM VirtualBox Extension Pack (доступно для скачивания там же, где вы загружали VirtualBox). Добавление флешки в VirtualBox
  6. В разделе «Общие папки» можно добавить папки, которые будут общими для основной ОС и виртуальной машины.

Некоторые из указанных выше вещей можно выполнить и из запущенной виртуальной машины в главном меню: например, в пункт «Устройства» можно подключить флешку, извлечь или вставить диск (ISO), включить общие папки и т.п.

Дополнительная информация

В завершение — некоторая дополнительная информация, которая может оказаться полезной при использовании виртуальных машин VirtualBox.

  • Одна из полезных возможностей при использовании виртуальных машин — создание «снимка» (snapshot) системы в её текущем состоянии (со всеми файлами, установленными программами и прочим) с возможностью отката к этому состоянию в любой момент (и возможностью хранить несколько снимков). Сделать снимок в VirtualBox можно на запущенной виртуальной машине в меню «Машина» — «Сделать снимок состояния». А восстановить в менеджере виртуальных машин, нажав «Машины» — «Снимки» и выбрав вкладку «Снимки». Восстановление виртуальной машины из снимка
  • Некоторые комбинации клавиш по умолчанию перехватываются основной операционной системой (например, Ctrl+Alt+Del). Если вам требуется отправить подобное сочетание клавиш в виртуальную машину, используйте пункт меню «Ввод».
  • Виртуальная машина может «захватывать» ввод клавиатуры и мышь (так, что нельзя перевести ввод на основную систему). Чтобы «освободить» клавиатуру и мышь, если потребуется, используйте нажатие хост-клавиши (по умолчанию это правый Ctrl).
  • На сайте Майкрософт есть готовые бесплатные виртуальные машины Windows для VirtualBox, которые достаточно импортировать и запустить. Подробно о том, как это сделать: Как скачать бесплатные виртуальные машины Windows с сайта Майкрософт.
  • При необходимости вы можете включить загрузку виртуальной машины VirtualBox с физической флешки или другого накопителя

  • Настройка ssh клиента на windows
  • Настройка virtualbox на windows 10 для ubuntu
  • Настройка usb наушников на windows 10
  • Настройка ssd под windows 7 под ssd диск
  • Настройка snmp windows server 2016