nixos-private-dots/NOTES.md
2026-01-20 03:23:17 +03:00

30 KiB
Raw Blame History

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

Навигация

Описание

Железо, на котором работают мои дотсы:

  • CPU: i5 10400f
  • GPU: AMD RX6600
  • RAM: 32gb (2x16) ddr4 3200
  • Motherboard: MSI Z590-A PRO
  • Два монитора 1920x1080 на 165 и 100 герц

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

Изначально я написал конфиги для 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 для гитхаб репы, пишем в терминал эту команду:

nix-prefetch-git link

Если хочется поменять цвета или шрифты в конфиге какой-то программы, но при ребилде получается конфликт, то дело в Stylix, который управляет системной темой и сам везде ставит шрифты и цвета. Если хочется заменить, не трогая stylix, то надо добавить lib.mkForce перед значением. Например так:

font = lib.mkForce "JetBrainsMono Nerd Font 11";

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

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 файл такой командой:

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 на нужный браузер):

xdg-settings set default-web-browser librewolf.desktop

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

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

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

Кидаешь жпт вывод команды

nix-store --gc --print-roots

У меня оказывается grb не чистит поколения home-manager

nix-env --list-generations \
  --profile ~/.local/state/nix/profiles/home-manager

Выдаст много всего

Удалить всё, кроме текущего:

nix-env --delete-generations old \
  --profile ~/.local/state/nix/profiles/home-manager

Или оставить за ласт 7 дней

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. Удалить временный результат сборки:
sudo rm -f /nix/var/nix/gcroots/auto/slq1zkcsd5k5vlj51bkkl24vngrh41m4
  1. Затем выполнить сборку мусора:
sudo nix-collect-garbage -d
  1. Проверить /nix/store:
du -sh /nix/store

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

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

Разбирает все зависимости профиля и показывает самые «тяжёлые» пакеты

nix-store --query --requisites /nix/var/nix/profiles/system-149-link | xargs du -sh | sort -hr | head -n 20

Показывает топ-20 самых «тяжёлых» директорий в /nix/store.

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 изменил нужные файлы, но ребилд сделать нельзя, потому что гит принадлежит другому юзеру. Фиксится таким образом:

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?) и постоянно уведомляет пользователя о необходимости повторной авторизации.

Если что-то не работает, то мб помогут эти ссылки:

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

Я установил 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:

# Увидеть список мониторов
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 с таким содержимым:

{
  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, который в конечном итоге выглядел так:

{
  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
        '';

      };
    };
}

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