Операционные системы

Виртуализация

Один физический сервер с 64 ядрами простаивает на 95%. Электричество жжётся, охлаждение работает, а CPU почти спит. Виртуализация превращает один сервер в десятки изолированных машин, каждая со своей OS, запущенных на одном железе. Это революция, изменившая индустрию: от огромных дата-центров до облачных гигантов AWS, Google Cloud.

  • **AWS EC2 - фундамент облаков.** Amazon сдаёт в аренду вычислительные мощности. На одном физическом сервере работают VM десятков клиентов, изолированные, безопасные. Без виртуализации облака были бы невозможны - экономика не сходилась бы.
  • **Docker изменил разработку.** «На моей машине работает!» - кошмар DevOps. С Docker упаковываешь приложение + зависимости в контейнер, запускаешь одинаково на ноутбуке, staging, production. Netflix деплоит тысячи микросервисов в контейнерах ежедневно.
  • **Безопасность через изоляцию.** Google Chrome запускает каждую вкладку в изолированном процессе (sandbox). Эксплойт в одной вкладке не затронет другие. Это виртуализация на уровне процессов - защита через изоляцию.

Цели урока

  • Различать Type 1 (bare-metal: ESXi, Xen, KVM) и Type 2 (hosted: VirtualBox, Parallels)
  • Знать hardware-assisted: Intel VT-x и AMD-V для VMexit/VMresume
  • Сравнить VM (full OS) и контейнер (shared kernel) по cost/isolation/density
  • Понимать paravirtualization: гостевая OS знает что виртуализирована (Xen PV)
  • Объяснить live migration: перенос running VM между хостами без downtime

Концепция виртуализации

**Виртуализация** - это техника создания виртуальной версии ресурса: компьютера, операционной системы, устройства хранения или сетевого ресурса. Вместо одного физического сервера получаем несколько изолированных виртуальных машин (VM).

Виртуализация как многоквартирный дом

Физический сервер - огромный особняк. Без виртуализации весь особняк занимает одна семья (одна OS). **С виртуализацией** особняк превращается в многоквартирный дом: каждая квартира (VM) изолирована, имеет свои стены, электричество, воду. Соседи не мешают друг другу, но делят общий фундамент (железо).

**Ключевая идея:** виртуальная машина думает, что она работает на реальном железе. На самом деле между VM и процессором стоит **гипервизор** - программа, которая эмулирует или виртуализирует аппаратуру.

**Зачем виртуализация:** - **Изоляция:** сбой в одной VM не влияет на другие - **Утилизация:** один сервер → 10+ VM вместо простоя - **Гибкость:** можно запустить Linux, Windows, BSD на одном железе - **Миграция:** VM легко перенести между серверами - **Экономия:** меньше физических серверов = меньше энергии, охлаждения

**История виртуализации:** идея родилась в 1960-х в IBM для мейнфреймов. Цель - дать каждому пользователю «свой компьютер», не покупая 100 физических машин. Технология **VM/370** (1972) позволяла запускать множество копий OS на одном мейнфрейме.

Виртуализация возродилась в 2000-х благодаря VMware, KVM, Xen. Причина: серверы стали слишком мощными для одной задачи. Зачем покупать сервер с 64 ядрами для веб-сайта, который загружает CPU на 2%?

AWS EC2 - виртуализация в облаках

Amazon EC2 (Elastic Compute Cloud) - это виртуализация в промышленных масштабах. У Amazon тысячи физических серверов. Аренда EC2 инстанса даёт **виртуальную машину** на одном из этих серверов. Снаружи это выглядит как отдельный компьютер, но на самом деле на том же железе могут работать десятки других VM.

Какое ключевое преимущество виртуализации позволило облачным провайдерам (AWS, Google Cloud) предлагать дешёвые вычисления?

Гипервизоры: Type 1 vs Type 2

**Гипервизор (hypervisor, VMM - Virtual Machine Monitor)** - это программа, которая создаёт и управляет виртуальными машинами. Существует два типа гипервизоров с радикально разной архитектурой.

**Type 1 (Bare Metal):** - Работает **напрямую на железе**, без host OS - Примеры: VMware ESXi, Microsoft Hyper-V, Xen, KVM - Используется в дата-центрах, облаках **Type 2 (Hosted):** - Работает **поверх обычной OS** (Windows, macOS, Linux) - Примеры: VMware Workstation, VirtualBox, Parallels Desktop - Используется разработчиками, для тестирования

**Type 1 (Bare Metal) - профессиональный уровень:** Гипервизор загружается как операционная система, получает полный контроль над железом. Нет промежуточной OS - минимальный overhead. **VMware ESXi** занимает всего ~150 MB, но управляет терабайтами RAM и сотнями ядер.

VMware ESXi в production

Компания хочет запустить 50 виртуальных серверов. Покупает 5 физических серверов, устанавливает на каждый ESXi. Гипервизор загружается за 30 секунд, получает доступ к железу, создаёт 10 VM на каждом хосте. Нет Windows Server или Linux под гипервизором - только тонкий слой виртуализации. Это даёт максимальную производительность.

**KVM (Kernel-based Virtual Machine)** - интересный гибрид. Технически это Type 1, но работает как модуль ядра Linux. Linux превращается в гипервизор! Используется в Google Cloud, OpenStack.

**Type 2 (Hosted) - для разработки и тестирования:** Гипервизор работает как обычная программа в host OS. Удобно для разработчиков: можно запустить Windows VM на macOS, чтобы протестировать приложение. Но медленнее из-за двойного overhead.

VirtualBox для разработчиков

Сценарий: код пишется на macOS, но приложение должно работать на Linux. Устанавливается VirtualBox, создаётся Ubuntu VM. Запуск VM, установка зависимостей, тестирование кода. VM работает в окне macOS, можно переключаться между системами. Это Type 2: VirtualBox - приложение в macOS, под ним крутятся виртуальные машины.

**Интересные факты:** - **Xen** использовался Amazon EC2 до 2017, затем перешли на KVM (Nitro System) - **Hyper-V** встроен в Windows 10 Pro/11 Pro - можно запустить Linux VM без сторонних программ - **Apple Hypervisor Framework** - встроенный Type 1 гипервизор в macOS (используется Parallels, Docker Desktop)

**Nested virtualization** - VM внутри VM. Например, запустить VirtualBox внутри VMware VM. Медленно, но полезно для тестирования самих гипервизоров. Требует поддержку от CPU и гипервизора.

Компания выбирает гипервизор для production серверов, где критична максимальная производительность и плотность VM. Какой тип гипервизора оптимален?

Аппаратная виртуализация

В начале 2000-х виртуализация была медленной - гипервизор перехватывал каждую инструкцию guest OS, эмулировал её. **Intel VT-x (2005)** и **AMD-V (2006)** добавили аппаратную поддержку виртуализации в процессоры, ускорив VM в 10-100 раз.

**Проблема без аппаратной поддержки:** Процессоры x86 имеют привилегированные инструкции (доступ к портам I/O, управление памятью), которые может выполнять только kernel mode (Ring 0). Но guest OS в VM тоже хочет быть в Ring 0! Конфликт.

**Binary Translation (старый метод VMware):** Гипервизор сканирует код guest OS, находит привилегированные инструкции, **переписывает их на лету** в безопасные вызовы. Медленно, но работает без поддержки CPU.

**Paravirtualization (Xen):** Гостевая OS **модифицируется** - вместо привилегированных инструкций вызывает hypercalls (аналог syscalls, но к гипервизору). Быстрее binary translation, но требует изменений в guest OS.

**Intel VT-x / AMD-V (Hardware-Assisted Virtualization):** Процессор добавляет новое кольцо **Ring -1** для гипервизора. Guest OS работает в настоящем Ring 0, но процессор автоматически перехватывает критичные операции и передаёт гипервизору. Никаких модификаций guest OS не требуется!

**Extended Page Tables (EPT) / Nested Page Tables (NPT):** До EPT гипервизор вручную транслировал адреса: guest virtual → guest physical → host physical. С EPT процессор делает это аппаратно, в **одно обращение к памяти**.

**Технологии аппаратной виртуализации:** **Intel:** - VT-x: виртуализация CPU - EPT: виртуализация памяти - VT-d: виртуализация I/O (прямой доступ VM к PCI устройствам) **AMD:** - AMD-V: виртуализация CPU - NPT (RVI): виртуализация памяти - AMD-Vi (IOMMU): виртуализация I/O

GPU Passthrough - виртуализация видеокарты

С VT-d можно **пробросить физическую видеокарту** напрямую в VM. Gamer запускает Windows VM на Linux хосте, пробрасывает Nvidia RTX в VM, играет с нативной производительностью! Это называется **PCI Passthrough** или **VFIO**. Видеокарта полностью принадлежит VM, host OS её не видит.

Аппаратная виртуализация превратила VM из «медленной игрушки» в production-ready технологию. Современные VM работают с overhead всего 2-10% по сравнению с native OS.

Почему аппаратная виртуализация (VT-x/AMD-V) даёт такой прирост производительности по сравнению с Binary Translation?

Контейнеры vs Виртуальные машины

**Контейнеры (Docker, Podman)** - это более лёгкий вид виртуализации. Вместо эмуляции целой машины контейнеры изолируют процессы на уровне операционной системы, деля одно ядро.

**Ключевое отличие:** VM эмулируют железо (каждая VM имеет свой kernel), контейнеры делят kernel хоста, изолируя процессы через **namespaces** и **cgroups**.

**VM vs Containers:** **Виртуальные машины:** - ✅ Полная изоляция (разные OS, kernels) - ✅ Безопаснее (гипервизор - дополнительный барьер) - ✅ Можно запустить Windows на Linux хосте - ❌ Тяжёлые (гигабайты диска, сотни MB RAM) - ❌ Медленный старт (минуты) **Контейнеры:** - ✅ Лёгкие (мегабайты, десятки MB RAM) - ✅ Быстрый старт (миллисекунды) - ✅ Портируемость (один образ работает везде) - ❌ Делят kernel хоста (только Linux контейнеры на Linux) - ❌ Слабее изоляция (уязвимость kernel затронет все контейнеры)

**Linux Namespaces** - механизм изоляции ресурсов. Каждый контейнер получает свой view системы:

**Control Groups (cgroups)** - ограничение ресурсов контейнеров:

Docker в production - Netflix, Spotify

**Netflix** запускает тысячи микросервисов в Docker контейнерах на AWS. Каждый сервис: рекомендации, стриминг, биллинг - изолированный контейнер. Новая версия сервиса? Соберём новый образ, задеплоим за секунды. Откат при проблемах - мгновенный (вернуться к старому образу). Контейнеры дают скорость разработки и деплоя, недостижимую с VM.

**Когда использовать VM, когда контейнеры?**

**Используй VM когда:** - Нужны разные OS (Windows + Linux) - Требуется максимальная изоляция (безопасность, compliance) - Legacy приложения с зависимостями от kernel - Долгоживущие stateful сервисы **Используй контейнеры когда:** - Микросервисная архитектура - CI/CD - быстрые деплои - Stateless приложения - Нужна высокая плотность (100+ контейнеров на хосте)

Гибридный подход - VM + Containers

Многие компании используют **оба** подхода: создают VM для изоляции команд/проектов, внутри каждой VM запускают десятки контейнеров. Например, AWS Fargate запускает Docker контейнеры, но каждый в своей микро-VM (Firecracker) для дополнительной безопасности.

**Будущее:** технологии сближаются. **Kata Containers** запускают контейнеры в лёгких VM (микросекунды старта). **Firecracker** (AWS) - микро-VM за 125ms. **gVisor** (Google) - userspace kernel для контейнеров. Грань между VM и контейнерами стирается.

Контейнеры - это просто лёгкие виртуальные машины, они работают одинаково.

Контейнеры и VM - принципиально разные технологии. VM виртуализируют железо (каждая имеет свой kernel), контейнеры изолируют процессы, деля один kernel хоста.

Это распространённое заблуждение приводит к неправильному выбору технологии. VM дают полную изоляцию (можно запустить Windows на Linux хосте), но тяжёлые и медленные. Контейнеры быстрые и лёгкие, но делят kernel - нельзя запустить Windows контейнер на Linux хосте без VM. Контейнер - это не «урезанная VM», это **изолированный процесс** с собственным view системы через namespaces. Понимание этой разницы критично для архитектурных решений: для legacy монолитов с разными OS нужны VM, для cloud-native микросервисов - контейнеры.

Ключевые идеи

  • **Виртуализация создаёт иллюзию множества компьютеров на одном железе.** VM думают, что работают на реальном CPU/RAM/диске, но гипервизор делит ресурсы между ними. Это даёт изоляцию, высокую утилизацию, гибкость.
  • **Type 1 (bare metal) vs Type 2 (hosted) гипервизоры.** Type 1 работает напрямую на железе (ESXi, KVM) - максимальная производительность для production. Type 2 работает поверх host OS (VirtualBox) - удобен для разработки, но медленнее.
  • **Аппаратная виртуализация (VT-x/AMD-V) ускорила VM в 10-100 раз.** CPU добавили Ring -1 для гипервизора, EPT/NPT для трансляции памяти. Guest OS работает в настоящем Ring 0, процессор автоматически перехватывает критичные операции.
  • **Контейнеры vs VM - разные цели.** VM виртуализируют железо (полная изоляция, тяжёлые), контейнеры изолируют процессы (лёгкие, быстрые, но делят kernel). VM для legacy и безопасности, контейнеры для микросервисов и CI/CD.

Связанные темы

Виртуализация связана с множеством областей Computer Science и системной инженерии:

  • Управление памятью — Гипервизор управляет физической памятью, создавая иллюзию независимой RAM для каждой VM. EPT/NPT - аппаратная трансляция guest физических адресов в host физические.
  • Процессы и планирование — Гипервизор - это scheduler для VM: распределяет CPU время между виртуальными машинами, как OS распределяет между процессами.
  • Контейнеры и изоляция — Linux namespaces и cgroups - механизмы изоляции процессов, лежащие в основе Docker. Альтернатива VM для cloud-native приложений.
  • Облачные вычисления — AWS, Google Cloud, Azure построены на виртуализации. IaaS (Infrastructure as a Service) предоставляет VM по требованию.

Вопросы для размышления

  • Почему облачные провайдеры мигрируют с Xen на KVM (AWS Nitro), хотя обе - Type 1 гипервизоры? Какие преимущества даёт KVM?
  • Нужно запустить 1000 микросервисов. Посчитать ресурсы: VM (1 GB RAM каждая) vs контейнеры (50 MB каждый). Какая экономия?
  • Docker контейнеры делят kernel хоста. Что произойдёт, если в kernel найдут критическую уязвимость? Как это влияет на безопасность контейнеризированных приложений?

Связанные уроки

  • os-08-virtual-memory — Nested paging - виртуализация виртуальной памяти
  • os-02-processes — VM для OS то же, что процесс для программы - изолированный контекст
  • os-19-containers — Контейнеры - более лёгкая альтернатива полной виртуализации
  • arch-10-virtual-memory
Виртуализация

0

1

Войти

Startup разрабатывает микросервисное приложение: 20 сервисов на Node.js, Python, Go. Нужны частые деплои (10+ раз в день), быстрое масштабирование, минимальные затраты на инфраструктуру. Что выбрать?