Виртуальная машина для программирования
Разработка стековой виртуальной машины и компилятора под неё (часть I)
В универе преподаватели, молодость которых приходилась на 70-80е годы, до объектно-ориентированного программирования убивались по теме разработке собственных языков (интерпретаторов, компиляторов) под предметные области. Всё это казалось невостребованным «старьём», но появление новых языков за последнее десятилетие (Go, Kotlin и множества других) повысили мой интерес к этой теме.
Решил в качестве хобби написать 32-bit стековую виртуальную машину и компилятор C подобного языка под неё, чтобы восстановить базовые навыки. Такая классическая Computer Science задачка для заполнения вечеров с пивом. Как предприниматель, я четко понимаю, что она никому не нужна, но такая практика нужна мне для эстетического инженерного удовольствия. Плюс когда об этом рассказываешь сам понимаешь глубже. С целью и мотивами определился. Начнём.
Так как это виртуальная машина, мне нужно определиться с её характеристиками:
CPU: 32-bitный набор команд, так как машина стековая, в основном операнды команд храним в стеке, из регистров только IP (Instruction Pointer) и SP (Stack Pointer), пока работаем с целыми числами со знаком (__int32), позже добавим остальные типы данных.
RAM: пусть памяти пока будет 65536 ячеек по 32-bit`а. Которую организуем просто. С нижних адресов в верх будут идти код (code/text) и данные (data, heap), а с верхних адресов вниз будет расти стек (stack). Дёшево и сердито.
Предусмотрим вот такие операции:
Пока первые 8 из 32 бит будут под команду (opcode), 1 бит зарезервируем под тип операнда (immediate или из стека), 3 бита под будущие типы данных (byte, short, int, long, char, float, double и что нибудь ещё), а остальные биты для чего нибудь применим. Пока не знаю.
В классе виртуальной машине сделаем такие методы, чтобы загружать исполняемый образ в память виртуальной машины (loadImage), запускать исполнение (run), позволять снаружи читать/писать память (readWord, writeWord), читать состояние регистров IP, SP. Из приватных методов сделаем вывод состояния машины printState (распечатка регистров и содержания стека), а также метод для системных вызовов systemCall, чтобы код виртуальной машины мог вызывать что-то снаружи (сделаем проброс какого-нибудь API).
В итоге получаем простенькую машину, которая умеет в арифметические и битовые операции, управлять ходом исполнения с условными переходами, вызывать функции (пока четкой конвенции по передачи аргументов через стек нет, но дальше доделаем).
Еще нам потребуется реализовать класс с помощью которого мы будем готовить исполняемый образ. Прикрутим к нему простые методы, которые будут записывать команды и данные, чтобы потом можно было этот образ «скормить» виртуальной машине.
И теперь можно попробовать сделать простенькую программу с циклом и вызовом функции, которая печатает «Hello, world from VM!» 10 раз, чтобы проверить, что виртуальная машина более менее работает. На ассемблере виртуальной машины (мнемоники пока будут очень условные, синтаксис до конца не придумал) это программа будет выглядеть примерно так:
Сейчас лень писать под эту задачу транслятор для ассемблера виртуальной машины, потому что делаем высокоуровневый язык, который будем сходу компилировать в команды виртуальной машины. Но чтобы это записать в исполняемый виртуальной машиной образ воспользуемся классом VMImage:
А затем запустим исполнение нашего образа на виртуальной машине, замерив время:
Получаем в консоли:
Ура! Классно! Работают операции со стеком, арифметика, команды условных переходов и вызов функций! Это воодушевляет. Видимо дальше буду развивать эту историю.
Виртуальная машина своими руками
Иногда в голову приходит какая-то мысль избавиться от которой очень сложно. Такое произошло и со мной.
Я решил создать виртуальную машину (VM), учитывая то, что на тот момент у меня не было идей, мне показалось, что это прекрасная мысль. Если вы заинтересовались, то вперёд под кат!
Теория
Для начала немного теории. Что вообще такое виртуальная машина? Это программа или набор программ, позволяющий эмулировать какую-нибудь аппаратную платформу, проще говоря эмулятор компьютера.
Сами по себе виртуальные машины бывают разные, к примеру Virtual Box – это классическая виртуальная машина позволяющая эмулировать самый настоящий компьютер, а вот к примеру JVM (виртуальная машина Java) такого не может.
Мой вариант VM будет чем-то схож с JVM просто потому, что это более обучающий проект, нежели направленный на создание мощной VM.
Память
Итак, а теперь давайте разберёмся с памятью. Для создания памяти я решил использовать массив unsigned int. Размер массива определим при помощи макроса, в моём варианте размер памяти равен 4096 байт (в массиве 1024 элемента, а так-как на большинстве платформ под данные типа unsigned int выделяется 4 байта то 1024*4 = 4096), помимо прочего определим 8 регистров по 8 ячеек в каждом это будет уже 256 байт (8*8*4 = 256). Выглядит это так:
Программирование
Память у нас есть, а как теперь писать код под нашу VM? Сейчас мы этим вопросом и займёмся, для начала определим команды которые наша машина будет исполнять:
Каждая команда имеет свой флаг, определяющий некоторые дополнительные параметры
опишем флаги:
Стандартная команда имеет вид: [команда] [флаг] [данные] (вид некоторых команд может отличаться), основываясь на этом напишем простой интерпретатор:
indxX & indxY – это переменные хранящие текущую позицию курсора в регистре reg.
сell – это переменная хранящая текущую позицию курсора в массиве memory.
Но программирование цифрами это не слишком удобно поэтому при помощи препроцессора C опишем наш ассемблер. Я понимаю что написание asm посредством макросов это не очень хорошо, но данное решение временное.
Код нашего asm выглядит так:
memIndx – это переменная хранящая текущую позицию курсора в массиве memory.
А вот код на нашем asm кладущий 123 в регистр по адресу [1][0] (первый регистр, нулевая ячейка):
Поздравляю, теперь у нас есть подобие asm для нашей машины!
Запуск программ
Нам удалось заставить нашу машину исполнять программы, но коду не хватает переносимости с одной машины на другую, поэтому сейчас мы займёмся созданием генератора машинного кода из asm (а я напомню что в отличие от настоящих компьютеров наша машина имеет машинный код представленный не в виде двоичных, а десятичных чисел), в принципе это не так сложно, но для начала давайте продумаем реализацию.
Перейдём от слов к делу:
Чтение кода и запись его в файл:
Код является частью тела функции ncpGen().
Чтение файла и его исполнение:
Если что, то в статье представлен не весь код, а только его небольшая часть!
Виртуальные машины и микроконтроллеры
Разрабатывая разные устройства, очень часто получаешь проблему: алгоритм от устройства к устройству местами повторяется, а сами устройства полностью разные. У меня три разрабатываемых устройства, которые местами повторяют функционал друг друга, в них используются три разных процессора (три разные архитектуры), но алгоритм один. Чтобы хоть как-то все унифицировать, было задумано написать минимальную виртуальную машину.
В целом, я смотрел в сторону байт-код машин Java, Lua и других, но весь имеющийся багаж особо переписывать на другой язык не хотелось. Так что с языком определились — Си. Хотя Java или Lua все еще заманчиво звучит. [1][2][3][4].
Следующим критерием шел компилятор. Я в своих проектах чаще всего использую «написанный студентами за печеньки GCC (с) анонимус». Т.е. если описывать свою какую-то архитектуру, к ней бы пришлось еще придумывать всю связку из GCC (Компилер, линковщик и т.д.).
Так как я человек ленивый, искал минимально возможную архитектуру с поддержкой GCC. И ею стала MSP430.
Краткое описание
MSP430 — очень простая архитектура. Она имеет всего 27 инструкций [5] и практически любую адресацию.
Постройку виртуальной машины начал с контекста процессора. Контекстом процессора в операционных системах называют структуру, которая полностью описывает состояние процессора. А состояние данного виртуального процессора описывается через следующее:
Более детально про регистры можно почитать в оригинальном user guide msp430x1xxx [6]. Кроме регистров есть еще содержимое адресного пространства — ОЗУ, ПЗУ. Но так как просто держать в памяти «Хост-машины» (машина, выполняющая код виртуальной машины) память виртуальной машины, за частую, нету смысла — используются callback.
Данное решение позволяет исполнять «совершенно левые» программы на процессорах с гарвардской архитектурой (читай AVR [7][8]), беря программу из внешних источников (Скажем, i2c память или SD карта).
Также в контексте процессора имеется описание регистров прерываний (SFR). Наиболее точно система прерываний MSP430 описана в [6] п. 2.2.
Но в описываемой виртуальной машине я немного отошел от оригинала. В оригинальном процессоре флаги прерываний находятся в регистрах периферии. В данном случае прерывания описывается в SFR регистрах.
Периферия процессора описывается так же, через callback-и, что позволяет создавать свою собственную периферию по желанию.
Следующим пунктом процессора является мультиплексор команд. Мультиплексор команд выполняет отдельная функция. Мультиплексор выбирает из слова команды саму команду, адресацию источника и приемника и выполняет действие выбранной команды.
Отдельными функциями описывается адресация источника (SRC) и приемника.
Как этим пользоватся
В файле Cpu.h выполняется настройка процессора.
Описание настроек ниже:
Использование библиотеки начинается с подключения cpu.c и cpu.h в проект.
Далее идет обьявление контекста процессора. В зависимости от использования параметров *_USE_CALLBACKS будет меняться код объявления контекста.
для всех *_USE_CALLBACKS = 1 объявления контекста процессора будет выглядеть следующим образом:
Где переменные *_cb принимают указатели на функции (см. примеры).
Наоборот же, для *_USE_CALLBACKS = 0, объявления будут выглядеть так:
Далее идет инициализация контекста через функцию:
И выполнение по одной инструкции за раз через функцию:
Callback-и для работы с адресным пространством выглядят следующим образом:
Адреса для IO передаются относительно 0 адресного пространства (т.е. если в программа виртуальной машины обратится к P1IN, который назначен на адрес 0x20, то и в функцию будет передан адрес 0x20).
Напротив, адреса для RAM и ROM передаются относительно начальных точек (например, при обращение по адресу 0xfc06 и началом ПЗУ по адресу 0xfc00 в функцию будет передан адрес 0x0006. Т.е адрес от 0 до RAM_SIZE, 0 — ROM_SIZE)
Это позволяет использовать внешнюю память, к примеру I2C (что и без того замедляет процессор).
Как завершение
Полностью проект не завершен. Он работает, тестовые прошивки работают на ура. Но большинство компиляторов практически не используют разные специфические команды (скажем, Dadd — десятичное сложение источника и приёмника (с переносом)). Так что говорить о 100% совместимости с реальными процессорами не приходится.
Естественно, на одну команду виртуальной машины приходится с два десятка операций хост-машины, поэтому говорить о каких-либо скоростных характеристиках бессмысленно.
Исходники проекта и более расширенное описание доступно на bitbucket.org [9].
Буду рад, если кому-нибудь пригодится данный проект.
Пишем регистровую машину
Что-то давно я не писал в свой блог. Нужно исправлять данное недоразумение.
И сегодня в программе: регистровая виртуальную машину на языке Rust.
Введение
На написание собственной упрощенной версии меня вдохновили несколько статей с хабра, ссылки на них смотри в разделе Полезные ссылки.
Но для начала давайте определимся с терминалогией с помощью вики.
Виртуальная машина (VM, от англ. virtual machine) — программная и/или аппаратная система, эмулирующая аппаратное обеспечение некоторой платформы (target — целевая, или гостевая платформа) и исполняющая программы для target-платформы на host-платформе (host — хост-платформа, платформа-хозяин) или виртуализирующая некоторую платформу и создающая на ней среды, изолирующие друг от друга программы и даже операционные системы (см.: песочница); также спецификация некоторой вычислительной среды (например: «виртуальная машина языка программирования Си»).
В общем разработанная нами программа не является в полной мере виртуальной машиной, а скорее всего её стоит называть интерпретатором кода. Эти разбирательства в терминологии я оставляю на читателя.
Давайте теперь перейдём к определение стековой машины — в общем говоря их два вида: стековая и регистровая и исходя из названий можно понять, что стековая машина использует для расчёт стек, а регистровая регистры… Но это не совсем так, в основном стековая использует только стек, а вот регистровая может использовать регистры и стек. Но это опять же терминологические фишки.
Мы же в своей реализации будем использовать только регистровую модель.
Вроде определились со всеми важными аспектами и теперь можно перейти к примеру, на котором будем проводить тесты.
Тестовый пример
Наша задачка основана на Гипотезе Коллатца и звучит вот так:
В нашем же примере будем делать расчёт от единицы до миллиона и для интереса реализуем её на нескольких языках:
Также стоит уточнить, что реализацию будем делать наивную чтобы не мучится с оптимизацией, да и это не самоцель для данного поста.
Алгоритм нахождения длины цепочки
Вы могли заметить, что в блоке с “иначе” мы делаем сразу два шага и вы будете правы. Это небольшая оптимизация, на которую я пошёл 🙂
Реализация на Python
На Python код будет выглядеть следующим образом:
Остаётся только перебрать все значения от 1 и до 1_000_000 включительно и выбрать максимально длинную цепочку, что можно сделать вот так:
Реализация на Rust
Реализация на виртуальной машине
Приступим к самому интересному, а именно к коду для виртуальной машины.
Я буду полагаться на Intel-подобный синтаксис ассемблера, т.к. он намного привычнее выглядит чем от AT&T.
И да, программа будет на ассемблере, так как его опкоды с операндами намного легче парсить, чем любой императивный язык программирования.
Сначала произведём инициализацию регистров необходимыми значениями
Определим внешний цикл от for
И последующий за ней блок с “функцией”
Внутренний цикл while выглядит немного мудрено, но это по сути прямой перенос питоновского кода на ассемблер
Остаётся только выбрать максимальное значение цепочки и вывести на печать значение, если обход закончен
Реализация интерпретатора
Так как я не очень хочу реализовывать весь функционал какого-то процессора, то ограничимся небольшим набором команд, который нужен нам для решения задачки.
Исходя ранее написанного кода можно выделить следующий набор команд:
Здесь F1 и F2 два регистровых флага, о которых поговорим позднее.
Теперь давайте определимся с работой нашего интерпретатора, то есть с шагами которые он должен выполнить:
Давайте для начала определим сущность виртуальной машины
Для упрощения написания программы регистр флагов у нас представляется только двумя значениями, хотя всегда можно реализовать весь их набор.
Установку флагов F1 и F2 будем делать вот таким образом — при сравнении двух значений с помощью опкода cmp :
здесь #1 — первый операнд, #2 — второй операд.
Теперь можно определить перечисление с нашим набором команд
Теперь остаётся только описать скелет программы
Остаётся только реализовать два недостающих блока по парсингу и интерпретации кода.
В коде это выглядит вот так:
А теперь к коду инструкций, которые очень просты в реализации
Остаётся парсинг кода, который я разбил на несколько шагов:
Чтение файла и разбор на отдельные блоки реализуется в пару строк
Далее проходимся по списку инструкций и вычленяем из него метки
Ну и собственно парсинг инструкций
Вот и всё, наш интерпретатор готов, теперь можно перейти к тестам!
Тесты
На моей машине с процессором i5-8265U примеры выполняются за следующее время:
В идеале нужно было произвести как минимум запусков по 10 для каждого примера и взять среднее, но это же не исследовательская работа!
Мы здесь чисто по фану собрались, а те кто хочет всегда смогут сами его провести.
Заключение
Вот так просто и незатейливо можно написать самую простой регистровый интерпретатор кода.
Весь исходный код доступен по ссылке
На этом сегодня всё, увидимся ещё через пару лет!
Что такое виртуальная машина и зачем она нужна
Выясняем, что представляют собой виртуальные машины, как ими пользоваться и зачем они вообще нужны.
Что такое виртуальная машина?
Виртуальная машина (ВМ, VM) – это виртуальная среда, работающая как настоящий компьютер, но внутри другого компьютера. Если выражаться проще, то это приложение, которое имитирует компьютер с полноценной операционной системой и аппаратным обеспечением.
Она запускается на изолированном разделе жесткого диска, установленного в компьютере-хосте (так называют системы, в рамках которых запускают ВМ). Благодаря виртуальным машинам пользователи могут тестировать программное обеспечение в различных окружениях (системах, конфигурациях и т.п.) на своем ПК без необходимости запускать и настраивать отдельное устройство.
Как работают виртуальные машины?
Определение виртуальной машины дает базовое понимание того, как все устроено, но мы пойдем чуть дальше. Запуск VM возможен благодаря технологии виртуализации. Она позволяет использовать существующее «железо» для создания его виртуальных копий. Виртуализация имитирует аппаратное обеспечение в цифровом виде для запуска нескольких полноценных операционных систем на одном компьютере поочередно или одновременно. Физическое «железо» в этом случае называется хостом, а виртуальное – гостевой ОС.
Весь процесс управляется приложением, которое называют гипервизором. Гипервизор отвечает за распределение физических ресурсов между виртуальными системами, выделении определенного количества оперативной памяти или пространства на жестком диске. Также он контролирует все процессы, запущенные в гостевых ОС, чтобы не произошло избыточной нагрузки и сбоев в работе систем из-за нехватки ресурсов.
Типы виртуальных машин
По типу ВМ делятся на виртуализацию процесса и виртуализацию ОС. В первом случае виртуальная машина отвечает только за работу конкретного приложения/процесса. По такому принципу работает язык программирования Java. Утилиты, написанные на нем, запускаются только в специальных виртуальных машинах – «прослойках» между аппаратной частью ПК и непосредственно приложением. Во втором случае речь идет об эмуляции полноценной системы.
Также ВМ иногда делят на категории по типу виртуализации:
Аппаратная виртуализация. Когда ВМ взаимодействует с физическим оборудованием ПК.
Программная. Когда виртуальная машина генерирует «новый ПК» на уровне ПО и использует его для запуска других систем.
Также есть виртуализация накопителей (когда несколько физических хранилищ данных объединяются в одно) и сети (когда несколько физически разных сетей формируют одну виртуальную).
Зачем нужны ВМ?
Виртуальные машины используются в бизнес-среде. Разработка большого количества сервисов сейчас не обходится без ВМ или контейнеров. Разработчики используют их, чтобы гарантировать легкую расширяемость продукта и высокую производительность независимо от количества пользователей.
Некоторые разработчики используют ВМ в утилитарных целях, чтобы проверять работоспособность своих проектов. А кто-то таким образом знакомится с новыми для себя операционными системами. Впрочем, обо всем подробнее.
Тестирование ПО
Благодаря виртуальным машинам, можно тестировать написанный код в различных операционных системах и графических средах, не используя для этого отдельные компьютеры.
Можно запустить на одном ПК несколько ВМ параллельно и запускать в них разрабатываемое приложение. С помощью виртуальных машин можно создать несколько «цифровых компьютеров» с различными характеристиками, чтобы узнать, как ваша программа/сервис будет работать на более слабых устройствах.
Разработка в безопасной среде
Иногда вести разработку на хостовой операционной системе небезопасно. Из-за прямого подключения к корпоративной сети, из-за активности других приложений либо из-за непредсказуемого поведения написанного кода.
Поэтому можно быстро и дешево (или даже бесплатно) организовать безопасную рабочую среду, где можно тестировать любой код, не переживая, что он как-то навредит основной системе или к нему кто-то получит доступ извне.
Виртуальную машину можно лишить доступа к некоторым компонентам ПК или к сети.
Знакомство и работа с новыми ОС
Используя ВМ, можно из праздного интереса установить на ПК какой-нибудь дистрибутив Linux или другую ОС. Неплохой вариант для тех, кто ничем кроме Windows не пользовался и хочет узнать, как там поживают пользователи Linux.
Еще один распространенный сценарий – установка Windows параллельно с macOS в качестве виртуальной машины, чтобы пользоваться эксклюзивными для системы Microsoft продуктами.
Развертывание дополнительных инстансов приложения
Виртуальные машины можно использовать для параллельного запуска нескольких инстансов (то есть действующих копий) одной программы. Это может быть полезно как на этапах тестирования, так и после запуска какого-либо онлайн-сервиса. По такому принципу (если говорить совсем уж обобщенно и абстрактно) работают контейнеры Docker.
Размещение ПО на удаленных серверах
Технологии виртуализации используются на хостинговых платформах. Например, VDS (или VPS) – это Virtual Dedicated Server, то есть виртуальный сервер, имитирующий реальное железо.
На одном физическом сервере несколько VDS запускаются параллельно и работают как отдельные компьютеры для вебмастеров, заплативших за услуги хостинг-провайдера.
Преимущества ВМ
Исходя из описанных выше сценариев применения, можно вывести три основных преимущества виртуальных машин над реальным аппаратным обеспечением:
ВМ можно установить на любой компьютер. ВМ поддерживают любые ОС, поэтому можно сэкономить окружающее пространство, деньги на покупку дополнительного оборудования и время на установку и настройку компьютеров.
На виртуальные машины можно устанавливать устаревшие операционные системы, поддерживающие разного рода архаичное программное обеспечение. Не придется содержать устаревшие компьютеры для их запуска и использования.
ВМ легче перезапустить/перенастроить и заново вернуть к работе в случае форс-мажора.
Недостатки ВМ
Из минусов виртуальных машин обычно выделяют два наиболее значимых. Во-первых, стабильность. Большое количество виртуальных машин, запущенных на одном устройстве, могут привести к снижению стабильности и скорости работы основной операционной системы. Хост-компьютер должен соответствовать высоким системным требованиям, что может дорого стоить и ограничивать пользователей в выборе форм-фактора устройства.
Во-вторых, производительность. Даже на мощных ПК виртуальные машины работают ощутимо медленнее, чем хост-система. Нет полноценного контакта ПО с аппаратным обеспечением. Поэтому заставить работать приложения в ВМ так же быстро, как на стандартной ОС, не получится.
Сравнение контейнеров с виртуальными машинами
Принципиальное отличие контейнеров от ВМ заключается в масштабе. Виртуальные машины имитируют полноценный ПК. В них устанавливается система для решения задач пользователя. Контейнеры созданы для изолированного запуска единичных приложений и зависимых компонентов, необходимых для запуска и работы этого приложения.
Контейнеры легче как в плане физического размера, так и в плане скорости освоения. Настроить контейнеры для решения задач бизнеса проще, а возможность взаимодействовать напрямую с ядром системы позволяет загружать изолированные программы быстрее.
Виртуальные же машины куда функциональнее и позволяют запускать в отдельном программном окружении большое количество систем, программ и т.п.
Лучшие программы для создания и настройки ВМ
Чтобы начать работу с виртуальными машинами, нужна специальная программа. Это инструмент, задействующий системные технологии виртуализации, чтобы использовать аппаратное обеспечение хост-системы для запуска дополнительных ОС в изолированном программном пространстве.
Их довольно много, но мы рассмотрим лишь несколько ключевых, использующихся чаще всего.
VirtualBox
Бесплатный продукт компании Oracle, позволяющий создавать ВМ на Windows, macOS и Linux. VirtualBox не обладает высокой производительностью и функционально отстает от конкурентов, но это та цена, которую необходимо заплатить за безвозмездное использование программы.
Ограничений по выбору ОС для запуска в VirtualBox почти нет. Можно найти образ практически любой операционной системы и спокойной установить ее в ВМ. Это касается даже проприетарных разработок компании Apple (но не всех; некоторые современные версии macOS все еще не поддерживаются).
В VirtualBox можно тонко настроить выделенные на ВМ ресурсы и выдать разрешение на использование гостевой системой тех или иных аппаратных составляющих.
VMWare Workstation
Продвинутое решение для профессионалов, нуждающихся в удобном и эффективном рабочем пространстве для виртуализации.
Из важных преимуществ VMWare Workstation стоит выделить поддержку Windows Hyper-V и кластеров Kubernetes. Первое позитивно сказывается на совместимости различных видов оборудования с системами, установленными в ВМ. Второе – позволяет создавать контейнеры и управлять ими из командной строки Windows и Linux.
Стандартная версия VMWare Workstation обойдется примерно в 15 тысяч рублей. Есть бесплатный тестовый период. Можно опробовать все функции утилиты в течение 30 дней.
Parallels Desktop
Лучшая утилита для создания и настройки ВМ на компьютерах Apple. Parallels Desktop – самый быстрый и эффективный способ запустить Windows или отдельные приложения для Windows в macOS.
Из важных плюсов PD стоит выделить тесную интеграцию с компонентами Windows. Можно запускать отдельные win-приложения в графической среде macOS, будто это нативные программы, а не утилиты из виртуальной машины.
В Parallels Desktop есть функция автоматической загрузки, установки и настройки ВМ. Нужно просто указать нужную ОС (на выбор есть Windows, Debian, Fedora, Ubuntu, Android и т.п.) и нажать на кнопку «Установить».
Базовая лицензия Parallels Desktop стоит 4788 рублей.
Microsoft Hyper-V
Microsoft Hyper-V – это встроенная в Windows технология виртуализации, объединенная с одноименным приложением для создания новых ВМ и работы с ними.
Для активации Hyper-V нужно установить последнюю версию Windows 10 Pro, а затем прописать в консоли Power Shell команду для активации технологии виртуализации.
Здесь, как и в случае с Parallels, есть функция быстрого создания виртуальных машин. Можно выбрать одну из предложенных систем (Windows, Ubuntu) или установить систему на выбор, загрузив подходящий образ из сети.
Плюсы Hyper-V кроются в тесной интеграции оного с другими компонентами Windows и аппаратным обеспечением компьютера. Это положительно сказывается на стабильности и производительности виртуальных машин.
Кроссплатформенный и быстрый эмулятор для запуска виртуальных машин. С помощью QEMU можно запускать Windows параллельно с Ubuntu или Fedora параллельно с macOS.
Также QEMU можно задействовать для виртуализации на серверных ПК. Поддерживается KVM-виртуализация для развертывания на удаленном компьютере сразу нескольких VDS.
Главное преимущество QEMU – высокая производительность. Разработчики обещают скорость работы гостевых ОС на уровне хост-систем.
Как настроить виртуальную машину?
Процесс настройки зависит от выбранного инструмента для создания ВМ. Почти всегда процесс упирается в выбор образа гостевой системы и установку параметров аппаратного обеспечения. Многие инструменты предлагают опции для быстрого запуска ВМ. Такие есть в VMWare Workstation, Parallels и Hyper-V.
Немного сложнее устроена программа QEMU. О том, как ее настроить, мы писали ранее.
Самый простой способ:
Заходим на сайт Oracle.
Скачиваем и устанавливаем VirtualBox.
Загружаем образ системы, которую нужно установить в ВМ (в формате ISO).
Запускаем VirtualBox и нажимаем кнопку «Создать новую…».
Указываем путь до ISO-файла с системой и жмем «Установить…».
Теперь с виртуальной системой можно работать, как с настоящей.
Вместо заключения
На этом все. Теперь вы знаете, что такое виртуальная машина и какие задачи она помогает решить. Но что еще важнее, теперь вы можете сами создать ВМ!