Compare commits

..

1 Commits

Author SHA1 Message Date
37d690e4de feat: add KVM/libvirt support for staging VM
- Load kvm-intel and kvm kernel modules
- Enable libvirtd service
- Add ai-worker to libvirtd group

Requires Intel VT-x to be enabled in BIOS.
After reboot: verify /dev/kvm exists, then deploy staging VM.
2026-05-12 19:15:03 -04:00
3 changed files with 13 additions and 15 deletions

View File

@@ -36,7 +36,7 @@
"transparent_hugepage=always" # because mucho ram "transparent_hugepage=always" # because mucho ram
]; ];
# 2. Load the specific drivers found by sensors-detect # 2. Load the specific drivers found by sensors-detect
boot.kernelModules = [ "nct6775" "lm96163" "iptable_nat" "iptable_filter" ]; boot.kernelModules = [ "nct6775" "lm96163" "iptable_nat" "iptable_filter" "kvm-intel" "kvm" ];
# 3. Force the nct6775 driver to recognize the chip if it's stubborn # 3. Force the nct6775 driver to recognize the chip if it's stubborn
boot.extraModprobeConfig = '' boot.extraModprobeConfig = ''
options nct6775 force_id=0xd280 options nct6775 force_id=0xd280
@@ -207,7 +207,6 @@
ai = { ai = {
path = self + "/assets/compose/ai"; path = self + "/assets/compose/ai";
envFile = config.age.secrets.containers_env.path; envFile = config.age.secrets.containers_env.path;
ports = [ 22000 ]; # Syncthing TCP sync
}; };
cloudstorage = { cloudstorage = {
@@ -247,11 +246,9 @@
envFile = config.age.secrets.containers_env.path; envFile = config.age.secrets.containers_env.path;
}; };
int = { # tak = {
path = self + "/assets/compose/int"; # path = self + "/assets/compose/tak";
envFile = config.age.secrets.containers_env.path; # };
ports = [ 3000 ];
};
}; };
services.opencode = { services.opencode = {
@@ -331,19 +328,20 @@
# Mi50 config # Mi50 config
hardware.graphics = { hardware.graphics = {
enable = true; enable = true;
enable32Bit = true; # Useful for some compatibility layers enable32Bit = true;
extraPackages = with pkgs; [ extraPackages = with pkgs; [
rocmPackages.clr.icd # OpenCL/HIP runtime rocmPackages.clr.icd
]; ];
}; };
nixpkgs.config.rocmTargets = [ "gfx906" ]; nixpkgs.config.rocmTargets = [ "gfx906" ];
environment.variables = { environment.variables = {
# This "tricks" ROCm into supporting the MI50 if using newer versions
HSA_OVERRIDE_GFX_VERSION = "9.0.6"; HSA_OVERRIDE_GFX_VERSION = "9.0.6";
# Ensures the system sees both GPUs
HIP_VISIBLE_DEVICES = "0,1"; HIP_VISIBLE_DEVICES = "0,1";
}; };
# KVM/libvirt for staging VM
virtualisation.libvirtd.enable = true;
# Open ports in the firewall. # Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ]; # networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ]; # networking.firewall.allowedUDPPorts = [ ... ];
@@ -477,7 +475,7 @@
services.openssh.settings = { services.openssh.settings = {
PermitRootLogin = "no"; PermitRootLogin = "no";
MaxAuthTries = 3; MaxAuthTries = 3;
MaxSessions = 20; MaxSessions = 10;
LoginGraceTime = 30; LoginGraceTime = 30;
ClientAliveInterval = 300; ClientAliveInterval = 300;
ClientAliveCountMax = 2; ClientAliveCountMax = 2;

View File

@@ -4,7 +4,7 @@
group = "ai-worker"; group = "ai-worker";
home = "/home/ai-worker"; home = "/home/ai-worker";
createHome = true; createHome = true;
extraGroups = [ "docker" ]; extraGroups = [ "docker" "libvirtd" ];
shell = pkgs.bashInteractive; shell = pkgs.bashInteractive;
openssh.authorizedKeys.keys = [ openssh.authorizedKeys.keys = [
keys.users.ai-worker.main keys.users.ai-worker.main