Рубрики
KVM

KVM / debian / libvirt / egrep / grep / dmesg / apt-get / virsh / sysctl / iptables

Проверка возможности установки KVM:

egrep -c '(vmx|svm)' /proc/cpuinfo - проверка процессора 
egrep '(vmx|svm)' --color /proc/cpuinfo - проверка процессора 
egrep -q '^flags.*(svm|vmx)' /proc/cpuinfo && echo virtualization extensions available - проверка процессора 
kvm-ok - проверка процессора  
egrep -c ' lm ' /proc/cpuinfo - количество потоков
uname -m  - архитектура установленной системы
free -h - количество памяти
fdisk -l - вывести список разделов и дисков
df -h - показать занятое пространство
dmesg | grep -i -e iommu -e dmar 

cat /proc/cpuinfo | grep svm - проверка процессора 
dmesg | grep AMD-Vi - проверка процессора 
lsmod | grep kvm - проверка процессора 

lsmod | grep vfio - устройства vfio (проброс pci, etc..)
dmesg | grep vfio - устройства vfio (проброс pci, etc..)
dmesg | grep VFIO - устройства vfio (проброс pci, etc..)
dmesg | grep -i vfio  - устройства vfio (проброс pci, etc..)

lspci -k | grep -i -A 3 vga - показать видео карту

Файлы:

/etc/libvirt/ - здесь в основном хранятся конфигурационные файлы
/etc/libvirt/qemu.conf - главный конфиг
/var/lib/libvirt/ - здесь будут хранится образы жестких дисков, мгновенные снимки системы и многое другое.
/var/lib/libvirt/qemu/snapshot/ - резервные копии файлов конфигураций снапшотов

Установка:

apt-get install cpu-checker - установить программу для проверки процессора
apt-get install qemu-kvm libvirt-bin bridge-utils - установка
apt-get install virt-manager - установка virt-manager
apt-get install libosinfo-bin - установить информацию об ос 

nano /etc/network/interfaces - конфиг сети

adduser user_name libvirt - добавить user_name в группу libvirtd
adduser user_name kvm - добавить user_name в группу kvm
sudo adduser `id -un` libvirtd - добавить себя в группу libvirtd
groups - группы
cat /etc/group - посмотреть составы групп
cat /etc/passwd - посмотреть пользователей

ls  /etc/libvirt/qemu/ - здесь находятся конфиги ВМ 
virsh --connect qemu:///system version - версия
virsh --connect qemu:///system list - 
virsh -c qemu:///system list - список ВМ
virsh list --all -  вывести список ВМ (вкл/выкл)
virsh pool-list --all - вывести список хранилищ
virsh list --all - вывести список всех виртуалок
virsh net-list --all - вывести список всех виртуальных сетей
virsh sysinfo - все о хосте (cpu,mem,etc..)
virsh capabilities - свойства хоста
dpkg -L ovmf - список каталогов ovmf (bios и т.д.)

Настройка сети static:

nano /etc/network/interfaces
----------------------------------------
auto lo
iface lo inet loopback

auto eno1
iface eno1 inet manual
dns-nameserver 192.168.15.1
dns-nameserver 8.8.8.8

auto br0
iface br0 inet static
address 192.168.15.253
broadcast 192.168.15.255
netmask 255.255.255.0
gateway 192.168.15.1
bridge_ports eno1
bridge_stp off
-------------------------------------

Настройка сети dhcp:

nano /etc/network/interfaces
----------------------------------------
auto lo
iface lo inet loopback

auto eno1
iface eno1 inet manual
dns-nameservers 192.168.15.1
dns-nameservers 8.8.8.8

auto br0
iface br0 inet dhcp
bridge_ports eno1
bridge_stp off
-------------------------------------

Применить настройки сети без перезагрузки:

/etc/init.d/networking restart - перезагрузка сети (пере читается конфигурация сети) 
systemctl stop NetworkManager.service - остановить сеть
systemctl start NetworkManager.service - запустить (пере читается конфигурация сети) 
systemctl restart networking - перезагрузка сети (пере читается конфигурация сети) 

Настройка bridge:

brctl show - посмотреть доступные  бриджи
brctl addif br0 eno1 - добавить сетевую карту eno1 в br0

sysctl настройка

 
включаем forward,proxy_arp и отключаем ipv6:
sysctl net.ipv4.conf.all.forwarding=1
sysctl net.ipv4.conf.all.proxy_arp=1
sysctl net.ipv6.conf.all.disable_ipv6=1
sysctl net.ipv6.conf.default.disable_ipv6=1
sysctl net.ipv6.conf.lo.disable_ipv6=1

можно улучшить быстродействие соединения bridge (хз и так вроде норм 
sysctl net.bridge.bridge-nf-call-ip6tables = 0 
sysctl net.bridge.bridge-nf-call-iptables = 0 
sysctl net.bridge.bridge-nf-call-arptables = 0

nano /etc/sysctl.conf - файл sysctl
sysctl -p  - применяем изменения без перезагрузки

Сеть доп:

При настройки bridge+forward  сеть заработает
На хосте буду создаваться интерфейсы vnet. 
В гостях будет интернет.
Команды для виртуальных сетей:
virsh net-list --all - вывести список всех виртуальных сетей
virsh net-info Network_NAME - подробная информация об ВС Network_NAME
virsh net-destroy default - остановить сеть
virsh net-start default - включить сеть
netstat -nap | grep kvm - определение номер порта VNC для виртуальной машины

Сеть виртуальная. команды:

virsh  net-list --all - список виртуальных  сетей 
virsh  net-edit default - редактирование сети по умолчанию

Отключение сети default:

ip link - посмотреть все линки
virsh net-destroy default - выключить сеть default
virsh net-autostart --disable default - отключение автозагрузки сети default

Включение сети default:

virsh  net-list --all - показать все сети 
virsh net-autostart default - включение автозагрузки сети default

Отключаем firewalld

systemctl stop firewalld
systemctl disable firewalld
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
rm '/etc/systemd/system/basic.target.wants/firewalld.service'

iptables:

----------------------------------------------
iptables -L -n -v - показать все правила (посмотреть текущие правила)
iptables -n -t nat -L - настройки firewall nat
iptables -n -L -v --line-numbers - для просмотра правил с номером строки
iptables -L INPUT -n -v - для просмотра INPUT правил
iptables -L OUTPUT -n -v --line-numbers - для просмотра OUTPUT правил
--------------------------------------------- 
Чтобы отчистить правила iptables его собственными средствами введите:
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
---------------------------------------------
 F: Удаление всех правил (flushing).
 X: Удаление цепочки
 t <таблица>: Выбрать таблицу и удалить правила.
 P: Установить политику по умолчанию (например DROP, REJECT или ACCEPT).
--------------------------------------------- 

Задаем нужный ip для гостя:


Виртуальная сетевая карта:

на хосте:
tunctl -b -u username -t debian_guest - создадим виртуальную сетевую карту и поднимем устройство
ifconfig debian_guest 0.0.0.0 up - включим сетевушку
ip route add 10.10.10.100 dev debian_guest - cсоздадим маршрут на нужное нам устройство с нужного IP-адреса

virsh edit VM_name - редактировать настройки ВМ
---------------------------------------------

    
    
    
    

---------------------------------------------

Настройки на госте 
ifconfig eth0 10.10.10.100 netmask 255.255.255.0 - задаем ip
route add default gw 10.10.10.10 - задаем маршрут

vlan:


  ovs-net
  
  
  
    
  
  
    
    
  
  
    
      
    
  

console:

 
Я получил ошибку, когда пытался запустить консоль своей виртуальной машины:
$ virsh console alice
error: internal error: cannot find character device 
Эта ошибка возникает потому, что вы не определили устройство консоли в XML-файле виртуальной машины. 
Добавьте приведенные ниже строки в раздел "device" XML-файла.

  

VNC:

 
---------------------------------------------
Проверяем вкл VNC:
virsh dumpxml debian8 | grep vnc
видим 
---------------------------------------------
Так выглядит настройка:



---------------------------------------------
virsh vncdisplay VMName_1 - узнаем порт VNC(для подключения используем внешний VNC клиент)
где VMName_1 — имя ВМ, :3 — номер по порядку порта, начиная с 5900, 
то есть подключаться надо на порт 5903, 
но в программе UltraVNC сработает и так 10.110.10.15:3 
---------------------------------------------

Хранилища команды:

virsh pool-list - вывести список хранилищ
mkdir -p /mnt/temp1/datastore1 - создать каталог /mnt/temp1/datastore1 (параметр -p создаст каталог temp1 если его нету)
virsh pool-define-as Имя_пула тип - - - - "/путь"  - создать пул хранилища Имя_пула
virsh pool-define-as storage dir - - - - "/mnt/temp1/datastore1"   - создать пул хранилища storage
virsh pool-build Имя_хранилища - собираем хранилище Имя_хранилища
virsh pool-build storage - собираем хранилище storage
virsh pool-start storage - включаем хранилище storage
virsh pool-autostart storage - включаем авто включение хранилище storage 
virsh pool-info storage - информация о хранилище (емкость и свободное место)
virsh pool-destroy storage - отключить хранилище с именем storage
virsh pool-delete storage - удалить хранилище
virsh pool-undefine storage - удалить определение(настройки) хранилища

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

0) virsh pool-define-as datastore1 dir - - - - "/mnt/datastore1" - обозначаем хранилище  datastore1
1) virsh pool-build datastore1 - собираем хранилище  datastore1
2) virsh pool-start datastore1 - запускаем хранилище  datastore1
3) virsh pool-autostart datastore1 - включаем авто загрузку хранилища   datastore1

!!! Иногда короткие команды не работают
!!! пример создание пула с именем vagrant, тип директория, точка монтирования (/kvm/500gb/vagrant/)
virsh pool-define-as --name vagrant --type dir --target /kvm/500gb/vagrant/

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

0) virsh - входим в virsh
1) pool-create-as iso1 dir - - - - "/mnt/datastore2/iso1/" - создаем настройки для хранилища (XML-конфигурация пула)
2) pool-refresh iso1 - собираем хранилище
ошибка: Не удалось собрать пул iso1
ошибка: Запрошена недопустимая операция: пул «iso1» уже активен
3) pool-refresh iso1 - перечитываем конфигурацию для хранилища iso1
4) virsh pool-autostart iso1 - включаем авто включение хранилища iso1

Отключение хранилища:

0) virsh pool-stop datastore1 - остановка хранилища
1) virsh pool-autostart  --disable datastore1 - отключаем  авто включение хранилища
2) virsh pool-undefine datastore - удалить определение(настройки) хранилища (убирается из автозагрузки)
!!! файлы должны остаться

Установочные файлы:

wget https://mirrors.kernel.org/centos/7.2.1511/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso - CentOS 7.x
wget ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/10.3/FreeBSD-10.3-RELEASE-amd64-disc1.iso - FreeBSD 10
wget ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/11.0/FreeBSD-11.0-RELEASE-amd64-disc1.iso - FreeBSD 11
wget http://mirror.esc7.net/pub/OpenBSD/5.9/amd64/install59.iso - OPENBSD 5.9
wget https://mirrors.kernel.org/debian-cd/current/amd64/iso-dvd/debian-8.5.0-amd64-DVD-1.iso - DEBIAN 8.X
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-9.1.0-amd64-netinst.iso - DEBIAN 9.x

Подключаем диск гостю:

!!! рекомендуется диск подключать по его UUID
!!! использую путь /dev/disk/by-id/UUID_DISK
fdisk -l - показать все диски и разметку
lshw -class disk -class storage - показать все устройства хранения
blkid - программа показывает UUID дисков и разделов
ls -l /dev/disk/by-id/ - показывает UUID дисков и разделов
ls -l /dev/disk/by-id/ |grep sdb - показывает UUID диска/разделов  sdb

Физический  диск virtio:
---------------------------------------------
     - подключаем блочное устройство
       - драйвер,тип данных, кеш
       - источник (наш диск)
       - "буква" диска и шина
      
- контролер --------------------------------------------- Физический диск virtio: ---------------------------------------------
--------------------------------------------- Физический диск virtio: ---------------------------------------------
--------------------------------------------- Виртуальный диск virtio: ---------------------------------------------
контроллер virtio: --------------------------------------------- --------------------------------------------- диск sata: --------------------------------------------- --------------------------------------------- контролер sata: ---------------------------------------------
---------------------------------------------

Управление VM:

osinfo-query os - список поддерживаемых ос 
virsh list --all - показать все доступные ВМ
virsh start VM_name - запустить ВМ
virsh reboot VM_name - перезагрузка VM
virsh shutdown VM_NAME - выключить ВМ (нажать кнопку выкл)
virsh destroy VM_name - выключить насильно ВМ (как вытащить вилку из розетки)
virsh undefine VM_name - удалить ВМ
virsh autostart VM_name - включить автозагрузку для ВМ
virsh autostart --disable VM_name - отключить автозагрузку ВМ
virsh edit VM_name - отредактировать настройки ВМ

Клонирование ВМ:

virt-clone --help - клонирует существующую виртуалку и изменяет host-sensitive данные, например, mac address
virt-clone -o VM_name -n vm_name_clone --file /mnt/tmp/vm_name_clone.img

Изменение диска:

qemu-img resize /mnt/datastore/name_disk.img -2G - уменьшить размер диска
qemu-img resize /mnt/datastore/name_disk.img +2G - увеличить размер диска
qemu-img info /mnt/datastore/name_disk.img - информация о диске

Еще команды для диска:

qemu-img create -f qcow2 /home/dev/images/alice.img 5G - создание диска qcow2
qemu-img create -o preallocation=metadata -f qcow2 name_disk.qcow2 20G - создание диска qcow2
kvm-img convert -O qcow2 zimbra-000001.vmdk zimbra.qcow2 - конвертация

Команды изменение привода ( CD-ROM DVD ISO):

change-media guest01 vdd --eject - извлечение образа
change-media guest01 vdd /pool/disc.iso - вставка нового образа:
Общий формат команды:
change-media   [] [--eject] [--insert] [--update] [--current] [--live] [--config] [--force]

Снапшоты:

 snapshot-create-as VM_name - создать снимок для VM_name
virsh snapshot-list VM_name - просмотреть снимки 
virsh snapshot-revert VM_name 1360593244 - восстановить из снимка
virsh snapshot-delete VM_name 1360593244 - удалить снимок

Время хоста:

!!!! аппаратные часы идут по UTC !!!
nano /etc/syscomfig/clock - воспринимает только одно значение UTC - это UTC=no или UTC=false, 
                            а его наличие UTC=yes или UTC=true или как таковое отсутствие (это по дефолту) 
                            подразумевает что аппаратные часы выставлены как положено (в UTC)
hwclock -w --localtime - установить время
dpkg-reconfigure tzdata - изменить временную зону
dpkg-reconfigure locales - настроить локали (язык)
dpkg-reconfigure console-data - настройки раскладки клавиатуры

Время гостя:

virsh list -all - список ВМ
virsh dumpxml instance-xxxx | grep clock
virsh edit VM_name - редактирование файла конфигурации
virsh domtime $name_vm --now - синхронизировать время гостя с хоста
----------------------------------------

    
    
    
    
  
----------------------------------------

NTP — сервер времени:

nano /etc/default/ntp
nano /etc/default/ntpdate

Миграция ВМ:

virsh migrate --live vm_NAME qemu+ssh://host2.com/system - миграция
virsh qemu+ssh://host2.com/system list - проверка результата 

Backup VM с остановкой:

0) virsh list --all - узнаем имена всех машин
1) virsh dumpxml имя_машины > имя_машины.xml - сохраняем конфигурацию VM
2) virsh shutdown имя_машины - останавливаем нужную виртуальную машину
3) Сжимаем файл имя_машины.img при помощи Lzop. 
lzop -c -1
4) Запускаем виртуальную машину
virsh start имя_машины
5) Копируем файл имя_машины.img.lzo любым удобным образом на сервер бекапов.

Распаковка Lzo:

lzop -dc disk1.lzo > /new/path/disk1.img
lzop -dc disk1.lzo > /dev/vg_name/vm_disk1

Агент QEMU установка (Tools) \ qemu guest agent:

-------------------------------------------
Установка на госте:
# в Debian - apt-get install qemu-guest-agent
# в CentOS - yum install qemu-guest-agent
# В Windows - с диска virtio-win установить пакет qemu-ga из папки guest-agent
-------------------------------------------
Установка на хосте для гостя:

   
   

-------------------------------------------

Установка drivers windows:

0) Подключаем диск с драйверами
1) В диспетчере устройств -> устройство -> обновить драйвер -> папка с драйверами

Установка Balloon

0) Копируем balloon из virtio.iso в "c:/Program files/Balloon"
1) Запускаем CMD от Администратора 
2) Создаем каталог Balloon
cd "c:\Program Files\"
mkdir Balloon
3) Переходим в каталог c:\Program Files\Balloon
cd "c:\Program Files\Balloon"
4) Ставим BLNSVR.exe 
BLNSVR.exe -i

Backup VM без остановки:

В клиенте устанавливаем Агент QEMU!
-------------------------------------------
Информация:
virsh domblklist vm-name -  узнаем имена дисков виртуальной машины
virsh list --all - вывести список всех виртуалок
vm-name	- имя виртуальной машины
backup-snapshot	- название снэпшота, может быть любым
vda -имя диска, для которого указываем адрес снепшота
/snapshot/vm-name-backup.qcow2	- путь и имя файла для снепшота
-------------------------------------------
На сервере:
0) virsh snapshot-create-as --domain vm-name backup-snapshot -diskspec vda,file=/snapshot/vm-name-backup.qcow2 --disk-only --atomic --quiesce --no-metadata - выполняем снимок виртуалки
1) pigz -c /virt/vm-name.qcow2 > /backup-vm/vm-name.qcow2.gz - архивируем основной файл виртуальной машины
2) virsh blockcommit vm-name vda --active --verbose --pivot - выполняем слияние снапшота + диск
3) rm /snapshot/vm-name-backup.qcow2 - удаляем снапшот
4) virsh dumpxml vm-name > /backup-vm/vm-name.xml - бэкапим настройки виртуалки

Скрипт бэкапа:

#!/bin/bash

# Дата год-месяц-день
data=`date +%Y-%m-%d`
# Папка для бэкапов
backup_dir=/backup-vm
# Список работающих VM
vm_list=`virsh list | grep running | awk '{print $2}'`
# Список VM, заданных вручную, через пробел
#vm_list=(vm-1 vm-2)
# Лог файл
logfile="/var/log/kvmbackup.log"

# Использовать это условие, если список VM задается вручную
#for activevm in "${vm_list[@]}";
# Использовать это условие, если список работающих VM берется автоматически
for activevm in $vm_list
    do
        mkdir -p $backup_dir/$activevm
        # Записываем информацию в лог с секундами
        echo "`date +"%Y-%m-%d_%H-%M-%S"` Start backup $activevm" >> $logfile
        # Бэкапим конфигурацию
        virsh dumpxml $activevm > $backup_dir/$activevm/$activevm-$data.xml
        echo "`date +"%Y-%m-%d_%H-%M-%S"` Create snapshots $activevm" >> $logfile
        # Список дисков VM
        disk_list=`virsh domblklist $activevm | grep vd | awk '{print $1}'`
        # Адрес дисков VM
        disk_path=`virsh domblklist $activevm | grep vd | awk '{print $2}'`
        # Делаем снепшот диcков
        virsh snapshot-create-as --domain $activevm snapshot --disk-only --atomic --quiesce --no-metadata
        sleep 2
        for path in $disk_path
            do
                echo "`date +"%Y-%m-%d_%H-%M-%S"` Create backup $activevm $path" >> $logfile
                # Вычленяем имя файла из пути
                filename=`basename $path`
                # Бэкапим диск
                pigz -c $path > $backup_dir/$activevm/$filename.gz
                sleep 2
            done
        for disk in $disk_list
            do
                # Определяем путь до снепшота
                snap_path=`virsh domblklist $activevm | grep $disk | awk '{print $2}'`
                echo "`date +"%Y-%m-%d_%H-%M-%S"` Commit snapshot $activevm $snap_path" >> $logfile
                # Объединяем снепшот
                virsh blockcommit $activevm $disk --active --verbose --pivot
                sleep 2
                echo "`date +"%Y-%m-%d_%H-%M-%S"` Delete snapshot $activevm $snap_path" >> $logfile
                # Удаляем снепшот
                rm $snap_path
            done
        echo "`date +"%Y-%m-%d_%H-%M-%S"` End backup $activevm" >> $logfile
    done

Очистка папки с бэкапами:

Данная команда удалит все файлы старше 90 дней:
/usr/bin/find /backup-vm/*/ -type f -mtime +90 -exec rm -rf {} \;

Установка и настройка ВМ:

!!! Перед выполнением этих команд убедитесь, что вы создали образ диска.
-------------------------------------------
virt-install \
--name debian8 \
--ram 1024 \
--disk path=./debian8.qcow2,size=8 \
--vcpus 1 \
--os-type linux \
--os-variant generic \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://ftp.nl.debian.org/debian/dists/jessie/main/installer-amd64/' \
--extra-args 'console=ttyS0,115200n8 serial
-------------------------------------------
virt-install \
--name centos7 \
--ram 1024 \
--disk path=./centos7.qcow2,size=8 \
--vcpus 1 \
--os-type linux \
--os-variant centos7 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://mirror.i3d.net/pub/centos/7/os/x86_64/' \
--extra-args 'console=ttyS0,115200n8 serial'
-------------------------------------------
virt-install \
--name ubuntu1404 \
--ram 1024 \
--disk path=./ubuntu1404.qcow2,size=8 \
--vcpus 1 \
--os-type linux \
--os-variant generic \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/' \
--extra-args 'console=ttyS0,115200n8 serial'
-------------------------------------------
wget http://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/10.1/FreeBSD-10.1-RELEASE-amd64-dvd1.iso
virt-install \
--name freebsd10 \
--ram 1024 \
--disk path=./freebsd10.qcow2,size=8 \
--vcpus 1 \
--os-type generic \
--os-variant generic \
--network bridge=virbr0 \
--graphics vnc,port=5999 \
--console pty,target_type=serial \
--cdrom ./FreeBSD-10.1-RELEASE-amd64-dvd1.iso \
-------------------------------------------

Источники:

https://fedoraproject.org/wiki/Windows_Virtio_Drivers - драйверы для windows 
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso - драйверы для windows iso
http://goodigy.ru/kvm_na_ubuntu_server_14.04
http://goodigy.ru/ustanovka_mashin_virt-install
https://help.ubuntu.com/community/KVM/Networking
http://www.linux-kvm.org/page/Main_Page
http://xgu.ru/wiki/Linux_Bridge
https://habrahabr.ru/post/168791/
https://linux.die.net/man/1/virt-install
https://khashtamov.com/ru/kvm-setup-server/
https://davidyat.es/2016/09/08/gpu-passthrough/
https://ycnrg.org/vga-passthrough-with-ovmf-vfio/
http://libvirt.org/formatdomain.html#elementsTime
https://www.cyberciti.biz/faq/installing-kvm-on-ubuntu-16-04-lts-server/
https://serveradmin.ru/kvm-backup/
http://wiki.libvirt.org/page/Live-disk-backup-with-active-blockcommit
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/chap-QEMU_Guest_Agent.html
http://rus-linux.net/MyLDP/vm/kvm-v-debian.html