fix(nb): resolve keyboard/touchpad and btrfs read-only issues after suspend
This commit addresses two critical suspend/resume issues on the nb host: 1. Keyboard and touchpad not working after suspend - Added i2c_hid_acpi kernel module - Created systemd service to reload the module after resume - Excluded input devices from TLP USB autosuspend 2. /nix/persist becoming read-only after suspend - Moved swap from /nix/persist to dedicated @swap subvolume - Added systemd service to remount /nix/persist if needed - Separated swap from persistent data to prevent btrfs corruption Changes: - Created hosts/nb/modules/suspend-fixes.nix with resume hooks - Updated swap path from /nix/persist/swapfile to /swap/swapfile - Added /swap filesystem mount for @swap btrfs subvolume - Added USB_EXCLUDE_INPUT=1 to TLP configuration Note: Manual step required before deployment - create @swap subvolume. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -30,6 +30,7 @@ in {
|
|||||||
./modules/ollama.nix
|
./modules/ollama.nix
|
||||||
./modules/qdrant.nix
|
./modules/qdrant.nix
|
||||||
./modules/battery-brightness.nix
|
./modules/battery-brightness.nix
|
||||||
|
./modules/suspend-fixes.nix
|
||||||
|
|
||||||
./cachix.nix
|
./cachix.nix
|
||||||
./users
|
./users
|
||||||
@@ -79,7 +80,7 @@ in {
|
|||||||
services.irqbalance.enable = false;
|
services.irqbalance.enable = false;
|
||||||
|
|
||||||
swapDevices = [ {
|
swapDevices = [ {
|
||||||
device = "/nix/persist/swapfile";
|
device = "/swap/swapfile";
|
||||||
size = 96 * 1024; # Size is in megabytes (96GB for full hibernation with 92GB RAM)
|
size = 96 * 1024; # Size is in megabytes (96GB for full hibernation with 92GB RAM)
|
||||||
} ];
|
} ];
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,16 @@
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fileSystems."/swap" = {
|
||||||
|
device = "/dev/mapper/root";
|
||||||
|
fsType = "btrfs";
|
||||||
|
neededForBoot = true;
|
||||||
|
options = [
|
||||||
|
"subvol=@swap"
|
||||||
|
"noatime"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
swapDevices = [ ];
|
swapDevices = [ ];
|
||||||
|
|
||||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||||
|
|||||||
@@ -159,6 +159,7 @@ in {
|
|||||||
USB_EXCLUDE_PHONE = 0;
|
USB_EXCLUDE_PHONE = 0;
|
||||||
USB_EXCLUDE_PRINTER = 1;
|
USB_EXCLUDE_PRINTER = 1;
|
||||||
USB_EXCLUDE_WWAN = 0;
|
USB_EXCLUDE_WWAN = 0;
|
||||||
|
USB_EXCLUDE_INPUT = 1; # Exclude keyboard/touchpad to prevent suspend issues
|
||||||
|
|
||||||
# Audio power saving
|
# Audio power saving
|
||||||
SOUND_POWER_SAVE_ON_AC = 0;
|
SOUND_POWER_SAVE_ON_AC = 0;
|
||||||
|
|||||||
32
hosts/nb/modules/suspend-fixes.nix
Normal file
32
hosts/nb/modules/suspend-fixes.nix
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# Add i2c_hid_acpi kernel module for proper input device support
|
||||||
|
boot.kernelModules = [ "i2c_hid_acpi" ];
|
||||||
|
|
||||||
|
# Systemd service to reload i2c_hid_acpi module after resume
|
||||||
|
# This fixes keyboard and touchpad not working after suspend
|
||||||
|
systemd.services.reload-i2c-hid-after-resume = {
|
||||||
|
description = "Reload i2c_hid_acpi module after resume to fix keyboard/touchpad";
|
||||||
|
after = [ "suspend.target" "hibernate.target" "hybrid-sleep.target" ];
|
||||||
|
wantedBy = [ "suspend.target" "hibernate.target" "hybrid-sleep.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = "${pkgs.bash}/bin/bash -c '${pkgs.kmod}/bin/rmmod i2c_hid_acpi; ${pkgs.kmod}/bin/modprobe i2c_hid_acpi'";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Systemd service to remount /nix/persist if it becomes read-only after resume
|
||||||
|
# This fixes the btrfs read-only issue that can occur with LUKS + btrfs on suspend/resume
|
||||||
|
systemd.services.remount-persist-after-resume = {
|
||||||
|
description = "Remount /nix/persist read-write if needed after resume";
|
||||||
|
after = [ "suspend.target" "hibernate.target" "hybrid-sleep.target" ];
|
||||||
|
wantedBy = [ "suspend.target" "hibernate.target" "hybrid-sleep.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = "${pkgs.util-linux}/bin/mount -o remount,rw /nix/persist";
|
||||||
|
# Don't fail if already mounted rw
|
||||||
|
SuccessExitStatus = [ 0 32 ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user