Compare commits

..

1 Commits

Author SHA1 Message Date
24a09a9922 [desktop] Add steam sleep inhibitor
Adds sleep inhibitor based on whether or not Steam is actively streaming
a remote session
2025-07-19 15:11:33 -07:00
6 changed files with 119 additions and 245 deletions

View File

@@ -39,15 +39,6 @@
boot.kernelPackages = pkgs.linuxPackages_latest; boot.kernelPackages = pkgs.linuxPackages_latest;
# Btrfs deduplication service
services.beesd.filesystems = {
root = {
spec = "/";
hashTableSizeMB = 32; # 128MB per TB recommended, ~225GB = ~32MB
verbosity = "err"; # Only show actual problems
};
};
# Enable networking # Enable networking
networking.networkmanager.enable = true; networking.networkmanager.enable = true;

View File

@@ -14,12 +14,8 @@
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];
fileSystems."/" = fileSystems."/" =
{ device = "/dev/disk/by-uuid/223a44e5-91e2-4272-830e-129166042a1d"; { device = "/dev/disk/by-uuid/bd396529-e2c4-47cb-b844-8d6ed841f81a";
fsType = "btrfs"; fsType = "ext4";
options = [
"compress=zstd" # Enable zstd compression for space savings
"noatime" # Don't update access times for performance
];
}; };
boot.initrd.luks.devices."luks-4126fbd4-bd09-4ece-af0d-6fff414c21b3".device = "/dev/disk/by-uuid/4126fbd4-bd09-4ece-af0d-6fff414c21b3"; boot.initrd.luks.devices."luks-4126fbd4-bd09-4ece-af0d-6fff414c21b3".device = "/dev/disk/by-uuid/4126fbd4-bd09-4ece-af0d-6fff414c21b3";

View File

@@ -1,223 +0,0 @@
# NixBook ext4 to btrfs Migration Guide
## Overview
This guide converts your nixbook machine from ext4 to btrfs with zstd compression and beesd deduplication while preserving your LUKS encryption and all data.
## Current System Info
- **Hostname**: nix-book
- **Root filesystem**: ext4 on `/dev/disk/by-uuid/bd396529-e2c4-47cb-b844-8d6ed841f81a`
- **Encryption**: LUKS with two devices configured
- **Current usage**: 138GB used / 225GB total (65% full)
- **Free space**: 76GB available (sufficient for conversion)
## Pre-Migration Checklist
### 1. Create Full System Backup (CRITICAL)
```bash
# Boot from NixOS live USB
# Mount encrypted filesystem
cryptsetup luksOpen /dev/disk/by-uuid/4126fbd4-bd09-4ece-af0d-6fff414c21b3 luks-nixbook
mount /dev/mapper/luks-nixbook /mnt
# Create backup to external drive (adjust target as needed)
rsync -avxHAX --progress /mnt/ /path/to/backup/nixbook-backup/
```
### 2. Verify Configuration Changes
The following files have been updated for btrfs:
- `machines/nix-book/configuration.nix` - Added beesd service
- `machines/nix-book/hardware-configuration.nix` - Changed fsType to btrfs with compression
## Migration Process
### Phase 1: Boot to Live Environment
1. **Create NixOS live USB**:
```bash
# Download latest NixOS ISO
# Flash to USB drive
dd if=nixos-minimal-xx.xx-x86_64-linux.iso of=/dev/sdX bs=4M status=progress
```
2. **Boot from live USB** and ensure you can access the encrypted drives
### Phase 2: Filesystem Conversion
3. **Unlock LUKS volumes**:
```bash
cryptsetup luksOpen /dev/disk/by-uuid/4126fbd4-bd09-4ece-af0d-6fff414c21b3 luks-nixbook
cryptsetup luksOpen /dev/disk/by-uuid/b614167b-9045-4234-a441-ac6f60a96d81 luks-nixbook2
```
4. **Check filesystem before conversion**:
```bash
fsck.ext4 -f /dev/mapper/luks-nixbook
```
5. **Convert ext4 to btrfs** (this preserves all data):
```bash
# Install btrfs-progs if not available
nix-shell -p btrfs-progs
# Convert the filesystem (takes 15-45 minutes depending on data)
btrfs-convert /dev/mapper/luks-nixbook
# Verify conversion succeeded
mount /dev/mapper/luks-nixbook /mnt
ls -la /mnt # Should show your normal filesystem
btrfs filesystem show /mnt
```
6. **Get new filesystem UUID** (may have changed):
```bash
blkid /dev/mapper/luks-nixbook
# Note the new UUID if it changed
```
### Phase 3: Configuration Update
7. **Mount and chroot into system**:
```bash
mount -o compress=zstd,noatime /dev/mapper/luks-nixbook /mnt
mount /dev/disk/by-uuid/7A0B-CF88 /mnt/boot
nixos-enter --root /mnt
```
8. **Update hardware-configuration.nix** if UUID changed:
```bash
# Edit /etc/nixos/hardware-configuration.nix if needed
# Update the UUID in fileSystems."/" section
```
9. **Rebuild system with btrfs configuration**:
```bash
cd /home/johno/nixos-configs
nixos-rebuild switch --flake .#nix-book
```
### Phase 4: Enable Compression and Deduplication
10. **Reboot into new btrfs system**:
```bash
exit # Exit chroot
umount -R /mnt
reboot
```
11. **Verify btrfs is working**:
```bash
mount | grep btrfs
btrfs filesystem usage /
```
12. **Enable and start beesd**:
```bash
systemctl status beesd-root
systemctl start beesd-root
systemctl enable beesd-root
```
13. **Force compression on existing files** (optional but recommended):
```bash
# This will compress existing files with zstd
btrfs filesystem defragment -r -czstd /
```
## Post-Migration Verification
### Check System Health
```bash
# Verify btrfs health
btrfs scrub start /
btrfs scrub status /
# Check compression effectiveness
compsize /
# Monitor beesd deduplication
journalctl -u beesd-root -f
# Check filesystem usage
btrfs filesystem usage /
df -h /
```
### Performance Monitoring
```bash
# Monitor beesd hash table
ls -lh /.beeshash
# Check compression ratio over time
compsize /home /nix /var
```
## Expected Benefits
### Space Savings
- **Compression**: 20-30% reduction in disk usage from zstd
- **Deduplication**: Additional 10-20% savings on duplicate files
- **Combined**: Potentially 30-40% total space savings
### Performance Impact
- **Compression**: Minimal CPU overhead, often improves I/O performance
- **Deduplication**: Background process, minimal impact during normal use
- **Overall**: Should be neutral to positive performance impact
## Rollback Plan (Emergency)
If something goes wrong:
1. **Boot from live USB**
2. **Restore from backup**:
```bash
cryptsetup luksOpen /dev/disk/by-uuid/4126fbd4-bd09-4ece-af0d-6fff414c21b3 luks-nixbook
mkfs.ext4 /dev/mapper/luks-nixbook
mount /dev/mapper/luks-nixbook /mnt
rsync -avxHAX --progress /path/to/backup/nixbook-backup/ /mnt/
```
3. **Restore original hardware-configuration.nix** with ext4 settings
4. **Rebuild and reboot**
## Troubleshooting
### Common Issues
**"Device busy" during conversion**:
- Ensure no processes are accessing the filesystem
- Check with `lsof` and `fuser`
**UUID changed after conversion**:
- Update hardware-configuration.nix with new UUID
- Regenerate initrd: `nixos-rebuild switch`
**Beesd service fails to start**:
- Check disk space for hash table
- Verify filesystem is btrfs: `mount | grep btrfs`
- Check logs: `journalctl -u beesd-root`
**Boot issues after conversion**:
- Boot from live USB
- Check /boot partition is mounted correctly
- Verify LUKS UUIDs match in configuration
- Rebuild bootloader: `nixos-rebuild switch --install-bootloader`
## Maintenance
### Regular Tasks
```bash
# Monthly scrub (checks for corruption)
btrfs scrub start /
# Monitor compression effectiveness
compsize /
# Check beesd deduplication status
systemctl status beesd-root
```
### Space Management
```bash
# Balance filesystem (defragments and optimizes)
btrfs balance start -dusage=50 /
# Check for space issues
btrfs filesystem usage /
```
This migration preserves all your data while gaining the benefits of modern btrfs features including transparent compression and automatic deduplication.

View File

@@ -20,5 +20,6 @@ with lib;
./kde.nix ./kde.nix
./programs.nix ./programs.nix
./sddm.nix ./sddm.nix
./steam-sleep-inhibitor.nix
]; ];
} }

View File

@@ -0,0 +1,116 @@
{ lib, config, pkgs, ... }:
with lib;
let
cfg = config.roles.desktop;
steamSleepInhibitor = pkgs.writeShellScript "steam-sleep-inhibitor" ''
#!/usr/bin/env bash
# Steam log path - adjust if different
STEAM_LOG="$HOME/.local/share/Steam/logs/streaming_log.txt"
FALLBACK_LOG="$HOME/.steam/steam/logs/streaming_log.txt"
# Find Steam log file
if [[ -f "$STEAM_LOG" ]]; then
LOG_FILE="$STEAM_LOG"
elif [[ -f "$FALLBACK_LOG" ]]; then
LOG_FILE="$FALLBACK_LOG"
else
# Monitor Steam process for streaming activity
LOG_FILE=""
fi
INHIBITOR_PID=""
MONITORING=false
cleanup() {
if [[ -n "$INHIBITOR_PID" ]]; then
echo "Stopping sleep inhibitor (PID: $INHIBITOR_PID)"
kill "$INHIBITOR_PID" 2>/dev/null
fi
exit 0
}
start_inhibitor() {
if [[ -z "$INHIBITOR_PID" ]]; then
echo "Starting sleep inhibitor for Steam Remote Play session"
${pkgs.systemd}/bin/systemd-inhibit \
--what=sleep \
--who="Steam Remote Play" \
--why="Active streaming session detected" \
--mode=block \
sleep infinity &
INHIBITOR_PID=$!
fi
}
stop_inhibitor() {
if [[ -n "$INHIBITOR_PID" ]]; then
echo "Stopping sleep inhibitor - streaming session ended"
kill "$INHIBITOR_PID" 2>/dev/null
INHIBITOR_PID=""
fi
}
# Check if Steam Remote Play is active by looking for streaming processes
check_streaming_active() {
# Check for Steam streaming processes
if pgrep -f "streaming_client" >/dev/null || \
pgrep -f "steamremoteplay" >/dev/null || \
${pkgs.procps}/bin/pgrep -f "Remote Play" >/dev/null; then
return 0
fi
# Check for active network connections on Steam streaming ports
if ${pkgs.nettools}/bin/netstat -an 2>/dev/null | grep -E ":(27036|27037)" | grep ESTABLISHED >/dev/null; then
return 0
fi
return 1
}
trap cleanup EXIT INT TERM
echo "Steam sleep inhibitor monitoring started"
while true; do
if check_streaming_active; then
if [[ "$MONITORING" == "false" ]]; then
MONITORING=true
start_inhibitor
fi
else
if [[ "$MONITORING" == "true" ]]; then
MONITORING=false
stop_inhibitor
fi
fi
sleep 10
done
'';
in
{
config = mkIf (cfg.enable && cfg.kde && cfg.gaming) {
# Steam streaming sleep inhibitor service
systemd.user.services.steam-sleep-inhibitor = {
description = "Steam Remote Play Sleep Inhibitor";
wantedBy = [ "default.target" ];
after = [ "graphical-session.target" ];
serviceConfig = {
Type = "simple";
ExecStart = "${steamSleepInhibitor}";
Restart = "always";
RestartSec = "5";
};
};
# Steam-specific environment variables to prevent sleep interference
environment.sessionVariables = {
SDL_VIDEO_ALLOW_SCREENSAVER = "1";
};
};
}

View File

@@ -19,12 +19,5 @@ in
nssmdns4 = true; nssmdns4 = true;
openFirewall = true; openFirewall = true;
}; };
hardware.printers.ensurePrinters = [{
name = "MFC-L8900CDW_series";
deviceUri = "dnssd://Brother%20MFC-L8900CDW%20series._ipp._tcp.local/?uuid=e3248000-80ce-11db-8000-b422006699d8";
model = "everywhere";
}];
hardware.printers.ensureDefaultPrinter = "MFC-L8900CDW_series";
}; };
} }