В данной инструкции используется железный сервер с установленной ОС Ubuntu 22.04 LTS. Главным условием для запуска KVM является наличие процессора с поддержкой аппаратной виртуализации (Vt-d+Vt-x, AMD-V). Обратите внимание, что количество ресурсов, требуемых для дальнейшей эксплуатации KVM варьируется в зависимости от задач. Для подключения по SSH будем использовать машину на Windows 10 LTSC.
Подготовка сервера
Ищем и применяем обновления, если такие уже появились:
sudo apt update && sudo apt upgrade
Установка и настройка ключей ssh
Устанавливаем ssh для удалённого управления (если ещё не установлен):
sudo apt install ssh
Проверяем, запустился ли сервис:
sudo systemctl status ssh
Сервис должен быть в состоянии Active.
Настроим безопасную аутентификацию по ключам:
ssh keygen -t rsa
Сохраняем ключи в предлагаемую директорию, а затем разрешим подключаться по приватному ключу:
touch ~/.ssh/authorized_keys && cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
Теперь необходимо скопировать приватный ключ на машину, с которой будем подключаться, сделать это можно с помощью scp. Для этого выполним ряд действий.
Если локальная машина на Linux, то достаточно скопировать в ключ поддиректории домашней папки пользователя
Если локальная машина на ОС Windows, то необходимо создать отдельную папку для ключей, и дать права ТОЛЬКО на пользователя, из-под которого заходите по ssh.
Для этого создаём папку, заходим в Свойства -> Безопасность -> Дополнительно -> Отключить наследование -> Удалить все унаследованные разрешения из этого объекта.
Затем в этом же окне добавляем себя: Добавить” -> “Выберите субъект” -> “Дополнительно” -> ищем пользователя -> OK.
Выбираем права полный доступ” -> OK.
Затем в созданную папку с модифицированными копируем приватный ключ, команда выглядит так:
scp <имя_пользователя>@<имя_хоста_или_IP>:/home/<имя_пользователя>/.ssh/id_rsa %папка_на_локальном_компьютере%id_rsa
Теперь заходим на наш сервер по приватному ключу:
ssh <имя_пользователя>@<имя_хоста> -i <расположение-ключа>
Пример:
ssh efsol_it@efsol-vm -i C:Usersefsol_itssh_keysid_rsa
Проверяем успешна ли прошла аутентификация и в случае успеха продолжаем настраивать сервер:
Установка виртуализации
Устанавливаем пакеты:
sudo apt install qemu qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager libvirt-daemon virt-top libguestfs-tools libosinfo-bin qemu-system
По завершению проверяем статус сервиса виртуализации:
sudo systemctl status libvirtd
Статус должен быть Active.
Установка панели управления cockpit
Для облегчения эксплуатации хост-машины установим панель управления cockpit:
sudo apt install cockpit-machines
Теперь нужно проверить статус сервиса cockpit:
sudo systemctl status cockpit
Дополнительно проверим работу сервиса, зайдя по адресу в браузере по ссылке: https://ip-адрес-машины:9090.
Если всё установилось правильно, то увидим страницу авторизации.
Также нужно убедиться, что модуль vhost_net включён и работает:
lsmod | grep vhost
Назначаем права на текущего пользователя
Если нужно назначить права управления виртуализацией на текущего не-root пользователя, то вводим следующие команды:
sudo usermod -aG libvirt $USER sudo usermod -aG kvm $USER
Если нужно назначить на другого пользователя, то $USER заменяем на имя требуемого пользователя.
Настройка сети
Мост с именем virbr0 создается в процессе установки. Это устройство использует NAT для подключения компьютеров гостей к внешнему миру.
brctl show
Отображает все мосты, к которым подключены гостевые машины.
При создании мостов всё управление сетью на хост-машине осуществляется в ручном режиме и изменения необходимо вносить в /etc/netplan/01-network-manager-all.yaml. В общем случае мы имеем 1 интерфейс управления и доп.интерфейсы для создания мостов и проброса сети в виртуальные машины.
Получаем актуальный список сетевых интерфейсов в ОС, чтобы задействовать их в сетевой конфигурации:
ip a
Далее редактируем файл:
sudo nano nano /etc/netplan/01-network-manager-all.yaml
Примерное содержание:
# Let NetworkManager manage all devices on this system network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: false dhcp6: false addresses: [192.168.0.26/24] gateway4: 192.168.0.1 mtu: 1500 nameservers: addresses: [8.8.8.8] enp0s8: dhcp4: false dhcp6: false bridges: br0: interfaces: [enp0s8] addresses: [192.168.0.22/16] mtu: 1500 nameservers: addresses: [8.8.4.4, 8.8.8.8] parameters: stp: true forward-delay: 4 dhcp4: no dhcp6: no
Содержимое файла указано выше, составлено на основе текущих данных системы. Сначала идет описание сетевых интерфейсов. Если интерфейс не участвует в мостовом соединении, ему необходимо прописать реквизиты в первой части. Если интерфейс задействован в мостовом соединении, то реквизиты сети задаются в параметрах моста.
Важно! Если машина подключена к VLAN, то интерфейсом моста нужно выбрать именно vlan. В таком случае, конфигурация будет выглядеть примерно так:
# Let NetworkManager manage all devices on this system network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: false dhcp6: false addresses: [192.168.0.26/24] gateway4: 192.168.0.1 mtu: 1500 nameservers: addresses: [8.8.8.8] enp0s8: dhcp4: false dhcp6: false vlans: vlan252: id: 252 link: enp0s8 dhcp4: false dhcp6: false bridges: br0: interfaces: [vlan252] addresses: [10.15.252.21/24] routes: - to: default via: 10.15.252.254 nameservers: addresses: [8.8.4.4, 8.8.8.8]
Также назначаем маршрут по умолчанию, где в параметр via вписываем адрес сетевого шлюза в vlan.
Затем применяем настройки:
sudo netplan generate sudo netplan apply
Возможно кратковременное прерывание связи с сервером, так что придётся переподключиться по ssh. Теперь нужно проверить, что настройки применились:
ip a
Должен появиться новый интерфейс br0 с адресом 192.168.0.22, а у интерфейса enp0s8 адрес исчез. Значит настроено корректно. Далее необходимо сообщить службе виртуализации что она может использоваться новый сетевой интерфейс. Создаем файл host-bridge0.xml:
<network> <name>host-bridge0</name> <forward mode="bridge"/> <bridge name="br0"/> </network>
Применяем настройки. Определяем интерфейс:
virsh net-define host-bridge0.xml
Запускаем:
virsh net-start host-bridge0
Настраиваем автозапуск:
virsh net-autostart host-bridge0
Создание ВМ
Скачиваем .iso-файл нужной ОС и размещаем его в директории с общими правами доступа для всех:
sudo chmod 777 -R /vm/images sudo chmod 777 /vmhttps://efsol.ru/images/ubuntu2204.iso
Далее создаём виртуальную машину. Команда на создание ВМ будет выглядеть примерно так:
virt-install --virt-type=kvm --name ubuntu22.04 --ram 2048 --vcpus=2 --os-variant=ubuntu22.04 --hvm --cdrom /vmhttps://efsol.ru/images/ubuntu2204.iso --network=bridge:br0,model=virtio --graphics vnc,listen=0.0.0.0 --disk path=/var/lib/libvirthttps://efsol.ru/images/ubuntu2204.qcow2,size=10,bus=virtio,format=qcow2
Расшифровка основных параметров:
- virt-type – тип виртуализации, в нашем случае kvm;
- name – имя новой машины;
- ram – количество памяти в мегабайтах;
- vcpus – количество ядер процессора;
- os-variant – тип операционной системы;
- cdrom – установочный образ системы;
- network-bridge – сетевой мост, который мы настроили ранее;
- graphics – способ получения доступа к графическому интерфейсу;
- diskpath – адрес нового жесткого диска для этой виртуальной машины.
Если все параметры указаны корректно, то установка продолжится в окне клиента VNC, либо же можно подключиться через панель управления cockpit.
Установка VM с ОС Windows 10
У Windows нет OOB-поддержки виртуальных дисков qcow2, создаваемых kvm, поэтому необходимо установить драйвера virtio, скачать iso-образ.
Чтобы подключить с диск с драйверами, в команду необходимо добавить ещё один параметр –disk:
virt-install --virt-type=kvm --name windows10 --ram 4096 --vcpus=4 --os-variant=win10 --hvm --cdrom /vmhttps://efsol.ru/images/windows10.iso --network=bridge:br0,model=virtio --graphics vnc,listen=0.0.0.0 --disk path=/var/lib/libvirthttps://efsol.ru/images/windows10.qcow2,size=30,bus=virtio,format=qcow2 --disk /vmhttps://efsol.ru/images/virtio-win.iso,device=cdrom,bus=sata --boot cdrom
В процессе установки Windows предложит поискать драйвера в расположении, которое потребуется указать.
Настройку и обслуживание KVM мы можем взять на себя. Оставьте заявку или напишите в чат!