NixOS — это дистрибутив Linux, обеспечивающий надёжность и позволяющий легко воспроизводить состояния системы. Знакомим с Nix и развёртыванием NixOS на вашей машине к старту курса по Fullstack-разработке на Python.


Расскажем, как работает NixOS, как его получить и установить, а также как Nix обеспечивает надёжность. Ваша машина загрузится с работающей системой NixOS, и вы узнаете, как взаимодействуют NixOS, пакетный менеджер Nix, и Home Manager.

Что такое NixOS?

NixOS — это дистрибутив Linux на основе Nix — функционального менеджера пакетов, язык которого навеян функциональным программированием. NixOS использует возможности пакетного менеджера Nix и применяет их ко всей системе. Это означает, что, среди прочего, он позволяет без труда вернуть все параметры системы к предыдущему состоянию. Помимо системы под управлением NixOS Home Manager контролирует пользовательскую среду.

Почему NixOS?

NixOS применяет базовые принципы Nix ко всей системе. Это означает:

  • Воспроизводимость системы. В зависимости от спецификации системы (в файле конфигурации NixOS) можно воспроизвести всю систему (кроме изменяемого состояния: содержимого баз данных и т. д.) на другой машине.

  • Атомарные обновления и откаты. Изменения на уровне системы или пакета всегда обратимы.

  • Управление зависимостями. NixOS использует систему управления пакетами Nix. Nix следит за тем, чтобы при установке пакета выполнялось объявление зависимостей. Поскольку Nix хранит пакеты изолированно друг от друга, то на одной машине допустимо нескольких версий одного и того же пакета. Таким образом, разные пакеты могут пользоваться разными версиями одной и той же зависимости. Такое управление зависимостями не ведёт к появлению приложений гигантского размера, как это случается с Flatpack.

Установка NixOS

Процесс установки демонстрируется на ноутбуке Dell Precision 5520 с твердотельным накопителем (SSD) 1 ТБ и 32 ГБ оперативной памяти. Инструкции ниже применимы к любой машине, будь то компьютер разработчика, ноутбук или виртуальная машина.

Получение ISO-образа NixOS

ISO-образ NixOS можно скачать со страницы загрузки NixOS. Этот файл доступен в двух вариациях:

  • Графический ISO-образ — самый простой вариант. С этим образом установка гораздо проще, поскольку в него изначально заложен необходимый и полностью готовый графический интерфейс и подключение к сети.

  • Минималистичный по содержимому и не графический ISO-образ. Из плюсов можно назвать меньший размер файла. Но его недостаток в том, что файл требует подготовки перед установкой. Почитать подробнее о настройке сетевого подключения в установщике.

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

Я выполняю установку графического ISO-образа со средой рабочего стола Gnome. Размер файла сравнительно небольшой — около 2 ГБ.

Загрузка установщика

Для создания загрузочного USB-устройства используется образ диска .iso. Процесс создания описывается в официальной документации по NixOS. Можно почитать  документацию по Ubuntu — там рассказывается, как с помощью balenaEtcher сделать загрузку удобнее для пользователя.

По завершении перезагрузите машину и запустите файл с USB-устройства. На экране появится графический интерфейс, через который будет проводиться установка и настройка NixOS. На первом экране предлагается несколько вариантов установщика. Выберите первый. Через несколько секунд вы получаете уже запущенный и функционирующий Gnome из USB-системы. Откройте новый терминал.

Создание разделов

Установщик NixOS не создаёт разделы и не выполняет форматирование. За это отвечает пользователь. Для выполнения данной операции необходимо знать имя жёсткого диска. Команда ниже позволит узнать, как обращаться к жёсткому диску:

lsblk -p

В нашем случае имя жёсткого диска — /dev/nvme0n1. Но для разных типов диска (SATA, SSD, NVMe и т. д.) значения могут различаться (например, /dev/sda). Последующие команды в статье выполняются для диска с именем /dev/nvme0n1.

Разобравшись с именем диска, можно переходить к созданию разделов. В нашем примере один раздел целиком выделен под операционную систему. Гибернация при перезагрузке сохраняет состояние системы на диске в раздел подкачки (или область свопинга). Получается, нам нужно будет создать раздел подкачки. Не рекомендуется включать гибернацию на системе с большими ресурсами оперативной памяти (например, сервер). Если вы решите включить гибернацию, то установите размер подкачки в 1,5 раза больше объёма ОЗУ.

В качестве метода загрузки берётся схема выделения разделов UEFI. Раздел подкачки использует 50 ГБ. Для наглядности также представлена схема выделения разделов MBR (главной загрузочной записи).

В терминале зайдите как root с sudo su --. Для создания раздела диска одинаково подходят и fdisk, и Parted.

  • Пример схемы выделения разделов в NixOS для /dev/nvme0n1 с UEFI:

# Enter fdisk
fdisk /dev/nvme0n1
# Partition 1
g # Create a new empty GTP partition table
n # Create a new partition
1 # First partition
(default) # First sector
+512M # 512 MB
t # Change the partition type
1 # Select the first partition
1 # Use EFI System Partition, or ESP.
# Partition 2
n # Create a new partition
2 # Second partition
(default) # First sector start at the end of first partition
-50G # All disk minus 50G for swap
# Partition 3
n # Create a new partition
3 # Third partition
(default) # First sector start at the end of second partition
(default) # Last sector is the end of the disk
t # Change the partition type
3 # Select the third partition
19 # Use Linux swap
# Finalize
v # Check the settings
w # Write and quit
  • Другой пример выделения разделов в NixOS для /dev/nvme0n1 с MBR:

parted /dev/nvme0n1 -- mklabel msdos
parted /dev/nvme0n1 -- mkpart primary 1MiB -50GiB
parted /dev/nvme0n1 -- mkpart primary linux-swap -50GiB 100%

Форматирование

Освежим в памяти: в нашей статье NixOS устанавливается на диск /dev/nvme0n1 disk. /dev/nvme0n1p2 — это корневой раздел системы Linux, а /dev/nvme0n1p3 — это раздел подкачки.

Цель этого шага — форматировать разделы, активировать раздел подкачки и собрать целевую файловую систему для установки NixOS. Ниже представлены команды для режимов загрузки UEFI и MBR (Legacy).

  • для UEFI:

# Disk format
mkfs.ext4 -L nixos /dev/nvme0n1p2
mkswap -L swap /dev/nvme0n1p3
mkfs.fat -F 32 -n boot /dev/nvme0n1p1
# System mount
mount /dev/disk/by-label/nixos /mnt
swapon /dev/nvme0n1p3
mkdir -p /mnt/boot
mount /dev/disk/by-label/boot /mnt/boot
  • для MBR:

mkfs.ext4 -L nixos /dev/nvme0n1p1
mkswap -L swap /dev/nvme0n1p2
mount /dev/disk/by-label/nixos /mnt
swapon /dev/nvme0n1p2
nixos-generate-config --root /mnt

Конфигурирование NixOS

Установка выполняется через файл конфигурации NixOS в /mnt/etc/nixos/configuration.nix. Чтобы сгенерировать файл конфигурации и открыть его для редактирования, выполните следующий код:

nixos-generate-config --root /mnt
nano /mnt/etc/nixos/configuration.nix

В соответствии с философией NixOS файл конфигурации должен отражать всю информацию о системе. Сюда относятся данные об устанавливаемых пакетах, запускаемых сервисах, применяемых настройках, конфигурациях сети и о многом другом. Чтобы быстрее во всём разобраться, пропишем минимальную конфигурацию и выполним её после перезагрузки системы. В будущем рекомендуется зафиксировать эту конфигурацию. Тогда при установке на новой машине можно будет клонировать конфигурацию и повторно использовать её (целиком или часть) на новой среде.

Минимальный файл конфигурации NixOS для настольной среды Gnome с режимом загрузки UEFI представлен ниже. Если вы хотите начать с более сложной системы, то дополните файл конфигурации дополнительными свойствами или воспользуйтесь  подробным файлом, который можно найти в конце статьи:

{ 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;
  
  # 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.wlp2s0.useDHCP = true;
  networking.networkmanager.enable = true;

  # Enable the X11 windowing system.
  services.xserver.enable = true;

  # Enable the GNOME Desktop Environment.
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;
  
  # Configure keymap in X11
  services.xserver.layout = "fr";

  # 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’ using the root account if you don't use the initialPassword field.
  users.users.florent = {
    isNormalUser = true;
    initialPassword = "secret";  # Define the user initial password
    extraGroups = [ "wheel" ]; # wheel to enable ‘sudo’ for the user.
  };

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

  # Enable the OpenSSH daemon.
  services.openssh.enable = true;

  # 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 = "21.05"; # Did you read the comment?
}

Установка

Это последний шаг перед перезагрузкой системы. Для скачивания зависимостей потребуется интернет-соединение. Установка сводится к выполнению конфигурации, которую прописывали выше. Команда для запуска установки:

nixos-install

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

Изменение конфигурации NixOS

Работающая система начинает дополняться под ваши нужды. Устанавливаются новые инструменты, запускаются сервисы, и обновляется конфигурация. Это часть жизненного цикла любой системы — будь то компьютер разработчика или рабочий сервер.

В файле конфигурации NixOS отражаются параметры системного уровня, такие настройки распространяются на всех пользователей конкретной машины. Кроме того, на уровне пользователя работает Home manager, устанавливающий приложения и конфигурацию для отдельного пользователя.

Пакет curl на системном уровне добавляется через следующую конфигурацию:

{ config, pkgs, ... }:

{
  ...
  environment.systemPackages = with pkgs; [
    vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
    curl
  ];
  ...
}

Любое изменение в файле конфигурации NixOS ведёт к созданию новой конфигурации начальной загрузки. Команды ниже создают конфигурацию, объявленную в файле конфигурации NixOS, и делают её настройкой по умолчанию для начальной загрузки:

nixos-rebuild switch

С каждым использованием команды nixos-rebuild switch при запуске операционной системы появляется новая конфигурация начальной загрузки. Ниже приводится пример окна перезагрузки:

Команда для просмотра перечня конфигураций начальной загрузки NixOS:

sudo nix-env -p /nix/var/nix/profiles/system --list-generations

В руководстве по Nix можно найти самые популярные команды.

Что такое Home Manager?

Home Manager — это инструмент для управления пользовательской средой через диспетчера пакетов Nix. Таким образом, он дополняет NixOS. Существует 2 варианта работы с Home Manager:

  • Использование самостоятельного инструмента home-manager.

Данный способ позволяет управлять домашней директорией пользователя независимо от совокупной системы. Необходимо поддерживать 2 файла конфигурации: один —  для конфигурации на системном уровне (/etc/nixos/configuration.nix), а второй — для конфигурации на уровне пользователя (~/config/nixpkgs/home.nix). Для первого нужны права root, а последний выполняется пользователем без разрешений sudoers.

  • В качестве модуля внутри файла конфигурации NixOS.

Так вы сможете управлять конфигурацией на системном и пользовательском уровнях в одном файле (/etc/nixos/configuration.nix). Для применения обновлений Home Manager потребуются root-права.

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

Ниже рассмотрим установку Home Manager в качестве модуля внутри системной конфигурации NixOS.

Home Manager в качестве модуля NixOS

Для установки Home manager в качестве модуля NixOS потребуются привилегии суперпользователя (root). В терминале зайдите как root с sudo su -. Затем следуйте этой инструкции для настройки Home Manager:

  • Чтобы добавить канал Home Manager, воспользуйтесь командами ниже:

nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
# If you follow a Nixpkgs version 21.11 channel, run nix-channel add https://github.com/nix-community/home-manager/archive/release-21.11.tar.gz home-manager instead of the command below
nix-channel --update
  • Добавьте ` в раздел imports файла конфигурации NixOS. Теперь появится новая опция NixOS под названием home-manager.users.

Если в файл конфигурации NixOS из раздела «Создание и настройка файла конфигурации NixOS» добавить модуль Home Manager с установкой пакета python3 и настройкой дот-файл.git для пользователя florent, то получится следующее:

{ config, pkgs, ... }:

{
  imports =
    [
      ./hardware-configuration.nix
      # To introduce the NixOS option called home-manager.users
      <home-manager/nixos>
    ];

  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;
  networking.useDHCP = false;
  networking.interfaces.wlp2s0.useDHCP = true;
  networking.networkmanager.enable = true;
  services.xserver.enable = true;
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;
  services.xserver.layout = "fr";
  sound.enable = true;
  hardware.pulseaudio.enable = true;
  services.xserver.libinput.enable = true;
  users.users.florent = {
    isNormalUser = true;
    initialPassword = "titi"  # Define the user initial password
    extraGroups = [ "wheel" ]; # wheel to enable ‘sudo’ for the user.
  };
  # Home Manager configuration for user florent
  home-manager.users.florent = { pkgs, ...}: {
    # List packages to install in user profile
    home.packages = [ 
      pkgs.python3
    ];
    # Git config for the user
    programs.git = {
      enable = true;
      userName = "Florent";
      userEmail = "florent@adaltas.com";
    };
  };

  environment.systemPackages = with pkgs; [
    vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
    curl
  ];
  services.openssh.enable = true;
  system.stateVersion = "21.05"; # Did you read the comment?
}

Снова зафиксируйте изменения через nixos-rebuild switch.

Заключение

NixOS применяет базовые принципы Nix ко всей системе, чтобы представить вам опыт полноценного взаимодействия с Nix. Nix упрощает сохранение, совместное использование и дублирование конфигурации вашей машины; он создаёт гибкий, надёжный и воспроизводимый дистрибутив Linux.

Без труда можно представить все плюсы от использования NixOS в CI/CD-средах и распредёленных кластерах. А мы поможем вам прокачать навыки или с самого начала освоить профессию, востребованную в любое время:

Выбрать другую востребованную профессию.

Краткий каталог курсов и профессий

Комментарии (5)


  1. karavan_750
    25.03.2022 22:21
    +1

    Ссылка в телегу на группу с русскоязычным комьюнити.
    https://t.me/ru_nixos
    Список других каналов поддержки можно найти на оф.сайте.


  1. amarao
    25.03.2022 23:51
    -3

    Всё человечество давно перешло на использование образов. Вместе с cloud-init'ом (который можно использовать вне cloud'а на обычном baremetal сервере) - это самый универсальный метод.


  1. PTM
    26.03.2022 10:32

    MicroOS?


  1. scruff
    28.03.2022 09:24

    можно воспроизвести всю систему (кроме изменяемого состояния: содержимого баз данных и т. д.). Смысл тогда во всех этих "состояниях" без содержимого?


    1. karavan_750
      28.03.2022 13:18

      Полностью отпадает необходимость бэкапить всю ОС, достаточно только данные.