Предисловие

Когда то, очень давно, я перешел на Gentoo. Переход получился спонтанный, думал поставлю второй системой на посмотреть но ошибся при разметке и поломал текущую ос (была OpenSUSE). После чего было принято решение разбираться с Gentoo дальше. Так меня и затянуло в этот мир portage use флагов и разных оптимизаций. В какой то момент все перестало ломаться работало стабильно только обновляй себе периодически и жди пока все соберётся. После чего Gentoo поселилась еще и на рабочем ПК. В какой то момент возникла потребность ставить обновления быстрее, так как компиляция тяжелых пакетов отнимала уйму времени. Делать отдельный binhost для пары машин было лень и затрано решил попробовать Calculate Linux. Вроде та же Gentoo только с некоторыми даполнениями и частично бинарными пакетами. Все было хорошо, новая игрушка чуть новые подходы (шаблоны, утилиты обновления и развёртывания). Но в один прекрасный день произошло странное, обновление привело к падению Xorg с segfault. Перепробованы все возможные варианты: откат обновок, установка более свежих пакетов, разные версии ядер. В общем убито много времени и без результата. Надо сказать что в последнее время Gentoo и Calculate(основана на gentoo) начали тереять свою стабильность с каждым разом приходилось разбираться вроде бы в уже исправленных и настроенных ранее местах.

И вот настал момент выбора, на какой дистрибутив переехать. Хотелось иметь всю ту же гибкость настройки что давала Gentoo но не хотелось что бы тратилось много времени на сборку пакетов. Поискав варианты нашел NixOS он показался странным в начале но однозначно импонировал декларативный подход к конфигурации системы а так же возможность отката на прошлую конфигурацию если где то ошибся. Все это не могло не радовать.

Установка

Графического установщика у NixOS не оказалось, по после Gentoo это не было какой то проблемой.

Перед началом нужно было сделать флешку с загрузочным ISO для установки nixos. Был выбран минимальный образ.

Все примеры команд будут указаны для Linux, если вы пытаетесь сделать из под Windows можете воспользоваться любой инструкцией как сделать флешку с Linux.

# Скачиваем образ
wget https://channels.nixos.org/nixos-20.09/latest-nixos-minimal-x86_64-linux.iso
# Копируем обораз через dd. ВАЖНО чтоб /dev/sdc была именно ваша флешка а не диск с данными )
dd if=latest-nixos-minimal-x86_64-linux.iso of=/dev/sdc bs=64M

По окончанию грузимся с данной флешки на нашем ПК.

Дальше будут выжимки из официальной инстркции по установки

Вся конфигурация системы находится в /etc/nixos все “пакеты” будет в /nix/store и симлинками разложены по нужным папкам системы.

Ставить будем на систему с EFI но без Secure Boot.

Подготовка диска

Предположим что диск на который мы хотим установить систему это /dev/sda

Разбивать диск будет так

ТомРазмерФайловаяТочка монтирования
/dev/sda1512Mfat32/boot
/dev/sda2100%ext4/

Ну что разобьем диск:

# Создадим таблицу разделом GPT
parted /dev/sda mklabel gpt
# Создаём партицию для /boot
parted /dev/sda mkpart EFI fat32 0% 512M
parted /dev/sda set 1 esp on
# B создаем партицию для коря
parted /dev/sda mkpart NIX ext4 512M 100%

Все диск разбит разделы есть, теперь нудно создать файловую системы на созданных разделах.

# Формтируем boot раздел в fat32
mkfs.vfat -F32 /dev/sda1
# и конрень в ext4
mkfs.ext4 /dev/sda2

На этом с разбивкой диска можно закончить

Установка базовой системы

Теперь нам необходимо установить базовую систему. Для начала смонтируем наши разделы

# раздел под корень нашей системы монтируем в /mnt
mount /dev/sda2 /mnt/
# и монтируем туда boot
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot

Теперь необходимо сгенерировать базовую конфигурацию для этого выполним следующие команды

# Добавим основной канал для нашей системы
nix-channel --add https://nixos.org/channels/nixos-20.09 nixos
nix-channel --update

# генерируем конфигурацию
nixos-generate-config --root /mnt

Теперь можно запускать установку:

nixos-install
reboot

Все, после этих этапов базовая система у нас установлена и мы можем войти.

Конфигурация

Вся конфигурация NixOS стартует с файла /etc/nixos/configuration.nix.

Для дальнейшей конфигурации нам понадобится пару полезных ссылок:

Базовый конфиг

Базовый конфиг, который сгенерировался при установке, будет выглядеть как то так:

# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{ config, pkgs, ... }:

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
    ];

  # Use the systemd-boot EFI boot loader.
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  # networking.hostName = "nixos"; # Define your hostname.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.

  # Set your time zone.
  # time.timeZone = "Europe/Amsterdam";

  # The global useDHCP flag is deprecated, therefore explicitly set to false here.
  # Per-interface useDHCP will be mandatory in the future, so this generated config
  # replicates the default behaviour.
  networking.useDHCP = false;
  networking.interfaces.enp1s0.useDHCP = true;

  # Configure network proxy if necessary
  # networking.proxy.default = "http://user:password@proxy:port/";
  # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";

  # Select internationalisation properties.
  # i18n.defaultLocale = "en_US.UTF-8";
  # console = {
  #   font = "Lat2-Terminus16";
  #   keyMap = "us";
  # };



  # Configure keymap in X11
  # services.xserver.layout = "us";
  # services.xserver.xkbOptions = "eurosign:e";

  # Enable CUPS to print documents.
  # services.printing.enable = true;

  # Enable sound.
  # sound.enable = true;
  # hardware.pulseaudio.enable = true;

  # Enable touchpad support (enabled default in most desktopManager).
  # services.xserver.libinput.enable = true;

  # Define a user account. Don't forget to set a password with ‘passwd’.
  # users.users.jane = {
  #   isNormalUser = true;
  #   extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
  # };

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  # environment.systemPackages = with pkgs; [
  #   wget vim
  #   firefox
  # ];

  # Some programs need SUID wrappers, can be configured further or are
  # started in user sessions.
  # programs.mtr.enable = true;
  # programs.gnupg.agent = {
  #   enable = true;
  #   enableSSHSupport = true;
  # };

  # List services that you want to enable:

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;
  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  # networking.firewall.enable = false;

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "20.09"; # Did you read the comment?

}

Давайте отредактируем конфиг. Сейчас в системе из редакторов есть только nano его и будем использовать.

Для начала заменим эти параметры

# имя нашего ПК
networking.hostName = "nixos";
# Укажем часовой пояс
time.timeZone = "Europe/Moscow";

После данных изменений нам нужно применить данную конфигурацию, для этого выполним команду:

nixos-rebuild boot

Теперь при загрузке ПК можно будет выбрать нашу конфигурацию.

Добавление пользователей

Что бы добавить пользователя необходимо использовать опцию users.users.<username>. Для примера добавим пользователя user указав в configuration.nix следующее:

users.users.user = {
  initialPassword = "user"; # Базовый пароль используемый
  isNormalUser = true;      # Обычный пользователь, для интерактивного входа
  extraGroups = [ "audio" "video" "wheel" ]; # Группы пользователя
}

После чего применяем конфигурацию nixos-rebuild boot.

Теперь мы можем войти в систему под пользователем user и паролем user.

Установка ПО

Нужные пакеты можно найти используя команду nix search <имя пакета>.

Для установки ПО желаемые пакеты нужно перечислить в параметре environment.systemPackages. Например установим wget и vim:

environment.systemPackages = with pkgs; [
  wget
  vim
];

После чего применяем конфигурацию nixos-rebuild boot.

Заключение

Это самые базовые вещи. Что бы установить и запустить базовую систему.