socketcomputer/backend/src/SlotQemuDefs.ts

69 lines
2.1 KiB
TypeScript

// QEMU definitions. These define the base QEMU command lines,
// which are standardized across all crusttest slots.
// (This file has been bastardized for socket2)
import { QemuVmDefinition } from '@computernewb/superqemu';
const kQemuPath = '/srv/collabvm/qemu/bin/qemu-system-x86_64';
// the aio model qemu will use. if possible, leave this at 'io_uring'.
const kQemuAio = 'io_uring';
/// Creates a base definition for a VM with PC chipset.
export function Slot_PCDef(
// RAM
ramSize: string,
// Network
netdevOption: string = '-netdev user,id=vm.wan',
netAdapterModel: string = 'rtl8139',
netMac: string = 'c7:4e:c0:5f:2c:7c',
// HDA
hdaIsSsd: boolean = true,
hdImagePath: string,
hdImageFormat: string
): QemuVmDefinition {
let qCommand = [kQemuPath];
let pushOption = (opt: string) => {
qCommand.push(opt.substring(0, opt.indexOf(' ')));
qCommand.push(opt.substring(opt.indexOf(' ') + 1));
};
// boilerplate/chipset
qCommand.push('-nodefaults');
pushOption('-machine pc-i440fx-2.10,accel=kvm,kernel_irqchip=on,hpet=off,acpi=on,usb=on');
pushOption('-rtc base=localtime,clock=vm');
// CPU/RAM
pushOption(`-cpu pentium3`);
pushOption(`-m ${ramSize}`); // unlike LVM we don't really want to prealloc per se..
pushOption(`${netdevOption}`);
pushOption(`-device ${netAdapterModel},id=vm.netadp,netdev=vm.wan,mac=${netMac}`);
pushOption(`-drive if=none,file=${hdImagePath},cache=writeback,discard=unmap,format=${hdImageFormat},aio=${kQemuAio},id=vm.hda_drive,bps=65000000,bps_max=65000000,iops=1500,iops_max=2000`);
// prettier-ignore
if (hdaIsSsd)
pushOption(`-device ide-hd,id=vm.hda,rotation_rate=1,drive=vm.hda_drive`);
else
pushOption(`-device ide-hd,id=vm.hda,drive=vm.hda_drive`);
// CD drive
pushOption(`-drive if=none,media=cdrom,aio=${kQemuAio},id=vm.cd`);
pushOption(`-device ide-cd,drive=vm.cd,id=vm.cd_drive`);
pushOption('-audio driver=none,model=ac97');
// VGA + usb tablet
pushOption('-device VGA,id=vm.vga');
pushOption('-device usb-tablet');
return {
id: 'socketvm1',
command: qCommand.join(' '),
snapshot: true
};
}