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
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
!!! так работать не будет:
## 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
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)
### 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
### 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
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
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
# 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
```
!!! настраиваем путем редактирования VM
!!! Обращаем внимание на следующие:
!!! ovsbr0 - настроенный bridge с помощью openvswitch
!!! vlan-4082 - имя нужного нужного vlan
!!! log-ens3 - желаемое имя сетевого адаптера на гипервизоре
Настройка OVS
!!! После включения ВМ у нас появится интерфейс с именем "log-ens3" на гипервизоре
ovs-vsctl set port log-ens3 tag=1234 - добавим vlan с тегом 1234 для интерфейса log-ens3
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
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 - включение автозапуска для сети
Команда миграции:
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
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
Программа 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 - дополнительные параметры, которые передаются ядру (не обязательно)
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
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
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'
обычное использование без 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)
lxc0131072exe/sbin/init1
Шаблон для контейнера(lxc1.xml)
lxc1131072exe/sbin/init1
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
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
!!! не забываем делать 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 /
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
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"
# настройки языка и локали в устанавливаемой системе. Используем американскую локаль, но указываем, что наш сервер находится в России.
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 - для проверки правильности формата файла ответов до установки