Знакомство с Home Manager
Как упоминалось ранее, средствами NixOS можно конфигурировать софт на уровне системы, в то время как декларативное управление пользовательскими настройками осуществляется с помощью утилиты Home Manager (в дальнейшем иногда hm). Тут лежит его официальная документация.
Чтобы поставить Home Manager в NixOS, сначала создаем /etc/nixos/home.nix
(предполагается, что системный флейк живет в /etc/nixos
). Его содержимое может выглядеть так:
{ config, pkgs, ... }:
{
# TODO юзернейм и homeDirectory нужно поменять на свои
home.username = "ryan";
home.homeDirectory = "/home/ryan";
# симлинкаем файл `wallpaper.jpg` из текущей директории в `.config/i3/wallpaper.jpg` в домашней директории пользователя
# home.file.".config/i3/wallpaper.jpg".source = ./wallpaper.jpg;
# симлинкаем все файлы из `./scripts` в `~/.config/i3/scripts`
# home.file.".config/i3/scripts" = {
# source = ./scripts;
# recursive = true; # link recursively
# executable = true; # make all files executable
# };
# задаем содержимое файла сразу в конфиге hm
# home.file.".xxx".text = ''
# xxx
# '';
# устанавливаем размер курсора и dpi под 4k монитор
xresources.properties = {
"Xcursor.size" = 16;
"Xft.dpi" = 172;
};
# конфиг git, значения снова надо менять на свои
programs.git = {
enable = true;
userName = "Ryan Yin";
userEmail = "xiaoyin_c@qq.com";
};
# какой софт ставить для текущего пользователя (не системно),
home.packages = with pkgs; [
neofetch
nnn # консольный файловый менеджер
# (раз)архивирование
zip
xz
unzip
p7zip
# утилиты
ripgrep # как grep, но быстрее
jq # легковесная тулза для работы с JSON
yq-go # то же, но для https://github.com/mikefarah/yq
exa # ‘ls’ с красивостями
fzf # A command-line fuzzy finder
# тулзы для работы с сетью
mtr # сетевая диагностика
iperf3
dnsutils # `dig` + `nslookup`
ldns # `drill`, альтернатива `dig`
aria2 # A lightweight multi-protocol & multi-source command-line download utility
socat # замена openbsd'шного netcat
nmap # A utility for network discovery and security auditing
ipcalc # калькулятор адресов IPv4/v6
# разное
cowsay
file
which
tree
gnused
gnutar
gawk
zstd
gnupg
# никсовое
nix-output-monitor # `nom`, по сути `nix`, но более детализированные логи
# productivity
hugo # генератор статичных сайтов
glow # превью markdown в терминале
btop # замена htop/nmon
iotop # мониторинг операций ввода/вывода
iftop # сетевой мониторинг
# мониторинг системных вызовов
strace
ltrace # следит за вызовами функций из библиотек
lsof # мониторит открытые софтом файлы
# системное
sysstat
lm_sensors # мониторинг различных сенсоров пк
ethtool
pciutils # lspci
usbutils # lsusb
];
# starship - гибкий prompt для любого шелла
programs.starship = {
enable = true;
settings = {
add_newline = false;
aws.disabled = true;
gcloud.disabled = true;
line_break.disabled = true;
};
};
# alacritty - эмулятор терминала
programs.alacritty = {
enable = true;
settings = {
env.TERM = "xterm-256color";
font = {
size = 12;
draw_bold_text_with_bright_colors = true;
};
scrolling.multiplier = 5;
selection.save_to_clipboard = true;
};
};
programs.bash = {
enable = true;
enableCompletion = true;
# TODO сюда кидаем содержимое .bashrc
bashrcExtra = ''
export PATH="$PATH:$HOME/bin:$HOME/.local/bin:$HOME/go/bin"
'';
shellAliases = {
k = "kubectl";
urldecode = "python3 -c 'import sys, urllib.parse as ul; print(ul.unquote_plus(sys.stdin.read()))'";
urlencode = "python3 -c 'import sys, urllib.parse as ul; print(ul.quote_plus(sys.stdin.read()))'";
};
};
# This value determines the home Manager release that your
# configuration is compatible with. This helps avoid breakage
# when a new home Manager release introduces backwards
# incompatible changes.
#
# You can update home Manager without changing this value. See
# the home Manager release notes for a list of state version
# changes in each release.
home.stateVersion = "23.05";
# Let home Manager install and manage itself.
programs.home-manager.enable = true;
}
/etc/nixos/home.nix
написали, осталось импортировать его в /etc/nixos/flake.nix
. Как это сделать можно посмотреть в темплейте hm:
Примечание: тут достаточно странный момент, т.к. до этого автор постепенно строил один флейк, а теперь предлагает сгенерить новый в той же директории. Если будет время, создам issue на гите, пока что меняю на создание шаблона в новой директории
mkdir test
cd test
nix flake new example -t github:nix-community/home-manager#nixos
Из созданного шаблона должно быть понятно, как изменить /etc/nixos/flake.nix
для подключения созданного ранее модуля hm:
{
description = "NixOS configuration";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
# подтягиваем hm в флейк
home-manager.url = "github:nix-community/home-manager";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = inputs@{ nixpkgs, home-manager, ... }: {
nixosConfigurations = {
# TODO please change the hostname to your own
nixos-test = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix
# использование home-manager в качестве модуля позволяет ему автоматически
# деплоить пользовательские конфиги при выполнении `nixos-rebuild switch`
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
# TODO меняем ryan на свой юзернейм
home-manager.users.ryan = import ./home.nix;
# передать в home.nix дополнительные параметны можно с помощью home-manager.extraSpecialArgs
# по аналогии с использованием specialArgs в предыдущей главе
}
];
};
};
};
}
Применяем изменения, выполнив sudo nixos-rebuild switch
. При этом будет установлен home-manager и прописанный в home.nix
софт.
Узнать, какой софт можно ставить через hm и как его настраивать можно так:
- Почитать Home Manager - Appendix A. Configuration Options: список всех опций hm; Ctrl+F - и в путь;
- Альтернативно можно воспользоваться Home Manager Option Search. Тулза предоставляет ту же информацию, но сильно упрощает поиск;
- Курить исходники home-manager: некоторые опции могут быть не указаны в доках или иметь невнятное описание.
Home Manager или NixOS
Один и тот же софт часто можно поставить как средставами NixOS (configuration.nix
), так и используя Home Manager (home.nix
), следовательно нужно знать в чем заключается разница между ними и что стоит использовать в различных юзкейсах
Сперва о различиях. Пакеты, установленные и сконфигурированные средствами NixOS доступны для любого пользователя в системе, их конфиги как правило лежат (симлинкнуты) в /etc
. С другой стороны, Home Manager ставит и конфигурирует софт для конкретного пользователя, соответственно другие не смогут его использовать.
Таким образом, рекомендуется выбирать:
- Модули NixOS: для установки необходимого для работы системы или используемого всеми пользователями (включая root) софта;
- Home Manager: для всего остального.