LINUX.ORG.RU

Скрыть использование виртуальной машины (qemu)

 ,


1

8

Здравствуйте, господа.

Помогите, пожалуйста, ибо нет сил уж больше гуглить. Есть задача: запустить некий «CAD софт» в виртуалке. Хитрый «кад» не разрешает себя устанавливать в виртуалку, а я пытаюсь его обмануть. XML конфиг для libvirt прилагаю:

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>xxx</name>
  <uuid>9f4441de-af34-42ca-b10d-ae29141574c4</uuid>
  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>8388608</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-2.8'>hvm</type>
    <boot dev='hd'/>
    <bootmenu enable='yes'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
    <hyperv>
      <relaxed state='off'/>
      <vapic state='off'/>
      <spinlocks state='off'/>
    </hyperv>
    <vmport state='off'/>
  </features>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
    <timer name='hypervclock' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/whoami/kvm/win7.qcow2'/>
      <target dev='hda' bus='ide'/>
      <serial>SEAGATE ST3750525AS</serial>
      <wwn>0x500277a1234c4e21</wwn>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='block' device='disk'>
      <driver name='qemu' type='raw' cache='none' io='native'/>
      <source dev='/dev/vg-ssd/soliddev'/>
      <target dev='hdc' bus='ide'/>
      <serial>SEAGATE ST3750526AS</serial>
      <wwn>0x500277a5678c4e21</wwn>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='94:de:80:78:2c:99'/>
      <source bridge='br_for_vms2'/>
      <model type='rtl8139'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <sound model='ich6'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </hostdev>
    <hostdev mode='subsystem' type='usb' managed='yes'>
      <source>
        <vendor id='0x09da'/>
        <product id='0xf613'/>
      </source>
      <address type='usb' bus='0' port='2'/>
    </hostdev>
    <hostdev mode='subsystem' type='usb' managed='yes'>
      <source>
        <vendor id='0x046d'/>
        <product id='0xc328'/>
      </source>
      <address type='usb' bus='0' port='1'/>
    </hostdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
  <qemu:commandline>
    <qemu:arg value='-cpu'/>
    <qemu:arg value='host,hv_time,kvm=off,hv_vendor_id=null,-hypervisor'/>
    <qemu:arg value='-smbios'/>
    <qemu:arg value='type=0,vendor=LENOVO,version=FBKTB4AUS,date=07/01/2015,release=1.180'/>
    <qemu:arg value='-smbios'/>
    <qemu:arg value='type=1,manufacturer=LENOVO,product=30AH001GPB,version=ThinkStation P300,serial=S4M88119,uuid=cecf333d-6603-e511-97d5-6c0b843f98ba,sku=LENOVO_MT_30AH,family=P300'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.x-vga=on'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.romfile=/home/whoami/k_install/gts450.img'/>
  </qemu:commandline>
</domain>

Я уже изрядно над ним поиздевался, не пинайте сильно, но все равно не смог добиться нужного результата.

К слову, в комплекте к данному софту есть таблэтка, которая позволяет его запустить в виртуалбоксе. Выглядит примерно вот так:

@echo Off

setlocal EnableDelayedExpansion


if "%1"=="" goto usage

set VMNAME=%1

VBoxManage setextradata "%VMNAME%" "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVendor" "American Megatrends Inc"
VBoxManage setextradata "%VMNAME%" "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVersion" "2.1.0"
VBoxManage setextradata "%VMNAME%" "VBoxInternal/Devices/pcbios/0/Config/DmiSystemVendor" "ASUSTek Computer"

call:gen_random_string 9

VBoxManage setextradata "%VMNAME%" "VBoxInternal/Devices/pcbios/0/Config/DmiSystemSerial" "string:!rand!"

call:gen_random_string 20

VBoxManage setextradata "%VMNAME%" "VBoxInternal/Devices/ahci/0/Config/Port0/SerialNumber" "string:!rand!"

call:gen_random_string 8

VBoxManage setextradata "%VMNAME%" "VBoxInternal/Devices/ahci/0/Config/Port0/FirmwareRevision" "string:!rand!"
VBoxManage setextradata "%VMNAME%" "VBoxInternal/Devices/ahci/0/Config/Port0/ModelNumber" "SEAGATE ST3750525AS"

echo.
echo Success!
echo.
pause
goto:eof

:usage

echo Usage: %0 VM-Name
echo This script shold be started from HOST machine
echo where VM-name is a name of STOPPED VirtualBox virtual machine
echo Note: the PATH variable must contain path to VBoxManage.exe
echo like set PATH=C:\Program Files\Oracle\VirtualBox;%%PATH%%
echo.
pause
goto:eof

:gen_random_string

set lineup=0123456789ABCDEF
set RandomLength=%1

set count=0
set rand=

:loop
set /a count+=1
set /a _RND=%Random%*15/32768
set rand=!rand!!lineup:~%_RND%,1!
if !count! lss %RandomLength% goto loop

:eof
(сорри за *.bat, но суть я думаю понятна).

Таблэтка рабочая, действительно в виртуалбоксе работает (сам виртуалбокс не хочу использовать потому что нужно пробросить видеокарту в виртуалку)

Подскажите, что я делаю не так (либо чего я еще не сделал)?

★★★

Прошу особо обратить внимание вот на этот кусок XML'ки:

qemu:commandline>
    <qemu:arg value='-cpu'/>
    <qemu:arg value='host,hv_time,kvm=off,hv_vendor_id=null,-hypervisor'/>
    <qemu:arg value='-smbios'/>
    <qemu:arg value='type=0,vendor=LENOVO,version=FBKTB4AUS,date=07/01/2015,release=1.180'/>
    <qemu:arg value='-smbios'/>
    <qemu:arg value='type=1,manufacturer=LENOVO,product=30AH001GPB,version=ThinkStation P300,serial=S4M88119,uuid=cecf333d-6603-e511-97d5-6c0b843f98ba,sku=LENOVO_MT_30AH,family=P300'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.x-vga=on'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.romfile=/home/whoami/k_install/gts450.img'/>
  </qemu:commandline>
ибо тут я сосредоточил особое количество костылей, которые, по заявлению интернетов, должны работать, но не работают

disee ★★★ ()

Не знаю, как с CAD-овской штуковиной, но в случае с драйвером NVidia это решалось вот так:

<features>
	<hyperv>
		...
		<vendor_id state='on' value='whatever'/>
		...
	</hyperv>
	...
	<kvm>
	<hidden state='on'/>
	</kvm>
</features>
Думаю будет не лишним попробовать.

Deleted ()
Ответ на: комментарий от Deleted

Мне кажется примерно это же я передаю через параметры напрямую в qemu в этом куске:

<qemu:arg value='-cpu'/>
    <qemu:arg value='host,hv_time,kvm=off,hv_vendor_id=null,-hypervisor'/>
Но все равно вечером попробую... А вдруг сработает.

С Nvidia драйвером я решил вопрос очень просто: установил драйвер 335 (начиная с 338 они блочат виртуалку)

disee ★★★ ()
Последнее исправление: disee (всего исправлений: 1)
Ответ на: комментарий от ving2

Виртуалка стартует и работает отлично. А вот софт стартовать не хочет.

Есть у меня нешуточное подозрение, что они детектят по жестким дискам.

В офтопике диски определяются как

QEMU HARDDISK ATA Device

А в таблэтке для virtualbox есть как раз лечение для этого:

VBoxManage setextradata "%VMNAME%" "VBoxInternal/Devices/ahci/0/Config/Port0/FirmwareRevision" "string:!rand!"
VBoxManage setextradata "%VMNAME%" "VBoxInternal/Devices/ahci/0/Config/Port0/ModelNumber" "SEAGATE ST3750525AS"

А вот как что-то подобное для kvm сделать - не знаю.

Если есть мысли - накидывайте, буду признателен

disee ★★★ ()

Призываю в тред господ, положительно замеченных в тредах про kvm/qemu: Lavos, Novell-ch, dyasny, Harliff, targitaj.

Спасите, помогите, не дают работать (пожалуйста)

disee ★★★ ()

сам виртуалбокс не хочу использовать потому что нужно пробросить видеокарту в виртуалку

Дык с линуксового хоста вроде ж можно пробрасывать виртуящиком видюху в гостя, не?

thesis ★★★★★ ()
Ответ на: комментарий от thesis

Можно, но помечено как Highly Experimental (что по русски можно перевести как «почти не работает») и действительно, проброс gpu на vb у меня пока так и не получилось завести

disee ★★★ ()
Ответ на: комментарий от anonymous_sama

Тоже пробовал. Беда, что все эти 6 решений не работают под x64. А мне очень бы хотелось иметь более 4гб оперативы на процесс

disee ★★★ ()
Ответ на: комментарий от disee

Для начала конечно стоит погуглить по softwarename, чтобы узнать что оно проверяет. В крайнем случае ты можешь всегда взять отладчик и узнать сам. Или просто спросить у разработчиков объяснив ситуацию, если у тебя конечно это все легально.

anonymous_sama ★★★★★ ()
Последнее исправление: anonymous_sama (всего исправлений: 1)
Ответ на: комментарий от anonymous_sama

Тоже об этом подумал. про мою ситуацию с %softwarename% есть буквально одна страничка в этих интернетах, на которой говорится, что софт смотрит на:

  • MAC адрес (fixed)
  • бит гипервизора в CPUID (fixed)
  • всякую инфу про материнскую плату (fixed)

Даже приведен пример для libvirt как это поправить, но увы не работает.

Тоже подумал в сторону дебагера. Даже установил windbg, но столкнулся с двумя следующими проблемами:

  • отсутствие Symbols
  • я в windbg ничего вообще не понимаю и вникание потенциально может занять очень много времени (хоть с наскоку и пробовал «Attach to process» и посмотреть что происходит). К сожалению квалификации не достаточно
disee ★★★ ()
Последнее исправление: disee (всего исправлений: 1)
Ответ на: комментарий от disee

Ты всегда можешь поставить VirtualBox в qemu/kvm, или просто все-таки использовать VirtualBox если с ним работает, похоже оно не стоит того времени.

anonymous_sama ★★★★★ ()
Ответ на: комментарий от anonymous_sama

Долго работал в VirtualBox. Из-за отсутствие аппаратного ускорения GPU - чертерж размером «чуть меньше маленького» очень медленно работает. По такому делу даже прикупил проц 8ми ядерный, дабы хоть чуть-чуть решить проблему (по факту почти результатов нет).

Сейчас мне кажется, что у меня осталась последняя неопробованная опция: где-нибудь взять PCI-e контроллер для SATA и пробросить его в виртуалку, дабы иметь не виртуализованный диск. Возможно это поможет...

Если же нет, увы, действительно остается только:

  • жрать что дают и сидеть в VB (очень не хочу)
  • дуалбут (еще больше не хочу)
disee ★★★ ()
Ответ на: комментарий от disee

А почему не второй комп? Собственно, это же напрашивается, когда есть специализированная задача, потребляющая много ресурсов, а у вас нет желания попробовать разобраться, может всё дело в строках «QEMU», которые захаркожены в исходнике и возможно чуть поправив их оно бы решило проблему? Я бы именно попробовал последнее, так как беглый анализ исходников показал, что это опциями вызова не решается.

vodz ★★★★★ ()
Ответ на: комментарий от disee

А вот как что-то подобное для kvm сделать - не знаю.
Если есть мысли - накидывайте, буду признателен

Это упущение. Напиши об этом разработчикам на форум и в багтрекер.

torvn77 ★★★★★ ()
Ответ на: комментарий от disee

QEMU HARDDISK ATA Device

в исходниках qemu

hw/ide/atapi.c
-        padstr8(buf + 8, 8, "QEMU");
-        padstr8(buf + 16, 16, "QEMU DVD-ROM");

hw/ide/core.c
- strcpy(s->drive_model_str, "QEMU DVD-ROM");
- strcpy(s->drive_model_str, "QEMU HARDDISK");

hw/scsi/scsi-disk.c
- s->vendor = g_strdup("QEMU");
- s->product = g_strdup("QEMU HARDDISK");
- s->product = g_strdup("QEMU CD-ROM");
Поменяй если хочется и пересобери

ving2 ()
Последнее исправление: ving2 (всего исправлений: 1)

<бред>Может он по модели процессора проверяет и если видит что-то отличное от Intel/AMD - орёт что виртуализация и болт?</бред>

TL;DR - попробуй

<cpu mode='host-passthrough'/>

Pinkbyte ★★★★★ ()

если собрать конкретный список того что именно sw проверяет и как оно выглядит в госте, то можно запостить все это в qemu-devel или в багзиллу

а еще, серьезные платящие клиенты могут жаловаться в sw напрямую, и требовать изменить политику

dyasny ★★★★★ ()
Последнее исправление: dyasny (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

так у него в конфиге, гипервизор hv_vendor_id=null т.е. наличия гипервизора он определить не должен. А процессор он хостовой указал. Конечно долго можно гадать нужно просто проверить... Судя по таблетке vbox, у него в дисках затык.

ving2 ()
Последнее исправление: ving2 (всего исправлений: 1)
Ответ на: комментарий от ving2

Проблема решилась использованием PCI-E SATA контроллера и пробросом его в виртуалку. Удивило, что для sata контроллера не нужны всякие vfio или pci-stub

disee ★★★ ()

ТС, я автор этого батника для SolidWorks :) Ты бы на рутрекере в ЛС меня спросил, что оно палит и как - я бы ответил :)

anonymous ()
Ответ на: комментарий от ving2

Поменяй если хочется и пересобери

пардон, мб я чего не понял. но зачем лезть в исходники qemu, если он замечательно и так работает с raw-дисками, не виртуализируя их?

у меня в компе 1 винт. на нем стоит венда7 и убунта. раз-два в год мне требуется эта венда, и я гружу её в kvm с этого же диска (главное не просохатить таймаут в grub, иначе повторно начнет грузится уже запущенная убунта и будет плохо)

anonymous ()
Ответ на: комментарий от anonymous

Только что всё сделал проще в своей Windows 10 под Qemu+KVM+VirtIO. Для всех жестких дисков поставил Disk Bus = VirtIO.

Удалил в виртуальной машине CD-ROM. Скопировал ISO на жесткий диск виртуальной машины. Открыл ISO (Win 10 позволяет монтировать iso файлы без проблем). И с него установил SolidWorks.

SolidWorks 2018 устанавливается отлично и больше не ругается на виртуальную машину.

В XML конфиг машины вписал только скрывание гипервизора, подмену вендора для драйверов NVidia, проброс реального процессора с хоста и проброс smbios с хоста. Доп параметры командной строки не прописывал.

anonymous ()
Ответ на: комментарий от anonymous
<domain ...>
  ...
  <os>
    ...
    <smbios mode='host'/>
    ...
  </os>
  <features>
    ...
    <vendor_id state='on' value='Nvidia00FIX'/>
    ...
  </features>
  <kvm>
    <hidden state='on'/>
  </kvm>
  <cpu mode='host-passthrough' check='none'>
    ...
  </cpu>
  ...
  <devices>
    ...
    <disk ...>
      ...
      <target dev='vda' bus='virtio'/>
      ...
    </disk>
  </devices>
  ...
</domain>

И не забудьте установить в операционной системе драйвер virtio для такой шины диска. Для этого скачайте wirtio-win iso файл с драйверами с сайта https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-mach...

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.