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
4 changed files with 42 additions and 74 deletions

View File

@@ -1,33 +0,0 @@
name: Build NixOS config
on:
pull_request:
branches: [ master ]
paths:
- '**.nix'
- 'flake.lock'
- 'secrets/**'
- 'hosts/**'
- 'modules/**'
push:
branches: [ master ]
paths:
- '**.nix'
- 'flake.lock'
- 'secrets/**'
- 'hosts/**'
- 'modules/**'
jobs:
build:
runs-on: nixos-builder
steps:
- name: Checkout
run: |
git clone -b "${{ github.head_ref || github.ref_name }}" \
https://gitea:${{ secrets.GITHUB_TOKEN }}@code.lazyworkhorse.net/gortium/infra.git .
git log --oneline -3
- name: Build NixOS config (lazyworkhorse)
run: |
nix --version
nh os build .#lazyworkhorse 2>&1

View File

@@ -36,7 +36,7 @@
"transparent_hugepage=always" # because mucho ram
];
# 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
boot.extraModprobeConfig = ''
options nct6775 force_id=0xd280
@@ -328,20 +328,21 @@
# Mi50 config
hardware.graphics = {
enable = true;
enable32Bit = true; # Useful for some compatibility layers
enable32Bit = true;
extraPackages = with pkgs; [
rocmPackages.clr.icd # OpenCL/HIP runtime
rocmPackages.clr.icd
];
};
nixpkgs.config.rocmTargets = [ "gfx906" ];
environment.variables = {
# This "tricks" ROCm into supporting the MI50 if using newer versions
HSA_OVERRIDE_GFX_VERSION = "9.0.6";
# Ensures the system sees both GPUs
HIP_VISIBLE_DEVICES = "0,1";
};
# Open ports in the firewall.
# KVM/libvirt for staging VM
virtualisation.libvirtd.enable = true;
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.

View File

@@ -1,36 +1,36 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IEdoTUQ4QSB5c1B3
anRidlRvdUIxUGZWVEw0VDQ5L1QzRHdlVHJHRDRvNEF6M2dNQVNrCk50aXF6ekxq
WnVCUXBZbEJsVk1BMmQvN2ZpNmp3ZHYvSUlvakN2VTdZUVkKLT4gMyR8Syh7ZyMt
Z3JlYXNlIFs3ezgmZDAKZ2hhNzZmU2wzdkNkTnliL0NiWWlQbnppcmRLdHZVYWdm
bG5LZ0p3Ci0tLSBMYmxYa0hCbnVham05dVo5eEJXTEhob2F1YXhzNlNoVXBwNmNz
M0RVS0xRCt2jk8SwZ4McFmBkWknNs0phZSD3deFAh1nvRE9fSp82yNG0SoFE8O8e
HaMP5fO1Y7gW7Nqvvtr0Fs2AXwxzLtVRc8+XYxDuhRY9Rq5w/VHaEt9fS2OQioml
hcTw3MhBGAN4JVhFz/lUOEO82jd3lKig95fGjA2SpwfxlAMhepe7OmJ4Hpe+QrPt
orXgJHG2Ssu2mLgpnIr3mYVXKfNMy9TUGkh5hM1qR2TidtcefExYegCesjRNmSw/
KVe8wTdF1dr+R+vQDGXZleLpLzKZHATw36+GxGUfpm6iWuDc3lBsjHrVVlm2mz7o
XM+bHDnnUHSFXhHh5gDIoRi/kI3w5b1F2psKXFAGOQq4osrYInoGdvMrGWDvhGZS
GbVyAoZKYOmlqjM/AY4vMc5N7ICsDJqugFi9fDSmckfgzvUYVbzuv7D+1gtmjAzi
+e/vhujRjE2xaD7kIeO6UFq0lZpMoQV3tX5kJG0OOuF1GlZzw22SUc67w25JNHSE
GRnm+MN7XfvtlRZyyYERMs6j829H6zOQL96YBpzxc1yx07K+SMKewHhbm4pyrcDD
dVZxNMHv+B+F2tw1KFMl+Go3pyQp0p+CgiSWUoyvBzK0BwZ7XXy93GWmuAN/dhpU
YhXIiqXgexN6a/0Z6OTah8xW1sr6EYvIGWnXdUUB+azEI2uykX00MO10szDJ/vkh
DZUafMtlgMKU+fBbM0Tr0QM1R30BWNJCjHgsoU7mxbyiuFYuyAC72T70z5WdQTst
jf4NJdc4FKOHA6ydLoyzi7ey05nxm8zquHW1kCwLVUMhvjUPbQhpWQbU8DvlB6l1
nGqWBUTqeorstDcvTTEjySPrp7PIUMj+Vt2MiFCQa5eh2sZWFJsYrA6CEtGFTpyU
og8rGtS7UBukgsp7rucLO8MYt0/ZauUcEg0jcbWc+KOWtC9MPedv6gTLfaxpk1xy
iY+7Y+H860Pt1WvVFYg9/0fj0wz92DqR08oWvOjR7+EekhacqAHfTm6PpLLKSeHw
M1D0dElJ6L1hkmHr88q7YwPfMzObmRbKh28ayeoLOprx3ezYr4t0qWWAKysvkkuo
uhvfqngZefj7CloVCaQVM0Du6p74wV5UEkxopJyMc3s4oEkauX2DgVHzb0NJ+a3n
KyatZoIEOK+yBDuRw9+c3FdxOmSc8EEdDPh5tXHOfixdxHlMXeNWo7VwtR7ThPcj
wRHwN9dgzW4AbYQAHKSOCGGqlhINYVxDviwhTT+PYB/w7x42id8aMW2KOhgGcVCD
fyQQJN5ANCxglu/T0+SmXikPQkuJqzOuE0+qqz1sMuKF3KLJB5ppys1Ygmpm27Up
oaqBa7JS4yJc53rPSEy4r10GqBbvYNDmcEWZilSrj5aTB7nhq+RVyTwmAU+qfLmK
NgGi05oyVGYBX135c6eXkEtKg1HiH5LkqkvLGIDYkAeiLmqXv6N7hGphBF7fdLXw
g8Anrn+JYaOc/6ZntCPLwm4cV4KE2hswSReHFrposb6M4/Kbx8Yf2iMx07IQ3v/R
z0sIihHjfOqLi3kafL4N0BDoLAQdjbxqkx1z0VcGVkPliS0mDro17b1KfxPsI04/
k6xTWoBQAhcCkH+NpT0VRNCM7f6aycsJekfakTRRqg5rwFimqReMSJcKCLZdoezi
iAIMHPqPW1+sjwA7Rroj3Th0NbC8vGJ47vobK8jQ4XgrwaUGhhloCTpAjzFLFTUS
YdiJN2qBQfABhxD9Owqo98HXDigqb9jhh/LrPYYDhtP6c4J+zz3+gPRiho7T03H3
kZ+YU3Q=
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IEdoTUQ4QSBWNEpt
cGFNeVBBaDRqb3pLSEZGQW0wb3VmVnBoZCswUFkzbnBLUnJ0QTNrClRqVkk4RUVO
d29KYjd5YUcwankvaTFmVHUxQVpDT2ZYWHRaY3JXTUtQMU0KLT4gKXBtQ3UsXi1n
cmVhc2UgNnwxYCBXVyA/KCQmIHt9NAo3OTZVUHR2UXkvaEFwY0ZBdEJsaFpsbHJ0
cklKcDVHcEdWMEdPSkpnN0FiRU43RW5hUWFMdjR3WFRRSFBLSGlmClM3cTNJWlNM
TExkdHdXUHJISkNIaE1TTUxUc1NUWkV1a09HeFU3bVZwQXMKLS0tIGhOcXFTUElS
azJJNnEreUhMWTJBaVZGSTJPRUFqQkVYS01KRENUVVpZSDgK8+8onFejroBo7MeO
dW+so4lOsq4zJKn3f0cxmCFg1f0X8zt6h4Uc3A5Cvr1uU+6yw1FWmJ7xa3jJz3lO
EEaKQJXYC+xIIKGcA7qILa0SFp4a/4OuYjcg27HrlPhg7u5wDhQrd0LdVEe1Xngp
ZivX7P7HwIna3X8C+TL+K2v/AG2N/z86cdKfRvxyMKNbHhYw+CfHEnWgh8tJ++4h
G9evNniuNqte6cQaRe7jODfPNW4FuY/Sb7barlJ/M9iAQdYAdyLAzU1LABeHeUfD
wtHjxy9DUZ55Vg8bB8M2JJU9MkoRT4ewiVd9LeC1GWeVmKsm93wsmrov714i7U2j
wHtDkjqEF2MmzuQc18sjNaAHiwz8j6o5xU2L/Q4+Q707yISWG7RGZYh389Cr1rnw
siUq/Vunqw2wk13+J/4vu9nqt5mMktBaCtp+QiWIurjwB5LUAyChrSm+dg5lb0Mt
UhSc0lq1+E3vxAXM2Hmk+vP86VD+6WJvAU82VFApF1s6zG2FU1/AcOVVf54nan/q
f+rgSFfASHQCYSblUJHyEtwLNsWEmTGmOEn1buUKD/H0zatPQnc0rYpjlx2V0Sjd
6yB5+wPrZ0AkN1pjcsPKOv8Kaog2DzqIjib+SaSTaRxWHQEb9uzvaReAcYI5HOpE
gkC040HN33BItATbo4+hz70Im8Ni/VXD+g6yzM6Hj1hJL+PinTKeg5keQRFIZjMx
grzievB2wVBBgLgN3qMdTFmpplaL7iL702JjXZUTTK9Izp+9wiCsV1fTa53FWDht
ylFL5SWElqXjK+QBXxAe+Jk6VQov5HI21YDXL67S554ABeRok23wxrQ31TCI4xq9
PQV7VtNRjyVud7S29m3OwpWOsgTZhn+JclHj2v4bNJzJkJnZRTmcvGPktzRI5+R4
e5vxVhGnJDzI71txaHl8+xS1lu9VzCQUrxX6TXyTRV4KjIOz0g06JOBgmBRBvJca
7MZbC65xpisl/gyLRbgkVga3t94dPV+dpZsn8eq6427IyRbKslJefatggR9//c6I
5N5fl0fR3gJQMB+HRbipBH2YsdbdWJyb4Nn6STZxIfrqoG/xC6C1raF0xK7hUx6i
4DUDSPohM8fOIswQPfE+FH3eygfzu/Ln5+ghsgHTEhgFvmgMvyxaAt6kHIzIUhMX
M3dASr4VPDpIXuXsRWwYLEifhzxsuvwVxfwtsnCaR6XKijsYECWGDdYOWHdleeqx
wDPhxEesfFVhKxhrKY9Ir8k9/FFBKQU/3GjW4+SMAg5Al1YEzxshP9vKuVcsei7W
JDwAwotNXaCm6NBckiyZJE53ou6+gckPY7V9cOfnuH74Z9ywkFzB3HW3ZlonaGyM
oGmLGcccavFtyhg5s/As4i6X8ARIpDiwe59Pn3GNXMctySqIrrr2ogUoXgrfFCie
6GOTdeMW7GeOSdJUxCofghlspS/nq01Og77VI/beWYrIwLubSka6Zaltww9zgObk
/FGEMgFkEpq7iyCvYSPA8F46pJKvnMP3S84AWCPmcTcHeg4lwGPvs6btexXBGdoz
nkCyq7wdH5Nngm7jUbl88LtaLZPAQkuqXphBVTnrF9Ofbnb4iRZ2Op4xpx9rGyvx
mO6UEhL6V1i2YZFNkNMg/W8aoMiUgBdqbkxaxblT9L0aNdlFU9+LbWYolURVEadd
Qjv0Z1gMA+tsuBbVszwsMfneZ5+B9Q==
-----END AGE ENCRYPTED FILE-----

View File

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