forked from M-Labs/wfvm
Compare commits
4 Commits
3694b0a9f2
...
7e09796a9b
Author | SHA1 | Date | |
---|---|---|---|
7e09796a9b | |||
4dcd3699fe | |||
bf681b20aa | |||
3cbddd7218 |
12
flake.lock
generated
12
flake.lock
generated
@ -2,16 +2,16 @@
|
|||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1665449268,
|
"lastModified": 1685004253,
|
||||||
"narHash": "sha256-cw4xrQIAZUyJGj58Dp5VLICI0rscd+uap83afiFzlcA=",
|
"narHash": "sha256-AbVL1nN/TDicUQ5wXZ8xdLERxz/eJr7+o8lqkIOVuaE=",
|
||||||
"owner": "nixos",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "285e77efe87df64105ec14b204de6636fb0a7a27",
|
"rev": "3e01645c40b92d29f3ae76344a6d654986a91a91",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "nixos",
|
"owner": "NixOS",
|
||||||
"ref": "nixos-unstable",
|
"ref": "nixos-23.05",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
|
21
flake.nix
21
flake.nix
@ -2,7 +2,7 @@
|
|||||||
description = "WFVM: Windows Functional Virtual Machine";
|
description = "WFVM: Windows Functional Virtual Machine";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.05";
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = { self, nixpkgs }:
|
outputs = { self, nixpkgs }:
|
||||||
@ -12,13 +12,26 @@
|
|||||||
|
|
||||||
pkgs = nixpkgs.legacyPackages.${system};
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
|
||||||
in {
|
in rec {
|
||||||
lib = import ./wfvm {
|
lib = import ./wfvm {
|
||||||
inherit pkgs;
|
inherit pkgs;
|
||||||
};
|
};
|
||||||
|
|
||||||
packages.${system}.demoImage = import ./wfvm/demo-image.nix {
|
packages.${system} = rec {
|
||||||
inherit self;
|
demoImage = import ./wfvm/demo-image.nix {
|
||||||
|
inherit self;
|
||||||
|
};
|
||||||
|
|
||||||
|
default = lib.utils.wfvm-run {
|
||||||
|
name = "demo";
|
||||||
|
image = demoImage;
|
||||||
|
script =
|
||||||
|
''
|
||||||
|
echo "Windows booted. Press Enter to terminate VM."
|
||||||
|
read
|
||||||
|
'';
|
||||||
|
display = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
, services ? {}
|
, services ? {}
|
||||||
, impureShellCommands ? []
|
, impureShellCommands ? []
|
||||||
, driveLetter ? "D:"
|
, driveLetter ? "D:"
|
||||||
|
, efi ? true
|
||||||
, imageSelection ? "Windows 11 Pro N"
|
, imageSelection ? "Windows 11 Pro N"
|
||||||
, enableTpm
|
, enableTpm
|
||||||
, ...
|
, ...
|
||||||
@ -119,7 +120,8 @@ let
|
|||||||
# Windows expects a flat list of users while we want to manage them as a set
|
# Windows expects a flat list of users while we want to manage them as a set
|
||||||
flatUsers = builtins.attrValues (builtins.mapAttrs (name: s: s // { inherit name; }) users);
|
flatUsers = builtins.attrValues (builtins.mapAttrs (name: s: s // { inherit name; }) users);
|
||||||
|
|
||||||
diskId = 2;
|
diskId =
|
||||||
|
if efi then 2 else 1;
|
||||||
|
|
||||||
autounattendXML = pkgs.writeText "autounattend.xml" ''
|
autounattendXML = pkgs.writeText "autounattend.xml" ''
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
@ -159,12 +161,12 @@ let
|
|||||||
<CreatePartitions>
|
<CreatePartitions>
|
||||||
<CreatePartition wcm:action="add">
|
<CreatePartition wcm:action="add">
|
||||||
<Order>1</Order>
|
<Order>1</Order>
|
||||||
<Type>EFI</Type>
|
<Type>${if efi then "EFI" else "Primary"}</Type>
|
||||||
<Size>300</Size>
|
<Size>300</Size>
|
||||||
</CreatePartition>
|
</CreatePartition>
|
||||||
<CreatePartition wcm:action="add">
|
<CreatePartition wcm:action="add">
|
||||||
<Order>2</Order>
|
<Order>2</Order>
|
||||||
<Type>MSR</Type>
|
<Type>${if efi then "MSR" else "Primary"}</Type>
|
||||||
<Size>16</Size>
|
<Size>16</Size>
|
||||||
</CreatePartition>
|
</CreatePartition>
|
||||||
<CreatePartition wcm:action="add">
|
<CreatePartition wcm:action="add">
|
||||||
@ -176,7 +178,7 @@ let
|
|||||||
<ModifyPartitions>
|
<ModifyPartitions>
|
||||||
<ModifyPartition wcm:action="add">
|
<ModifyPartition wcm:action="add">
|
||||||
<Order>1</Order>
|
<Order>1</Order>
|
||||||
<Format>FAT32</Format>
|
<Format>${if efi then "FAT32" else "NTFS"}</Format>
|
||||||
<Label>System</Label>
|
<Label>System</Label>
|
||||||
<PartitionID>1</PartitionID>
|
<PartitionID>1</PartitionID>
|
||||||
</ModifyPartition>
|
</ModifyPartition>
|
||||||
|
@ -57,7 +57,7 @@ wfvm.makeWindowsImage {
|
|||||||
disable-autolock
|
disable-autolock
|
||||||
disable-firewall
|
disable-firewall
|
||||||
])
|
])
|
||||||
anaconda3 msys2 msvc msvc-ide-unbreak
|
anaconda3 msys2
|
||||||
];
|
];
|
||||||
|
|
||||||
# services = {
|
# services = {
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
, baseRtc ? "2022-10-10T10:10:10"
|
, baseRtc ? "2022-10-10T10:10:10"
|
||||||
, cores ? "4"
|
, cores ? "4"
|
||||||
, qemuMem ? "4G"
|
, qemuMem ? "4G"
|
||||||
|
, efi ? true
|
||||||
, enableTpm ? false
|
, enableTpm ? false
|
||||||
}:
|
}:
|
||||||
|
|
||||||
@ -23,6 +24,7 @@ rec {
|
|||||||
"-rtc base=${baseRtc}"
|
"-rtc base=${baseRtc}"
|
||||||
"-device qemu-xhci"
|
"-device qemu-xhci"
|
||||||
"-device virtio-net-pci,netdev=n1"
|
"-device virtio-net-pci,netdev=n1"
|
||||||
|
] ++ pkgs.lib.optionals efi [
|
||||||
"-bios ${OVMF.fd}/FV/OVMF.fd"
|
"-bios ${OVMF.fd}/FV/OVMF.fd"
|
||||||
] ++ pkgs.lib.optionals enableTpm [
|
] ++ pkgs.lib.optionals enableTpm [
|
||||||
"-chardev" "socket,id=chrtpm,path=tpm.sock"
|
"-chardev" "socket,id=chrtpm,path=tpm.sock"
|
||||||
|
@ -8,12 +8,13 @@
|
|||||||
, enableTpm ? true
|
, enableTpm ? true
|
||||||
# autounattend always installs index 1, so this default is backward-compatible
|
# autounattend always installs index 1, so this default is backward-compatible
|
||||||
, imageSelection ? "Windows 11 Pro N"
|
, imageSelection ? "Windows 11 Pro N"
|
||||||
|
, efi ? true
|
||||||
, ...
|
, ...
|
||||||
}@attrs:
|
}@attrs:
|
||||||
|
|
||||||
let
|
let
|
||||||
lib = pkgs.lib;
|
lib = pkgs.lib;
|
||||||
utils = import ./utils.nix { inherit pkgs enableTpm; };
|
utils = import ./utils.nix { inherit pkgs efi enableTpm; };
|
||||||
inherit (pkgs) guestfs-tools;
|
inherit (pkgs) guestfs-tools;
|
||||||
|
|
||||||
# p7zip on >20.03 has known vulns but we have no better option
|
# p7zip on >20.03 has known vulns but we have no better option
|
||||||
@ -95,7 +96,7 @@ let
|
|||||||
"usb-storage,drive=virtio-win"
|
"usb-storage,drive=virtio-win"
|
||||||
# USB boot
|
# USB boot
|
||||||
"-drive"
|
"-drive"
|
||||||
"id=win-install,file=usbimage.img,if=none,format=raw,readonly=on,media=disk"
|
"id=win-install,file=${if efi then "usb" else "cd"}image.img,if=none,format=raw,readonly=on,media=${if efi then "disk" else "cdrom"}"
|
||||||
"-device"
|
"-device"
|
||||||
"usb-storage,drive=win-install"
|
"usb-storage,drive=win-install"
|
||||||
# Output image
|
# Output image
|
||||||
@ -124,7 +125,11 @@ let
|
|||||||
|
|
||||||
cp ${autounattend.autounattendXML} win/autounattend.xml
|
cp ${autounattend.autounattendXML} win/autounattend.xml
|
||||||
|
|
||||||
|
${if efi then ''
|
||||||
virt-make-fs --partition --type=fat win/ usbimage.img
|
virt-make-fs --partition --type=fat win/ usbimage.img
|
||||||
|
'' else ''
|
||||||
|
${pkgs.cdrkit}/bin/mkisofs -iso-level 4 -l -R -udf -D -b boot/etfsboot.com -no-emul-boot -boot-load-size 8 -hide boot.catalog -eltorito-alt-boot -o cdimage.img win/
|
||||||
|
''}
|
||||||
rm -rf win
|
rm -rf win
|
||||||
|
|
||||||
${utils.tpmStartCommands}
|
${utils.tpmStartCommands}
|
||||||
|
Loading…
Reference in New Issue
Block a user