blob: 9eddde96bbf4e385a943373cf398b7896c7b04e4 [file] [log] [blame]
# This module runs the RIPE anchor VM in a bare qemu.
# It's expected that a storage LV is created independently and passed as blkdev.
{ config, pkgs, lib, ... }:
with lib;
let
cfg = config.hscloud.anchorvm;
in {
options.hscloud.anchorvm = {
blkdev = mkOption {
type = types.str;
description = "Root block device";
};
bridge = mkOption {
type = types.str;
description = "bridge interface";
};
ram = mkOption {
type = types.int;
description = "memory allocated to the vm";
default = 2048;
};
};
config.environment = {
# qemu-bridge-helper (needed for -nic bridge) requires this file to exist.
# We're running as root and don't care about the ACL functionality, so just
# make a minimal file that allows the interface.
# This snippet stolen from nixpkgs//libvirtd.nix
etc."qemu/bridge.conf".text = lib.concatMapStringsSep "\n" (e:
"allow ${e}") [cfg.bridge];
};
config.systemd.services.anchorvm = {
wantedBy = [ "multi-user.target" ];
after = [
"network.target"
];
serviceConfig = {
Type = "simple";
# spawn=allow needed for bridge helper
ExecStart = ''${pkgs.qemu}/bin/qemu-kvm \
-nographic -m ${toString cfg.ram} -smp 2 \
-drive file=${cfg.blkdev},if=virtio,cache=none,format=raw \
-nic bridge,br=${cfg.bridge},model=virtio-net-pci \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=allow,resourcecontrol=deny
'';
Restart = "always";
};
};
}