dot
vizie's NixOS desktop: Hyprland, CachyOS kernel and gaming tweaks
| 1 | # Moving from CachyOS to NixOS |
| 2 | |
| 3 | [nixos-anywhere](https://github.com/nix-community/nixos-anywhere) installs |
| 4 | NixOS from the MacBook over SSH. It switches the running CachyOS into a NixOS |
| 5 | installer in RAM (kexec), wipes the NVMe drive and lays it out as |
| 6 | `hosts/desktop/disko.nix` says, builds the system on the desktop itself and |
| 7 | reboots into it. No USB stick, and nothing Linux gets built on the Mac. |
| 8 | |
| 9 | CachyOS and everything on the NVMe drive are gone afterwards. Your home folder |
| 10 | is backed up to the Kingston SATA SSD (`sda`) first, and only what |
| 11 | `restore-filter` lists comes back: it's a fresh start. The other SATA SSD |
| 12 | (`sdb`) is never touched. |
| 13 | |
| 14 | ## 1. On the desktop (CachyOS) |
| 15 | |
| 16 | - [ ] Optional, but the last chance: record WoW's performance to compare |
| 17 | later. In Faugus, edit Battle.net, turn on MangoHud and add this line to |
| 18 | the launch arguments: |
| 19 | `MANGOHUD_CONFIG=read_cfg,output_folder=/home/vizie/benchmarks,log_duration=60,log_interval=0`. |
| 20 | In game, stand somewhere you can return to (a busy city), keep the camera |
| 21 | still and press Left Shift+F2. Do it three times. Do the same on NixOS |
| 22 | later and compare with `~/git/dot/tools/bench-compare`. |
| 23 | - [ ] Quit Signal, Discord, Firefox, Claude and the games, then update the |
| 24 | backup (only what changed since the last run is copied): |
| 25 | |
| 26 | ```bash |
| 27 | sudo ~/git/dot/tools/backup-to-sata |
| 28 | ``` |
| 29 | |
| 30 | ## 2. On the Mac |
| 31 | |
| 32 | Needs Nix (with flakes) and the GitHub CLI signed in to your account: `dot` |
| 33 | and `philly` are private, and `gh auth setup-git` lets Nix fetch them. The |
| 34 | Mac's public key must also be in `macKeys` in `hosts/desktop/default.nix` |
| 35 | (committed and pushed), so it can log in to the new system. |
| 36 | |
| 37 | ```bash |
| 38 | gh auth setup-git |
| 39 | gh repo clone Eiziv/dot ~/dot |
| 40 | cd ~/dot && nix develop |
| 41 | ``` |
| 42 | |
| 43 | `nix develop` opens a shell with nixos-anywhere in it. Then install. It logs |
| 44 | in as you (with your password, or the Mac's key if CachyOS has it), asks for |
| 45 | your sudo password once, and from then on **wipes the desktop's NVMe drive** |
| 46 | without asking again: |
| 47 | |
| 48 | ```bash |
| 49 | nixos-anywhere --flake .#desktop --build-on remote --copy-host-keys --no-use-machine-substituters vizie@10.0.0.40 |
| 50 | ``` |
| 51 | |
| 52 | It takes a while: the CachyOS kernel's binary cache has been down, so the |
| 53 | kernel compiles on the desktop. `--no-use-machine-substituters` skips that |
| 54 | cache; if it's back up (`curl -sI https://attic.xuyh0120.win/lantian/nix-cache-info` |
| 55 | gives 200), leave the flag out and the kernel downloads instead. The desktop |
| 56 | reboots into NixOS at the end. |
| 57 | |
| 58 | If the kernel compile fails with a "Bus error", the installer ran out of RAM |
| 59 | (it builds there). The backup drive has the system that was built on CachyOS, |
| 60 | kernel included. Load it into the new system's store and run only the install: |
| 61 | |
| 62 | ```bash |
| 63 | ssh root@10.0.0.40 'mkdir -p /backup && mount -o ro /dev/disk/by-label/backup /backup && |
| 64 | nix --extra-experimental-features nix-command copy --no-check-sigs \ |
| 65 | --from file:///backup/nix-cache --to /mnt "$(cat /backup/nix-cache/system)"' |
| 66 | nixos-anywhere --flake .#desktop --build-on remote --copy-host-keys --no-use-machine-substituters --phases install,reboot root@10.0.0.40 |
| 67 | ``` |
| 68 | |
| 69 | ## 3. After the reboot |
| 70 | |
| 71 | The desktop may come back on a different IP address (it did: 10.0.0.127). If |
| 72 | `ssh` times out, find it in the router's client list, or scan for the |
| 73 | desktop's host key: `ssh-keyscan -t ed25519 10.0.0.<n>` and compare with |
| 74 | `ssh-keygen -F 10.0.0.40`. A DHCP reservation in the router keeps it fixed. |
| 75 | |
| 76 | From the Mac (its key is in the config, for root and for you). The backup |
| 77 | drive is mounted read-only at `/mnt/backup`: |
| 78 | |
| 79 | ```bash |
| 80 | ssh root@10.0.0.127 |
| 81 | passwd vizie |
| 82 | /mnt/backup/vizie/git/dot/tools/restore-from-sata |
| 83 | ``` |
| 84 | |
| 85 | Then log in on the desktop. |
| 86 | |
| 87 | ## 4. On the new system |
| 88 | |
| 89 | - There is no login screen any more: tty1 logs you in and Hyprland starts behind |
| 90 | hyprlock, so unlocking it is logging in. The desktop starts after you unlock. |
| 91 | - Only what `restore-filter` lists came back: app data and logins, SSH keys, |
| 92 | shell history, `~/git/dot`, Steam's settings and saves. Everything else |
| 93 | (Downloads, the other repos, CachyOS leftovers) is on the backup drive, at |
| 94 | `/mnt/backup/vizie/`, to copy something back. |
| 95 | - "Command not found" suggestions need nix-index's database once: |
| 96 | `nix-index` (takes a few minutes). |
| 97 | - Check the background programs: `systemctl --user list-units --type=service`. |
| 98 | |
| 99 | ## 5. What changed |
| 100 | |
| 101 | What is different from CachyOS, all on purpose: |
| 102 | |
| 103 | - **Packages** are generic x86-64 builds, apart from the kernel (Zen 4) and |
| 104 | proton-cachyos (x86-64-v3). CachyOS rebuilds everything for v3/v4. |
| 105 | - **Snapper** root snapshots are replaced by NixOS generations: each rebuild is |
| 106 | a boot menu entry. `/home` was never snapshotted on CachyOS either. |
| 107 | - **GTK theme**: set in `modules/home/theming.nix`. nwg-look can't save over |
| 108 | those files any more. |
| 109 | - **Signal theme** is built into the package: edit, `rebuild`, `config/signal/restart`. |
| 110 | - **Bitwarden** autostart: the same XDG autostart entry, with NixOS's program name. |
| 111 | - **fish**: only CachyOS's default fish config was there, and your shell is zsh, |
| 112 | so fish isn't set up. |
| 113 | - **vkBasalt's ReShade shaders** in `~/.config/vkBasalt/reshade-shaders` stay in |
| 114 | your home folder; they aren't in this repo (vkBasalt.conf doesn't use them). |
| 115 | - **vkSumi**: its config is kept, but the layer itself wasn't installed on |
| 116 | CachyOS (there is no nixpkgs package for it either). |
| 117 | |
| 118 | Unchanged on purpose, but worth knowing: |
| 119 | |
| 120 | - **kitty's font**: kitty.conf asks for JetBrains Mono, which was never |
| 121 | installed, so kitty has been showing Noto Sans Mono. That's kept. Add |
| 122 | `nerd-fonts.jetbrains-mono` to `fonts.packages` in `modules/nixos/desktop.nix` |
| 123 | to get the font the config names. |
| 124 | - **`~/.ssh/authorized_keys`** has a key labelled `chris@echoz.io`, which lets |
| 125 | that key log in as you over SSH (port 22 is open, as before). It stays in your |
| 126 | home folder. |
| 127 | - **mDNS** (port 5353) stays closed in the firewall, as ufw had it. |
| 128 | - **sched-ext** schedulers stay off, as before. See the comment in |
| 129 | `modules/nixos/cachyos.nix` to try one. |
| 130 | |
| 131 | ## 6. Games |
| 132 | |
| 133 | - **Steam**: your settings, Proton versions and game saves (`compatdata`) are |
| 134 | back. The games in `~/Games/SteamLibrary` and Steam's own library show as |
| 135 | not installed; install them again. Steam may need the library folder |
| 136 | re-added (Settings → Storage). |
| 137 | - **WoW**: in Faugus, remove the old Battle.net entry and add Battle.net again |
| 138 | (Faugus installs it into a new prefix at `~/Games/battlenet`). Pick the same |
| 139 | runner, `Proton-CachyOS Latest` (it's back in |
| 140 | `~/.local/share/Steam/compatibilitytools.d`), and the same launch arguments: |
| 141 | `WINE_SIMULATE_WRITECOPY=1` and `PROTON_ENABLE_WAYLAND=0`. Install WoW, then |
| 142 | copy your settings and addons back before you start it: |
| 143 | |
| 144 | ```bash |
| 145 | cp -a /mnt/backup/wow/{WTF,Interface} ~/Games/battlenet/drive_c/'Program Files (x86)'/'World of Warcraft'/_retail_/ |
| 146 | ``` |
| 147 | |
| 148 | - **OSRS**: install the official Old School RuneScape launcher. Bolt is gone, |
| 149 | and so is its data. |
| 150 | |
| 151 | ## 7. Once you're happy |
| 152 | |
| 153 | The backup on the Kingston drive stays until you need the drive for something |
| 154 | else. It is the only copy of what wasn't restored, including the repos that |
| 155 | exist only here (`skate3`, `skate-game`, `he60`, `move`, and `Left4Resi`'s |
| 156 | uncommitted changes), so copy out anything you want before reusing the drive. |
| 157 | NixOS mounts it read-only at `/mnt/backup`; before reusing it, remove the |
| 158 | `fileSystems."/mnt/backup"` entry in `hosts/desktop/hardware-configuration.nix`. |