diff --git a/hosts/skydick/datapool.nix b/hosts/skydick/datapool.nix index 2701d83..a8c4537 100644 --- a/hosts/skydick/datapool.nix +++ b/hosts/skydick/datapool.nix @@ -68,7 +68,7 @@ # dick/users/ldx/files /srv/users/ldx/files 128K zstd personal files # dick/users/ldx/bt-state /srv/users/ldx/bt-state 16K zstd .torrent, resume, *arr DBs # dick/users/ldx/vm /srv/users/ldx/vm 64K zstd VM filesystem root / parent for zvol children -# dick/users/ldx/timemachine /srv/users/ldx/timemachine 64K zstd macOS Time Machine sparsebundle backups +# dick/users/ldx/timemachine /srv/users/ldx/timemachine 1M zstd macOS Time Machine sparsebundle backups # # SYSTEM # dick/system (canmount=off) namespace root @@ -100,7 +100,7 @@ # zfs create -o recordsize=128K -o mountpoint=/srv/users/ldx/files dick/users/ldx/files # zfs create -o recordsize=16K -o mountpoint=/srv/users/ldx/bt-state dick/users/ldx/bt-state # zfs create -o recordsize=64K -o mountpoint=/srv/users/ldx/vm dick/users/ldx/vm -# zfs create -o recordsize=64K -o compression=zstd -o mountpoint=/srv/users/ldx/timemachine dick/users/ldx/timemachine +# zfs create -o recordsize=1M -o compression=zstd -o mountpoint=/srv/users/ldx/timemachine dick/users/ldx/timemachine # mkdir -p /srv/users/ldx/vm/files # chown ldx:users /srv/users/ldx && chmod 0700 /srv/users/ldx # for d in files bt-state vm vm/files timemachine; do chown ldx:users /srv/users/ldx/$d && chmod 0750 /srv/users/ldx/$d; done @@ -246,6 +246,10 @@ "d /srv/users/ldx/vm 0750 ldx users -" "d /srv/users/ldx/vm/files 0750 ldx users -" "d /srv/users/ldx/timemachine 0750 ldx users -" + "d /srv/users/ldx/.cache 0750 ldx users -" + "d /srv/users/ldx/.local 0750 ldx users -" + "d /srv/users/ldx/.local/share 0750 ldx users -" + "f /var/lib/systemd/linger/ldx" "d /srv/users/ye-lw21 0700 ye-lw21 users -" "d /srv/users/ye-lw21/files 0750 ye-lw21 users -" "d /srv/users/ye-lw21/bt-state 0750 ye-lw21 users -" @@ -442,17 +446,55 @@ }; }; - # Tracker/localsearch for Samba Spotlight search + # Localsearch filesystem miner for Samba Spotlight search. + # Runs as ldx on ldx's session bus so smbd workers (setuid to the + # connecting user) can reach the miner via /run/user/1000/bus. + # Lingering for ldx is enabled in tmpfiles above. environment.systemPackages = with pkgs; [ tinysparql localsearch ]; - systemd.services.localsearch-index = { - description = "Localsearch file indexer for Samba Spotlight"; + systemd.services.localsearch-miner = { + description = "Localsearch filesystem miner for Samba Spotlight"; + requires = [ "user@1000.service" ]; + after = [ "user@1000.service" "samba-smbd.service" "local-fs.target" ]; wants = [ "samba-smbd.service" ]; - after = [ "samba-smbd.service" "local-fs.target" ]; wantedBy = [ "multi-user.target" ]; + environment = { + DBUS_SESSION_BUS_ADDRESS = "unix:path=/run/user/1000/bus"; + XDG_DATA_DIRS = builtins.concatStringsSep ":" [ + "${pkgs.localsearch}/share/gsettings-schemas/${pkgs.localsearch.name}" + "${pkgs.tinysparql}/share/gsettings-schemas/${pkgs.tinysparql.name}" + "/run/current-system/sw/share" + ]; + XDG_CACHE_HOME = "/srv/users/ldx/.cache"; + XDG_DATA_HOME = "/srv/users/ldx/.local/share"; + }; + serviceConfig = { + User = "ldx"; + Group = "users"; + ExecStart = "${pkgs.localsearch}/libexec/localsearch-3"; + Restart = "on-failure"; + RestartSec = 10; + }; + }; + + systemd.services.localsearch-paths = { + description = "Register Spotlight index paths with localsearch"; + requires = [ "localsearch-miner.service" ]; + after = [ "localsearch-miner.service" ]; + wantedBy = [ "multi-user.target" ]; + environment = { + DBUS_SESSION_BUS_ADDRESS = "unix:path=/run/user/1000/bus"; + XDG_DATA_DIRS = builtins.concatStringsSep ":" [ + "${pkgs.localsearch}/share/gsettings-schemas/${pkgs.localsearch.name}" + "${pkgs.tinysparql}/share/gsettings-schemas/${pkgs.tinysparql.name}" + "/run/current-system/sw/share" + ]; + }; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; + User = "ldx"; + Group = "users"; }; script = '' ${pkgs.localsearch}/bin/localsearch index --add /srv/public diff --git a/hosts/skydick/default.nix b/hosts/skydick/default.nix index cda9c9d..24579da 100644 --- a/hosts/skydick/default.nix +++ b/hosts/skydick/default.nix @@ -104,19 +104,50 @@ }; }; + # Wait only for bond0, not individual member ports — a disconnected port + # (cable maintenance) should not stall boot by 2 minutes. + systemd.network.wait-online.anyInterface = true; + # ========================================================================== # KERNEL PERFORMANCE TUNING # ========================================================================== powerManagement.cpuFreqGovernor = "performance"; services.udev.extraRules = '' - # SAS/SATA HDDs - use mq-deadline - ACTION=="add|change", KERNEL=="sd[c-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="mq-deadline" - # SSDs/NVMe - use none - ACTION=="add|change", KERNEL=="sd[a-b]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none" + # I/O schedulers by media type (no kernel-name assumptions) + ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="mq-deadline" + ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none" ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none" ''; + # Belt-and-suspenders: enforce I/O schedulers and NIC ring buffers at boot. + # The udev rules above handle hotplug; this service catches anything the + # rules miss due to driver-level scheduler resets on SAS devices. + systemd.services.storage-tuning = { + description = "Storage I/O scheduler and NIC ring buffer tuning"; + after = [ "systemd-udevd.service" "network.target" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + }; + path = [ pkgs.ethtool ]; + script = '' + # mq-deadline for rotational drives (SAS Mach2 HDDs) + for dev in /sys/block/sd*; do + [ -d "$dev/queue" ] || continue + if [ "$(cat "$dev/queue/rotational" 2>/dev/null)" = "1" ]; then + echo mq-deadline > "$dev/queue/scheduler" 2>/dev/null || true + fi + done + + # Increase Mellanox ring buffers for 10GbE burst absorption + for nic in enp4s0f0np0 enp4s0f1np1; do + ethtool -G "$nic" rx 4096 tx 4096 2>/dev/null || true + done + ''; + }; + boot.kernel.sysctl = { # Network buffers for high-throughput storage "net.core.rmem_max" = 134217728; @@ -282,7 +313,7 @@ # Performance & NUMA numactl perf-tools - linuxPackages_6_6.perf + perf ]; # ==========================================================================