KVM: различия между версиями
Tora-bora (обсуждение | вклад) (+links) |
м (→Tips: +Включение виртуализации в BIOS (спасибо vt@)) |
||
(не показана 21 промежуточная версия 7 участников) | |||
Строка 20: | Строка 20: | ||
== Создание VPS == | == Создание VPS == | ||
VPS можно создавать с разными виртуальными | VPS можно создавать с разными виртуальными устройствами. Можно использовать по умолчанию, а можно использовать virtio. Последние считаются наилучшим вариантом для Windows OS. Поэтому ВСЕГДА стараемся сделать так, как надо. Если не получается - тогда как обычно. | ||
Для новой системы со сразу установленными значениями virtio в конфиге | Для новой системы со сразу установленными значениями virtio в конфиге необходимо в процессе установки добавить драйверы. Качаем iso с драйверами: | ||
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso | |||
(ссылка верна на 27 октября 2016 г., в дальнейшем можно заглянуть на [https://fedoraproject.org/wiki/Windows_Virtio_Drivers#Direct_download вики проекта] или в старый [http://alt.fedoraproject.org/pub/alt/virtio-win/latest/ каталог загрузок] и скачать имеющийся там virtio-win*.iso) | |||
=== Создание VPS Windows с поддержкой virtio === | === Создание VPS Windows с поддержкой virtio === | ||
* создаем LVM раздел нужного размера: | * создаем LVM раздел нужного размера: | ||
<pre> | <pre> | ||
lvcreate -L 10G -n win2008 main | /sbin/lvcreate -L 10G -n win2008 main | ||
</pre> | </pre> | ||
* coздаем конфиг VPS: | * coздаем конфиг VPS: | ||
<pre> | <pre> | ||
virt-install --connect=qemu:///system -n test_win2008 -r 1024 --boot cdrom --disk path=/dev/main/test_win2008,bus=virtio --disk path=/vz/template/virtio-win-1.1.16.vfd,device=floppy --cdrom=/var/lib/vz/template/SW_DVD5_Windows_Svr_DC_Ent_Std_2008_Russian_32bit_MLF_X14-26782.ISO --network bridge:breth0,model=virtio --graphics vnc,password=123,listen=0.0.0.0 --os-type=windows --os-variant=win2k8 --arch=i686 --cpu host -v --autostart | virt-install --connect=qemu:///system -n test_win2008 -r 1024 --boot cdrom --disk path=/dev/main/test_win2008,bus=virtio \ | ||
--disk path=/vz/template/virtio-win-1.1.16.vfd,device=floppy --cdrom=/var/lib/vz/template/SW_DVD5_Windows_Svr_DC_Ent_Std_2008_Russian_32bit_MLF_X14-26782.ISO \ | |||
--network bridge:breth0,model=virtio --graphics vnc,password=123,listen=0.0.0.0 --os-type=windows --os-variant=win2k8 --arch=i686 --cpu host -v --autostart | |||
</pre> | </pre> | ||
Строка 44: | Строка 44: | ||
--cpu host - передает в VPS все возможности процессора хостовой системы. Применять с осторожностью, т.к. при переносе на другой сервер при отличии винда может ругаться. | --cpu host - передает в VPS все возможности процессора хостовой системы. Применять с осторожностью, т.к. при переносе на другой сервер при отличии винда может ругаться. | ||
'''NB''' Для полного списка задаваемых параметров смотрим | '''NB''' Для полного списка задаваемых параметров смотрим man-страницу по virt-install(1) | ||
Также подключаем флоппи диск с драйверами для virtio. При установке система не увидит жесткий диск на который будет устанавливаться и нужно выбрать драйвер для диска с флопика. Там же располагаются драйвера для сетевой карты. | Также подключаем флоппи-диск с драйверами для virtio. При установке система не увидит жесткий диск, на который будет устанавливаться, и нужно выбрать драйвер для диска с флопика. Там же располагаются драйвера для сетевой карты. | ||
*''Windows Server 2003 и Windows XP'' Нажимаем F6 и ставим драйвера. | *''Windows Server 2003 и Windows XP'' Нажимаем F6 и ставим драйвера. | ||
*''Windows 2008'' Доходим до окна разбивки дисков и выбираем "Загрузить Драйвер". | *''Windows 2008'' Доходим до окна разбивки дисков и выбираем "Загрузить Драйвер". | ||
Строка 54: | Строка 54: | ||
<pre> | <pre> | ||
lvcreate -L 10G -n win2008 main | /sbin/lvcreate -L 10G -n win2008 main | ||
virt-install --connect=qemu:///system -n win2008 -r 1024 --disk path=/dev/main/win2008 --cdrom=/mnt/images/windows2008.ISO --accelerate --vnc --noautoconsole -v --network bridge:breth0 --os-type=windows --vcpus=1 --noapic --os-variant=win2k8 --arch=i686 | virt-install --connect=qemu:///system -n win2008 -r 1024 --disk path=/dev/main/win2008 --cdrom=/mnt/images/windows2008.ISO --accelerate \ | ||
--vnc --noautoconsole -v --network bridge:breth0 --os-type=windows --vcpus=1 --noapic --os-variant=win2k8 --arch=i686 | |||
</pre> | </pre> | ||
ALT Linux x86_64 на LVM : | |||
<pre> | <pre> | ||
lvcreate -L10G -n altlinux main | /sbin/lvcreate -L10G -n altlinux main | ||
virt-install --connect qemu:///system --name altlinux --ram 512 --disk path=/dev/main/altlinux --network=bridge:breth0 --vnc --os-type=linux --os-variant=rhel6 --cdrom /mnt/images/altlinux-x86_64.iso --accelerate --noautoconsole --vcpus=1 --arch=x86_64 | virt-install --connect qemu:///system --name altlinux --ram 512 --disk path=/dev/main/altlinux --network=bridge:breth0 --vnc --os-type=linux \ | ||
--os-variant=rhel6 --cdrom /mnt/images/altlinux-x86_64.iso --accelerate --noautoconsole --vcpus=1 --arch=x86_64 | |||
</pre> | </pre> | ||
Строка 69: | Строка 71: | ||
<pre> | <pre> | ||
lvcreate -L20G -n freebsd main | /sbin/lvcreate -L20G -n freebsd main | ||
virt-install --connect qemu:///system --name freebsd --ram 512 --disk path=/dev/main/freebsd --network=bridge:breth0 --graphics vnc,password=rootSD,listen=0.0.0.0 --os-type unix --os-variant=freebsd8 --cdrom /var/lib/vz/template/FreeBSD-8.1-RELEASE-i386-disc1.iso --accelerate --noautoconsole --vcpus=1 --arch=i686 | virt-install --connect qemu:///system --name freebsd --ram 512 --disk path=/dev/main/freebsd --network=bridge:breth0 --graphics vnc,password=rootSD,listen=0.0.0.0 \ | ||
--os-type unix --os-variant=freebsd8 --cdrom /var/lib/vz/template/FreeBSD-8.1-RELEASE-i386-disc1.iso --accelerate --noautoconsole --vcpus=1 --arch=i686 | |||
</pre> | </pre> | ||
После запуска команды создания VPS | После запуска команды создания VPS смотрим через netstat, какой номер порта добавился в список открытых портов, подключаемся через VNC к хардноде к этому порту (например '''vncviewer test.domain.com:5902''' ) и вводим пароль указанный в строке "'''vnc,password='''" | ||
== Удаление VPS == | == Удаление VPS == | ||
Строка 83: | Строка 87: | ||
И удаляем раздел LVM: | И удаляем раздел LVM: | ||
<pre> | <pre> | ||
lvremove /dev/main/test_vps | /sbin/lvremove /dev/main/test_vps | ||
</pre> | |||
== Управление ресурсами == | |||
Нужно настроить cgroups. В случае systemd это уже должно быть сделано автоматом. | |||
Проверить наличие в /etc/libvirt/qemu.xml | |||
<pre> | |||
cgroup_controllers = [ "cpu", "devices", "memory", "cpuset", "blkio" ] | |||
cgroup_device_acl = [ | |||
"/dev/null", "/dev/full", "/dev/zero", | |||
"/dev/random", "/dev/urandom", | |||
"/dev/ptmx", "/dev/kvm", "/dev/kqemu", | |||
"/dev/rtc", "/dev/hpet", "/dev/net/tun", | |||
] | |||
</pre> | |||
Назначить нужные ресурсы через: | |||
<pre> | |||
$ virsh schedinfo --set cpu_shares=1024 alt_guest | |||
$ virsh blkiotune alt_guest --weight 1024 | |||
</pre> | |||
==Проброс PCI-устройств внутрь домена== | |||
В /etc/libvirt/qemu.conf активируем | |||
<pre> | |||
relaxed_acs_check = 1 | |||
</pre> | |||
Получение нужной информации о NIC | |||
<pre> | |||
# lspci -vn | |||
... | |||
0e:00.0 0200: 14e4:1659 (rev 21) | |||
Subsystem: 103c:7031 | |||
Physical Slot: 3 | |||
Flags: fast devsel, IRQ 17 | |||
Memory at fdff0000 (64-bit, non-prefetchable) [size=64K] | |||
[virtual] Expansion ROM at d0100000 [disabled] [size=64K] | |||
Capabilities: [48] Power Management version 2 | |||
Capabilities: [50] Vital Product Data | |||
Capabilities: [58] MSI: Enable- Count=1/8 Maskable- 64bit+ | |||
Capabilities: [d0] Express Endpoint, MSI 00 | |||
Capabilities: [100] Advanced Error Reporting | |||
Capabilities: [13c] Virtual Channel <?> | |||
Capabilities: [160] Device Serial Number 00-19-bb-ff-fe-ce-87-dc | |||
Capabilities: [16c] Power Budgeting <?> | |||
Kernel modules: tg3 | |||
# lspci -t | |||
-[0000:00]-+-00.0 | |||
+-02.0-[09-12]--+-00.0-[0a-11]--+-00.0-[0b-0d]----00.0-[0c]----08.0 | |||
| | +-01.0-[0e-10]----00.0 | |||
| | \-02.0-[11]-- | |||
| \-00.3-[12]-- | |||
+-03.0-[06-08]----00.0 | |||
+-04.0-[13-15]-- | |||
+-05.0-[16]-- | |||
+-06.0-[17-19]-- | |||
+-07.0-[1a]-- | |||
+-10.0 | |||
+-10.1 | |||
+-10.2 | |||
+-11.0 | |||
+-13.0 | |||
+-15.0 | |||
+-16.0 | |||
+-1c.0-[02-03]----00.0-[03]----00.0 | |||
+-1c.1-[04-05]----00.0-[05]----00.0 | |||
+-1d.0 | |||
+-1d.1 | |||
+-1d.2 | |||
+-1d.3 | |||
+-1d.7 | |||
+-1e.0-[01]--+-03.0 | |||
| +-04.0 | |||
| +-04.2 | |||
| +-04.4 | |||
| \-04.6 | |||
+-1f.0 | |||
\-1f.1 | |||
</pre> | |||
Отвязываем устройство от HN | |||
<pre> | |||
# echo 0000:0e:00.0 > /sys/bus/pci/drivers/tg3/unbind | |||
</pre> | |||
В xml домена добавляем | |||
<pre> | |||
<hostdev mode='subsystem' type='pci' managed='yes'> | |||
<source> | |||
<address domain='0x0000' bus='0x0e' slot='0x00' function='0x0'/> | |||
</source> | |||
</hostdev> | |||
</pre> | |||
и запускаем домен | |||
<pre> | |||
virsh # start PXE-server | |||
error: Failed to start domain PXE-server | |||
error: internal error Process exited while reading console log output: char device redirected to /dev/pts/4 | |||
No IOMMU found. Unable to assign device "hostdev0" | |||
qemu-kvm: -device pci-assign,host=0e:00.0,id=hostdev0,configfd=30,bus=pci.0,addr=0x5: Device 'pci-assign' could not be initialized | |||
</pre> | |||
No IOMMU found говорит о том, что аппаратная платформа не поддерживает виртуализацию ввода/вывода. | |||
==Проброс единственной видеокарты с GPU внутрь домена== | |||
Добавить в qemu.conf для виртуальной машины в раздел features: | |||
<pre> | |||
<kvm> | |||
<hidden state='on'/> | |||
</kvm> | |||
</pre> | |||
Тип CPU изменить на passthrough (CPU в виртуальной машине будет полностью соответствовать CPU а хост-системе): | |||
<pre> | |||
<cpu mode='host-passthrough' check='partial'/> | |||
</pre> | |||
В параметры ядра хост системы добавить: | |||
<pre> | |||
nomodeset nofb video=video=vesafb:off,efifb:off intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction vfio-pci.disable_vga=1 vfio-pci.ids=<список pciid устройств, которые нужно виртуализировать> | |||
</pre> | |||
pcie_acs_override=downstream,multifunction нужно только в том случае, если видеокарта попадает в одну IOMMU GROUP с другими устройствами. | |||
В загрузку модулей добавить vfio-pci: | |||
<pre> | |||
echo vfio-pci >>/etc/modules | |||
</pre> | </pre> | ||
== Сменить диск в приводе на VPS без перезагрузки == | |||
далее, если у вас возникает такая (или подобная) ошибка: | |||
<pre> | |||
vfio-pci 0000:01:00.0: BAR 3: can't reserve [mem 0xd0000000-0xd1ffffff 64bit pref] | |||
</pre> | |||
То нужно посмотреть в содержимое /proc/iomem на предмет того, кто использует данную область памяти. Если это окажется BOOTFB, то рецепт простой: | |||
склонировать себе https://github.com/furkanmustafa/forcefully-remove-bootfb | |||
скомпилировать модуль ядра, предварительно установив kernel-headers-modules-std-def: | |||
<pre> | |||
make -C /usr/src/<версия вашего ядра>/ M=/root/forcefully-remove-bootfb/build src=/root/forcefully-remove-bootfb modules | |||
</pre> | |||
Ну и дальше действовать по инструкции с https://github.com/furkanmustafa/forcefully-remove-bootfb | |||
После освобождения памяти, можно запустить виртуальную машину, предварительно добавив в неё нужное PCI устройство (или устройства): | |||
<pre> | |||
<hostdev mode='subsystem' type='pci' managed='yes'> | |||
<source> | |||
<address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> | |||
</source> | |||
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> | |||
</hostdev> | |||
<hostdev mode='subsystem' type='pci' managed='yes'> | |||
<source> | |||
<address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/> | |||
</source> | |||
<address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/> | |||
</hostdev> | |||
<hostdev mode='subsystem' type='pci' managed='yes'> | |||
<source> | |||
<address domain='0x0000' bus='0x01' slot='0x00' function='0x2'/> | |||
</source> | |||
<address type='pci' domain='0x0000' bus='0x00' slot='0x0c' function='0x0'/> | |||
</hostdev> | |||
<hostdev mode='subsystem' type='pci' managed='yes'> | |||
<source> | |||
<address domain='0x0000' bus='0x01' slot='0x00' function='0x3'/> | |||
</source> | |||
<address type='pci' domain='0x0000' bus='0x00' slot='0x0d' function='0x0'/> | |||
</hostdev> | |||
</pre> | |||
Внутри виртуальной машины переданный GPU будет вторым устройством и его можно использовать для offload расчётных операций. | |||
== Tips == | |||
=== Сменить диск в приводе на VPS без перезагрузки === | |||
<pre> | <pre> | ||
virsh -c qemu:///system attach-disk --type cdrom --mode readonly win2003 /vz/template/SW_CD_Windows_Svr_Std_2003_.ISO hdc | virsh -c qemu:///system attach-disk --type cdrom --mode readonly win2003 /vz/template/SW_CD_Windows_Svr_Std_2003_.ISO hdc | ||
</pre> | </pre> | ||
http://www.e-faux.com/references:applications:libvirt:cdrom_hotplug | http://www.e-faux.com/references:applications:libvirt:cdrom_hotplug | ||
=== Отправка комбинаций клавиш === | === Отправка комбинаций клавиш === | ||
Строка 113: | Строка 288: | ||
kpartx -d /dev/loop0 | kpartx -d /dev/loop0 | ||
losetup -d /dev/loop0 | losetup -d /dev/loop0 | ||
=== Включение виртуализации в BIOS === | |||
При виде сообщений <tt>kvm: disabled by bios</tt> или <tt>kvm: no hardware support</tt> в выводе {{cmd|dmesg}} на системе с x86-процессором, который поддерживает расширение vmx (см. {{path|/proc/cpuinfo}}), [http://www.linux-kvm.org/page/FAQ#.22KVM:_disabled_by_BIOS.22_error следует] обратить внимание на статус поддержки виртуализации где-то в расширенных настройках BIOS/UEFI; также может понадобиться [http://serverfault.com/a/844277/100216 включить NX], на некоторых системах Dell -- "Trusted Execution". В свою очередь, некоторые настройки могут помешать (например, включение Intel AMT на Thinkpad T500). | |||
== Полезные ссылки == | |||
* http://en.wikibooks.org/wiki/QEMU/Images | |||
* [http://umgum.com/acpi-windows2003-shutdown ACPI + MS Windows 2003 shutdown] | |||
* [http://habrahabr.ru/post/122425 Управление ресурсами через cgroups] | |||
* [http://www.opennet.ru/openforum/vsluhforumID3/109974.html#14 Что такое QEMU, KVM, libvirt и как они соотносятся] | |||
[[Категория:Руководства]] | [[Категория:Руководства]] | ||
[[Категория:KVM]] |
Текущая версия от 23:30, 20 октября 2020
См.тж. Настройка_сети_в_KVM и Создание профиля KVM
Команды для управления QEMU-KVM
virsh -c qemu:///system list --all #листинг virsh -c qemu:///system start vsrv1 #пуск virsh -c qemu:///system shutdown vsrv1 #shutdown virsh -c qemu:///system destroy vsrv1 #выключить по питанию virsh -c qemu:///system undefine vsrv1 #удалить (конифг тоже удаляется) virsh -c qemu:///system autostart vsrv1 #добавить в автозагрузку virsh -c qemu:///system autostart --disable # удалить из автозагрузки virsh -c qemu:///system qemu-monitor-command win2008std-32bit help --hmp # запустить команду в qemu мониторе virsh -c qemu:///system define /etc/libvirt/qemu/mirror.xml # обновить информацию о виртуальной машине.
Чтобы постоянно не вводить -c qemu:///system
можно добавить:
export LIBVIRT_DEFAULT_URI=qemu:///system
Расположение основных конфигов
- /etc/libvirt/qemu.conf - основной конфиг qemu. Тут задаём параметры vnc сервера.
- /etc/libvirt/qemu/ - папка для хранения конфигов, в том числе и виртуальных машин.
Создание VPS
VPS можно создавать с разными виртуальными устройствами. Можно использовать по умолчанию, а можно использовать virtio. Последние считаются наилучшим вариантом для Windows OS. Поэтому ВСЕГДА стараемся сделать так, как надо. Если не получается - тогда как обычно. Для новой системы со сразу установленными значениями virtio в конфиге необходимо в процессе установки добавить драйверы. Качаем iso с драйверами:
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
(ссылка верна на 27 октября 2016 г., в дальнейшем можно заглянуть на вики проекта или в старый каталог загрузок и скачать имеющийся там virtio-win*.iso)
Создание VPS Windows с поддержкой virtio
- создаем LVM раздел нужного размера:
/sbin/lvcreate -L 10G -n win2008 main
- coздаем конфиг VPS:
virt-install --connect=qemu:///system -n test_win2008 -r 1024 --boot cdrom --disk path=/dev/main/test_win2008,bus=virtio \ --disk path=/vz/template/virtio-win-1.1.16.vfd,device=floppy --cdrom=/var/lib/vz/template/SW_DVD5_Windows_Svr_DC_Ent_Std_2008_Russian_32bit_MLF_X14-26782.ISO \ --network bridge:breth0,model=virtio --graphics vnc,password=123,listen=0.0.0.0 --os-type=windows --os-variant=win2k8 --arch=i686 --cpu host -v --autostart
где:
-n test_win2008 - имя VPS
-r 1024 - к-во выделяемой памяти
-v использовать аппаратную виртуализацию
--arch=i686 - используемая архитектура
--cpu host - передает в VPS все возможности процессора хостовой системы. Применять с осторожностью, т.к. при переносе на другой сервер при отличии винда может ругаться.
NB Для полного списка задаваемых параметров смотрим man-страницу по virt-install(1)
Также подключаем флоппи-диск с драйверами для virtio. При установке система не увидит жесткий диск, на который будет устанавливаться, и нужно выбрать драйвер для диска с флопика. Там же располагаются драйвера для сетевой карты.
- Windows Server 2003 и Windows XP Нажимаем F6 и ставим драйвера.
- Windows 2008 Доходим до окна разбивки дисков и выбираем "Загрузить Драйвер".
Создание VPS без virtio
Windows 2008 32bit на LVM:
/sbin/lvcreate -L 10G -n win2008 main virt-install --connect=qemu:///system -n win2008 -r 1024 --disk path=/dev/main/win2008 --cdrom=/mnt/images/windows2008.ISO --accelerate \ --vnc --noautoconsole -v --network bridge:breth0 --os-type=windows --vcpus=1 --noapic --os-variant=win2k8 --arch=i686
ALT Linux x86_64 на LVM :
/sbin/lvcreate -L10G -n altlinux main virt-install --connect qemu:///system --name altlinux --ram 512 --disk path=/dev/main/altlinux --network=bridge:breth0 --vnc --os-type=linux \ --os-variant=rhel6 --cdrom /mnt/images/altlinux-x86_64.iso --accelerate --noautoconsole --vcpus=1 --arch=x86_64
FreeBSD 8.1 на LVM :
/sbin/lvcreate -L20G -n freebsd main virt-install --connect qemu:///system --name freebsd --ram 512 --disk path=/dev/main/freebsd --network=bridge:breth0 --graphics vnc,password=rootSD,listen=0.0.0.0 \ --os-type unix --os-variant=freebsd8 --cdrom /var/lib/vz/template/FreeBSD-8.1-RELEASE-i386-disc1.iso --accelerate --noautoconsole --vcpus=1 --arch=i686
После запуска команды создания VPS смотрим через netstat, какой номер порта добавился в список открытых портов, подключаемся через VNC к хардноде к этому порту (например vncviewer test.domain.com:5902 ) и вводим пароль указанный в строке "vnc,password="
Удаление VPS
Выполняем остановку и удаление VPS в KVM:
virsh -c qemu:///system destroy test_vps #выключить по питанию virsh -c qemu:///system undefine test_vps #удалить (конифг тоже удаляется)
И удаляем раздел LVM:
/sbin/lvremove /dev/main/test_vps
Управление ресурсами
Нужно настроить cgroups. В случае systemd это уже должно быть сделано автоматом.
Проверить наличие в /etc/libvirt/qemu.xml
cgroup_controllers = [ "cpu", "devices", "memory", "cpuset", "blkio" ] cgroup_device_acl = [ "/dev/null", "/dev/full", "/dev/zero", "/dev/random", "/dev/urandom", "/dev/ptmx", "/dev/kvm", "/dev/kqemu", "/dev/rtc", "/dev/hpet", "/dev/net/tun", ]
Назначить нужные ресурсы через:
$ virsh schedinfo --set cpu_shares=1024 alt_guest $ virsh blkiotune alt_guest --weight 1024
Проброс PCI-устройств внутрь домена
В /etc/libvirt/qemu.conf активируем
relaxed_acs_check = 1
Получение нужной информации о NIC
# lspci -vn ... 0e:00.0 0200: 14e4:1659 (rev 21) Subsystem: 103c:7031 Physical Slot: 3 Flags: fast devsel, IRQ 17 Memory at fdff0000 (64-bit, non-prefetchable) [size=64K] [virtual] Expansion ROM at d0100000 [disabled] [size=64K] Capabilities: [48] Power Management version 2 Capabilities: [50] Vital Product Data Capabilities: [58] MSI: Enable- Count=1/8 Maskable- 64bit+ Capabilities: [d0] Express Endpoint, MSI 00 Capabilities: [100] Advanced Error Reporting Capabilities: [13c] Virtual Channel <?> Capabilities: [160] Device Serial Number 00-19-bb-ff-fe-ce-87-dc Capabilities: [16c] Power Budgeting <?> Kernel modules: tg3 # lspci -t -[0000:00]-+-00.0 +-02.0-[09-12]--+-00.0-[0a-11]--+-00.0-[0b-0d]----00.0-[0c]----08.0 | | +-01.0-[0e-10]----00.0 | | \-02.0-[11]-- | \-00.3-[12]-- +-03.0-[06-08]----00.0 +-04.0-[13-15]-- +-05.0-[16]-- +-06.0-[17-19]-- +-07.0-[1a]-- +-10.0 +-10.1 +-10.2 +-11.0 +-13.0 +-15.0 +-16.0 +-1c.0-[02-03]----00.0-[03]----00.0 +-1c.1-[04-05]----00.0-[05]----00.0 +-1d.0 +-1d.1 +-1d.2 +-1d.3 +-1d.7 +-1e.0-[01]--+-03.0 | +-04.0 | +-04.2 | +-04.4 | \-04.6 +-1f.0 \-1f.1
Отвязываем устройство от HN
# echo 0000:0e:00.0 > /sys/bus/pci/drivers/tg3/unbind
В xml домена добавляем
<hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x0e' slot='0x00' function='0x0'/> </source> </hostdev>
и запускаем домен
virsh # start PXE-server error: Failed to start domain PXE-server error: internal error Process exited while reading console log output: char device redirected to /dev/pts/4 No IOMMU found. Unable to assign device "hostdev0" qemu-kvm: -device pci-assign,host=0e:00.0,id=hostdev0,configfd=30,bus=pci.0,addr=0x5: Device 'pci-assign' could not be initialized
No IOMMU found говорит о том, что аппаратная платформа не поддерживает виртуализацию ввода/вывода.
Проброс единственной видеокарты с GPU внутрь домена
Добавить в qemu.conf для виртуальной машины в раздел features:
<kvm> <hidden state='on'/> </kvm>
Тип CPU изменить на passthrough (CPU в виртуальной машине будет полностью соответствовать CPU а хост-системе):
<cpu mode='host-passthrough' check='partial'/>
В параметры ядра хост системы добавить:
nomodeset nofb video=video=vesafb:off,efifb:off intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction vfio-pci.disable_vga=1 vfio-pci.ids=<список pciid устройств, которые нужно виртуализировать>
pcie_acs_override=downstream,multifunction нужно только в том случае, если видеокарта попадает в одну IOMMU GROUP с другими устройствами.
В загрузку модулей добавить vfio-pci:
echo vfio-pci >>/etc/modules
далее, если у вас возникает такая (или подобная) ошибка:
vfio-pci 0000:01:00.0: BAR 3: can't reserve [mem 0xd0000000-0xd1ffffff 64bit pref]
То нужно посмотреть в содержимое /proc/iomem на предмет того, кто использует данную область памяти. Если это окажется BOOTFB, то рецепт простой: склонировать себе https://github.com/furkanmustafa/forcefully-remove-bootfb скомпилировать модуль ядра, предварительно установив kernel-headers-modules-std-def:
make -C /usr/src/<версия вашего ядра>/ M=/root/forcefully-remove-bootfb/build src=/root/forcefully-remove-bootfb modules
Ну и дальше действовать по инструкции с https://github.com/furkanmustafa/forcefully-remove-bootfb
После освобождения памяти, можно запустить виртуальную машину, предварительно добавив в неё нужное PCI устройство (или устройства):
<hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </hostdev> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/> </hostdev> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x2'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x0c' function='0x0'/> </hostdev> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x3'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x0d' function='0x0'/> </hostdev>
Внутри виртуальной машины переданный GPU будет вторым устройством и его можно использовать для offload расчётных операций.
Tips
Сменить диск в приводе на VPS без перезагрузки
virsh -c qemu:///system attach-disk --type cdrom --mode readonly win2003 /vz/template/SW_CD_Windows_Svr_Std_2003_.ISO hdc
http://www.e-faux.com/references:applications:libvirt:cdrom_hotplug
Отправка комбинаций клавиш
Часто бывает нужно переключиться в окне kvm на вторую виртуальную консоль из графического режима.
- Нажимаем Ctrl+Alt+2 (именно 2, а не F2)
- В консоли QEMU вводим команду:
sendkey ctrl-alt-f2
- Нажимаем Ctrl+Alt+1 для возращения из консоли уже на вторую виртуальную консоль. Возврат в X.org: Alt+F7
Получение файлов из образа qcow2
Подключение:
losetup -f lxde-p5.qcow2 kpartx -a /dev/loop0 mount /dev/mapper/loop0p2 /mnt # монтирование второго раздела
Отключение:
umount /mnt kpartx -d /dev/loop0 losetup -d /dev/loop0
Включение виртуализации в BIOS
При виде сообщений kvm: disabled by bios или kvm: no hardware support в выводе dmesg на системе с x86-процессором, который поддерживает расширение vmx (см. /proc/cpuinfo), следует обратить внимание на статус поддержки виртуализации где-то в расширенных настройках BIOS/UEFI; также может понадобиться включить NX, на некоторых системах Dell -- "Trusted Execution". В свою очередь, некоторые настройки могут помешать (например, включение Intel AMT на Thinkpad T500).