Почему OS X допускает одновременное использование нескольких программ виртуализации, в то время как другие системы этого не делают?
Я был удивлен, узнав, что VirtualBox и докер HyperKit могут одновременно запускать виртуальные машины в OS X. Использование разных гипервизоров одновременно невозможно в Windows или Linux. Почему это работает на OS X?
1 ответ
Позвольте мне попытаться ответить на этот не очень простой вопрос.
Существует два типа гипервизоров, которые обобщены в Википедии:
Тип-1, нативные или голые металлические гипервизоры
Эти гипервизоры работают непосредственно на оборудовании хоста для управления оборудованием и управления гостевыми операционными системами. По этой причине их иногда называют железными гипервизорами.
Тип-2 или размещенные гипервизоры
Эти гипервизоры работают в обычной операционной системе (ОС) так же, как и другие компьютерные программы.
Hyper-V относится к типу 1, что означает, что после установки он становится компьютером. По сути, установка функции Hyper-V означает, что установленная версия Windows является просто виртуальной машиной, которой, однако, выделено 100% аппаратных ресурсов.
VirtualBox и VMWare для Windows относятся к типу 2, что означает, что они работают под Windows как обычные программы, в которых процессоры эмулируются как потоки, поэтому теоретически могут работать под гипервизором типа 1, таким как Hyper-V.
Проблема возникает, когда аппаратная виртуализация используется для эмуляции разнородных процессоров, а именно Intel VT-x и AMD-V. Такое оборудование требуется для эмуляции, например, 32-разрядного процессора на 64-разрядном компьютере.
Аппаратная виртуализация может иметь только одного владельца (или пользователя). Это означает, что только один гипервизор может использовать его одновременно и исключает использование двух гипервизоров типа 2, работающих на одном компьютере.
Кроме того, специально для упомянутого Docker, это не гипервизор. Как объясняет Вкипедия:
Docker - это компьютерная программа, которая выполняет виртуализацию на уровне операционной системы, также известную как "контейнеризация".
Docker не выполняет эмуляцию процессора или устройства, но предоставляет тонкий слой для преобразования вызовов операционной системы в контейнерах в вызовы операционной системы хоста. Контейнеры очень ограничены в том, насколько их операционная система может отличаться от операционной системы хоста, поскольку она должна быть достаточно схожей для простой и легкой трансляции вызовов. Поэтому Docker не конфликтует с гипервизорами при использовании оборудования.