91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
		
		
			
		
	
	
			91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| 
								 | 
							
								{ config, pkgs, lib, ... }:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								with lib;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let
							 | 
						||
| 
								 | 
							
								  boolToStr = value: if value then "on" else "off";
							 | 
						||
| 
								 | 
							
								  cfg = config.vmware;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  subformats = [
							 | 
						||
| 
								 | 
							
								    "monolithicSparse"
							 | 
						||
| 
								 | 
							
								    "monolithicFlat"
							 | 
						||
| 
								 | 
							
								    "twoGbMaxExtentSparse"
							 | 
						||
| 
								 | 
							
								    "twoGbMaxExtentFlat"
							 | 
						||
| 
								 | 
							
								    "streamOptimized"
							 | 
						||
| 
								 | 
							
								  ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								in {
							 | 
						||
| 
								 | 
							
								  options = {
							 | 
						||
| 
								 | 
							
								    vmware = {
							 | 
						||
| 
								 | 
							
								      baseImageSize = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.int;
							 | 
						||
| 
								 | 
							
								        default = 2048;
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          The size of the VMWare base image in MiB.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								      vmDerivationName = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.str;
							 | 
						||
| 
								 | 
							
								        default = "nixos-vmware-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}";
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          The name of the derivation for the VMWare appliance.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								      vmFileName = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.str;
							 | 
						||
| 
								 | 
							
								        default = "nixos-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}.vmdk";
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          The file name of the VMWare appliance.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								      vmSubformat = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.enum subformats;
							 | 
						||
| 
								 | 
							
								        default = "monolithicSparse";
							 | 
						||
| 
								 | 
							
								        description = "Specifies which VMDK subformat to use.";
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								      vmCompat6 = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.bool;
							 | 
						||
| 
								 | 
							
								        default = false;
							 | 
						||
| 
								 | 
							
								        example = true;
							 | 
						||
| 
								 | 
							
								        description = "Create a VMDK version 6 image (instead of version 4).";
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  config = {
							 | 
						||
| 
								 | 
							
								    system.build.vmwareImage = import ../../lib/make-disk-image.nix {
							 | 
						||
| 
								 | 
							
								      name = cfg.vmDerivationName;
							 | 
						||
| 
								 | 
							
								      postVM = ''
							 | 
						||
| 
								 | 
							
								        ${pkgs.vmTools.qemu}/bin/qemu-img convert -f raw -o compat6=${boolToStr cfg.vmCompat6},subformat=${cfg.vmSubformat} -O vmdk $diskImage $out/${cfg.vmFileName}
							 | 
						||
| 
								 | 
							
								        rm $diskImage
							 | 
						||
| 
								 | 
							
								      '';
							 | 
						||
| 
								 | 
							
								      format = "raw";
							 | 
						||
| 
								 | 
							
								      diskSize = cfg.baseImageSize;
							 | 
						||
| 
								 | 
							
								      partitionTableType = "efi";
							 | 
						||
| 
								 | 
							
								      inherit config lib pkgs;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    fileSystems."/" = {
							 | 
						||
| 
								 | 
							
								      device = "/dev/disk/by-label/nixos";
							 | 
						||
| 
								 | 
							
								      autoResize = true;
							 | 
						||
| 
								 | 
							
								      fsType = "ext4";
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    fileSystems."/boot" = {
							 | 
						||
| 
								 | 
							
								      device = "/dev/disk/by-label/ESP";
							 | 
						||
| 
								 | 
							
								      fsType = "vfat";
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    boot.growPartition = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    boot.loader.grub = {
							 | 
						||
| 
								 | 
							
								      version = 2;
							 | 
						||
| 
								 | 
							
								      device = "nodev";
							 | 
						||
| 
								 | 
							
								      efiSupport = true;
							 | 
						||
| 
								 | 
							
								      efiInstallAsRemovable = true;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    virtualisation.vmware.guest.enable = true;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 |