NixOS – первые шаги

Как-то в очередной раз меня задолбала убунта своими приколами. Уже не помню, чем конкретно, но то, что задолбала – помню (смаил). И решил я устроить очередной чес по интернетикам на тему “а не придумали ли чего-то нового”. И, внезапно, индеец Джо обнаружил что у барака нет одной стены! В смысле оказалось что придумали, да еще как придумали!

Когда я первый раз прочитал про NixOS, я почему-то совершенно не поверил прочитанному. Ну согласитесь, все мы любим изредка приукрашивать действительность. А тут декларируют полную развязку системы и пользователя. Дескать, можно одной командой сменить Gnome на KDE и потом сделать так, чтобы от гнома и следов не осталось. Или если что-то накосячил в системе, то бах и вернуться на предидущее состояние. Или на пред-пред-предидущее. Уже хорошо, да? А следом еще одна плюшка: все состояние системы описывается в текстовых файлах. И контрольный в голову: они заранее подумали, что надо работать на линуксах, макосях и WSL. И обещают кросс-платформенное управление домашним каталогом.

В общем, начитался я интернетиков и пошел ставить эту nixos. Первая попытка получилась на удивление удачной. Воодушевившись, я пошел пробовать остальные фичи… И закопался напрочь. Я пробовал раз за разом, но мануалы в духе “рисуем два овала и потом дорисовываем так, чтобы получилась сова” не очень способствовали успеху. Я бы плюнул и списал на “да это еще один дистрибутив для повернутых”, но первая фича работала как железный лом. Чтобы я не делал, как бы не издевался над системой, но я всегда мог откатиться на любое число шагов назад. Единственное, чего она не переживала – это форматирование дисков 🙂

В общем, ниже очень краткая выжимка из кучи мануалов. В результате вы получите голую систему, то, что в других дистрибутивах называют minimal.

Шаг первый: идем на nixos.org и качаем минимальный исошник. Можно попробовать с графикой, но он у меня под виртуалбоксом не запустился почему-то.

Шаг второй: грузимся с этого исошника. Получаем консоль, в которой можно руками настроить сеть (про wifi пока не пробовал, но по ethernet все получается автоматом).

Шаг третий: меняем пароль root и цепляемся в систему снаружи.

Шаг четвертый: размечаем диски. Я ленивый, поэтому использую btrfs на весь диск. А дальше – сабволумами.

DISK="/dev/sda"
parted -s ${DISK} -- mklabel gpt
parted -s ${DISK} -- mkpart ESP fat32 1MB 512MB
parted -s ${DISK} -- set 1 esp on
parted -s ${DISK} -- mkpart nixos btrfs 512MB 100%

mkfs.fat -f -F 32 -n boot ${DISK}1
mkfs.btrfs -f -L NIXOS ${DISK}2

mount -t btrfs ${DISK}2 /mnt
btrfs subvolume create /mnt/root
btrfs subvolume create /mnt/home
btrfs subvolume create /mnt/nix
btrfs subvolume create /mnt/swap
umount /mnt

mount -o compress=zstd,subvol=root ${DISK}2 /mnt
mkdir /mnt/{boot,nix,home,swap}
mount -t vfat -o defaults,noatime ${DISK}1 /mnt/boot
mount -t btrfs -o noatime,compress=zstd,subvol=nix ${DISK}2 /mnt/nix
mount -t btrfs -o noatime,compress=zstd,subvol=home ${DISK}2 /mnt/home
mount -o subvol=swap ${DISK}2 /mnt/swap
btrfs filesystem mkswapfile --size 2g --uuid clear /mnt/swap/swapfile

Все, диск разбит и даже сделан своп фаил на 2 гига.

Шаг пятый: генерируем конфигурацию из того, что есть. Просто nixos-generate-config --root /mnt

И теперь добавляем посредине (вы поймете, там реально просто) нужное nano /mnt/etc/nixos/configuration.nix

fileSystems = {
  "/".options = [ "compress=zstd" ];
  "/home".options = [ "compress=zstd" ];
  "/nix".options = [ "compress=zstd" "noatime" ];
  "/swap".options = [ "noatime" ];
};

swapDevices = [ { device = "/swap/swapfile"; } ];

users.users.kiltum.initialHashedPassword = "$6$e8/m1MmQORdTvNsS$IpPlxYoW9C3UU9uPUE1fO9SlX0f6c86au.NvaxBa34K8HAtoMaOZ3NXa.Jpa9LKCZL5rrz3hlBreTjxU4mfRc0";
users.users.kiltum.isNormalUser = true;
users.users.kiltum.extraGroups = [ "wheel" ];

services.openssh.enable = true;
users.users.kiltum.openssh.authorizedKeys.keys = [
    "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIwTbklxgidWB5w+tpw6aRE2ZZuJdpdyOqGWX44Duu8G kiltum@kiltum.tech"
  ];
users.users.root.openssh.authorizedKeys.keys = [
    "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIwTbklxgidWB5w+tpw6aRE2ZZuJdpdyOqGWX44Duu8G kiltum@kiltum.tech"
  ];

Хеш пароля генерится просто nix-shell --run 'mkpasswd -m SHA-512 -s' -p mkpasswd

Все. За исключением первых строчек, которые нужны исключительно для btrfs и выдраны мной из хаутушки, остальные понятны с первого взгляда.

Просто говорим, что пользователь kiltum обычный юзер, хеш его пароля вот такой, и он входит в группу wheel. Далее включаем ssh и указываем публичные ключи для kiltum и root.

Нет, это реально все. После команды nixos-install --no-root-passwd случится вся магия. Оно пойдет, накачает чего-то, надрыгает винтом, пошумит кулером и вывалится назад в консоль. Можно смело ребутить и вытаскивать то, с чего грузились.

Загрузившись, потыкался и понял, что мне опять приходится вводить пароль на sudo. Надо убрать. Читаем доки (ведь надо по-правильному), там пишут, что надо добавить security.sudo.wheelNeedsPassword = false; в /etc/nixos/configuration.nix . И потом sudo nixos-rebuild switch.

Все, запрос пароля пропал. Но если вы сейчас перезагрузитесь, то обнаружите в бутменю два варианта. В последнем запроса пароля не будет, а в предпоследнем – будет. Мелочь? Да. Но это абсолютно точно так же работает и для всего другого. Добавляем следующее:

services.xserver = {
  enable = true;
  displayManager.gdm.enable = true;
  desktopManager.gnome.enable = true;
}

И у нас после sudo nixos-rebuild switch появится Gnome. Надоел? Ок, можно и сменить.

services.xserver.enable = true;
services.displayManager.sddm.enable = true;
services.desktopManager.plasma6.enable = true;

Пересбор конфигурации и у нас KDE. Не понравилось? Можно спокойно вернуться в Gnome или в голую систему. Самое оно для “попробовать что-то другое, но не ломая существующее”. Раньше я такое мог получить только с помощью снапшотов. А тут … магия! 🙂

И, внезапно, вот все вот это выше написанное, типа разбивки дисков можно делать автоматом. Просто скормив в инсталлере длинную строку с урлом репы. Примеры я видел, но пока такой магии не научился. Зачем? Ну если есть куча хостов, то ситуации класса “вылетел диск? Надо вернуть все как было” или “сделай мне еще точно такой же” решаются за столько времени, сколько надо для похода к этому хосту и вставки исошника.

Есть ли минусы? Есть конечно.

Самый главный: вам нужен интернет. Много. Нет, там можно как-то и без него, но это как с гентой: пока все нужное выкачаешь, уже забудешь, что хотел.

Второй: оно реально сложное для первоначального старта. Кажущаяся легкость разбивается о твердые грани хотелок. Но поднимать таким макаром хосты (пока тестовые) у меня получается уже быстрее, чем из темплейта и потом проходить ансиблом.

Остальное… Скажу так, слишком пока неоднозначное для меня.