{ config, pkgs, lib, ... }: with lib; let networkModule = import ./network.nix { inherit config pkgs lib ;}; in { options = { cpu = mkOption { type = types.str; default = "host"; description = '' The CPU model to emulate. ''; }; smp = mkOption { type = types.ints.positive; default = 1; description = '' Specify the number of cores the guest is permitted to use. The number can be higher than the available cores on the host system. ''; }; memSize = mkOption { type = types.ints.positive; default = 1024; description = '' The memory size in megabytes of the virtual machine. ''; }; diskSize = mkOption { type = types.str; default = ""; description = '' The disk size in qemu params. ''; }; osImage = mkOption { type = types.package; description = '' OS image stored in the nix store, either built with vmixLib.images or fetched from the internet. ''; }; persistantOverlayImagePath = mkOption { type = types.nullOr types.path; default = null; description = '' Path where the persistant overlay is stored. If path is non-existant, a qcow2 image backed by the original osImage is created. ''; }; startOnBoot = mkOption { type = types.bool; description = '' Whether to start the VM automatically on system boot. ''; default = true; }; sharedDirectories = lib.mkOption { type = types.attrsOf (types.submodule { options = { source = lib.mkOption { type = types.str; description = "The path of the directory to share, can be a shell variable"; }; target = lib.mkOption { type = types.str; description = "The mount point of the directory inside the virtual machine"; }; }; }); example = { my-share = { source = "/path/to/be/shared"; target = "/mnt/shared"; }; }; default = { }; }; networks = lib.mkOption { type = types.attrsOf (types.submodule networkModule); example = { my-share = { source = "/path/to/be/shared"; target = "/mnt/shared"; }; }; default = { }; }; }; functions.mkVMService = name: cfg: let vmCfg = cfg // { inherit name }; mkDiskImageFrom diskImage = qemuArgs = '' --name ${vmCfg.name} \ --cpu ${vmCfg.cpu} \ --smp ${vmCfg.cores} \ -- ''; in { }; } //storage // //networking - DNS, VPNs, Bridges, NATs, isolation, connecting with others,host //run adhoc //run and die //