Рубрики
KVM

QEMU / Пример работы с kvm/ nokvm из qemu без libvirt

M – тип машины, virt – абстрактно-виртуальный ARM
-machine указывает тип компьютера, который вы собрались эмулировать, можно выбрать ubuntu, pc, pc-q35 и другие варианты, смотрите подробнее командой -machine help
-cpu - тип процессора, можно передать непосредственно тип процессора, а также дополнительные флаги
-smp - включает симуляцию мультипроцессорной архитектуры, количество ядер
-boot - позволяет настроить порядок загрузки устройств, a,b - дискета, с - первый жесткий диск, d - CDROM, n-p - загрузка через сеть, по умолчанию виртуальная машина загружается из жесткого диска
-m - указывает количество оперативной памяти, доступной машине, объем памяти
-k - раскладка клавиатуры по умолчанию
-soundhw - подключить звуковую карту к системе
-device - подключить указанное устройство к машине, нужно указать драйвер и его опции
-name - имя гостевой системы, будет отображаться в верху окна
-uuid - установить UUID для системы
-fda, fdb - подключить дискету из файла
-hda, hdb - подключить жесткий диск из файла
-cdrom - подключить оптический диск
-usb - включить поддержку USB
-usbdevice - подключить USB устройство
-display - выбрать тип отображения, доступно sdl, curses, gtk, none, vga и другие
-full-screen - запустить в полный экран
-no-acpi - отключить поддержку ACPI
-net - создать сетевой интерфейс
-net nic
-net tap
-net user
-net nic user,model=virtio
-realtime включить режим реального времени, опции mclock нужно передать значение on
-gdb - ожидать подключения отладчика gdb
-enable-kvm - включить поддержку kvm
-loadvm - загрузить сохраненное состояние
-daemonize - сделать процесс фоновым
-snapshot - записывать изменения не в файл жесткого диска, а в отдельные файлы
-nographic - отключить графический вывод
-kernel - использовать указанный образ ядра linux
-append - командная строка для ядра
-initrd - файл initrd для загрузки Linux
-vnc :5 - VNC на :5905 
-drive if=none,file=debian.img,format=qcow2 – образ жесткого диска
-soundhw ac97 - добавить звуковую карту
 no-reboot – перезапуск системы приведет к остановке эмулятора

Немного о сетевых устройствах в qemu

Вариант первый:
qemu-system-x86_64 
-m 1G 
-device virtio-net-pci,netdev=lan 
-netdev user,id=lan 
-drive file=you.iso,media=cdrom

Виртуальная машина автоматически получит ip-адрес из подсети 10.0.2.0/24, шлюз - 10.0.2.2, dns-сервер - 10.0.2.3.
К физическому хосту можно обратиться по адресу 10.0.2.2.
ICMP пакеты через такой тип сети не проходят.


Вариант два:
Для такой сетевой карты требуется root
sudo qemu-system-x86_64 
-m 1G 
-device virtio-net-pci,netdev=lan 
-netdev tap,id=lan,ifname=tap0 
-drive file=/tmp/livecd.iso,media=cdrom
P.S. мне этот вариант не нравится так как у меня уже есть бридж на ovs

Вариант три:
Для такой сетевой карты требуется root
sudo qemu-system-x86_64 
-m 1G 
-device virtio-net-pci,netdev=lan 
-netdev tap,id=lan,script=no,ifname=tap0 
-drive file=/tmp/livecd.iso,media=cdrom
Почти тоже самое что но c очень важным параметром "script=no", 
да и теперь нам надо выполнить одну команду для ovs для добавления tap0 в бридж ovs
ovs-vsctl add-port ovsbr0 tap0
ip link set up dev tap0

x86

Готовим диск:

cd new_dir
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.5.0-amd64-netinst.iso

qemu-img create -f qcow2 image_x86.qcow2 10G

Установка системы:
qemu-system-x86_64 
    -enable-kvm 
    -cpu host 
    -hda image_x86.qcow2 
    -drive file=debian-12.5.0-amd64-netinst.iso,media=cdrom 
    -boot d 
    -smp 4 
    -m 4G 
    -display gtk 
    -vga std 
    -device virtio-net-pci,netdev=lan 
    -netdev tap,id=lan,ifname=tap0,script=no 
    -vnc :5 
    -device AC97 
    -nographic

Дальнейший запуск и использование ВМ:
!!! Убираем строки отвечающие за загрузку с cd-cdrom
!!! -drive file=manjaro-xfce-21.0-210318-linux510.iso,media=cdrom 
!!! -boot d 
!!! Не забываем про сеть
!!! ovs-vsctl add-port ovsbr0 tap0
!!! ip link set up dev tap0

qemu-system-x86_64 
    -enable-kvm 
    -cpu host 
    -hda image_x86.qcow2 
    -smp 4 
    -m 4G 
    -display gtk 
    -vga std 
    -device virtio-net-pci,netdev=lan 
    -netdev tap,id=lan,ifname=tap0,script=no 
    -vnc :5 
    -device AC97 
    -nographic

arm



0. Готовим диск болванку:
qemu-img create -f qcow2 ebian12-arm.qcow2 8G


1. Нам нужны будут файлы:
Файло брать тут:
http://ftp.debian.org/debian/dists/bookworm/main/installer-armhf/current/images/netboot/

Нам потребуется:
wget http://ftp.debian.org/debian/dists/bookworm/main/installer-armhf/current/images/netboot/initrd.gz
wget http://ftp.debian.org/debian/dists/bookworm/main/installer-armhf/current/images/netboot/vmlinuz

2. Создаем диск:
qemu-img create -f qcow2 debian12-arm.qcow2 10G

!!! Заменил драйвер для сетевой карты так как при установки системы ее было не видно
!!! Вместо  -device virtio-net-pci,netdev=lan 
!!! На -device virtio-net-device,netdev=lan

3. Создаем виртуальный интерфейс tap0 и добавляем его в ovsbr0
ip tuntap add dev tap0 mode tap
ip link set up dev tap0
ovs-vsctl add-port ovsbr0 tap0


4. Пример первый запуск ВМ для установки ос:
qemu-system-arm -smp 4 -m 1024 -M virt 
   -kernel vmlinuz 
   -initrd initrd.gz 
   -append "root=/dev/ram" 
   -drive if=none,file=debian12-arm.qcow2,format=qcow2,id=hd 
   -device virtio-blk-device,drive=hd 
   -device virtio-net-device,netdev=lan 
   -netdev tap,id=lan,ifname=tap0,script=no 
   -vnc :5 
   -device AC97 
   -nographic 
   -no-reboot

5. Теперь нам нужно добыть загрузочные файлы из толькочто установленного образа
sudo modprobe nbd max_part=16
sudo qemu-nbd -c /dev/nbd0 debian12-arm.qcow2 
mkdir mount-qemu
mount /dev/nbd0p1 mount-qemu
sudo mount /dev/nbd0p1 mount-qemu
mkdir after-copy
cp mount-qemu/ after-copy/
umount mount-qemu 
sudo umount mount-qemu 
sudo qemu-nbd -d /dev/nbd0
sudo killall qemu-nbd


6. Используем образ дальше:
!!! Перед использованием рекомендую файлы initrd,vmlinuz и debian12-arm.qcow2 в один каталог.
qemu-system-arm -smp 4 -m 1024 -M virt 
   -kernel vmlinuz-6.1.0-18-armmp-lpae 
   -initrd initrd.img 
   -drive if=none,file=debian12-arm.qcow2,format=qcow2,id=hd 
   -device virtio-blk-device,drive=hd 
   -device virtio-net-device,netdev=lan 
   -netdev tap,id=lan,ifname=tap0,script=no 
   -vnc :5 
   -device AC97 
   -nographic 
   -no-reboot

7. запуск образа system_img

qemu-system-x86_64 
  -enable-kvm -cpu host 
  -machine type=q35 
  -m 2048 
  -smp sockets=1,cores=4 
  -drive file=./system_img,if=none,id=hd0,format=raw 
  -device virtio-scsi-pci 
  -device scsi-hd,drive=hd0 
  -boot order=d 
  -netdev user,id=net0 
  -device virtio-net-pci,netdev=net0
  

8. запуск образа и использовать бридж что потребует судо:


создаем бридж:
sudo ip link add name br0 type bridge
sudo ip link set br0 up
sudo ip link set eth0 master br0  # Замените eth0 на ваш интерфейс

запускаем вм:
sudo qemu-system-x86_64 
  -enable-kvm -cpu host 
  -machine type=q35 
  -m 2048 
  -smp sockets=1,cores=4 
  -drive file=./ system_img,if=none,id=hd0,format=raw 
  -device virtio-scsi-pci 
  -device scsi-hd,drive=hd0 
  -boot order=d 
  -netdev bridge,id=net0,br=br0 
  -device virtio-net-pci,netdev=net0

9. запуск образа и использовать проброс портов:

qemu-system-x86_64 
  -enable-kvm -cpu host 
  -machine type=q35 
  -m 2048 
  -smp sockets=1,cores=4 
  -drive file=./napios-qemux86-64-dev-0.2.0.1.rootfs.system_img,if=none,id=hd0,format=raw 
  -device virtio-scsi-pci 
  -device scsi-hd,drive=hd0 
  -boot order=d 
  -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8443-:443 
  -device virtio-net-pci,netdev=net0


После используем:
curl https://localhost:8443/
ssh root@localhost:2222
Рубрики
ovs / openvswitch / dpdk

ovs / openvswitch

ссылки:

https://www.openvswitch.org/
https://docs.openvswitch.org/en/latest/faq/issues/
https://www.openvswitch.org/support/dist-docs/ovs-vswitchd.conf.db.5.html
https://docs.openvswitch.org/en/latest/intro/install/dpdk/
https://habr.com/ru/companies/intel/articles/309836/

Информация о бридже:

ovs-vsctl show
ovs-vsctl list port
ovs-ofctl show ovsbr0

Создание бриджа и добавление сетевой карты:

ovs-vsctl add-br ovsbr0
ovs-vsctl add-port ovsbr0 eth0
ovs-vsctl add-port ovsbr0 eth1
ovs-vsctl add-port ovsbr0 wlan0

Назначение IP адреса на бридж:

ip addr flush dev eth0
ip addr add 192.168.128.5/24 dev ovsbr0
ip link set ovsbr0 up

Создание бриджа ovsbr0 и сделать bond:

ovs-vsctl add-br ovsbr0
ovs-vsctl add-bond ovsbr0 bond0 eth0 eth1
#mode  active-backup, balance-slb, or balance-tcp
ovs-vsctl add-bond ovsbr0 bond0 eth1 eth2 bond_mode=active-backup

Включить STP:

ovs-vsctl add-br ovsbr0
ovs-vsctl set bridge ovsbr0 stp_enable=true
ovs-vsctl add-port ovsbr0 eth0
ovs-vsctl add-port ovsbr0 eth1

Создание внутреннего устройства:

!!! так работать не будет:
## tunctl -t tap0
## ip addr add 192.168.0.123/24 dev tap0
## ip link set tap0 up
## ovs-vsctl add-br br0
##ovs-vsctl add-port br0 tap0

Почему:
Ответ в том, что Open vSwitch перехватывает только полученные пакеты, но это уже передаваемый пакет. 
То же самое происходит и со всеми остальными типами сетевых устройств, кроме «внутренних» портов Open vSwitch. 
Если вы, например, добавите физический порт Ethernet к мосту OVS, настроите IP-адрес на физическом порту Ethernet, 
а затем отправите «ping» на адрес в этой подсети, произойдет то же самое: 
ARP будет передан на физический порт Ethernet и Open vSwitch его никогда не видят.
Обратите внимание, что в таком случае на «отводном» устройстве не настраивается IP-адрес
(обычно IP-адрес настроен в виртуальном сетевом адаптере внутри виртуальной машины, но он не виден ядру хоста Linux или Open vSwitch).

А вот так все заработает:
ovs-vsctl add-br ovsbr0
ovs-vsctl add-port ovsbr0 int0 -- set Interface int0 type=internal
ip addr add 192.168.0.123/24 dev int0
ip link set int0 up

Потеря пакетов в начале тестов RFC2544

В случае OVS кэш очищается быстро, и чтобы учесть задержку генератора трафика между фазой обучения и тестирования, 
настройки максимального времени ожидания простоя следует изменить на 50000 мс:
ovs-vsctl --no-wait set Open_vSwitch . other_config:max-idle=50000

MTU

Установить mtu:
ovs-vsctl set int ovsbr0 mtu_request=1450

Вернуть mtu по умолчанию:
ovs-vsctl set int br0 mtu_request=[]

Добавление VLAN

Одним из больших плюсов работы с OpenVSwitch является поддержка VLAN. 
Для этого нужно обозначить теги на виртуальных портах и настроить сетевую карту как транковый интерфейс.

Создадим новый виртуальный коммутатор:
ovs-vsctl add-br ovsbr0

Добавляем реальную сетевую карту к виртуальному коммутатору:
ovs-vsctl add-port ovsbr0 eth0

Делаем порт коммутатора транковым и описываем теги, которые будут проходить через коммутатор:
ovs-vsctl set port eth0 trunks=10,20,300,400,1000

Добавляем виртуальный сетевой интерфейс и присваиваем ему тег:
ovs-vsctl add-port ovsbr0 testvlan20 tag=20 -- set interface testvlan20 type=internal

Теперь можно посмотреть конфигурацию:
ovs-vsctl show

Еще примеры:
обычное использование без vlan:
ovs-vsctl show - показывает информацию по свитчу, проверяем работу и заодно узнаем какая у нас версия ovs
ovs-vsctl add-br br0 - добавляем свитч с именем br0
ovs-vsctl add-port br0 eth0 - добавляем интерфейс eth0 в свитч br0 
 
пример с vlan:
ovs-vsctl add-br ovs0 - добавляем свитч openvswitch с именем br0
ovs-vsctl add-port ovs0 eth0 - добавляем интерфейс eth0 в свитч ovs0 
ovs-vsctl set port eth0 vlan_mode=native-untagged tag=2 trunks=2,3,4 - вешаем trunk на интерфейс eth0 
ovs-vsctl add-port ovs0 ovs0-vlan2 tag=2 -- set Interface ovs0-vlan2 type=internal - добавляем порт и вешаем access (tag=2) на интерфейс ovs0-vlan2
ovs-vsctl add-port ovs0 ovs0-vlan4 tag=4 -- set Interface ovs0-vlan4 type=internal - добавляем порт и вешаем access (tag=4) на интерфейс ovs0-vlan2
ovs-vsctl add-port ovs0 ovs0-vlan3 tag=3 -- set Interface ovs0-vlan3 type=internal - добавляем порт и вешаем access (tag=3) на интерфейс ovs0-vlan2
 
ovs-vsctl set port ovsbr0 tag=29
 
удаление портов и коммутатора:
ovs-vsctl del-port ovs0-vlan2 - удалить порт (ovs0-vlan2) из коммутатора
ovs-vsctl del-br ovs0 - удалить коммутатор ovs0

Включение Netflow на виртуальном коммутаторе OpenVSwitch:

Если возникает необходимость вести учет сетевого трафика, проходящего через интерфейсы, 
то заставить OpenVSwitch отправлять пакеты Netflow на адрес коллектора можно одной командой:
ovs-vsctl -- set Bridge ovsbr0 netflow=@nf -- --id=@nf create NetFlow targets="IP_ADDRESS:PORT" active-timeout=30

Изменить время:
ovs-vsctl set Netflow ovsbr0 active_timeout=60

Чтобы прекратить отправлять данные на Netflow коллектор, достаточно очистить настройки Netflow для виртуального коммутатора:
ovs-vsctl clear Bridge ovsbr0 netflow

dpdk

Выделение памяти:
numa0 mem:
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024,0"
или numa
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024"

Выделение процессоров:
Установленный бит в маске означает, что поток pmd создается и закрепляется за соответствующим ядром ЦП. 
Например, чтобы запустить потоки pmd на ядрах 1 и 2:
ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x6

Проверка доступности dpdk:
ovs-vsctl get Open_vSwitch . dpdk_initialized

Проверка версии ovs:
ovs-vswitchd --version

Проверка версии dpdk:
ovs-vsctl get Open_vSwitch . dpdk_version "DPDK 17.11.0"

Добавление сетевых карт в бридж ovs dpdk:
ovs-vsctl add-br ovsbr0 -- set bridge br0 datapath_type=netdev
ovs-vsctl add-port ovsbr0 eth0_name -- set Interface myportnameone type=dpdk options:dpdk-devargs=0000:06:00.0
ovs-vsctl add-port ovsbr0 eth1_name -- set Interface myportnametwo type=dpdk options:dpdk-devargs=0000:06:00.1

Очереди dpdk:
ovs-vsctl set Interface  options:n_rxq=
ovs-vsctl set Interface dpdk0 options:n_rxq_desc=
ovs-vsctl set Interface dpdk0 options:n_txq_desc=
Различные конфигурации n_rxq_desc и n_txq_desc дают разные преимущества с точки зрения пропускной способности и задержки для разных сценариев. 
Как правило, меньшие размеры очередей могут оказать положительное влияние на задержку за счет пропускной способности. 
Обратное часто справедливо для очередей большего размера. 
Примечание. Увеличение количества дескрипторов rx, например. до 4096 может отрицательно повлиять на производительность из-за того, 
что могут использоваться невекторизованные функции DPDK rx. 
Это зависит от используемого драйвера, но справедливо для часто используемых драйверов DPDK i40e и ixgbe.

Ограничения скорости / шейпер


ovs-vsctl set interface vhost-user1 ingress_policing_rate=10000 ingress_policing_burst=1000

ingress_policing_rate: максимальная скорость (Кбит/с), разрешенная для этой виртуальной машины. 
Это значение обязательно для создания ограничителя входящего трафика. 
Если значение не указано, существующая настройка ограничения скорости останется без изменений.

ingress_policing_burst: размер буфера маркеров в килобайтах. 
Минимальное значение этого параметра должно быть равно наибольшему предполагаемому размеру пакета. 
Если значение не указано, используется значение по умолчанию, равное 8000 КБ.


Существующую настройку ограничения скорости для vhost-user1 можно получить с помощью следующей команды:
ovs-vsctl list interface vhost-user1

Чтобы отменить ограничения скорости трафика vhost-user1, установите для параметра ingress_policing_rate значение 0, 
как показано ниже (настраивать значение параметра ingress_policing_burst не нужно):
ovs-vsctl set interface vhost-user1 ingress_policing_rate=0
Рубрики
KVM

KVM virtiofs / shared folder host + guest / общая папка / проброс папки в гостя

Ссылки:

https://github.com/virtio-win/kvm-guest-drivers-windows/wiki/Virtiofs:-Shared-file-system
https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
https://github.com/winfsp/winfsp/releases
https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md
https://libvirt.org/kbase/virtiofs.html
https://virtio-fs.gitlab.io/

guest linux

0. Добавляем на гостя железку

  ...
  
    
    
  
  ...
  
    ...
    
      
      
      
    
    ...
  



1. В госте монтируем каталог
mount -t virtiofs mount_tag /mnt/mount/path

guest windows

0. Устанавливаем драйверы, агента, службу WinFsp
https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
1. Если "общая папка" сама не появилась то можно выполнить вручную 
cmd
cd "C:Program Files (x86)WinFspbin"
launchctl-x64.exe" start virtiofs viofsY mount_tag0 Y
где:
mount_tag0 - ваш так который вы указали в настройках гостя
Y - желаемая буква (тоже надо viofsY)

Рубрики
ovs / openvswitch / dpdk

Faucet / openvswitch / OpenFlow / SDN

Ссылки:

http://www.openvswitch.org/support/ovscon2016/8/1450-mysore.pdf
https://docs.faucet.nz/en/latest/installation.html
https://github.com/faucetsdn/faucet
https://gist.github.com/cyrenity/397c6baebdc20d9a9e377523f256620e
https://github.com/wandsdn/sc18-ansible

Установка faucet:

### https://docs.faucet.nz/en/latest/installation.html#faucet-apt-install
sudo apt-get install curl gnupg apt-transport-https lsb-release
echo "deb https://packagecloud.io/faucetsdn/faucet/$(lsb_release -si | awk '{print tolower($0)}')/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/faucet.list
sudo curl -1sLf https://packagecloud.io/faucetsdn/faucet/gpgkey -o /etc/apt/trusted.gpg.d/faucet.asc
sudo apt-get update
sudo apt-get install faucet-all-in-one
sudo apt-get install faucet
sudo apt-get install gauge


### Настройка Prometheus
vim /etc/default/prometheus
---------------------------
...
ARGS="--config.file=/etc/faucet/prometheus/prometheus.yml"
...
---------------------------
systemctl restart prometheus.service 


### настройка grafana
sudo systemctl daemon-reload
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
Сначала загрузите http://localhost:3000 в свой веб-браузер (по умолчанию и имя пользователя, и пароль admin).
Веб-интерфейс сначала предложит нам добавить источник данных. 
Используйте следующие настройки:
Name:   Prometheus
Type:   Prometheus
URL:    http://localhost:9090
Нажмите: Save & Test
Далее мы хотим добавить несколько информационных панелей, чтобы позже мы могли просматривать показатели из крана.
Наведите курсор на + кнопку на левой боковой панели в веб-интерфейсе и нажмите Import
https://docs.faucet.nz/en/latest/_static/grafana-dashboards/faucet_instrumentation.json
https://docs.faucet.nz/en/latest/_static/grafana-dashboards/faucet_inventory.json
https://docs.faucet.nz/en/latest/_static/grafana-dashboards/faucet_port_statistics.json

Настройка сервера faucet:

### https://docs.faucet.nz/en/latest/tutorials/first_time.html
### https://docs.faucet.nz/en/latest/configuration.html#configuration-options

Готовим конфиг faucet:
vim /etc/faucet/faucet.yaml
----------------------
---
include:
    - acls.yaml

vlans:
    office:
        vid: 100
        description: "office network"
        acls_in: [office-vlan-protect]
dps:
    sw0:
        dp_id: 0x4
        hardware: "Open vSwitch"
        interfaces:
            5:
                name: "5"
                description: "in5"
                native_vlan: office
            6:
                name: "6"
                description: "in6"
                native_vlan: office
    sw1:
        dp_id: 0x1
        hardware: "Open vSwitch"
        interfaces:
            2:
                name: "2"
                description: "in2"
                native_vlan: office
            3:
                name: "3"
                description: "in3"
                native_vlan: office
    sw2:
        dp_id: 0x2
        hardware: "Open vSwitch"
        interfaces:
            2:
                name: "2"
                description: "in2"
                native_vlan: office
            3:
                name: "3"
                description: "in3"
                native_vlan: office
    sw3:
        dp_id: 0x3
        hardware: "Open vSwitch"
        interfaces:
            6:
                name: "6"
                description: "in6"
                native_vlan: office
            7:
                name: "7"
                description: "in7"
                native_vlan: office
            8:
                name: "8"
                description: "in8"
                native_vlan: office
            9:
                name: "9"
                description: "in9"
                native_vlan: office

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

vim /etc/faucet/acls.yaml 
-------------------------
---
acls:
    office-vlan-protect:
        # Prevent IPv4 communication betwen Office/Guest networks
        - rule:
              actions:
                  allow: 1        # allow
-------------------------


Проверяем на ошибки конфиг faucet:
check_faucet_config /etc/faucet/faucet.yaml

Логи:
tail  /var/log/faucet/faucet.log
journalctl -u faucet.service


Конфиг /etc/faucet/gauge.yaml отвечает за мониторинг faucet(grafana и prometheus).

Настройка openwswitch на клиентах:

### https://docs.faucet.nz/en/latest/vendors/ovs/faucet_testing_with_OVS_on_hardware.html?highlight=openvswitch#commands-on-open-vswitch
Установка пакетов:
apt-get install openvswitch-switch
systemctl status openvswitch-switch.service

Создание бриджа и добавление портов: 
ovs-vsctl add-br ovsbr0
ovs-vsctl add-port ovsbr0 ens3 -- set Interface ens3 ofport_request=1
ovs-vsctl add-port ovsbr0 ens4 -- set Interface ens4  ofport_request=2
ovs-vsctl add-port ovsbr0 ens5 -- set Interface ens5  ofport_request=3
ovs-vsctl add-port ovsbr0 ens6 -- set Interface ens6  ofport_request=4
ovs-vsctl set-fail-mode ovsbr0 secure
ovs-vsctl set bridge ovsbr0 protocols=OpenFlow13,OpenFlow10
ovs-vsctl set-controller ovsbr0 tcp:172.16.0.1:6636 tcp:172.16.0.1:6637

Получаем инфу по клиенту:
ovs-vsctl get bridge ovsbr0 datapath_id
ovs-vsctl show

Изменить настройку  fail_mode:
ovs-vsctl set  bridge ovsbr0  fail_mode=standalone
ovs-vsctl set  bridge ovsbr0  fail_mode=secure

Очистить настройку fail_mode: 
ovs-vsctl clear  bridge ovsbr0  fail_mode

Сменить datapath_id( 0x2 и 0x1 ):
ovs-vsctl set bridge ovsbr0 other-config:datapath-id=0000000000000001
ovs-vsctl set bridge ovsbr0 other-config:datapath-id=0000000000000002

Показать информацию о бридже и портах:
ovs-vsctl get  Interface ens4  ofport_request
ovs-vsctl show
ovs-vsctl list port
ovs-vsctl list port ovsbr0 
ovs-ofctl show ovsbr0
ovs-ofctl dump-tables ovsbr0
ovs-ofctl dump-flows ovsbr0
ovs-ofctl queue-get-config ovsbr0
ovs-vsctl get-controller br0
ovsdb-tool show-log
ovs-dpctl show
ovsdb-client dump


Сброс ovs:
ovs-vsctl emer-reset

Удачное подключение выглядит так:

#### Так вот
# ovs-vsctl show 
55432938-4f67-49b2-983e-bf0bb9f73336
    Bridge ovsbr0
        Controller "tcp:172.16.0.1:6637"
            is_connected: true
        Controller "tcp:172.16.0.1:6636"
            is_connected: true

### Если нет проверяем соответствие портов

vim /etc/default/faucet 
vim /etc/default/gauge

## 
ss -tpln 

## Логи:
tail  /var/log/faucet/faucet.log
journalctl -u faucet.service

Рубрики
owner

Mininet / эмулятор компьютерной сети

Источники:

Mininet — эмулятор компьютерной сети

Установка на debian 11:

apt install mininet

Использование:



Рубрики
owner

gns3 / guacamole / kvm

Ссылки:

https://github.com/boschkundendienst/guacamole-docker-compose

https://docs.gns3.com/docs/getting-started/installation/download-gns3-vm/
https://github.com/GNS3/gns3-gui/releases

default password gns3:

gns3:gns3

default password guacamole:

guacadmin:guacadmin

Быстрый старт guacamole:

git clone "https://github.com/boschkundendienst/guacamole-docker-compose.git"
cd guacamole-docker-compose
./prepare.sh
docker-compose up -d

Рубрики
ovs / openvswitch / dpdk

debian / openvswitvh / dpdk

0. устанавливаем
apt install openvswitch-switch-dpdk

1. добавить в конец 
vim /etc/dpdk/interfaces  
------------------------------
pci     0000:09:00.0    vfio-pci 
pci     0000:09:00.1    vfio-pci
------------------------------

2. добавить в конец 
vim /etc/dpdk/dpdk.conf
-----------------------
NR_2M_PAGES=1024
NR_1G_PAGES=4
------------------------

3. настраиваем ovs
!!! Для проверки номерации ядер в системе можно использовать команду lstopo из пакета hwloc.
!!! lstop
!!! (numactl -H) Установите ядра процессора, на которых должны создаваться потоки ядра dpdk dpdk-core-mask: (требуется шестнадцатеричная строка для наборов процессоров)

ovs-vsctl set Open_vSwitch . "other_config:dpdk-init=true"
ovs-vsctl set Open_vSwitch . "other_config:dpdk-lcore-mask=0x1"
ovs-vsctl set Open_vSwitch . "other_config:dpdk-socket-mem=2048"
ovs-vsctl set Open_vSwitch . "other_config:vhost-iommu-support=true"
systemctl restart ovs-vswitchd.service

4. Создаем бридж и добавляем сетевые карты
ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev 
ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk options:dpdk-devargs=0000:09:00.0 
ovs-vsctl add-port br0 dpdk-p1 -- set Interface dpdk-p1 type=dpdk options:dpdk-devargs=0000:09:00.1
Рубрики
ovs / openvswitch / dpdk

openvswitch / ovs-vsct / dpdk / debian 11 / ubuntu / modprobe / apt /

Ссылки:

http://core.dpdk.org/doc/
https://doc.dpdk.org/guides/tools/devbind.html


https://ubuntu.com/server/docs/network-dpdk
https://ubuntu.com/server/docs/openvswitch-dpdk
https://ubuntu.com/server/docs/search?q=openvswitch&siteSearch=https%3A%2F%2Fubuntu.com%2Fserver%2Fdocs
https://askubuntu.com/questions/1128111/how-to-install-openvswitch-in-ubuntu-16-04

https://habr.com/ru/company/huawei/blog/653839/
https://habr.com/ru/company/intel/blog/280502/


https://docs.microsoft.com/ru-ru/azure/virtual-network/setup-dpdk

https://selectel.ru/blog/vvedenie-v-dpdk-arxitektura-i-princip-raboty/
https://habr.com/ru/company/selectel/blog/313150/


https://docs.openvswitch.org/en/latest/intro/

https://www.intel.com/content/www/us/en/developer/articles/technical/open-vswitch-with-dpdk-overview.html


https://forum.proxmox.com/threads/tutorial-run-open-vswitch-ovs-dpdk-on-pve-7-0.97116/

https://ovs.readthedocs.io/en/latest/howto/dpdk.html

https://doc.dpdk.org/guides/sample_app_ug/l2_forward_real_virtual.html

https://docs.openvswitch.org/en/latest/intro/install/dpdk/

https://habr.com/ru/post/267591/

http://core.dpdk.org/supported/

Установка openvswitch \ debian:

Установка:
sudo apt update
sudo apt upgrade
sudo apt install openvswitch-switch

Установка зависимостей:
sudo apt install build-essential fakeroot graphviz autoconf automake bzip2 debhelper dh-autoreconf libssl-dev libtool openssl procps python-all python-qt4 python-twisted-conch python-zopeinterface module-assistant dkms make libc6-dev python-argparse uuid-runtime netbase kmod python-twisted-web iproute2 ipsec-tools openvswitch-switch racoon

sudo dpkg-checkbuilddeps

Установка openvswitch dpdk \debian:

Удаляем обычный openvswitch
apt remove openvswitch-* --purge
apt autoremove -f 

Удаляем конфигурации openvswitch: 
rm usr/local/var/run/openvswitch /usr/local/etc/openvswitch /var/log/openvswitch /var/lib/openvswitch -rf 

Устанавливаем openvswitch-switch-dpdk:
apt install openvswitch-switch-dpdk

Пример использование DPDK

0. добавили драйверы с поддержкой dpdk: 
vfio-pci 
uio_pci_generic 
ixgbe

1. Создали бридж в openvswitch-switch-dpdk

2. Добавили в него сетевую карту dpdk-p1

Добавление сетевой карты в управление DPDK:

dpdk-devbind --status - проверяем состояние dpdk (доступные \ подключенные устройства)

Загружаем модули ядра 
modprobe vfio-pci
modprobe uio_pci_generic
modprobe ixgbe

Драйверы для устройств:
vfio-pci
uio_pci_generic
Чтобы понять какой IO нужен для работы с картой, сначала пробуем vfio-pci, а если в dmesg будет ошибка - "привязываем" к uio_pci_generic.
dpdk-devbind --bind=vfio-pci 09:00.0
dmesg 
dpdk-devbind --bind=uio_pci_generic 09:00.0

DPDK device config

/etc/dpdk/interfaces
--------------------
pci 0000:09:00.0 uio_pci_generic
--------------------

dpdk-devbind --status - проверяем состояние dpdk (доступные \ подключенные устройства)

DPDK hugapages

vim /etc/dpdk/dpdk.conf
-----------------------
NR_2M_PAGES=1024
NR_1G_PAGES=4
------------------------

dpdk-hugepages -p 1G --setup 2G

Подготовка OVS для использования DPDK

# Enable DPDK support
ovs-vsctl set Open_vSwitch . "other_config:dpdk-init=true"
# run on core 1 only
ovs-vsctl set Open_vSwitch . "other_config:dpdk-lcore-mask=0x1"
# allocate 2G huge pages
ovs-vsctl set Open_vSwitch . "other_config:dpdk-socket-mem=2048"
# enable vhost-user-client IOMMU support
ovs-vsctl set Open_vSwitch . "other_config:vhost-iommu-support=true"
# restart OVS
systemctl restart ovs-vswitchd.service

# problem 
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
# restart OVS
systemctl restart ovs-vswitchd.service

Создание br0 и добавление dpdk-p0

ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk options:dpdk-devargs=0000:09:00.1

PMD Thread Statistics:

To show current stats:
ovs-appctl dpif-netdev/pmd-stats-show

To clear previous stats:
ovs-appctl dpif-netdev/pmd-stats-clear

Port/RXQ Assigment to PMD Threads:

To show port/rxq assignment:
ovs-appctl dpif-netdev/pmd-rxq-show

To change default rxq assignment to pmd threads, rxqs may be manually pinned to desired cores using:
ovs-vsctl set Interface  other_config:pmd-rxq-affinity=

where:
 is a CSV list of : values

For example:
$ ovs-vsctl set interface dpdk-p0 options:n_rxq=4 other_config:pmd-rxq-affinity="0:3,1:7,3:8"

Adding an OVS port to a KVM guest:

# create a directory for vhost-user sockets
mkdir -p /var/run/vhostuserclient

# add a vhost-user-client port
ovs-vsctl add-port br0 vhost-user-1 -- set Interface vhost-user-1 type=dpdkvhostuserclient "options:vhost-server-path=/var/run/vhostuserclient/vhost-user-client-1"

# vm setup
- Ensure the VM instance is powered off.
- Change the machine type to `q35`.
- Enable NUMA on guest CPU.
- Edit `/etc/pve/qemu-server/.conf`, add the following lines to add the port to guest with mac address `00:00:00:00:00:01` and enable hugepages and (optional) vIOMMU on the guest:
```
args: -machine q35+pve0,kernel_irqchip=split -device intel-iommu,intremap=on,caching-mode=on -chardev socket,id=char1,path=/var/run/vhostuserclient/vhost-user-client-1,server=on -netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce=on -device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1
hugepages: 1024
```

Рубрики
KVM

osv + kvm (еще один способ подать vlan)

Пример настроенного сетевого интерфейса VM

!!! настраиваем путем редактирования VM
!!! Обращаем внимание на следующие:
!!! ovsbr0 - настроенный bridge с помощью openvswitch
!!! vlan-4082 - имя нужного нужного vlan
!!! log-ens3 - желаемое имя сетевого адаптера на гипервизоре


  
  
  
    
  
  
  
  
  

Настройка OVS

!!! После включения ВМ у нас появится интерфейс с именем "log-ens3" на гипервизоре
ovs-vsctl set port log-ens3 tag=1234 - добавим vlan с тегом 1234 для интерфейса log-ens3
Рубрики
ovs / openvswitch / dpdk

ovs / openvswitch / виртуальный интерфейс / virtual interface / debian

Пример:

1. Добавляем интерфейс vitest
!!! будет ошибка что не существует интерфейс с именем vitest, но он будет создан
!!! ovs-vsctl show будет ошибка (error: "could not open network device vitest (No such device)") 

ovs-vsctl add-port ovsbr0 vitest 

2. Теперь делаем его внутренним
ovs-vsctl set interface vitest type=internal

3. Теперь мы можем работать с ним как с обычным интерфейсом
!!! По поводу vlan их надо задавать в ovs
ip address add 192.168.101.12/24 dev vitest - добавить адрес 192.168.101.12 с сетевой маской 24 на устройство vitest                                         
ip address del 192.168.1.5/24 dev vitest - удалить ip-адрес 192.168.1.5/24 с интерфейса eth0 vitest 
ip link set mtu 9000 dev vitest - установим MTU устройства vitest на 9000
ip link set dev vitest  mtu 1400 - установить MTU равным 1400 на интерфейсе vitest
ip link add link vitest name vitest.500 type vlan id 500 - добавить vlan 500 интерфейс vitest.500 к родительскому vitest

4. задаем vlans
ovs-vsctl set port vitest tag=566 
ovs-vsctl set port  tag=4082 trunks=4082,566 vlan_mode=native-untagged

5. Очистить tag, vlans, vlan_mode
ovs-vsctl clear port vitest trunks
ovs-vsctl clear port vitest tag
ovs-vsctl clear port vitest vlan_mode

6. удалить порт 
ovs-vsctl del-port vitest

7. Дополнительные команды:
ip a  - показать все интерфейсы
ovs-vsctl show - показать порты в ovs
man ovs-vsctl - помощь по ovs-vsctl

Одной командой создать ВИ vitest c tag555:

ovs-vsctl add-port ovsbr0 vitest tag=555 -- set interface vitest type=internal

Настройка авто конфигурирования ip на интерфейсе vitest:

1. Редактируем файл interfaces
vim /etc/network/interfaces
---------------------------
auto vitest
iface vitest inet static
      address 10.168.177.200
      netmask 255.255.255.192
---------------------------

2. ifup vitest  - проверяем и запасаем интерфейс vitest

Пример настойки интерфейса ВМ



  
  
    
  
  
      
   
  


Рубрики
KVM ovs / openvswitch / dpdk

KVM OVS / установка KVM / настройка сети openvswitch / debian

Установка KVM

cat /proc/cpuinfo | grep -E '(vmx|svm)' -m 1 - проверить что процессор поддерживает Виртуализацию
 
apt install qemu-kvm libvirt-daemon-system ovmf  virtinst - установка на debian
apt install qemu-kvm libvirt-bin ovmf  virtinst - установка на ubuntu (до 20)
yum -y install kvm libvirt qemu-kvm virtinst - установка на CentOS
 
apt install virt-manager - установка virt-manager
 
qemu-kvm - гипервизор
libvirt-bin - по для управления гипервизором(virsh)
virt-manager - графическая утилита для управления гипервизором (не обязательная программа, для установки требуется x-windows)
ovmf - по для поддержки загрузки uefi для гостей
virtinst - программа для создания виртуальных машин в консоли 
 
ip -a - посмотреть адаптеры
iptables -vnL - показать правила firewall
sudo iptables -nvL  - показать правила firewall
 
virt-host-validate - проверка установленных компонентов

libvirtd - основной демон управления виртуализацией
systemctl status libvirtd - проверяем состояние демона
systemctl start libvirtd - запускаем демон
systemctl enable libvirtd - добавляем в автозагрузку

Установка OVS и настройка OVS

apt install openvswitch-switch - устанавливаем ovs

ovs-vsctl show - смотрим что у нас с сетью
ovs-vsctl add-br ovsbr0 - создаем свитч с именем ovsbr0
ovs-vsctl add-port ovsbr0 eno1 - добавляем в свитч с именем ovsbr0 интерфейс eno0
ovs-vsctl show - проверяем настройки


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

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 ovsbr0
iface br0 inet static
address 192.168.15.253/24
gateway 192.168.15.1

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

Настройка сети 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 ovsbr0
iface ovsbr0 inet dhcp
-------------------------------------

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

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

Настройка сети KVM и OVS

!!! можно просто отредактировать сеть по умолчанию default
!!! virsh net-edit default

0. Выполняем выгрузку сети по умолчанию
virsh net-list --all - показать все сети 
virsh net-dumpxml default > /root/1.xml - этой командой мы можем сохранить настройки сети default

1. Редактируем файл 1.xml  
1.1 пример простой сети (ovs) для добавления в KVM 
-------------

  ovsbr0
  
  
  

-------------
 
1.2 пример сложной сети с vlan (ovs) для добавления в KVM 
-------------------

  ovs-network
  
  
  
  
    
      
    
  
  
    
      
    
  
  
    
      
    
  
  
    
      
    
  
  
    
      
      
    
  

-------------------
 
 
2. Добавляем сеть ovsbr0 из файла 1.xml
virsh net-define --file /root/1.xml - этой командой мы можем создать сеть из файла (/root/1.xml)
virsh net-start --network ovsbr0 - запуск сети 
virsh net-autostart --network ovsbr0 - включение автозапуска для сети 

Пример настройки интерфейса ВМ

0. virsh list --all - показать доступные ВМ
1. virsh edit VM_name - редактируем файл настроек VM_name
----------------
  
      
      
      
      
----------------

Редактирование сети default на живую:

Добавление нового vlan:

virsh net-update default add portgroup "
     
         
     
" --live --config


irsh net-update default add portgroup "
     
         
         
     
" --live --config


Изменение существующего vlan:

virsh net-update default modify portgroup  "
    
      
    
  " --live --config


Рубрики
KVM

Как отключить AppArmor \ How to disable and remove AppArmor \ Ubuntu \ Debian

Ошибка при выполнении миграции debian10:

Команда миграции:
virsh migrate --live --copy-storage-all --persistent --abort-on-error --verbose linux6 qemu+ssh://hsrv1/system

Ошибка:
Live Migration Failure With Error "Unable to find security driver for model apparmor"


Должно было помочь:
Вариант 1:
sudo aa-status - смотрим состояние AppArmor
sudo aa-teardown - вырубаем AppArmor 

Вариант 2:
sudo apt install apparmor-utils
sudo aa-complain /etc/apparmor.d/usr.sbin.libvirtd
sudo aa-enforce /etc/apparmor.d/usr.lib.libvirt.virt-aa-helper
service libvirtd restart

Удалить AppArmor

sudo systemctl stop apparmor
sudo systemctl disable apparmor
sudo apt remove --assume-yes --purge apparmor
Рубрики
Virtualization

Xen / debian

0. Первым делом проверим поддержку инструкций аппаратной виртуализации:
egrep '(vmx|svm)' /proc/cpuinfo | wc -l

1. Выполним обновление репозиториев:
apt-get update

2. Установка:
apt-get install xen-linux-system

3. Выполняем обновление grub:
dpkg-divert --divert /etc/grub.d/08_linux_xen --rename /etc/grub.d/20_linux_xen

4. Заново сгенерируем файл /boot/grub/grub.cfg:
update-grub

5. Как только система загрузилась, проверить запущен ли Xen можно командой:
xl list
!!! если что-то пошло не так, то система вернет результат:
ERROR:  Can't find hypervisor information in sysfs!

6. Базовая настройка сети
nano /etc/network/interfaces

вариант 1
---------
iface lo inet loopback
 
auto xenbr0
iface xenbr0 inet dhcp
  bridge_ports eth0
 
auto eth0
iface eth0 inet manual
---------

вариант 2
---------
auto lo
iface lo inet loopback
 
auto xenbr0
iface xenbr0 inet static
  bridge_ports eth0
  address 192.168.1.120
  netmask 255.255.255.0
  gateway 192.168.1.1
 
auto eth0
iface eth0 inet manual
---------

7. Проверяем сеть
brctl show
ip addr

Пример конфига

0. vim vmconfig.cfg
------------
name = '2012R2Test01'
builder = 'hvm'
kernel = '/usr/lib/xen-4.8/boot/hvmloader'
vcpus = 4
memory = 4096
disk = [
       '/root/ru_windows_server_2012_r2x64_dvd_6052763.iso,,hdc,cdrom',
       '/dev/vg0/2012R2Test01-Disk001,,hda'
       ]
vif = ['mac=00:50:56:00:D3:7E,bridge=xenbr0']
boot = "d"
vnc = 1
vncconsole = 1
vnclisten = ""
vncpasswd = ""
------------

1. xl create vmconfig.cfg

tool xm

Программа xm - это главный инструмент по управлению Xen из консоли. 

Общий формат командной строки xm такой:
xm команда [ключи] [аргументы] [переменные]

Для того чтобы посмотреть справку самой программы, введите:
xm help

Выводит информацию о доменах в формате:
xm list

Если вы хотите узнать, сколько уже работают ваши домены, дайте команду:
xm uptime

Доступ к консоли домена можно получить с помощью команды xm console:
xm console myVM

Сохранить домен VM1 на диск можно командой:
xm save VM1 VM1.chk !!! Домен будет остановлен, а его состояние записано в файле VM1.chk

Чтобы продолжить выполнение домена, используется команда restore:
xm restore VM1.chk

Миграция и живая миграция:
xm migrate --live mydomain destination.ournetwork.com


Конфигурационные файлы:

В конфигурационных файлах Xen могут присутствовать перечисленные ниже параметры. 
Если не указано обратное, конфигурационные параметры заключаются в кавычки. 
В каталоге /etc/xen/ есть конкретные примеры.

kernel - путь к образу ядра
ramdisk - путь к образу виртуального диска (не обязательно)
memory - объём память в мегабайтах
vcpus - количество виртуальных процессоров
console - порт, на котором будет доступна консоль (по умолчанию 9600 + domain ID)
vif - конфигурация сетевых интерфейсов. vif = [ 'mac=00:16:3E:00:00:11, bridge=xen-br0', 'bridge=xen-br1' ]
disk - список блочных устройств, которые должны быть экспортированы в домен. Например: ~disk = [ 'phy:hda1,sda1,r' ]
dhcp - нужно установить равным 'dhcp', если для конфигурирования сети будет использоваться этот протокол
netmask - сетевая маска
gateway - IP-адрес шлюза
hostname - имя виртуального хоста
root - имя корневого раздела, передаваемое ядру системы
nfs_server - IP-адрес NFS сервера, если используется
nfs_root - путь к корневому каталогу на NFS-сервере, если используется
extra - дополнительные параметры, которые передаются ядру (не обязательно)
Рубрики
ovs / openvswitch / dpdk

openvswitch / ovs / bond0

Пример 1:

0. Создали бридж с именем ovsbr1:
ovs-vsctl add-br ovsbr1 

1. Синтаксис bond:
ovs-vsctl add-bond   

2. Создали bond0 в свитче ovsbr1 из интересов eth1,eth3
ovs-vsctl add-bond ovsbr1 bond0 eth1 eth3

2. Включили lacp на интерфейсе bond0
ovs-vsctl set port bond0 lacp=active

# вариант на backup-active
ovs-vsctl add-bond ovsbr0 bond0 enp2s0 wlan0 bond_mode=active-backup

Пример 2:

ovs-vsctl add-bond ovsbr1 bond0 eth1 eth3 lacp=active

Дополнительные команды:

ovs-appctl bond/show  - показать информацию о bond

ovs-appctl lacp/show  - показать информацию о lacp

ovs-vsctl list port bond0 - показать порты в bond

ovs-vsctl set port ovsbr0 tag=29 - установить vlan с tag 29


ovs-vsctl del-port br0 bond0 -- add-bond br0 bond0 a b c d - удалить bond0 из br0 и создать bond0 из интерфейсов a,b,c,d


Ссылки:

https://blog.scottlowe.org/2012/10/19/link-aggregation-and-lacp-with-open-vswitch/
https://mail.openvswitch.org/pipermail/ovs-discuss/2017-October/045455.html
https://wiki.archlinux.org/title/systemd-networkd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)
Рубрики
KVM

kvm migrate / clone / миграция / клонирование

Подготовка:

0. Проверяем доступность между серверами kvm (iptables -L -n -v, ipset list kvm)

1. Проверяем соответствие конфигурации live и config по части сети и дисков
virsh dumpxml VM_NAME
cat /etc/libvirt/qemu/VM_NAME.xml
virsh net-dumpxml default

2. Проверяем конфиг VM_NAME
virsh dumpxml --inactive --security-info VM_NAME > /tmp/VM_NAME.xml
vim /tmp/VM_NAME.xml
В случае различия в процессорах можно их выровнять по младшему процессору, отключив некоторые фичи (потребуется перезагрузка):
  
    
    
    
  

3. 
Проверяем лимит скорости при миграции
virsh migrate-getspeed VM_NAME
 
Ограничиваем скорость, если требуется
virsh migrate-setspeed  VM_NAME Speed-in-B
virsh migrate-setspeed  VM_NAME 20000000

Увеличиваем простой ВМ после миграции (фриз на время копирования памяти, дефолт: 500)
virsh migrate-setmaxdowntime  VM_NAME milliseconds

​Миграция без удаления (виртуальная машина не удаляется после перемещения):

 
!!! Рекомендуется к применению
virsh migrate --live --copy-storage-all --persistent --abort-on-error --verbose VM_NAME qemu+ssh://TO_KVM_SERVER/system
 
 дополнительно можно указать --xml filename.xml для таргета
  дополнительно можно указать --compressed для уменьшения передаваемых при миграции данных
  
  ** Не забываем, что после миграции создаётся файл текущей конфигурации, а не указанной в --xml, поэтому надо применять конфиг отдельно.

Миграция с удалением и созданием в новом KVM:

!!! Внимание лучше использовать вариант без удаления
!!! мигрировать надо с двумя важными опциями 
!!! --undefinesource - удалить ВМ из того гипервизора откуда мигрируем(логично, да?)
!!! --persistent - добавить ВМ в список ВМ на новом месте

Миграция:
virsh migrate VM_NAME qemu_ssh://KVM_NAME/system --undefinesource --persistent

Проверка:
virsh dominfo VM_NAME | grep persistent

Пример переноса ВМ:

На хосте с которого копируем ВМ:
0) Копируем диск на новый хост (файл myserver.qcow2)
1) Выгружаем настройки ВМ
virsh dumpxml myserver > /mnt/data-1/myserver.xml - сохранить настройки ВМ

На хосте на котором разворачиваем бэкап:
0) Восстанавливаем ВМ
virsh define /home/user/myserver.xml
1) При необходимости правим (указываем месторасположение образа жесткого диска):
virsh edit myserver

virt-clone:

!!! Перед клонирование ВМ необходимо выключить или поставить на паузу.
!!! virsh shutdown
!!! vursh suspend

Первый вариант:
virt-clone --original {Domain-Vm-Name-Here} --auto-clone

Второй вариант:
virt-clone --original {Domain-Vm-Name-Here} --name {New-Domain-Vm-Name-Here} --auto-clone

Третий вариант:
virt-clone --original {Domain-Vm-Name-Here} --name {New-Domain-Vm-Name-Here} --file {/var/lib/libvirt/images/File.Name.here}


Пример:
virsh suspend Name_VM_1
virt-clone --original Name_VM_1 --name Name_VM_2 --file /var/lib/libvirt/images/Name_VM_2.qcow2
virsh resume Name_VM_1
virt-sysprep -d Name_VM_2 --hostname Name_VM_2 --enable user-account,ssh-hostkeys,net-hostname,net-hwaddr,machine-id --keep-user-accounts vivek --keep-user-accounts root --run 'sed -i "s/192.168.122.16/192.168.122.25/" /etc/network/interfaces'

ссылки:


Рубрики
KVM ovs / openvswitch / dpdk

ovs \ libvirt \ virsh \ lxc \ openvswitch \ openflow \ контейнеры

ссылки:

http://www.openvswitch.org/
https://docs.openvswitch.org/en/latest/howto/libvirt/
https://libvirt.org/drvlxc.html
https://libvirt.org/drvqemu.html
https://www.linux-kvm.org/page/Main_Page
https://xakep.ru/2017/09/04/open-vswitch/
https://habr.com/ru/post/242741/
https://xakep.ru/2012/11/19/59656/
https://docs.openvswitch.org/en/latest/howto/libvirt/
https://russianblogs.com/article/5481757540/

Установка необходимых пакетов:

# ставим на Debian 10

apt install openvswitch-switch - ставим openvswitch (ovs)
apt install qemu-kvm libvirt-clients libvirt-daemon-system - устанавливаем libvirt

openvswitch:

обычное использование без vlan:
ovs-vsctl show - показывает информацию по свитчу, проверяем работу и заодно узнаем какая у нас версия ovs
ovs-vsctl add-br br0 - добавляем свитч с именем br0
ovs-vsctl add-port br0 eth0 - добавляем интерфейс eth0 в свитч br0 

пример с vlan:
ovs-vsctl add-br ovs0 - добавляем свитч openvswitch с именем br0
ovs-vsctl add-port ovs0 eth0 - добавляем интерфейс eth0 в свитч ovs0 
ovs-vsctl set port eth0 vlan_mode=native-untagged tag=2 trunks=2,3,4 - вешаем trunk на интерфейс eth0 
ovs-vsctl add-port ovs0 ovs0-vlan2 tag=2 -- set Interface ovs0-vlan2 type=internal - добавляем порт и вешаем access (tag=2) на интерфейс ovs0-vlan2
ovs-vsctl add-port ovs0 ovs0-vlan4 tag=4 -- set Interface ovs0-vlan4 type=internal - добавляем порт и вешаем access (tag=4) на интерфейс ovs0-vlan2
ovs-vsctl add-port ovs0 ovs0-vlan3 tag=3 -- set Interface ovs0-vlan3 type=internal - добавляем порт и вешаем access (tag=3) на интерфейс ovs0-vlan2

ovs-vsctl set port ovsbr0 tag=29

удаление портов и коммутатора:
ovs-vsctl del-port ovs0-vlan2 - удалить порт (ovs0-vlan2) из коммутатора
ovs-vsctl del-br ovs0 - удалить коммутатор ovs0

Примеры настройки сети:

dhcp client:
dhclient ovs0-vlan3 - получить настройки по dhcp для интерфейса ovs0-vlan3

static ifconfig:
ifconfig ovs0-vlan2 inet 10.254.254.1/24 up - настраиваем ip 10.254.254.1/24 и запускаем интерфейс
ifconfig ovs0-vlan4 up - просто запускаем интерфейс без настройки ip


static ip:
ip a - показать доступные устройства
ip address add  192.168.66.10/24 dev eth0 - задаем адрес ipv4
ip link set up eth0 - запускаем интерфейс

Собственно пытаемся работать:

virsh --c lxc:// - подключаемся к консоли управления lxc контейнерами
create /root/lxc0.xml - создаем контейнер из шаблона lxc0.xml
create /root/lxc1.xml - создаем контейнер из шаблона lxc1.xml
list - показать доступные контейнеры
console lxc0 - подключаемся к контейнеру lxc0 (CTRL+] - отключится контейнера)

ip a - показать доступные устройства
ip address add  192.168.66.10/24 dev eth0 - задаем адрес ipv4
ip link set up eth0 - запускаем интерфейс


ip a - показать доступные устройства
ip address add  192.168.66.11/24 dev eth0 - задаем адрес ipv4
ip link set up eth0 - запускаем интерфейс




Шаблон для контейнера(lxc0.xml)


    lxc0
    131072
    
        exe
        /sbin/init
    
    1
    
    
        
            
            
            
        
        
    

Шаблон для контейнера(lxc1.xml)


    lxc1
    131072
    
        exe
        /sbin/init
    
    1
    
    
        
            
            
            
        
        
    



OpenFlow


По умолчанию openvswitch работает как обычный свитч (нету vlan)
ovs-vsctl set-fail-mode br0 secure - включаем режим работы умного свитча (Задействуем протокол OpenFlow)

Гоняем трафик между двумя портами
ovs-ofctl add-flow br0 in_port=1,action=output=2
ovs-ofctl add-flow br0 in_port=2,action=output=1
ovs-ofctl dump-flows br0 - проверяем что мы там настроили 

ovs-vsctl set-fail-mode br0 standalone - вернуть настройки в обычный режим (br0 снова будет как обычный свитч)



# еще 
ovs-ofctl -O OpenFlow13 dump-flows ovsbr0
ovs-ofctl -O OpenFlow13 dump-ports ovsbr0

Рубрики
KVM

Как добавить virsh console / How To Enable Virsh Console Access For KVM Guests / rs232 / com port

ссылки

https://ostechnix.com/how-to-enable-virsh-console-access-for-kvm-guests/
https://www.cyberciti.biz/faq/howto-exit-virsh-console-connection-on-centos-ubuntu-debian-linux/
https://gist.github.com/lukasnellen/fe9b61cb9add581ef0215bd40c09c7c2
https://ravada.readthedocs.io/en/latest/docs/config_console.html
https://unix.stackexchange.com/questions/288344/accessing-console-of-ubuntu-16-04-kvm-guest


Зачем нужен visrsh console?
Что бы с гипервизора подключатся на гостевые хосты.

общая настройка гостей

!!! по умолчанию оно обычно добавлено но на госте не запущен tty
!!! нас интересует последовательное подключение
!!! устройство pty
!!! /dev/pts/0

Должно быть добавлено оборудование:
    
      
    

для CentOS

!!! Подключаемся по ssh и выполняем от root
systemctl enable serial-getty@ttyS0.service
systemctl start serial-getty@ttyS0.service

для Debian / Ubuntu

!!! Подключаемся по ssh и выполняем от root
sudo systemctl enable serial-getty@ttyS0.service
sudo systemctl start serial-getty@ttyS0.service


!!! вроде больше не актуально (На debian 10 и ubuntu 20 работает после запуска serial-getty@ttyS0.service)
# В ubuntu ~14 был баг не консоль после активации не работала 
# Была ошибка при подключении
0. Редактируем /etc/default/grub:
---------------------------------
...
###GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0,115200n8 console=tty1"
GRUB_CMDLINE_LINUX=""
...
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
----------------------------------

1. Применяем изменения
update-grub2

Для выхода из консоли (virsh console vm)

CTRL+Shift+5
CTRL+Shift+]

Помощь по команде (virsh console)

virsh help console

iei puzzle in003b / console

0. Редактируем /etc/default/grub:
---------------------------------
...
###GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0,115200n8 console=tty1"
GRUB_CMDLINE_LINUX=""
...
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
----------------------------------

1. Применяем изменения
update-grub2

2. Создаем демон консоли:
cat > /etc/systemd/system/ttyS0.service << "EOF"
[Unit]
Description=Serial Console Service
[Service]
ExecStart=/sbin/getty -L 115200 ttyS0 vt102
Restart=always
[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable ttyS0
systemctl start ttyS0

3. Reboot
reboot
Рубрики
KVM Виртуализация \ контейнеры \ облака

KVM изменить размер диска / blockresize / domblklist / guests linux / mbr /gpt

Внимание !!!

Всегда делаем backup!!!

Изменение диска offline / qemu-img

!!! не забываем делать backup

qemu-img resize vmdisk.qcow2 +10G - добавим 10Гб диску vmdisk.img

Изменение диска online / blockresize

virsh blockresize   
   [--domain] <строка>  имя домена, ID или UUID
   [--path] <строка>  Полный путь к блочному устройству
   [--size] <число>  Новый размер блочного устройства, кратный целому числу (по умолчанию в КиБ)

virsh domblklist name_VM - узнаем какие диски есть у ВМ
virsh blockresize name_VM /kvm/name_VM_disk.qcow2 100G - для ВМ (name_VM), изменим размер диска равный 100Гб

Необходимые действия для гостя, при изменении диска, MBR диск / один раздел / fdisk:

!!! Не забываем делать backup 
!!! Внимание пример для одного диска с одним разделом
!!! fdisk -l - посмотреть доступные

 fdsik /dev/sda - редактируем таблицу разделов
   : p - показываем таблицу разделов
   Устр-во    Загрузочный Start Конец Секторы Size Id Тип
   /dev/sda1  *            2048 14678015 14675968   7G 83 Linux
   : d - удаляем таблицу разделов
   : n - создаем таблицу разделов
   Do you want to remove the signature? [Y]es/[N]o: N - не удаляем сигнатуры
   : a - ставим ставим загрузочный бит
   : w - применяем изменения
!!! после выхода из (fdisk) будет сказано что изменена таблица разделов и необходимо выполнить partprobe
(name_VM)# partprobe - выполняем просим систему перечитать таблицу разделов
(name_VM)# resize2fs /dev/sda1 - выполняем изменения FS

Необходимые действия для гостя, при изменении диска, MBR диск / несколько разделов / parted:

!!! Не забываем делать backup 
!!! Внимание пример для одного диска и нескольких разделов
!!! fdisk -l - посмотреть доступные

Пример (parted)
(name_VM)# parted /dev/vda - открываем нужный диск
           (parted) print free - покажем доступные  разделы (диск /dev/vda)
               Number Start End Size Type File system Flags
               1 32.3kB 4295MB 4295MB primary ext4 boot
               2 4295MB 8590MB 4295MB primary linux-swap(v1)
               3 8590MB 107GB 98GB primary ext4
                 107GB 215GB 107GB Free Space
           (parted) resizepart 3 - изменяем размер третьего раздела
               End [107GB]? 215GB
           (parted) quit - выходим из parted
(name_VM)#partprobe - выполняем просим систему перечитать таблицу разделов
(name_VM)#resize2fs /dev/vda3 -  выполняем изменения FS

Необходимые действия для гостя, при изменении диска, GBT диск / несколько разделов / parted:

!!! GPT Рассматривается схема с одним разделом (/dev/vdb1) на весь диск
(name_VM)#partprobe
(name_VM)#gdisk /dev/vdb
  переходим в расширенный режим x
  смещаем запись в конец диска e
  выходим из расширенного режима m
  Command (? for help): d
  Using 1
  Command (? for help): n
  Partition number (1-128, default 1): [Enter]
  First sector (34-2147483614, default = 2048) or {+-}size{KMGTP}: [Enter]
  Last sector (2048-2147483614, default = 2147483614) or {+-}size{KMGTP}: [Enter]
  Current type is 'Linux filesystem'
  Hex code or GUID (L to show codes, Enter = 8300): [Enter]
  Changed type of partition to 'Linux filesystem'
  выходим с сохранением w
(name_VM)#partprobe
(name_VM)#resize2fs /dev/vdb1
или
btrfs filesystem resize max /

Смонтировать образ диска qcow2 в гипервизоре:

modprobe nbd max_part=8
qemu-nbd --connect=/dev/nbd0 .qcow2
fdisk /dev/nbd0 -l
mount -o ro /dev/nbd0p1 /mnt/ext0
umount /mnt/ext0
qemu-nbd --disconnect /dev/nbd0
rmmod nbd
Рубрики
KVM Виртуализация \ контейнеры \ облака Конспект

Конспект: KVM / libvirt / apt / yum / systemctl / ip / virt / libvirt / virsh / lvm

ссылки

https://www.youtube.com/watch?v=tLQ2PtSVr58 - достаточно толковое видео
https://b14esh.com/category/kvm - много всего 
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/ - драйверы для виртуального оборудования
https://b14esh.com/devops/cockpit.html - веб интерфейс управления KVM

Установка

cat /proc/cpuinfo | grep -E '(vmx|svm)' -m 1 - проверить что процессор поддерживает Виртуализацию

apt install qemu-kvm libvirt-daemon-system ovmf  virtinst - установка на debian
apt install qemu-kvm libvirt-bin ovmf  virtinst - установка на ubuntu (до 20)
yum -y install kvm libvirt qemu-kvm virtinst - установка на CentOS

apt install virt-manager - установка virt-manager


qemu-kvm - гипервизор
libvirt-bin - по для управления гипервизором(virsh)
virt-manager - графическая утилита для управления гипервизором (не обязательная программа, для установки требуется x-windows)
ovmf - по для поддержки загрузки uefi для гостей
virtinst - программа для создания виртуальных машин в консоли 

ip -a - посмотреть адаптеры
iptables -vnL - показать правила firewall
sudo iptables -nvL  - показать правила firewall

virt-host-validate - проверка установленных компонентов

libvirtd - основной демон управления виртуализацией
systemctl status libvirtd - проверяем состояние демона
systemctl start libvirtd - запускаем демон
systemctl enable libvirtd - добавляем в автозагрузку

virsh

virsh - программа для управления KVM
help - покажет все доступные команды

!!! Использование virsh  работает TAB 

virsh command \ KVM управление 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 - отредактировать настройки ВМ

net-

!!! Сеть
!!!  В данном примере все действия производятся из оболочки virsh
!!! сеть должна отличаться от вашей сети, иначе она не сможет запустится. 
!!! тоесть у вас сеть 192.168.0.0/24, тогда виртуальная будет 192.168.100.0/24 
!!! по умолчанию 192.168.122.0/24
!!! При создании сети создаются также правила в firewall

net-list - покажет все активные сети
net-list --all - показать все сети 
net-info default - посмотреть информацию по сети default
net-edit default - редактировать параметры сети default 
net-start default - запуск сети default
net-autostart default - включить авто запуск сети
net-destroy - остановка сети ( в некоторых случаях удаляет сеть)

net-dumpxml default - вывести на экран настройки сети
virsh net-dumpxml default > /root/default.xml - выйдя из virsh, вот так можно выгрузить настройки сети  default  в файл  default 



  namelan0
   ... можно удалить всю строку вместе с uuid, будет регенерировано при создании сети 
  
  
  
    
       
          
       
   


!!! Существует две команды для создания сети из xml файла. 
!!! Это net-create и net-define.
!!! Имеются отличия созданных сетей
!!! При net-define сеть создается, ее надо запустить, при net-destroy  она останавливается, для удаления надо использовать команду net-undefine
!!! При net-create сеть создается и сразу запускается, при net-destroy сразу удаляется

net-define --file file.xml - создать сеть из файла file.xml
net-start --network namelan0 - запуск сети namelan0
net-destroy namelan0 - остановить сеть  namelan0
net-undefine --network namelan0 - удалить сеть полностью


net-create --file /home/b14esh/file.xml - создание сети 
net-destroy namelan0 - удалить сеть namelan0

LVM / parted

!!! подготовим диск для LVM
parted -l - все диски и их разметку
parted /dev/vdb - запустили партед и указали диск с которым будем работать
(parted)mklabel msdos - задали таблицу разделов MBR, если требуется поддержка диска более 2ТБ то необходимо таблицу разделов указывать GPT команда  (parted)mklabel gpt
(parted) unit MiB - выбрали единицу измерения мегабайты
(parted) mkpart - запросили создать раздел
        Partition type?  primary/extended? p - сказали что он первичный
        File system type?  [ext2]? ext4 - попросили создать файловую систему ext4
        Start? 0 - указали начало раздела
        End? -1 - указали  конец
        y - применили изменения 
(parted) q - выход из программы разметки

!!! Если диск будет использоваться не для LVM то надо создать на нем ФС
mkfs.ext4 /dev/vdb2 - для создания ФС на диске /dev/vdb2

LVM / создание

fdisk -l - показать диски и разделы
parted -lm - показать диски и разделы
ls /dev/vd* - показать диски и разделы

pvcreate /dev/vdb1 - создаем структуру LVM, пометим диск
vgcreate vg0 /dev/vdb1 - создадим группу vg0 и добавим туда помеченный диск vdb1
vgdisplay - показать используемое пространство

!!! Все этого достаточно что бы дальше KVM мог использовать данный раздел.

сеть на openvswitch

!!! сносим сеть на brctl !!!
brctl show - проверяем что у нас там настроено
brctl delif br0 eno1 - удаляем интерфейс (eno1) из (br0)
brctl delbr br0 - удаляем бридж (br0)
brctl show - проверяем что у нас там настроено

!!! настраиваем ovs
apt install openvswitch-switch - устанавливаем ovs
ovs-vsctl show - смотрим что у нас с сетью
ovs-vsctl add-br br0 - создаем свитч с именем br0
ovs-vsctl add-port br0 eno1 - добавляем в свитч с именем br0 интерфейс eno0
ovs-vsctl show - проверяем настройки

!!! далее настройка KVM
virsh net-list --all - показать все сети 
virsh net-dumpxml default > /root/1.xml - этой командой мы можем сохранить настройки сети default


пример простой сети (ovs) для добавления в KVM 
-------------

  br0
  
  
  

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

virsh net-define --file /root/1.xml - этой командой мы можем создать сеть из файла (/root/1.xml)
virsh net-start --network br0 - запуск сети 
virsh net-autostart --network br0 - включение автозапуска для сети 

пример сложной сети с vlan (ovs) для добавления в KVM 
-------------------

  ovs-network
  
  
  
  
    
      
    
  
  
    
      
    
  
  
    
      
    
  
  
    
      
    
  
  
    
      
      
    
  

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


пример настройки интерфейса ВМ
virsh list --all - показать доступные ВМ
virsh edit VM_name - редактируем файл настроек VM_name
----------------
  
      
      
      
      
----------------

LVM / pool — для каталога

!!! Хранилище образов, дисков
!!! RAW - сырой диск
!!! qcow2 - динамически расширяемый, предпочтительный формат, так как гостя можно будет бэкапить средствами kvm
!!! хз как по скорости по мне так они одинаковые

pool-list --all - показать все хранилища

!!! Для команд pool-create и pool-define требуется конфигурационные файлы xml
!!! При pool-define хранилище создается, его надо запустить, при pool-destroy останавливается, для удаления надо использовать команду pool-undefine
!!! При pool-create создается и сразу запускается, при pool-destroy сразу удаляется, подходит для временного использования
!!! Так как у нас нет конфиг файла хранилища xml можно воспользоваться командами pool-create-as и pool-define-as 

pool-create-as --name local-tmp --type dir --target /tmp/ - создать хранилище с именем local-temp в каталоге /tmp и оно сразу будет запущенно
pool-destroy local-tmp - удалить хранилище

pool-define-as --name local-tmp --type dir --target /tmp/ - создать хранилище с именем local-temp в каталоге /tmp 
pool-autostart local-tmp - включить авто запуск хранилища local-tmp
pool-start local-tmp - запустить хранилище local-tmp

vol-create-as --pool local-tmp --capacity 1G --name test.qcow2 --format qcow2 - вот так можно создать диск test.qcow2 на локальном хранилище local-tmp

pool-destroy local-tmp - останавливаем хранилище local-tmp 
pool-undefine --pool local-tmp - удаляем хранилище local-tmp 

pool-define-as --name vg0 --type logical --source-name vg0 - добавить хранилище на LVM (почему --type logical ХЗ)
pool-autostart --pool vg0 - добавили в авто запуск хранилище vg0
pool-start --pool vg0 - запустили хранилище


vol-create-as --pool vg0 --name test --capacity 1G - создать диск с именем test размером 1Gb
vol-list --pool vg0 - показать диски на хранилище vg0

vol-delete test --pool vg0 - удалить диск test из пула vg0

pool-undefine vg0 - удалить хранилище vg0


pool-define-as --name zp1 --type zfs --target zp1 - подключить хранилище ZFS с именем zp1 и назвать его zp1  
pool-autostart --pool zp1- добавили в авто запуск хранилище vg0
pool-start --pool zp1 - запустили хранилище

vol-create-as --pool zp1 --name test1 --capacity 10G - создать диск с именем test1 размером 10Gb на хранилище zp1

TRIM в VM

!!! Уменьшение диска qcow2 средствами ВМ
!!! Освобождается пустое место
!!! Выделенный размер остается прежним

Настройка TRIM
1. Выставить диск как SCSI
2. Выставить контроллер как VirtIO SCSI
3. Добавить discard='unmap'


4. Настроить TRIM в VM (напр: fstrim -a -v)
5. Запуск TRIM гостя из гипервизора
virsh domfstrim  VM-NAME

virt-install — help

Общие параметры:
  -n NAME, --name NAME  Имя экземпляра гостя
  --memory MEMORY       Configure guest memory allocation. Ex:
                        --memory 1024 (in MiB)
                        --memory 512,maxmemory=1024
                        --memory 512,maxmemory=1024,hotplugmemorymax=2048,hotplugmemoryslots=2
  --vcpus VCPUS         Число виртуальных процессоров, например:
                        --vcpus 5
                        --vcpus 5,maxcpus=10,cpuset=1-4,6,8
                        --vcpus sockets=2,cores=4,threads=2,
  --cpu CPU             CPU model and features. Ex:
                        --cpu coreduo,+x2apic
                        --cpu host-passthrough
                        --cpu host
  --metadata METADATA   Конфигурация метаданных гостя, например:
                        --metadata name=foo,title="Мой прикольный заголовок",uuid=...
                        --metadata description="Мое милое длинное описание"

Параметры метода установки:
  --cdrom CDROM         Установочный CD-ROM
  -l LOCATION, --location LOCATION
                        Источник установки (например,
                        nfs:сервер:/путь,
                        http://сервер/путь,
                        ftp://сервер/путь)
  --pxe                 Загрузить из сети с помощью PXE
  --import              Создать гостевую систему на основе существующего образа диска
  --livecd              Рассматривать носитель как LiveCD
  -x EXTRA_ARGS, --extra-args EXTRA_ARGS Дополнительные параметры для передачи ядру, загруженному из --location
  --initrd-inject INITRD_INJECT Добавить файл в корневой каталог initrd из --location
  --os-variant DISTRO_VARIANT Вариант устанавливаемой ОС (например, «fedora18», «rhel6», «winxp»)
  --boot BOOT           Параметры загрузки гостя, например:
                        --boot hd,cdrom,menu=on
                        --boot init=/sbin/init (для контейнеров)
                        --boot uefi (для windows)
  --idmap IDMAP         Включить пространство имен пользователей для контейнеров LXC, например:
                        --idmap uid_start=0,uid_target=1000,uid_count=10

Параметры устройства:
  --disk DISK           Настройка пространства хранения данных, например:
                        --disk size=10 (новый образ на 10 ГиБ в выбранном по умолчанию месте)
                        --disk /my/existing/disk,cache=none
                        --disk device=cdrom,bus=scsi
                        --disk=?
  -w NETWORK, --network NETWORK
                        Конфигурация гостевого сетевого интерфейса, например:
                        --network bridge=mybr0
                        --network network=my_libvirt_virtual_net
                        --network network=mynet,model=virtio,mac=00:11...
                        --network none
                        --network help
  --graphics GRAPHICS   Параметры дисплея гостевой системы, например:
                        --graphics vnc
                        --graphics SPICE,port=5901,tlsport=5902
                        --graphics none
                        --graphics vnc,password=foobar,port=5910,keymap=ja
  --controller CONTROLLER
                        Настройка контроллера, например:
                        --controller type=usb,model=ich9-ehci1
  --input INPUT         Конфигурация устройства ввода, например:
                        --input tablet
                        --input keyboard,bus=usb
  --serial SERIAL       Настройте последовательное устройство гостевой системы
  --parallel PARALLEL   Настройте параллельное устройство гостевой системы
  --channel CHANNEL     Настройте канал обмена данными для гостевой системы
  --console CONSOLE     Настройте соединение между гостем и хостом в текстовой консоли
  --hostdev HOSTDEV     Конфигурация физических USB/PCI и других устройств хоста для совместного использования гостевой машиной.
  
   --filesystem FILESYSTEM Передача каталога хоста гостевой системе, например:
                        --filesystem /my/source/dir,/dir/in/guest
                        --filesystem template_name,/,type=template

  --sound [SOUND]       Настройте эмуляцию звукового устройства для гостевой системы
  --watchdog WATCHDOG   Настройте устройство слежения для гостевой системы
  --video VIDEO         Настройте видеоустройства  гостевой системы например qlx
  --smartcard SMARTCARD Настройте устройство смарт-карт, например: --smartcard mode=passthrough
  --redirdev REDIRDEV   Настройте устройство перенаправления, например: --redirdev usb,type=tcp,server=192.168.1.1:4000
  --memballoon MEMBALLOON Настройте устройство перераспределения памяти, например: --memballoon model=virtio
  --tpm TPM             Конфигурация гостевого устройства TPM, например: --tpm /dev/tpm
  --rng RNG             Configure a guest RNG device. Ex: --rng /dev/urandom
  --panic PANIC         Конфигурация гостевого устройства паники, например: --panic default
  --memdev MEMDEV       Configure a guest memory device. Ex: --memdev dimm,target_size=1024


Параметры платформы виртуализации:
  -v, --hvm             Этот гость должен быть полностью виртуализированным.
  -p, --paravirt        Этот гость должен быть паравиртуализированным.
  --container           Этот гость должен быть заключен в контейнер
  --virt-type HV_TYPE   Имя гипервизора (kvm, qemu, xen и т.п.)
  --arch ARCH           Имитируемая архитектура процессора
  --machine MACHINE     Имитируемый тип компьютера

Прочие:
  --autostart           Запускать домен автоматически при запуске хоста
  --transient           Create a transient domain.
  --wait WAIT           Время ожидания завершения установки (в минутах)
  --noautoconsole       Не подключаться к гостевой консоли автоматически
  --noreboot            Не выполнять загрузку гостя после установки.
  --print-xml [XMLONLY] Вывести XML-описание домена, не создавая гостевую систему.
  --dry-run             Выполнить установку, но не создавать устройства и гостевые системы.
  --check CHECK         Включать и выключать без выполнения проверки, например:
                        --check path_in_use=off
                        --check all=off
  -q, --quiet           Подавлять вывод (за исключением ошибок)
  -d, --debug           Вывести отладочные данные

virt-install примеры

!!! Все легко и просто можно выполнить в virt-manager, его не обязательно ставить на гипервизоре.
!!! порт для spice и VNC берется начиная с 5901 (то есть следующей машине будет присвоен 5902 и т.д.)
!!! По умолчанию контроллеры для виртуальных устройств будут virtio
virt-install --help - помощь
man virt-install - ищема в man жмем / и вводим EXAMPLES

virt-install  --hvm  --name demo --memory 500 --disk none --livecd  --graphics vnc  --cdrom /root/fedora7live.iso

virt-install   --connect qemu:///system  --virt-type kvm --name demo --memory 500 --disk size=10 --cdrom /dev/cdrom --os-variant fedora13

virt-install   --connect lxc:/// --name httpd_guest --memory 512 --vcpus 2 --init /usr/bin/httpd

virt-install   --connect lxc:/// --name container --memory 128 --filesystem /home/LXC,/ --filesystem /home/test,/mnt --init /bin/sh

virt-install --name test1 --vcpus 1 --memory 512 --network=default,model=e1000 --graphics spice --video qxl --disk vol=zp3/test1-disk1,cache=none,format=raw --boot hd,cdrom --cdrom=/tmp/iso/debian110.iso --sound ac97 --virt-type kvm --hvm

virt-install --name debian8 --ram 1024 --disk path=/PVE/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 --virt-type=kvm --name centos7 --ram 2048 --vcpus=2 --os-variant=rhel7 --hvm --cdrom=/tmp/CentOS-7-x86_64-DVD-1511.iso --network=bridge=br0,model=virtio --graphics vnc --disk path=/var/lib/libvirt/images/centos7.qcow2,size=40,bus=virtio,format=qcow2

virt-install  --name test -r 1024 --disk path=/tmp/disk1.qcow2,size=8 --vcpus 2 --location=http://ftp.ru.debian.org/debian/dists/stable/main/installer-amd64/  --initrd-inject=/root/preseed.cfg  --extra-args="auto keyboard-configuration/xkb-keymap=en" --vnc --noautoconsole --os-type Debian10 --accelerate  --network bridge=br0,model=virtio  --hvm


Драйверы искать тут:

https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/
https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers
https://www.linux-kvm.org/page/Virtio
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso - образ с последними драйверами virtio

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

-------------------------------------------
Установка на госте:
# в 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

KVM swap in file / Файл подкачки

fallocate -l 1G /.swap
chmod 600 /.swap
mkswap /.swap
echo '/.swap none swap defaults 0 0' >> /etc/fstab
swapon /.swap


Команда «virsh list не показывает ВМ»

0. Команда "virsh list не показывает ВМ" 
Пользователь должен быть в группе kvm и libvirtd
Проверяем:
id $USER
id user_name

Добавляем с помощью usermod:
usermod -aG kvm user_name
usermod -aG libvirtd user_name

1. Команда "virsh list не показывает ВМ" 
Проверьте вывод virsh uri. 
Если он возвращает qemu:///session , но вы используете соединение qemu:///system в Virtu-Manager, вы нашли причину. 

Можно добавить пользователю в  bahsrc:
export LIBVIRT_DEFAULT_URI="qemu:///system"

Рубрики
KVM

KVM auto install / virt-install / debian / pressed.cfg

Ссылки:

Автоустановка debian-виртуалок в KVM — один из способов.
https://www.debian.org/releases/stretch/mips/apbs03.html.ru https://help.ubuntu.com/lts/installation-guide/s390x/apb.html https://www.debian.org/releases/stable/amd64/apbs04.ru.html https://www.debian.org/releases/buster/example-preseed.txt

preseed.cfg — файл настроек инсталляции

# настройки языка и локали в устанавливаемой системе. Используем американскую локаль, но указываем, что наш сервер находится в России.
d-i debian-installer/language string en
d-i debian-installer/country string RU
d-i debian-installer/locale string en_US.UTF-8
d-i localechooser/supported-locales multiselect en_US.UTF8, ru_RU.UTF8

# Настройки клавиатуры. Опять же - американская раскладка.
d-i console-keymaps-at/keymap select us
d-i keyboard-configuration/variant select American English

# Выбираем интерфейс сети, через который будет происходить установка. Для KVM-виртуалок в 99% случаев (если сами не ломали) это eth0. Если сомневаемся - ставим auto.
d-i netcfg/choose_interface select auto

# Настройки сети. Я привожу пример для ipv6, для v4 вам просто нужно будет поменять адреса.
# важный момент - если настраиваете здесь ipv6 сеть, то обязательно используйте ipv6 nameservers.
# Иначе netmask ffff:ffff:ffff:ffff:: внутри debian-installer'a превратится в 255.255.255.0 (или что-то такое) и вам придется лезть в консоль, чтобы перевбивать настройки лапками.
# если вам нужен ipv4 - то просто замените ipaddress, netmask, gateway, nameservers на корректные v4-адреса. Ничего дополнительно указывать не нужно.
# использую dhcp
d-i netcfg/dhcp_timeout string 2
d-i netcfg/disable_dhcp boolean false
#d-i netcfg/get_ipaddress string 10.0.0.1
#d-i netcfg/get_netmask string 10.0.0.255
#d-i netcfg/get_gateway string 10.0.0.1
#d-i netcfg/get_nameservers string 10.0.0.1
#d-i netcfg/confirm_static boolean true

# hostname и domain для наливаемой машинки.
# fqdn машины в данном случае будет temporary.debian.pro - если хотите, чтобы на сервере нормально работала отправка почты, то такой же fqdn должен быть прописан в PTR записи "основного" адреса машинки.
d-i netcfg/get_hostname string linux13
d-i netcfg/get_domain string b14esh.com

# Если вы выберете ftp, то mirror/country string устанавливать не нужно.
#d-i mirror/protocol string ftp
d-i mirror/country string manual
d-i mirror/http/hostname string http.us.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

# прокси внутри инсталлера нам не нужен.
d-i mirror/http/proxy string

# Настройки часового пояса - наш сервер будет жить по часикам в Москве.
# дополнительно, при установке синхронизируем время с ntp.ubuntu.com
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Moscow
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string ntp.ubuntu.com

# Настройка HDD. Внутри виртуалок нам подойдет разметка auto regular atomic (последний раздел - swap = 2xRAM, первый раздел - /, занимающий всё, что осталось после swap'a).
# Саму систему ставим на /dev/vda.
d-i partman-auto/disk string /dev/vda
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

# устанавливаем рутовый пароль.
# после установки его, само собой, лучше менять (preseed могут спереть).
d-i passwd/root-password password ПАРОЛЬ_ДЛЯ_РУТА
d-i passwd/root-password-again password ПАРОЛЬ_ДЛЯ_РУТА

# не создаём дополнительных пользователей, кроме рута.
#d-i passwd/make-user boolean false

# создаем пользователя
# To create a normal user account.
d-i passwd/user-fullname string ИМЯ_ПОЛЬЗОВАТЕЛЯ
d-i passwd/username string ИМЯ_ПОЛЬЗОВАТЕЛЯ
# Normal user's password, either in clear text
d-i passwd/user-password password ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ
d-i passwd/user-password-again password ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ


# остальные настройки apt'a - включаем contrib и non-free репозитории.
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true

# не отправляем данные об установленных пакетах.
popularity-contest popularity-contest/participate boolean false

# ставим только ssh-сервер - никаких гномов/web-серверов и так далее.
tasksel tasksel/first multiselect ssh-server
# указываем, что нам нужны дополнительные пакеты - openssh-server (дада, я видел его строчкой выше, но хочу быть уверенным), htop и dstat.
d-i pkgsel/include string openssh-server htop dstat sudo


# ставим загрузчик
d-i grub-installer/only_debian boolean true

#пофиг ставим загрузчик 
d-i grub-installer/with_other_os boolean true

# Из-за возможного наличия подключённых карт памяти USB, расположение MBR
# нельзя определить безопасно, поэтому нужно указать:
d-i grub-installer/bootdev  string /dev/vda
# Для установки на первое устройство (считая, что это не карта памяти USB):
d-i grub-installer/bootdev  string default



# вырубаем виртуалку.
d-i finish-install/reboot_in_progress note
d-i debian-installer/exit/poweroff boolean true




Главный вопрос… а не льзя ли получить файл pressed.cfg, да попроще….

Ответ можно. И очень просто :)
Продолжение следует...
0. Ставим debian и настраиваем его как нам нужно. 

1. Немного о файлах 
/var/log/installer/cdebconf - в этом каталоге в  конце установки создаются , база данных программы установки debconf, по умолчанию файл разрешено читать только суперпользователю.
templates.dat - хранятся необработанные шаблоны
questions.dat — текущие значения и значения, назначенные переменным

/var/lib/cdebconf - для выяснения возможных ответов на вопросы можно использовать редактор nano для просмотра файла прямо во время процесса установки
/var/log/installer - каталог и все файлы в нём будут удалены из системы при вычистке пакета installation-report

2. Альтернативный метод — выполнить установку вручную и затем, после перезагрузки, 
использовать команду debconf-get-selections из пакета debconf-utils, 
чтобы сохранить базу данных debconf и базу данных программы установки cdebconf в один файл preseed.cfg

apt install debconf-utils - ставим необходимое debconf-utils 
echo "#_preseed_V1" > preseed.cfg
debconf-get-selections --installer >> preseed.cfg
debconf-get-selections >> preseed.cfg

3. Файл preseed.cfg то получили теперь его надо бы отредактировать......

4. Проверяем файл preseed.cfg на валидность....
debconf-set-selections -c preseed.cfg - для проверки правильности формата файла ответов до установки


пример install_debian.sh

#!/bin/bash
virt-install  \
--name linux2 \  - исправь
-r 1024  \
--disk path=/PVE/linux2.qcow2,size=8  \   - исправь
--vcpus 1  \ 
--location=http://ftp.ru.debian.org/debian/dists/stable/main/installer-amd64/  \  - исправь
--initrd-inject=/home/b14esh/ansible/roles/debian_install/preseed.cfg  \  - исправь
--extra-args="auto keyboard-configuration/xkb-keymap=en"  \
--vnc \
--noautoconsole  \
--os-type Debian10  \
--accelerate  \
--network bridge=br0,model=virtio  \  - исправь
--hvm

А должно быть так install_debian.sh

#!/bin/bash
virt-install  --name ИМЯ_ХОСТА -r 1024  --disk path=/PVE/ИМЯ_ЖЕСТКОГО_ДИСКА.qcow2,size=8  --vcpus 2  --location=http://ftp.ru.debian.org/debian/dists/stable/main/installer-amd64/  --initrd-inject=/home/b14esh/ansible/roles/debian_install/preseed.cfg  --extra-args="auto keyboard-configuration/xkb-keymap=en"  --vnc   --noautoconsole   --os-type Debian10  --accelerate  --network bridge=br0,model=virtio  --hvm