Last active
July 8, 2023 11:31
-
-
Save cmdrkotori/ba1ad88a705616a3bcb8d1ddf70c114b to your computer and use it in GitHub Desktop.
QEMU script for windows
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
from subprocess import Popen, call | |
from time import sleep | |
threads = 8 | |
mem = 8 | |
eth0mac = '52:54:65:03:DC:ED' | |
bootSplash = '/home/tux/vms/splash/boot.jpg' | |
ovmfCode = '/home/tux/vms/uefi/OVMF_CODE.fd' | |
ovmfVars = '/home/tux/vms/uefi/OVMF_VARS.fd' | |
tpmDir = '/home/tux/vms/tpm' | |
drives = ['/home/tux/vms/vm/win10/disk.img'] | |
drivesRaw = []#'/dev/disk/by-id/usb-Kingston_DataTraveler_3.0_F46D04613D1EE0A069000026-0:0'] | |
usbs = [] | |
vgaSlot = '11' | |
vgaRom = '/home/tux/vms/scratchpad/rx560.rom' | |
glassSock = '/tmp/looking-glass.socket' | |
glassMem = '/dev/shm/looking-glass' | |
screamMem = '/dev/shm/scream' | |
usevnc = False | |
usescream = False | |
def sep(u): | |
return [v for v in u.split() if v] | |
glass = sep(f''' | |
-spice unix,addr={glassSock},disable-ticketing | |
-device ivshmem-plain,memdev=ivshmem | |
-object memory-backend-file,id=ivshmem,share=on,mem-path={glassMem},size=32M | |
-device virtio-serial-pci | |
-device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 | |
-chardev spicevmc,id=spicechannel0,name=vdagent | |
''') | |
scream = sep(f''' | |
-device ivshmem-plain,memdev=sc_ivshmem | |
-object memory-backend-file,id=sc_ivshmem,share=on,mem-path={screamMem},size=2M | |
''') | |
usbaudio = sep(''' | |
-audiodev spice,id=usba | |
-device usb-audio,audiodev=usba | |
''') | |
cirrus = sep(''' | |
-device VGA,vgamem_mb=64 | |
-vnc 127.0.0.1:0 | |
''') | |
vga = sep(f''' | |
-vga none | |
-device ioh3420,bus=pcie.0,addr=1c,multifunction=on,port=1,chassis=1,id=root.1 | |
-device vfio-pci,host={vgaSlot}:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on | |
-device vfio-pci,host={vgaSlot}:00.1,bus=root.1,addr=00.1 | |
''') | |
tpm = sep(f''' | |
-chardev socket,id=chrtpm,path=tpm-sock | |
-tpmdev emulator,id=tpm0,chardev=chrtpm | |
-device tpm-tis,tpmdev=tpm0 | |
''') | |
qemu=sep(f''' | |
sudo -E qemu-system-x86_64 | |
-enable-kvm | |
-cpu host,kvm=on,+invtsc,vmware-cpuid-freq=on,+topoext,+ssse3,+sse4.1,+sse4.2,+x2apic | |
-smp threads={threads} | |
-M pc-q35-2.9 | |
-m {mem}G | |
-boot menu=on,splash={bootSplash},splash-time=5000 | |
-drive if=pflash,format=raw,unit=0,file={ovmfCode},readonly=on | |
-drive if=pflash,format=raw,file={ovmfVars} | |
-device ahci | |
-usb | |
-device usb-kbd | |
-device usb-mouse | |
-net nic,model=virtio,netdev=n1,macaddr={eth0mac} | |
-netdev user,id=n1 | |
-smbios type=2 | |
-rtc base=utc,base=localtime | |
-name win10 | |
''') | |
for d in drives: | |
qemu.extend(['-drive', f'if=ide,file={d},media=disk']) | |
for r in drivesRaw: | |
qemu.extend(['-drive', f'if=ide,file={r},media=disk,format=raw']) | |
for u,v in [x.split(':') for x in usbs]: | |
qemu.extend(['-device', f'usb-host,vendorid={u},productid={v}']) | |
client = sep(f'looking-glass-client win:autoResize=yes win:borderless=yes opengl:amdPinnedMem=0 win:position=0x0 spice:port=0 spice:host={glassSock}') | |
viewer = sep('gvncviewer 127.0.0.1') | |
qemu.extend(glass) | |
if usevnc: | |
qemu.extend(cirrus) | |
ctrl = viewer | |
else: | |
call(sep(f'sudo touch {glassMem}')) | |
call(sep(f'sudo touch {glassSock}')) | |
qemu.extend(vga) | |
ctrl = client | |
if usescream: | |
call(sep(f'sudo touch {screamMem}')) | |
qemu.extend(scream) | |
else: | |
qemu.extend(usbaudio) | |
if tpmDir: | |
qemu.extend(tpm) | |
call(['mkdir', '-p', tpmDir]) | |
call(['touch', tpmDir + '/TMP2-00.permall']) | |
Popen(['swtpm', 'socket', '--tpm2', '--tpmstate', 'dir=' + tpmDir, '--ctrl', 'type=unixio,path=tpm-sock']) | |
sleep(1) | |
print('qemu cmdline:\n' + ' '.join(qemu)) | |
vm = Popen(qemu) | |
sleep(1) | |
if not usevnc: | |
call(sep(f'sudo chmod 777 {glassMem}')) | |
call(sep(f'sudo chmod 777 {glassSock}')) | |
if usescream: | |
call(sep(f'sudo chmod 777 {screamMem}')) | |
sc = Popen(sep(f'scream -m {screamMem}')) | |
cl = Popen(ctrl) | |
vm.wait() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment