-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmicrovm-test.nix
87 lines (81 loc) · 2.16 KB
/
microvm-test.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
{
config,
lib,
pkgs,
inputs,
...
}:
let
cfg = config.home-ops.microvm-host;
in
{
options.home-ops.microvm-host = {
enable = lib.mkEnableOption "Enable microvm host services.";
baseZfsDataset = lib.mkOption {
type = lib.types.str;
description = "Base ZFS dataset whereunder to create shares for MicroVMs.";
};
};
config = lib.mkIf cfg.enable {
# microvm host settings
microvm = {
host.enable = true;
autostart = [ ];
};
# allow microvm access to zvol
users.users.microvm.extraGroups = [ "disk" ];
systemd.services = {
"microvm-virtiofsd@" = {
requires = [ "microvm-zfs-datasets@%i.service" ];
};
"microvm-zfs-datasets@" = {
description = "Create ZFS datasets for MicroVM '%i'";
before = [ "microvm-virtiofsd@%i.service" ];
after = [ "local-fs.target" ];
partOf = [ "microvm@%i.service" ];
unitConfig.ConditionPathExists = "/var/lib/microvms/%i/current/share/microvm/virtiofs";
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
WorkingDirectory = "/var/lib/microvms/%i";
SyslogIdentifier = "microvm-zfs-datasets@%i";
};
path = with pkgs; [ zfs ];
scriptArgs = "%i";
script = # bash
''
zfsExists() {
zfs list $1 >/dev/null 2>/dev/null
}
NAME="$1"
BASE="${cfg.baseZfsDataset}"
zfsExists $BASE || \
zfs create $BASE
zfsExists $BASE/$NAME || \
zfs create $BASE/$NAME
for d in current/share/microvm/virtiofs/*; do
SOURCE=$(cat $d/source)
TAG=$(basename $d)
MNT=$SOURCE
if [[ "$MNT" == /var/lib/microvms/$NAME/* ]]; then
zfsExists $BASE/$NAME/$TAG || \
zfs create -o mountpoint=$MNT $BASE/$NAME/$TAG
fi
done
'';
};
};
nix.settings = {
min-free =
10 # gb
* 1024
* 1024
* 1024;
max-free =
20 # gb
* 1024
* 1024
* 1024;
};
};
}