Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Виртуальная машина (Virtual Machine)
Что это такое?
Виртуальная машина (VM) — это программное обеспечение, которое эмулирует (имитирует) работу полноценного компьютера с собственным процессором, памятью, жёстким диском и операционной системой. Виртуальная машина работает внутри хоста (основного компьютера) и позволяет запускать одну или несколько операционных систем на одном физическом оборудовании.
ВМ создаёт полную изоляцию: каждая виртуальная машина работает независимо от других и от основной ОС.
Типы виртуализации
1. Полная виртуализация (Full Virtualization) Гипервизор полностью эмулирует аппаратное обеспечение:
┌─────────────────────────────────┐
│ Хостовая ОС (Windows) │
│ ┌──────────┬──────────┬──────┐ │
│ │ VM 1 │ VM 2 │ VM 3 │ │
│ │ Ubuntu │ CentOS │Windows││
│ │ (Linux) │ (Linux) │ │ │
│ └──────────┴──────────┴──────┘ │
│ (Гипервизор) │
└─────────────────────────────────┘
2. Паравиртуализация (Paravirtualization) ОС в ВМ знает о гипервизоре и взаимодействует с ним напрямую:
┌─────────────────────────────────┐
│ Хостовая ОС (Linux) │
│ ┌──────────────────────────┐ │
│ │ KVM / Xen гипервизор │ │
│ │ (паравиртуализованные) │ │
│ │ VMs с модифицированным │ │
│ │ ядром │ │
│ └──────────────────────────┘ │
└─────────────────────────────────┘
Популярные гипервизоры
Type 1 (Bare Metal) — запускаются напрямую на оборудовании:
- ESXi (VMware) — для корпоративных систем
- Hyper-V (Microsoft) — встроена в Windows Server
- KVM (Kernel-based Virtual Machine) — встроена в Linux
- Xen — открытый исходный код
Type 2 (Hosted) — работают внутри операционной системы:
- VirtualBox (Oracle) — бесплатная, для всех ОС
- VMware Workstation / Fusion — коммерческая
- Parallels (macOS) — для Mac
- QEMU (Quick Emulator) — открытый исходный код
Пример: VirtualBox
На Windows/Mac/Linux можно установить виртуальную машину:
# Создание новой VM через командную строку (VirtualBox)
VBoxManage createvm --name "Ubuntu" --ostype Ubuntu_64
# Выделение ресурсов
VBoxManage modifyvm "Ubuntu" --cpus 4 --memory 4096
# Создание жёсткого диска
VBoxManage createmedium disk --filename "Ubuntu.vdi" --size 50000
# Подключение диска к VM
VBoxManage storageattach "Ubuntu" --storagectl "SATA" --port 0 --device 0 --type hdd --medium "Ubuntu.vdi"
# Запуск VM
VBoxManage startvm "Ubuntu" --type headless
Python и VM: управление через libvirt
import libvirt
# Подключение к локальному KVM
conn = libvirt.open('qemu:///system')
# Получение списка виртуальных машин
dom_ids = conn.listDomainsID()
for dom_id in dom_ids:
dom = conn.lookupByID(dom_id)
print(f"VM: {dom.name()}, Статус: {'running' if dom.isActive() else 'stopped'}")
# Запуск VM
dom = conn.lookupByName("my-ubuntu-vm")
if not dom.isActive():
dom.create()
print("VM запущена")
# Остановка VM
if dom.isActive():
dom.shutdown()
print("VM остановлена")
conn.close()
Контейнеры vs Виртуальные машины
Виртуальная машина:
┌─────────────────────┐
│ Приложение │
│ ┌────────────────┐ │
│ │ Гостевая ОС │ │
│ │ (Ubuntu) │ │
│ └────────────────┘ │
│ ┌────────────────┐ │
│ │ Гипервизор │ │
│ └────────────────┘ │
└─────────────────────┘
Хостовая ОС + оборудование
Контейнер (Docker):
┌─────────────────┐
│ Приложение │
│ + библиотеки │
│ + зависимости │
└─────────────────┘
Ядро хостовой ОС
| Критерий | VM | Контейнер |
|---|---|---|
| Размер | 1-10 ГБ | 10-100 МБ |
| Время запуска | Минуты | Секунды |
| Изоляция | Полная | Частичная (делят ядро) |
| Производительность | ~95% хоста | ~99% хоста |
| Использование ресурсов | Высокое | Низкое |
Практический пример: Python на VM
# На хостовой машине
import subprocess
import time
# Запуск VM с Ubuntu
vm_name = "dev-environment"
subprocess.run(["VBoxManage", "startvm", vm_name])
# Ждём загрузки
time.sleep(10)
# SSH подключение к VM
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.100', username='user', password='pass')
# Запуск Python скрипта в VM
stdin, stdout, stderr = ssh.exec_command('python3 /home/user/script.py')
print(stdout.read().decode())
ssh.close()
Создание собственного образа VM
# Загрузка базового образа Linux
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
# Создание VM из образа
cp focal-server-cloudimg-amd64.img my-vm.qcow2
# Запуск VM через QEMU
qemu-system-x86_64 -m 2048 -smp 2 -hda my-vm.qcow2 -net nic,model=virtio -net user,hostfwd=tcp::2222-:22
# SSH подключение через проброс портов
ssh -p 2222 ubuntu@localhost
Снимки (Snapshots)
import libvirt
conn = libvirt.open('qemu:///system')
dom = conn.lookupByName("my-vm")
# Создание снимка состояния VM
xml_config = """
<domainsnapshot>
<name>backup-before-upgrade</name>
<description>Снимок перед обновлением</description>
</domainsnapshot>
"""
dom.snapshotCreateXML(xml_config, 0)
# Список снимков
for snap in dom.listAllSnapshots():
print(f"Снимок: {snap.getName()}")
# Восстановление из снимка
dom.snapshotRevert(snap, 0)
print("Восстановлено из снимка")
Когда использовать VM?
✓ Используйте VM для:
- Полной изоляции окружений
- Запуска разных ОС на одном оборудовании
- Разработки (безопасное тестирование)
- Серверов с разными требованиями
- Обучения Linux/системному администрированию
✗ Не используйте VM для:
- Микросервисной архитектуры (используйте контейнеры)
- Быстрого масштабирования (контейнеры лучше)
- Минимизации ресурсов (контейнеры эффективнее)
Облачные VM
Вместо локальной VM, можно использовать облачные сервисы:
# Запуск VM на AWS
aws ec2 run-instances --image-id ami-0c55b159cbfafe1f0 --instance-type t2.micro
# Запуск VM на Google Cloud
gcloud compute instances create my-instance --image-family ubuntu-2004-lts --image-project ubuntu-os-cloud
# Запуск VM на Azure
az vm create --resource-group myResourceGroup --name myVM --image UbuntuLTS
Заключение
Виртуальная машина — это мощный инструмент для создания изолированных вычислительных окружений. Хотя в современной разработке контейнеры часто предпочтительнее для микросервисов, VM остаются критически важными для полной виртуализации, тестирования разных ОС и облачных вычислений. Python разработчик должен понимать, как работают VM, как управлять ими программно и когда их использовать вместо альтернатив.