Тут будут всякие заметки и доп информация по работе с NixOS и моим конфигом.

## Навигация

- [Описание](#описание)
- [Браузер](#браузер)
- [Фикс Flatpak и Wine](#фикс-flatpak-и-wine)
- [Сборщик мусора](#сборщик-мусора)
  - [Часть диалога с GPT](#часть-диалога-с-gpt)
  - [Кто больше всего жрёт памяти](#кто-больше-всего-жрёт-памяти)
- [Что делать в emergency mode](#что-делать-в-emergency-mode)
- [Нюансы с JetBrains Toolbox](#нюансы-с-jetbrains-toolbox)
- [Настройки для игр](#настройки-для-игр)
  - [MangoHud](#mangohud)
  - [gamemode](#gamemode)
  - [gamescope](#gamescope)
  - [Параметры запуска Steam](#параметры-запуска-steam)
- [Настройка мониторов](#настройка-мониторов)
- [Системная тема на всех вебсайтах](#системная-тема-на-всех-вебсайтах)
- [Запуск Waydroid на X11](#запуск-waydroid-на-x11)
- [Как я тестирую разный новый софт](#как-я-тестирую-разный-новый-софт)

## Описание

Железо, на котором работают мои дотсы:
- CPU: i5 10400f
- GPU: AMD RX6600
- RAM: 32gb (2x16) ddr4 3200
- Motherboard: MSI Z590-A PRO
- Один монитор 4к на 160 герц

Основной набор софта

Изначально я написал конфиги для `bspwm` + `polybar`. Но потом хочу затестить другию WM. В теории между ними можно переключаться при запуске пк, так что проблем быть не должно. Если какой-то WM надо выключить, чтоб не засирать систему, то это можно делать в `modules/home-manager/bundle.nix`

|   Software   |             Name                 |
| ------------ | -------------------------------- |
| WM           | bspwm                            |
| Hotkeys      | sxhkd                            |
| Terminal     | Alacritty, Kitty                 |
| Multiplexer  | Zellij                           |
| Shell        | oh-my-zsh with many plugins      |
| Shell Prompt | Starship                         |
| Apps/Menus   | Rofi                             |
| Bar          | Polybar                          |
| ScreenLock   | betterlockscreen                 |
| Notification | Dunst                            |
| Files        | Thunar, Ranger                   |
| Images       | qView                            |
| Video        | mpv with plugins                 |
| Music        | Strawberry, mpv                  |
| Browsers     | Librewolf, Firefox, Chromium, ungoogled-chromium|
| Social       | Discord, Telegram, Steam         |
| Audio        | PipeWire, pavucontrol            |
| Color Theme  | Gruvbox Dark Medium              |
| Icons        | Papirus Dark                     |
| DM           | SDDM                             |
| Compositor   | Нет. Мне не нужны анимации и прозрачность |
| Screenshare  | OBS, ksnip                       |
| Code Editor  | Neovim, VSCode                   |
| Video Editor | Blender                          |
| Fetch        | fastfetch                        |
| Torrent      | qBittorrent                      |
| Email client | Thunderbird                      |
| Color picker | xcolor, gcolor3                  |
| Docs/eBook   | Evince, LibreOffice, Calibre     |
| Design       | Krita                            |
| Productivity | Obsidian, Planify                |

Чтоб узнать sha256 для гитхаб репы, пишем в терминал эту команду:
```sh
nix-prefetch-git link
```

Если хочется поменять цвета или шрифты в конфиге какой-то программы, но при ребилде получается конфликт, то дело в Stylix, который управляет системной темой и сам везде ставит шрифты и цвета. Если хочется заменить, не трогая stylix, то надо добавить `lib.mkForce` перед значением. Например так:
```nix
font = lib.mkForce "JetBrainsMono Nerd Font 11";
```

Узнать localhost виртуалки, чтоб конектиться по ssh:
```sh
ip a
```

В бутменю биоса надо ставить не ссд диск, а `nixos boot`. У меня иначе не работало

У меня есть удобные алиасы для работы с NixOS:
- Ребилдить систему можно командой `rbs`, она ссылается на `~/nixos-private-dots` и применяет изменения на лету. Типо `rе build switch`, первые буквы. Ещё есть `rbb`, это `re build boot`, чтоб изменения после ребута пк применились.
- Обновить всю систему можно командой `upd`. Это изменит `flake.lock` файл, после чего надо `rbs` или `rbb`, чтоб применить. Если всё сломается, то придётся откатывать файл `flake.lock` на старый. Не знаю даётся ли такой выбор при ребуте системы, я через гит обычно откатываюсь.
- Обновить только `pkgs2` можно через `upd nixpkgs2`. Например Discord качаешь из `pkgs2.discord` и обновляешь `pkgs2` отдельно от системы, чтоб всё было стабильно и дискорд последней версии

Обновления системы часто требуют переписывать конфиг, потому что разрабы любят переименовывать параметр `залупа` в параметр `залупень`, считая это более удобным. В итоге обновил, применяешь конфиг, он не применяется и ты получаешь кучу ошибок "параметр `залупа` не существует" или "параметр `залупа` теперь `залупень`, поменяй конфиг"

Если ты обновил всю систему, но некоторые программы сломались, то можно не откатывать всю систему, а попробовать добавить к ним префикс `spkgs.`. Это скачает их из стабильной ветки репозитория

Визуальная тема у меня везде `gruvbox` и менять не планирую.

Чтоб задать аватарку юзера в SDDM (это меню ввода пароля при запуске пк), надо отправить png файл такой командой:
```sh
sudo cp image.png /var/lib/AccountsService/icons/username
```
То есть именно `username`, без `.png` в конце

Настройки смены языка, тачпада и мыши можно найти в файле `./modules/nixos/xserver.nix`. У меня там стоит необычный скрол мышкой. Я не использую колесо мыши. Я зажимаю дальнюю боковую кнопку мыши и двигаю мышку по столу. В какую сторону двигаешь мышку, в ту сторону и будет скрол. Так можно удобно регулировать скорость скрола и быстро оказываться где надо. Язык я меняю на капслок. Для активации капса надо жать шифт капслок. В этом же файле есть **настройка для amd видеокарт, которую надо выключить, если у тебя nvidia**. Не знаю надо ли что-то настраивать для nvidia после этого.

В стоке выключены следующие конфиги (их можно включить в `bundle.nix` в разных каталогах):
- `filesystem.nix` - Конектить внешние диски автоматически. В стоке выкл, потому что у каждого свои айдишники дисков.
- `hibernate.nix` -  Настройки гибернации. В стоке выкл, потому что у каждого свои айдишники файла подкачки.
- `vr.nix` - Пакеты для работы виара на linux. Нужно очень мало кому, потому выкл
- `symlinks.nix` - Настройки симлинков. Не всем надо, плюс у каждого свои симлинки. Потому выкл в стоке
- Файл подкачки - У меня он в `/etc/nixos/hardware-configuration.nix`, который у каждого свой

Баш скрипты требуют другой шебанг в начале. Обязательно используй `#!/usr/bin/env bash` вместо `#!/bin/bash`. Первый вариант будет работать на любой OS с bash, а вот второй вариант ломается.

Не юзай ИИ для поиска информации по NixOS, он всегда выдумывает параметры. Сколько бы я не тестил разные ИИ для настройки NixOS, они даже базовые вещи не могут дать, тут слишком часто всё меняется и в интернете слишком мало информации по данной OS, чтоб ИИ давал хоть что-то рабочее. P.S спустя пару лет после написания этого текста я нашёл один ИИ, который бредит чуть реже остальных. Это Grok. Но даже он всё ещё часто выдумывает параметры

Если изменил параметр, но не хочешь ничего качать, то есть флаг `--offline`, чтоб без инета ребилд работал

## Браузер

В стоке используется браузер `LibreWolf`, который имеет неприятные настройки безопасности. Мне проще выключить некоторые настройки безопасности в нём, чем выключить лишний шлак в `Firefox`. `Chromium` стоит как запаска для некоторых сайтов, как основа он мне не нравится. Написать какие настройки безопасности я выключил в `LibreWolf` мне лень. Но могу сказать какие настройки я использую в `Firefox` и `LibreWolf`, связанные просто с удобством. Они в таблице ниже.

| Настройка about:config                  | Значение | Описание                                                                        |
| --------------------------------------- | -------- | ------------------------------------------------------------------------------- |
| browser.bookmarks.openInTabClosesMenu   | false    | Не закрывать меню закладок при открытии ссылки                                  |
| browser.tabs.loadBookmarksInBackground  | true     | Не перекидывать на закладку, открытую в новой вкладке                           |
| layout.css.has-selector.enabled         | true     | Для кастом стилей                                                               |
| accessibility.typeaheadfind.enablesound | false    | Чтоб не булькало на ухо                                                         |
| full-screen-api.warning.timeout         | 0        | Чтоб фулскрин popup не вылазил                                                  |
| browser.tabs.insertAfterCurrent         | true     | Чтоб новые вкладки были справа от нынешней                                      |
| network.http.http3.enable               | false    | Чтоб ютуб не лагал как блядь (мб больше не помогает)                            |
| dom.webgpu.enabled                      | true     | Чтоб WebGPU работал                                                             |
| media.ffmpeg.vaapi.enabled              | true     | Если хочу аппаратное декодирование видео, например на ютубе, чтоб цп не грузить |
| network.dns.disableIPv6                 | true     | В стоке false. Если не работает локалхост, то верни true                        |
| extensions.update.autoUpdateDefault     | false    | Не надо мне обновлять расширения без разрешения                                 |
| browser.tabs.unloadOnLowMemory          | true     | Выгружать неактивные вкладки                                                    |
| browser.cache.memory.capacity           | 512000   | Кеш в оперативе на 512мб поставил вместо авто. В стоке -1, это авто             |
| browser.eme.ui.enabled                  | false    | Отключить отрисовку всего, что связано с DRM, будто его и не существует         |
| nglayout.enable_drag_images             | false    | Запретить drag-n-drop картинок сайтов, чтоб не было фризов браузера на века     |

Если хочешь сменить стоковый браузер, то мб надо поменять переменную в `./nixos/home.nix`. Если не помогает, то допом команда в терминале (замени `librewolf` на нужный браузер):
```sh
xdg-settings set default-web-browser librewolf.desktop
```

## Фикс Flatpak и Wine

Чтоб ссылки открывались в браузере из flatpak и wine приложений, надо сделать это:
```sh
systemctl --user import-environment PATH
systemctl --user restart xdg-desktop-portal xdg-desktop-portal-gtk
```
Отменить изменения можно так:
```sh
systemctl --user unset-environment PATH
```
Проверить текущее значение можно так:
```sh
systemctl --user show-environment | grep PATH
```
Дефолт значение такое:
```sh
PATH=/nix/store/3abwqv1a1bdycmgaydzfw3a0qzxwk8am-systemd-256.8/bin/
```
Проверить сработал ли фикс можно так (надо скачать `flatseal` через flatpak):
```sh
flatpak run --command=sh com.github.tchx84.Flatseal
xdg-open https://example.com
```

## Сборщик мусора

Если обновил систему и спустя время с ней всё окей, всё стабильно, то советую запускать сборщик мусора. При обновлении nixos не удаляет старые пакеты, чтоб ты мог откатиться назад, в случае поломок, даже если нет интернета. Чтоб удалить пакеты, которые больше не используются, можно использовать команду `grb` (это мой алиас в zsh).

Если вдруг кажется, что система занимает больше места, чем должна, и сборка мусора не помогает, то вот что я делаю.

Кидаешь жпт вывод команды
```sh
nix-store --gc --print-roots
```

У меня оказывается `grb` не чистит поколения `home-manager`
```sh
nix-env --list-generations \
  --profile ~/.local/state/nix/profiles/home-manager
```
Выдаст много всего

Удалить всё, кроме текущего:
```sh
nix-env --delete-generations old \
  --profile ~/.local/state/nix/profiles/home-manager
```
Или оставить за ласт 7 дней
```sh
nix-env --delete-generations "+7" \
  --profile ~/.local/state/nix/profiles/home-manager
```

И потом можешь `grb` использовать

Но это почистило не всё. Много, но явно не всё.

### Часть диалога с GPT

(тут был вывод команды `ls -l /nix/var/nix/gcroots/auto`)

При этом команда `find ~ -maxdepth 3 -type l -name result` ничего не нашла. Команда `ls -l /nix/var/nix/gcroots/auto | grep nix-shell` тоже пусто

(тут был вывод команды `ls -l /nix/var/nix/gcroots`)

На что GPT ответил так:

Основное:
- `slq1zkcsd5k5vlj51bkkl24vngrh41m4 -> /tmp/nixos-rebuild.S9abuF/result`  
    Это держит большую часть `/nix/store`. То есть **не сам system profile**, а именно **результат последнего `nixos-rebuild build`**, который создаёт `result` в `/tmp`.
- Остальные ссылки (`system-149-link`, `profile-4-link`, `home-manager-60-link`) — это нормальные активные профили, их GC не тронет.
- `dbgcd463h97sj574ym1jhfpydmxm66si` (flake-registry.json) — копейки, можно игнорировать.

Вот почему `find ~ -type l -name result` ничего не показал: `result` был в `/tmp`, а не в домашнем каталоге.

Что делать?

1. Удалить временный результат сборки:
```bash
sudo rm -f /nix/var/nix/gcroots/auto/slq1zkcsd5k5vlj51bkkl24vngrh41m4
```

2. Затем выполнить сборку мусора:
```bash
sudo nix-collect-garbage -d
```

3. Проверить `/nix/store`:
```bash
du -sh /nix/store
```

После этого, скорее всего, объём уменьшится на десятки гигабайт.

### Кто больше всего жрёт памяти

Разбирает **все зависимости профиля** и показывает самые «тяжёлые» пакеты
```sh
nix-store --query --requisites /nix/var/nix/profiles/system-149-link | xargs du -sh | sort -hr | head -n 20
```

Показывает топ-20 самых «тяжёлых» директорий в `/nix/store`.
```sh
find /nix/store -maxdepth 1 -type d -print0 | xargs -0 du -sh 2>/dev/null | sort -hr | head -n 20
```


## Что делать в emergency mode

Я случайно забыл удалить маунты хостовых дисков на виртуалке. В итоге улетел в `emergency mode`, аварийный мод systemd. Из него нельзя выйти, войти можно лишь от рута. Я через `nvim /home/buliway/nixos-private-dots` изменил нужные файлы, но ребилд сделать нельзя, потому что гит принадлежит другому юзеру. Фиксится таким образом:
```sh
git config --global --add safe.directory /home/buliway/nixos-private-dots
sudo nixos-rebuild boot --impure --flake /home/buliway/nixos-private-dots
```

Выдаст ошибку, но похуй, `reboot`

И в следующий раз не забывай юзать такие параметры маунта `"nofail" "noatime" "x-systemd.device-timeout=1s"`

## Нюансы с JetBrains Toolbox

В стоке тулбокс может всегда разлогинивать. Я не проверял, сразу сделал как просили на вики, чтоб это исправить.

Надо скачать тулбокс (уже стоит), запустить его один раз, а потом:
- Изменить `~/.local/share/JetBrains/Toolbox/.storage.json` и добавить строку `"preferredKeychain": "linux-fallback"` (у меня было в стоке)
- Залогиниться как обычно, но остановиться после того, как JetBrains вебсайт откроется
- Перезапустить JetBrains Toolbox, открыть настройки и нажать `"Troubleshoot..."`
- Следуй инструкциям по ручному входу в систему, как указано в руководстве

После выполнения этих действий JetBrains Toolbox сохранит учетные данные пользователя в зашифрованном файле (со статическим ключом) по адресу `~/.local/share/JetBrains/Toolbox/.securestorage`. Если этого не сделать, JetBrains Toolbox не сможет получить учетные данные через `libsecret` (из-за bwrap sandboxing?) и постоянно уведомляет пользователя о необходимости повторной авторизации.

Если что-то не работает, то мб помогут эти ссылки:
- https://nixos.wiki/wiki/Jetbrains_Tools
- https://github.com/NixOS/nixpkgs/issues/240444

## Настройки для игр

Я установил `MangoHud`, `gamemode` и `gamescope`. Ещё есть `proton-ge` в steam. Всё это можно по разному комбинировать между собой.

### MangoHud 

Мониторинг ресурсов для vulkan и opengl приложений. Показывает fps и нагрузку на пк, включая температуры цп и гп. Можно использовать как полноценные бенчмарки, логируя всю его инфу и визуализируя данные другой утилитой. Чтоб использовать, надо написать `mangehud приложение`, если запускать через терминал, или `mangohud %command%`, если использовать через steam. Если используется вместе с `gamescope`, то надо писать `gamescope --mangoapp`.

### gamemode

Оптимизатор линукса для игр. В параметры запуска игры в стиме пишешь `gamemoderun %command%` и всё работает.

### gamescope

SteamOS session compositing window manager. Можно назвать мини wm внутри wm (хотя можно и в tty запустить, без стороннего wm). Не совсем понимаю когда его надо использовать. Иногда, если у игры есть проблемы с обычным linux, то она может нормально запускаться через `gamescope`

### Параметры запуска Steam

Если в параметры запуска захочется добавить что-то помимо того, что я напишу, то надо учитывать порядок написания. Как я понял, если надо используется переменная, то её надо писать в начале. Например, если в игре не работает печать на русском языке, то надо в начало добавить `LC_ALL="ru_RU.UTF-8"`. Если же речь про стандартные параметры запуска стима, по типу `-dev` или `-novid`, то их надо писать после `%command%`. Слово `%command%` скорее всего является игрой, то есть команда для запуска игры. То есть синтаксис как в обычном терминале. Сначала переменные окружения, потом команда, потом параметры запуска через `-параметр`.

Параметры запуска для игр, чтоб использовать все доступные бафы, что я сделал:
Параметр запуска без использования gamescope - `mangohud gamemoderun %command%`.
Параметр запуска с использованием gamescope `gamescope --mangoapp gamemoderun %command%`.

Вот пример параметров запуска для Apex Legends: `mangohud gamemoderun %command% +exec autoexec.cfg -dev`

FSR в `proton-ge` включается только в фулскрине через `WINE_FULLSCREEN_FSR=1`. Регулировать резкость можно через переменную окружения `WINE_FULLSCREEN_FSR_STRENGTH=N`, где N - это уровень резкости изображения от 0 до 5. Чем выше значение, тем меньше резкость. По умолчанию установлено значение "2", рекомендуют использовать значение "3".

## Настройка мониторов

На иксах второй монитор может не работать или все мониторы могут сидеть на 60 герц. Изменить это один раз недостаточно, после ребута сбросится. Не знаю нормального способа, кроме как добавить настройки в автозапуск. Ниже пример того, как произвести начальную настройкy:

```sh
# Увидеть список мониторов
xrandr
# Изменить настройки для основного монитора. Мб вместе с --primary для основного монитора
xrandr --output DisplayPort-2 --mode 1920x1080 --rate 165
# Изменить настройки для второго (правого) монитора
xrandr --output HDMI-A-0 --mode 1920x1080 --rate 100 --right-of DisplayPort-2
```

Есть ещё такая штука - https://github.com/phillipberndt/autorandr . Но мне лень с ней разбираться


## Системная тема на всех вебсайтах

Если используется популярная системная тема, то, скорее всего, её можно выбрать в браузерном расширении DarkReader, чтоб все сайты в интернете выглядели как системная тема. Может быть я потом займусь синхронизацией темы stylix с настройками DarkReader

## Запуск Waydroid на X11

Один раз написать в терминале `waydroid init`

- Запустить `weston`
- В его терминале написать `waydroid show-full-ui`

На weston всё работает сразу как надо. Но стоит изменить размеры окна, как waydroid ui пропадает. Приходится стопать и по новой запускать отображение

## Как я тестирую разный новый софт

Для этого создаю каталог, а в нём файл `flake.nix` с таким содержимым:
```nix
{
  description = "Development shell for my project";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.11";
  };

  outputs = { self, nixpkgs, ... }@inputs: 
  let
    system = "x86_64-linux";
    # pkgs = nixpkgs.legacyPackages.${system};
    config = {
      allowUnfree = true;
      rocmSupport = true;
      permittedInsecurePackages = [
        "python-2.7.18.8"
        "electron-25.9.0"
      ];
    };
    pkgs = import nixpkgs {
      inherit system;
      inherit config;
    };
    spkgs = import inputs.nixpkgs-stable {
      inherit system;
      inherit config;
    };
  in {
    devShells.${system}.default =
      pkgs.mkShell {
        buildInputs = with pkgs; [
          planify
        ];

        shellHook = ''
          zsh
          echo "Welcome to Dev Shell"
        '';
      };
    };
}
```
Сюда можно ставить разный софт из нужной версии репы. Чтоб зайти в этот шел, заходишь в каталог с этим файлом и пишешь `nix develop`. Теперь весь софт из этого `flake.nix` будет доступен именно в этом терминале. Если хочется обновить весь софт в этом шеле до последней версии, то я просто удаляю файл `flake.lock` и снова пишу `nix develop`. Чтоб выйти из шела, можно написать `exit`.

Например, я разрабатывал GUI на fyne. Это либа для golang, чтоб GUI приложения делать. Она на nixos требует пробрасывть зависимости через nix shell, который в конечном итоге выглядел так:
```nix
{
  description = "Development shell for my project";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
  };

  outputs = { self, nixpkgs }:
  let
    system = "x86_64-linux";
    pkgs = nixpkgs.legacyPackages.${system};
  in {
    devShells.${system}.default =
      pkgs.mkShell {
        buildInputs = with pkgs; [
          # Fyne
          libGL
          pkg-config
          xorg.libX11.dev
          xorg.libXcursor
          xorg.libXi
          xorg.libXinerama
          xorg.libXrandr
          xorg.libXxf86vm
          fyne

          # Avif
          libaom

          # Video
          glib
          glib.dev
          gst_all_1.gstreamer
          gst_all_1.gst-plugins-base
          gst_all_1.gst-plugins-good
          gst_all_1.gst-plugins-bad
          gst_all_1.gst-plugins-ugly
          gst_all_1.gst-libav
        ];

        # Чтобы pkg-config видел .pc-файлы, и GStreamer загружал плагины
        PKG_CONFIG_PATH = pkgs.lib.concatStringsSep ":" [
          "${pkgs.glib.dev}/lib/pkgconfig"
          "${pkgs.gst_all_1.gstreamer}/lib/pkgconfig"
          "${pkgs.gst_all_1.gst-plugins-base}/lib/pkgconfig"
          "${pkgs.gst_all_1.gst-plugins-good}/lib/pkgconfig"
          "${pkgs.gst_all_1.gst-plugins-bad}/lib/pkgconfig"
          "${pkgs.gst_all_1.gst-plugins-ugly}/lib/pkgconfig"
          "${pkgs.gst_all_1.gst-libav}/lib/pkgconfig"
        ];

        NIX_CFLAGS_COMPILE = [ "-I${pkgs.glib.dev}/include" ];
        NIX_LDFLAGS = [ "-L${pkgs.glib.out}/lib" ];

        shellHook = ''
          zsh
          echo "Welcome to Dev Shell"
          export LD_LIBRARY_PATH=${pkgs.wayland}/lib:${pkgs.lib.getLib pkgs.libGL}/lib:$LD_LIBRARY_PATH
        '';

      };
    };
}
```
Необходимые пакеты я подбирал методом тыка, читая ошибки при попытке компилировать

