KVM

Материал из Wiki семьи Белых
Перейти к: навигация, поиск

KVM (или Kernel-based Virtual Machine) — это программное решение, обеспечивающее виртуализацию в среде Linux на платформе x86, которая поддерживает аппаратную виртуализацию на базе Intel VT (Virtualization Technology) либо AMD SVM (Secure Virtual Machine).

Подготовка системы

На примере CentOS и RELS

1. Проверка, поддерживает ли процессор аппаратную виртуализацию (результат должен быть не пустым):

Code:
# egrep '(vmx|svm)' /proc/cpuinfo

2. Установка нужных пакетов, запуск сервиса и проверка загруженности модуля KVM (вывод не должен быть пустым), а так же подключение к KVM (в выводе должна быть структура XML):

Code:
# yum install kvm libvirt policycoreutils-python bridge-utils
# service libvirtd start
# lsmod | grep kvm
# virsh sysinfo

3. Настройка Selinux для раздела с образами виртуальных машин. Предполагается, что раздел для образов виртуальных машин будет примонтирован в /mnt/VMS.

Code:
# semanage fcontext -a -t virt_image_t /mnt/VMS
# mount /mnt/VMS

Настройка сети на хост-сервере

Внимание: Перед выполнением этого шага, надо убедиться, что на хост-сервере установлен пакет bridge-utils, иначе при выполнении операций с сетью есть потерять связь с сервером.

Code:
# rpm -qa | grep bridge-utils

Предполагается, что использовался интерфейс eth0 и он был соответствующим образом настроен:

  • IP - 192.168.0.1
  • MASK - 255.255.255.0
  • GETWAY - 192.168.0.10
  • HWADDR - 00:1F:2E:3D:4C:5A

Создается сетевой интерфейс типа "bridge" на хост-сервере. Для этого создается и/или редактируется файл /etc/sysconfig/network-scripts/ifcfg-br0

Файл: /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE="Bridge"
# UUID=0584ce6b-2984-40c3-befb-f4aab5049399
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO="static"
# HWADDR=00:1F:2E:3D:4C:5A
IPADDR=192.168.0.1
PREFIX=24
GATEWAY=192.168.0.10
DNS1=192.168.0.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System br0"

Так же редактируется файл основного интерфейса /etc/sysconfig/network-scripts/ifcfg-eth0:

Файл: /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
HOSTNAME="localhost.localdomain"
# UUID=0584ce6b-2984-40c3-befb-f4aab5049399
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
HWADDR=00:1F:2E:3D:4C:5A
DEFROUTE=yes
BRIDGE="br0"
#IPV4_FAILURE_FATAL=yes
#IPV6INIT=no
NAME="System eth0"

После редактирования файлов перезапускается служба сети

Code:
# service network restart

Проверка состояния подключения типа «bridge»:

Code:
# brctl show

Приблизительный вывод:

Code:
bridge name     bridge id               STP enabled     interfaces
br0             8000.00259096c5e4       no              eth0

Настройки Iptables, разрешающие трафик на интерфейсе типа bridge:

Code:
# iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
# service iptables save
# service iptables restart

Опционально: можно улучшить быстродействие соединения bridge, поправив настройки в /etc/sysctl.conf

Файл: /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 0 
net.bridge.bridge-nf-call-iptables = 0 
net.bridge.bridge-nf-call-arptables = 0

После этого

Code:
# sysctl -p /etc/sysctl.conf
# service libvirtd reload

Создание хранилища KVM

Создается и проверяется хранилище

Code:
# virsh pool-define-as guest_images_dir dir - - - - "/mnt/VMS" 
Pool guest_images_dir defined

# virsh pool-list --all 
Name                 State      Autostart  
----------------------------------------- 
default              active     yes        
guest_images_dir     inactive   no

# virsh pool-build guest_images_dir 
Pool guest_images_dir built 

Запускается хранилище и добавляется в автозагрузку

Code:
# virsh pool-start guest_images_dir 
Pool guest_images_dir started 
# virsh pool-list --all 
Name                 State      Autostart  
----------------------------------------- 
default             active     yes        
guest_images_dir    active     no 

# virsh pool-autostart guest_images_dir 
Pool guest_images_dir marked as autostarted 
# virsh pool-list --all 
Name                 State      Autostart  
----------------------------------------- 
default              active     yes        
guest_images_dir     active     yes 

# virsh pool-info guest_images_dir 

Создание виртуальной машина

Создание виртуальной машины

Code: Создание виртуальной машины RELS
virt-install -n VMName --ram 4096 --arch=x86_64 --vcpus=4 --cpu host --check-cpu /
--extra-args="vnc sshd=1 sshpw=secret ip=static reboot=b selinux=0" --os-type linux /
--os-variant=rhel6 --boot cdrom,hd,menu=on --disk pool=Server,size=215,bus=virtio /
--network=bridge:br0,model=virtio --graphics vnc,listen=0.0.0.0,keymap=ru,password=VNCPASSWORD /
--noautoconsole --watchdog default,action=reset --virt-type=kvm --autostart --location /
http://mirror.yandex.ru/rosa/server/6.5/os/x86_64/
  • -n VMName — имя новой виртуальной машины
  • --ram 4096 — кол-во виртуальной памяти
  • --arch=x86_64 — архитектура ОС виртуалки
  • --vcpus=4 — кол-во виртуальных процессоров
  • --os-type linux — тип ОС
  • --disk pool=guest_images_dir,size=50 — размещение хранилища, размер вирт. диска
  • --network=bridge:br0 - интерфейс "белой" сети
    --network=bridge:virbr0 - интерфейс "серой сети". В этом случае для ВМ будет присвоен серый IP по DHCP от хост-сервера.
  • --graphics vnc,listen=0.0.0.0,keymap=ru,password=VNCPASSWORD - определен тип подключения через VNC, а так же пароль.
  • location http://mirror.yandex.ru/rosa/server/6.5/os/x86_64/ загрузка инсталлятора ОС с сетевого ресурса.

Установка MS Windows в виртуальную машину

Code: Создание виртуальной машины с MS Windows
virt-install --connect qemu:///system --arch=x86_64 -n VMName_1 -r 1024 --vcpus=1 \
--disk pool=guest_images_dir,size=50,bus=virtio,cache=none -c /iso/Windows2008R2RU.ISO \
--graphics vnc,listen=0.0.0.0,keymap=ru,password=some.password.here --noautoconsole \
--os-type windows --os-variant win2k8 --network=bridge:br0,model=e1000 \
--disk path=/iso/virtio-win.iso,device=cdrom,perms=ro

При установке ОС Windows не увидит виртуального жесткого диска, поэтому надо подгрузить дополнительный виртуальный cdrom с драйверами /iso/virtio-win.iso — расположение файла ISO с драйверами виртуального диска. Взять можно отсюда.

Команды для работы с виртуальными машинами

virsh help

Встроенная помощь по командам

virsh list --all

Посмотреть статус установленных ВМ

virsh start vsrv1

Запусить ВМ vsrv1

virsh shutdown vsrv1

Послать команду завершения работы ВМ

virsh destroy vsrv1

Принудительно завершить работу ВМ

virsh undefine vsrv1

Удалить ВМ

Изменение настроек виртуальной машины

Конфиги ВМ находятся в каталоге /etc/libvirt/qemu/
Для редактирования настроек ВМ VMName нужно отредактировать файл /etc/libvirt/qemu/VMName.xml

Однако, более правильным будет извлечения настроек ВМ в текущую директорию.

Code:
# virsh dumpxml VMName > VMName_Config.xml

Отредактированный конфиг загружается командой:

Code:
# virsh define VMName_Config.xml

Изменять конфигурационный файл нужно при выключенной виртуальной машине.

Увеличение RAW диска KVM

Перед любым изменением нужно сделать бэкап.

Добавить к диску 4 ГБ:

Code:
# dd if=/dev/zero of=./addition.img bs=1M count=4096
cat src.img addition.img >> src.new
mv src.new src.img

Если известен точный размер диска:

Code:
# dd if=/dev/zero of=./src.img bs=1M count=4096 seek=10240

Доступ к виртуальной машине по средством VNC

Для определения порта, на котором работает виртуальная машина используется команда:

Code:

virsh vncdisplay VMName

Результат команды будет номер по порядку, начиная с порта 5900. (Нумерация идет с нуля.)

В конфиге ВМ можно жестко прописать номер порта VNC

Файл:
<graphics type='vnc' port='5914' autoport='no' listen='0.0.0.0' passwd='some.password.here'>
<listen type='address' address='0.0.0.0'/>
</graphics>

В случае, если виртуальная машина будет иметь серый IP адрес, необходимо разрешить проброс портов:

Code: Порт форвардинг
# sysctl net.ipv4.ip_forward=1
# iptables -I FORWARD -j ACCEPT
# iptables -t nat -I PREROUTING -p tcp -d 192.168.0.1 --dport 5910 -j DNAT --to-destination 192.168.122.170:5901
# iptables -t nat -I POSTROUTING -p tcp -s 192.168.122.170 --sport 5901 -j SNAT --to-source 192.168.0.1:5910

где 192.168.122.170 - IP-адрес виртуальной машины.

Благодарность

Хабр Записки линуксоида