Compare commits

..

1 Commits

Author SHA1 Message Date
Lumpiasty 92330a6fe2 failed nixbsd experiment 2026-05-04 19:52:16 +02:00
11 changed files with 321 additions and 110 deletions
Generated
+175 -47
View File
@@ -58,6 +58,33 @@
"type": "github" "type": "github"
} }
}, },
"cppnix": {
"inputs": {
"flake-compat": "flake-compat_2",
"flake-parts": "flake-parts",
"git-hooks-nix": "git-hooks-nix",
"nixpkgs": [
"nixbsd",
"nixpkgs"
],
"nixpkgs-23-11": "nixpkgs-23-11",
"nixpkgs-regression": "nixpkgs-regression"
},
"locked": {
"lastModified": 1771531533,
"narHash": "sha256-E6uWPzQoMpzUb+2kcrxaYsfhUXjyIAoTpI6DPtbe1Y0=",
"owner": "rhelmot",
"repo": "nix",
"rev": "d623444c12428e69a3269d3b4b40200f2b4618fc",
"type": "github"
},
"original": {
"owner": "rhelmot",
"ref": "freebsd-safe",
"repo": "nix",
"type": "github"
}
},
"crane": { "crane": {
"locked": { "locked": {
"lastModified": 1765145449, "lastModified": 1765145449,
@@ -105,6 +132,36 @@
} }
}, },
"flake-compat_2": { "flake-compat_2": {
"flake": false,
"locked": {
"lastModified": 1733328505,
"narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-compat_3": {
"locked": {
"lastModified": 1733328505,
"narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"revCount": 69,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
}
},
"flake-compat_4": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1627913399, "lastModified": 1627913399,
@@ -120,6 +177,28 @@
"type": "github" "type": "github"
} }
}, },
"flake-parts": {
"inputs": {
"nixpkgs-lib": [
"nixbsd",
"cppnix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1733312601,
"narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-utils": { "flake-utils": {
"inputs": { "inputs": {
"systems": "systems" "systems": "systems"
@@ -153,6 +232,41 @@
"type": "github" "type": "github"
} }
}, },
"git-hooks-nix": {
"inputs": {
"flake-compat": [
"nixbsd",
"cppnix"
],
"gitignore": [
"nixbsd",
"cppnix"
],
"nixpkgs": [
"nixbsd",
"cppnix",
"nixpkgs"
],
"nixpkgs-stable": [
"nixbsd",
"cppnix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1734279981,
"narHash": "sha256-NdaCraHPp8iYMWzdXAt5Nv6sA3MUzlCiGiR586TCwo0=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "aa9f40c906904ebd83da78e7f328cd8aeaeae785",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"type": "github"
}
},
"gitignore": { "gitignore": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -220,20 +334,24 @@
"type": "github" "type": "github"
} }
}, },
"linux-ntfs": { "mini-tmpfiles": {
"flake": false, "inputs": {
"nixpkgs": [
"nixbsd",
"nixpkgs"
]
},
"locked": { "locked": {
"lastModified": 1778111793, "lastModified": 1742754557,
"narHash": "sha256-E+f1utc2Az4ZmqvkZ8lDgHpXsheJobUMbLff1vdpQHE=", "narHash": "sha256-nGxgiNhA94eSl8jcQwCboJ5Ed132z8yrFdOoT+rf8bE=",
"owner": "Lumpiasty", "owner": "nixos-bsd",
"repo": "linux-ntfs", "repo": "mini-tmpfiles",
"rev": "7fbf82056e26d99bfa4d5aab87ce287cd8c8cbef", "rev": "534ee577692c7092fdcd035f89bc29b663c6f9ca",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "Lumpiasty", "owner": "nixos-bsd",
"ref": "main", "repo": "mini-tmpfiles",
"repo": "linux-ntfs",
"type": "github" "type": "github"
} }
}, },
@@ -253,26 +371,6 @@
"type": "github" "type": "github"
} }
}, },
"nix-skills": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1775452536,
"narHash": "sha256-1MjzL/U5OtALBmsel4YHVSK9jr2c/YP4eXfi7lA5C+o=",
"owner": "sudosubin",
"repo": "nix-skills",
"rev": "c2d1958a5cdd7ee83f552c046fbc7cb43e8171e4",
"type": "github"
},
"original": {
"owner": "sudosubin",
"repo": "nix-skills",
"type": "github"
}
},
"nix-sweep": { "nix-sweep": {
"inputs": { "inputs": {
"cf": "cf", "cf": "cf",
@@ -296,6 +394,26 @@
"type": "github" "type": "github"
} }
}, },
"nixbsd": {
"inputs": {
"cppnix": "cppnix",
"flake-compat": "flake-compat_3",
"mini-tmpfiles": "mini-tmpfiles",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1777600581,
"narHash": "sha256-DbKmDIFNLqR8xXnSepJPr29FngkiPDa8+vAErZRrQUA=",
"path": "/home/user/Projects/nixbsd",
"type": "path"
},
"original": {
"path": "/home/user/Projects/nixbsd",
"type": "path"
}
},
"nixos-hardware": { "nixos-hardware": {
"locked": { "locked": {
"lastModified": 1776830795, "lastModified": 1776830795,
@@ -328,30 +446,41 @@
"type": "github" "type": "github"
} }
}, },
"ntfsplus": { "nixpkgs-23-11": {
"inputs": {
"linux-ntfs": "linux-ntfs",
"nixpkgs": [
"nixpkgs"
]
},
"locked": { "locked": {
"lastModified": 1774317576, "lastModified": 1717159533,
"narHash": "sha256-HSDFaDLvfS/NqJlXbHh9135DEpqH6JrNuWqbu3YPcTg=", "narHash": "sha256-oamiKNfr2MS6yH64rUn99mIZjc45nGJlj9eGth/3Xuw=",
"owner": "cmspam", "owner": "NixOS",
"repo": "ntfsplus-flake", "repo": "nixpkgs",
"rev": "e22d1bcbac31b4e6484d32c503396e8184650215", "rev": "a62e6edd6d5e1fa0329b8653c801147986f8d446",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "cmspam", "owner": "NixOS",
"repo": "ntfsplus-flake", "repo": "nixpkgs",
"rev": "a62e6edd6d5e1fa0329b8653c801147986f8d446",
"type": "github"
}
},
"nixpkgs-regression": {
"locked": {
"lastModified": 1643052045,
"narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
"type": "github" "type": "github"
} }
}, },
"peerix": { "peerix": {
"inputs": { "inputs": {
"flake-compat": "flake-compat_2", "flake-compat": "flake-compat_4",
"flake-utils": "flake-utils_2", "flake-utils": "flake-utils_2",
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
@@ -424,11 +553,10 @@
"home-manager": "home-manager", "home-manager": "home-manager",
"lanzaboote": "lanzaboote", "lanzaboote": "lanzaboote",
"nix-flatpak": "nix-flatpak", "nix-flatpak": "nix-flatpak",
"nix-skills": "nix-skills",
"nix-sweep": "nix-sweep", "nix-sweep": "nix-sweep",
"nixbsd": "nixbsd",
"nixos-hardware": "nixos-hardware", "nixos-hardware": "nixos-hardware",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"ntfsplus": "ntfsplus",
"peerix": "peerix", "peerix": "peerix",
"plasma-manager": "plasma-manager" "plasma-manager": "plasma-manager"
} }
+5 -8
View File
@@ -34,13 +34,8 @@
url = "github:Lumpiasty/acer-wmi-ext/main"; url = "github:Lumpiasty/acer-wmi-ext/main";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
ntfsplus = { nixbsd = {
url = "github:cmspam/ntfsplus-flake"; url = "path:/home/user/Projects/nixbsd";
inputs.nixpkgs.follows = "nixpkgs";
inputs.linux-ntfs.url = "github:Lumpiasty/linux-ntfs/main";
};
nix-skills = {
url = "github:sudosubin/nix-skills";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
}; };
@@ -50,11 +45,13 @@
nixosConfigurations = nixosConfigurations =
let let
mkNixosSystem = import lib/mkNixosSystem.nix inputs; mkNixosSystem = import lib/mkNixosSystem.nix inputs;
mkNixbsdSystem = import lib/mkNixbsdSystem.nix inputs;
in in
with nixos-hardware.nixosModules; { with nixos-hardware.nixosModules; {
x260 = mkNixosSystem lenovo-thinkpad-x260 hosts/x260.nix; x260 = mkNixosSystem lenovo-thinkpad-x260 hosts/x260.nix;
acer = mkNixosSystem {} hosts/acer.nix; acer = mkNixosSystem {} hosts/acer.nix;
gaming-pc = mkNixosSystem {} hosts/gaming-pc.nix; gaming-pc = mkNixosSystem {} hosts/gaming-pc.nix;
bestieTest = mkNixbsdSystem hosts/bestieTest.nix;
}; };
}; };
} }
+10 -31
View File
@@ -21,20 +21,6 @@
pkgs.vscode-extensions.arrterian.nix-env-selector pkgs.vscode-extensions.arrterian.nix-env-selector
pkgs.vscode-extensions.jnoortheen.nix-ide pkgs.vscode-extensions.jnoortheen.nix-ide
]; ];
# profiles.default.userSettings = {
# "claudeCode.claudeProcessWrapper" = "${pkgs.claude-code}/bin/claude-code";
# };
};
# Just a fixed-location executable that launches claude code
# so we can point vscode's extenstion at it, not the nix store path
# remove it once we configure vscode using nix
home.file.".config/claude-code-wrapper" = {
text = ''
#!${pkgs.stdenv.shell}
exec ${pkgs.claude-code}/bin/claude "$@"
'';
executable = true;
}; };
home.packages = with pkgs; [ home.packages = with pkgs; [
@@ -60,6 +46,16 @@
nodejs_24 nodejs_24
codex codex
claude-code claude-code
(
# Wrapping opencode to set the OPENCODE_ENABLE_EXA environment variable
runCommand "opencode" {
buildInputs = [ makeWrapper ];
} ''
mkdir -p $out/bin
makeWrapper ${pkgs.opencode}/bin/opencode $out/bin/opencode \
--set OPENCODE_ENABLE_EXA "1"
''
)
winbox4 winbox4
amdgpu_top amdgpu_top
dua dua
@@ -118,22 +114,5 @@
fi fi
'' ''
); );
programs.opencode = {
enable = true;
package = (
# Wrapping opencode to set the OPENCODE_ENABLE_EXA environment variable
pkgs.runCommand "opencode" {
buildInputs = [ pkgs.makeWrapper ];
} ''
mkdir -p $out/bin
makeWrapper ${pkgs.opencode}/bin/opencode $out/bin/opencode \
--set OPENCODE_ENABLE_EXA "1"
''
);
skills = with pkgs.skills; {
caveman = majiayu000."claude-skill-registry".caveman + "/";
};
};
}; };
} }
+1 -10
View File
@@ -6,16 +6,7 @@
config = lib.mkIf (config.lumpiastyHome.enablePcApps && osConfig.lumpiasty.pc) { config = lib.mkIf (config.lumpiastyHome.enablePcApps && osConfig.lumpiasty.pc) {
home.packages = with pkgs; [ home.packages = with pkgs; [
vesktop vesktop
# Manual update, not yet in nixpkgs as for now spotify
(spotify.overrideAttrs (old: rec {
version = "1.2.86.502.g8cd7fb22";
rev = "94";
src = fetchurl {
name = "spotify-${version}-${rev}.snap";
url = "https://api.snapcraft.io/api/v1/snaps/download/pOBIoZ2LrCB3rDohMxoYGnbN14EHOgD7_${rev}.snap";
hash = "sha256-XhwyaObck6viIvDRXEztlSLja5fsfw5HgHUUQzMehLI=";
};
}))
pass-wayland pass-wayland
teamspeak6-client teamspeak6-client
easyeffects easyeffects
+30
View File
@@ -0,0 +1,30 @@
{ config, pkgs, lib, ... }: {
nixpkgs.hostPlatform = "x86_64-freebsd";
nixpkgs.config.allowUnsupportedSystem = true;
users.users.root.initialPassword = "toor";
networking.dhcpcd.wait = "background";
users.users.bestie = {
isNormalUser = true;
description = "your bestie";
extraGroups = [ "wheel" ];
inherit (config.users.users.root) initialPassword;
};
services.sshd.enable = true;
boot.loader.stand-freebsd.enable = true;
fileSystems."/" = {
device = "/dev/gpt/nixos";
fsType = "ufs";
};
fileSystems."/boot" = {
device = "/dev/msdosfs/ESP";
fsType = "msdosfs";
};
virtualisation.vmVariant.virtualisation.diskImage = "./${config.system.name}.qcow2";
}
+1 -6
View File
@@ -94,7 +94,7 @@
"/var/games" = "/var/games" =
{ {
device = "/dev/disk/by-uuid/8A3094A230949733"; # "Shared" NTFS partition device = "/dev/disk/by-uuid/8A3094A230949733"; # "Shared" NTFS partition
fsType = "ntfs"; fsType = "ntfs-3g";
options = [ options = [
"uid=1000" "gid=100" # My user account "uid=1000" "gid=100" # My user account
"nofail" # Don't fail boot if failed to mount because windows left it dirty "nofail" # Don't fail boot if failed to mount because windows left it dirty
@@ -102,11 +102,6 @@
}; };
}; };
# Use ntfs-plus instead driver
services.ntfsplus.enable = true;
# Force disable ntfs-3g driver
boot.supportedFilesystems.ntfs = lib.mkForce false;
# Config modules # Config modules
lumpiasty = { lumpiasty = {
pc = true; pc = true;
+60
View File
@@ -0,0 +1,60 @@
{
self,
nixpkgs,
nixbsd,
home-manager,
nix-flatpak,
plasma-manager,
lanzaboote,
claude-code,
nix-sweep,
peerix,
acer-wmi-ext,
...
}:
hostConfig:
nixbsd.lib.nixbsdSystem {
modules = [
# Cross-compile FreeBSD from Linux, builds dispatched to remote builder
{
nixpkgs.buildPlatform = "x86_64-linux";
nixpkgs.config.allowUnsupportedSystem = true;
nixpkgs.overlays = [
(final: prev: {
# No-op emulator for FreeBSD - builds happen on remote builder where binaries run natively
freebsdEmulator = prev.runCommand "freebsd-emulator" { } ''
mkdir -p $out/bin
cat > $out/bin/freebsd-exec << 'SCRIPT'
#!/bin/sh
exec "$@"
SCRIPT
chmod +x $out/bin/freebsd-exec
'';
# Override mesonEmulatorHook to not require a real emulator for FreeBSD
mesonEmulatorHook =
let
canExec = prev.stdenv.hostPlatform.canExecute prev.stdenv.targetPlatform;
emulatorPath = "${final.freebsdEmulator}/bin/freebsd-exec";
in
if canExec then
prev.mesonEmulatorHook
else
prev.makeSetupHook
{
name = "mesonEmulatorHook";
substitutions = {
crossFile = prev.writeText "cross-file.conf" ''
[binaries]
exe_wrapper = '${prev.lib.escape [ "'" "\\" ] emulatorPath}'
'';
};
}
"${nixpkgs.outPath}/pkgs/build-support/setup-hooks/meson/emulator-hook.sh";
})
];
}
hostConfig
];
}
-4
View File
@@ -9,8 +9,6 @@
nix-sweep, nix-sweep,
peerix, peerix,
acer-wmi-ext, acer-wmi-ext,
ntfsplus,
nix-skills,
... ...
}: }:
hardwareConfig: hostConfig: hardwareConfig: hostConfig:
@@ -27,7 +25,6 @@ nixpkgs.lib.nixosSystem {
nixpkgs.overlays = [ nixpkgs.overlays = [
claude-code.overlays.default claude-code.overlays.default
acer-wmi-ext.overlays.default acer-wmi-ext.overlays.default
nix-skills.overlays.default
]; ];
nix.settings = { nix.settings = {
substituters = [ "https://claude-code.cachix.org" ]; substituters = [ "https://claude-code.cachix.org" ];
@@ -39,7 +36,6 @@ nixpkgs.lib.nixosSystem {
home-manager.nixosModules.home-manager home-manager.nixosModules.home-manager
nix-sweep.nixosModules.default nix-sweep.nixosModules.default
peerix.nixosModules.peerix peerix.nixosModules.peerix
ntfsplus.nixosModules.default
../modules ../modules
hostConfig hostConfig
]; ];
+1 -1
View File
@@ -8,7 +8,7 @@
services.xserver.enable = true; services.xserver.enable = true;
# Enable the KDE Plasma Desktop Environment. # Enable the KDE Plasma Desktop Environment.
services.displayManager.plasma-login-manager.enable = true; services.displayManager.sddm.enable = true;
services.desktopManager.plasma6.enable = true; services.desktopManager.plasma6.enable = true;
# Configure keymap in X11 # Configure keymap in X11
+34
View File
@@ -6,14 +6,48 @@ let
else if config.boot.loader.systemd-boot.enable then else if config.boot.loader.systemd-boot.enable then
config.boot.loader.systemd-boot.configurationLimit config.boot.loader.systemd-boot.configurationLimit
else null; else null;
# NixBSD builder VM SSH key (needs to be readable by root/nix-daemon)
builderKeyDir = "/etc/nix/builder-keys";
in in
{ {
nix = { nix = {
daemonIOSchedClass = "idle"; daemonIOSchedClass = "idle";
daemonCPUSchedPolicy = "idle"; daemonCPUSchedPolicy = "idle";
settings.trusted-users = [ "root" "user" ]; settings.trusted-users = [ "root" "user" ];
# FreeBSD remote builder VM (NixBSD)
distributedBuilds = true;
buildMachines = [
{
hostName = "192.168.122.100";
system = "x86_64-freebsd";
sshUser = "root";
sshKey = "${builderKeyDir}/nixbsd-builder";
maxJobs = 8;
speedFactor = 1;
supportedFeatures = [ "big-parallel" ];
}
];
settings.builders-use-substitutes = true;
}; };
# Install the builder SSH key where root/nix-daemon can read it
system.activationScripts.nixbsd-builder-key = ''
mkdir -p ${builderKeyDir}
cp /home/user/Projects/nixbsd-flake/keys/builder ${builderKeyDir}/nixbsd-builder
chmod 600 ${builderKeyDir}/nixbsd-builder
chown root:root ${builderKeyDir}/nixbsd-builder
'';
# Skip host key checking for the local builder VM (keys change on rebuild)
programs.ssh.extraConfig = ''
Host 192.168.122.100
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
LogLevel ERROR
'';
# Clean up nix store from old configurations usinx nix-sweep # Clean up nix store from old configurations usinx nix-sweep
services.nix-sweep = { services.nix-sweep = {
enable = true; enable = true;
+4 -3
View File
@@ -2,8 +2,9 @@
{ {
config = lib.mkIf config.boot.zfs.enabled { config = lib.mkIf config.boot.zfs.enabled {
# Set ARC max to 5% of physical RAM at boot
systemd.services."zfs-arc-limit" = { systemd.services."zfs-arc-limit" = {
description = "Set ZFS ARC max to 20% of physical RAM"; description = "Set ZFS ARC max to 5% of physical RAM";
# Ensure the module is loaded before we write to /sys # Ensure the module is loaded before we write to /sys
after = [ "systemd-modules-load.service" ]; after = [ "systemd-modules-load.service" ];
# Run early, but its fine if ZFS has already imported; the limit still applies # Run early, but its fine if ZFS has already imported; the limit still applies
@@ -14,8 +15,8 @@
# Total RAM in kB # Total RAM in kB
mem_kb=$(awk '/MemTotal:/ {print $2}' /proc/meminfo) mem_kb=$(awk '/MemTotal:/ {print $2}' /proc/meminfo)
echo "DEBUG: Total RAM: $mem_kb kB" echo "DEBUG: Total RAM: $mem_kb kB"
# 20%, in bytes # 5%, in bytes
arc_max_bytes=$(( mem_kb * 1024 / 100 * 20 )) arc_max_bytes=$(( mem_kb * 1024 / 100 * 5 ))
echo "DEBUG: Setting ZFS ARC max to: $arc_max_bytes bytes" echo "DEBUG: Setting ZFS ARC max to: $arc_max_bytes bytes"
param="/sys/module/zfs/parameters/zfs_arc_max" param="/sys/module/zfs/parameters/zfs_arc_max"
if [ -w "$param" ]; then if [ -w "$param" ]; then