Всем привет! Этой статьёй я хотел бы начать цикл, посвящённый настройке NixOS, а именно её установке, настройке и эксплуатации. Я постараюсь собрать воедино достаточно материала, чтобы каждый смог разобраться с этим необычным дистрибутивом

В первой части я сделаю краткий обзор NixOS, расскажу о декларативной и императивной парадигмах программирования и, непосредственно, об установке этого дистрибутива.

ВАЖНО

Для желающих перейти сразу к практике — смело листайте до главы "Установка"

Пакетный менеджер Nix

Начнём с краткого обзора основы дистрибутива — пакетном менеджере Nix.

Nix был создан разработчиком по имени Элко Долстра, разработавшим его в рамках своей диссертации. Пакетный менеджер, в отличие от других, хранит все установленные пакеты в директории /nix/store/. Внутри данного каталога пакеты изолируются друг от друга, создавая новые директории. Их названия являются криптографическим хешем от всех входных данных, использованных при развёртывании пакета. Внутри этих каталогов образуется структура директорий bin, etc, lib и прочих. Подобная реализация позволяет, например, иметь сразу несколько версий одной и той же библиотеки без конфликта имён, благодаря чему решается интерференции.

Пакетный менеджер использует декларативную парадигму программирования — метод, при котором требуется лишь указывать желаемый результат, в отличие от императивного, где мы сами описываем шаги для достижения цели. Так, например, фраза «приготовь плов» —пример декларативного программирования, т.е. получатель сам разберётся, что ему нужно сделать, чтобы приготовить плов. А фразы «нарежь лук», «отчисти морковь», «нарежь мясо» — пример императивного программирования — мы отдаём получателю конкретные команды для достижения цели.

NixOS

Философия пакетного менеджера в дальнейшем легла в основу Linux дистрибутива NixOS — в нём вся конфигурация системы происходит путём редактирования файла configuration.nix. Это позволяет легко разворачивать одну и ту же версию дистрибутива со всеми необходимыми пакетами на нескольких машинах. Есть возможность разбить его на несколько частей, но в контексте этой статьи речь об этом не пойдёт.

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

Стоит отметить, что в дистрибутив использует systemd.

Достоинства и недостатки

Перейдём к оценке всего вышесказанного и выделим плюсы и минусы системы

Достоинства

  • Лёгкость дубликации системы - NixOS сильно облегчает задачу установки одной и той же системы на нескольких машинах, имея на руках буквально 2 легковесных текстовых файла.

  • Высокая стабильность — из-за особенностей пакетного менеджера Nix, весь софт и его зависимости хранятся независимо друг от друга, что позволяет безопасно выполнять обновления.

  • Возможность откатиться да определённой версии (поколения) системы — в случае, если же после установки пакета что-то пошло не так, то всегда можно откатиться на предыдущую версию системы.

  • Один из самых больших пакетных репозиториев - на repology можно посмотреть актуальную статистку среди известных пакетных репозиториев. На момент написания статьи nixpkgs unstable является самым большим из всех имеющихся, при этом содержит наиболее свежие версии пакетов. Ниже привёл скриншот графа, актуального на момент написания статьи.

    Сравнение пакетных репозиториев по размеру/свежести на момент написания статьи
    Сравнение пакетных репозиториев по размеру/свежести на момент написания статьи

Недостатки

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

  • Наличие всей конфигурации в системе в одном файле требует особой бдительности и подхода к безопасности, ведь если злоумышленник получит доступ к хотя-бы чтению этого файла, то последствия могут быть крайне не приятными. Однако, стоит отметить, что имеются возможности избавиться от этого недостатка, но речь об этом пойдёт в следующих статьях.

  • Не полная документация — nixos wiki прекрасный ресурс для изучения дистрибутива, однако он всё ещё развивается, и, по сравнению с arch wiki, может ответить далеко не на все возникающие вопросы.

Для кого этот дистрибутив?

Первый вывод, который можно сделать — этот дистрибутив идеально подходит для использования на серверах из-за своей стабильности и безопасности. Не секрет, что добрая часть проблем с последней вызвана наличием устаревшего программного обеспечения на продах. Происходит это потому, что обновление системы может привезти к поломке отдельного ПО. Позже выясняется, что найти замену, обновить или переписать ПО затратно по силам и времени, что приводит к вышеупомянутой проблеме. NixOS решает её лишь отчасти, идя на некий компромисс. В случае, если ПО не будет требовать установку новых версий зависимостей, то и обновлять их не будет. Так что от наличия устаревших версии пакетов в системе NixOS не спасает.

В общем, с безопасностью положение дел хоть и становится лучше, но полностью проблему не искореняет. Что касается стабильности - если не использовать репозиторий nixpkgs unstable, то с ней всё очень даже неплохо.

Вторая сфера применения - личные ЭВМ. Ранее я вёл файлик, в котором содержалось вообще всё, что я делал со своей системой. Это подкрепляло моё ощущение контроля над ОС и помогало понять, что я сделал не так в случае возникновения какой-либо ошибки. В случае NixOS мне подобным заниматься не придётся, ведь файл конфигурации системы, фактически, содержит полную историю того, что было проделано на устройстве. Дистрибутив также даёт возможность регулировки свежести пакетов на вкус пользователя.

Установка

Наконец, переходим к практике. Весь процесс будет демонстрироваться на виртуальной машине, однако всё описанное здесь применимо и к реальному железу, однако там уже, само собой, потребуется загрузочный носитель (Balena-Etcher для Linux или Rufus на Windows).

Характеристики у машины следующие

  • ОЗУ - 6Gb

  • ПЗУ - 20Gb

  • Число процессоров - 1

  • Кол-во ядер - 4

Начать, следует, со скачивания ISO файла с официального сайта. На нём присутствуют образы как для графической установки (с использованием окружения GNOME или Plasma Desktop), так и для легковесной установки без графики. Я же буду использовать Minimal ISO Image 64-bit Intel/AMD.

Страница загрузки образов на официальном сайте
Страница загрузки образов на официальном сайте

После скачивания необходимо создать виртуальную машину. Характеристики своей я уже указывал выше. Стоит добавить, что в моём случае используется микропрограмма UEFI. На разных гипервизорах она включается по разному, но вот пример для трёх самых популярных:

  • VMware Workstation: VM -> Settings -> Options -> Andvanced -> Firmware type

    Включение UEFI в VMware Workstation
    Включение UEFI в VMware Workstation
  • Virtual Box: Машина -> Настроить -> Система -> Включить EFI

    Включение EFI в Virtual Box
    Включение EFI в Virtual Box
  • Менеджер виртуальных машин: перед созданием виртуальной машины нужно нажать на галочку "Проверить конфигурацию перед установкой" -> Обзор -> Свойства гипервизора -> Микропрограмма Включение UEFI в Менеджере виртуальных машин (QEMU/KVM)

    Включение UEFI в менеджере виртуальных машин (QEMU/KVM)
    Включение UEFI в менеджере виртуальных машин (QEMU/KVM)

Загружаемся, используя скаченный ISO образ. Нас встречает tty сессия от пользователя nixos. Я рекомендую сразу выполнить команду ниже и изменить пароль на любой удобный вам для работы через ssh:

nixos passwd

Подключатся по SSH не обязательно, но сильно сэкономит вам время

Также проверьте корректность настройки интернет-соединения. Оно понадобиться в дальнейшем в процессе установки. Это можно сделать, например, с помощью команды ниже:

ping ya.ru

Note

Если вы ранее подключались по SSH к виртуальной машине, но затем по какой-то причине её удалили, у вас может возникнуть ошибка подключения. Для её устранения введите в консоль следующее (вместо VM IP введите IP адрес виртуальной машины):

 ssh-keygen -R {VM IP}

Разметка дисков с помощью disko

Установка системы начинается с разметки диска и каждый делает её по разному. Многие на этом этапе используют императивные утилиты, которые пересекаются с декларативной философией nix. Но сообщество решило и эту проблему с помощью disko.

Disko — созданная сообществом утилита, позволяющая записать схему распределения разделов диска в конфигруационный файл, а затем уже выполнить саму разметку. Такой способ, в купе с configuration.nix, позволяет с лёгкостью воспроизводить установку NixOS на нескольких машинах.

Итак, для начала посмотрим имеющиеся диски:

sudo fdisk -l
Результат вывода команды sudo fdisk -l
Результат вывода команды sudo fdisk -l

Игнорируем /dev/loop0 и видим, что название нашего диска - /dev/vda. Оно может быть и другим, в зависимости от типа и количества дисков. Например, для ssd это может быть nvme0n1, а для HDD - sda, sdb и т.п.

Теперь перейдём к разметке. На странице disko на github можно найти стандартный пример конфигурационного файла, которым мы и воспользуемся. Там же имеется множество вариантов этого файла, например с разделом подкачки или btrfs volumes. Создадим файл в каталоге tmp, назовём его disko.nix и внесём туда следующее:

{
  disko.devices = {
    disk = {
      my-disk = {
        device = "/dev/vda";
        type = "disk";
        content = {
          type = "gpt";
          partitions = {
            ESP = {
              type = "EF00";
              size = "500M";
              content = {
                type = "filesystem";
                format = "vfat";
                mountpoint = "/boot";
              };
            };
            root = {
              size = "100%";
              content = {
                type = "filesystem";
                format = "ext4";
                mountpoint = "/";
              };
            };
          };
        };
      };
    };
  };
}

В этом случае disko выделит 500 мегабайт для загрузочного раздела, а всё остальное место - под корневой. Я изменил название /dev/sda на /dev/vda. При установки на реальную ЭВМ с HDD этого делать не придётся. Сохраняем изменения и выходим.

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

sudo nix --experimental-features "nix-command flakes" run github:nix-community/disko -- --mode disko /tmp/disko.nix

Дожидаемся завершения работы утилиты и разметка дисков завершена!

Проверить результат можно всё с той же команды для проверки имеющихся дисков:

Результат вывода команды sudo fdisk -l
Результат вывода команды sudo fdisk -l

Как мы можем увидеть, разметка дисков прошла успешно

Настройка конфигурационного файла

Начнём настройку конфигурационного файла. Сгенерировать его можно следующей командой:

sudo nixos-generate-config --root /mnt

Далее необходимо отредактировать файл любым удобным для вас редактором, например nano или vim:

sudo nano /mnt/etc/nixos/configuration.nix
sudo vim /mnt/etc/nixos/configuration.nix

Файл достаточно объёмный и содержит множество примеров конфигурации системы. Сейчас мы не будем разбирать, что означает каждый из них, лишь отредактируем пару необходимых строчек.

  1. Сеть - зададим имя хоста TestNixOS и включим автозапуск сервиса networkmanager:

    networking.hostName = "TestNixOS"; # Define your hostname.
    # Pick only one of the below networking options.
    # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.
    networking.networkmanager.enable = true;  # Easiest to use and most distros use this by default.
  1. Временная зона - зададим временную зону, в которой находимся:

    # Set your time zone.
    time.timeZone = "Europe/Moscow";
  1. Пользователь - настроим пользователя, указав его имя, вместо стандартного alice, а также раскомментируем несколько нужных строк. Здесь некоторые указывают ещё и пароль пользователя, но из соображений безопасности так делать не рекомендуется:

    # Define a user account. Don't forget to set a password with ‘passwd’.
    users.users.test = {
      isNormalUser = true;
      extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
    #   packages = with pkgs; [
    #     firefox
    #     tree
    #   ];
    };
  1. Скачивание пакетов - шаг не обязательный, но если вам нужно, то есть возможность перечислить все требуемые пакеты для установки. NixOS загрузит их в процессе. Этот шаг мне нужен, чтобы добавить VIM:

    # List packages installed in system profile. To search, run:
    # $ nix search wget
    environment.systemPackages = with pkgs; [
      vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
    #   wget
    ];

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

sudo nixos-install

В случае возникновения ошибок вернитесь к конфигурационному файлу и проверьте что всё написано в точности как у меня (точки с запятой также важны!).

Дожидаемся конца установки системы, вводим пароль от root пользователя и перезагружаемся с помощью команды reboot.

После завершения щагрузки выполняем вход под учётной записью root, и изменяем пароль пользователю test:

passwd test

Выходим из учётной записи с помощью exit и входим уже под пользователем test.

На этом процесс установки, как и статья, подходит к концу! В следующей части мы разберём процесс управления системой, язык nix, написание flake'ов и работу с home manager.

Буду рад любой конструктивной критике в комментариях. Всем спасибо!

Потенциально полезные ссылки:
1) https://nixos.org - сайт nixos
2) https://wiki.nixos.org - nixos wiki
3) https://nix.dev - официальная документация по экосистеме nix
4) https://github.com/nix-community/disko - github с disko
5) https://t.me/ru_nixos - ссылка на чат NixOS RU

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


  1. MountainGoat
    02.07.2024 10:36
    +2

     фраза «приготовь плов» —пример декларативного программирования, 

    Не согласен. Это пример программирования на Питоне. А декларативное программирование будет: "Плов: рис варёный 70%, субпродукты резаные 15%, морковь варёная 15%"


    1. kma21
      02.07.2024 10:36

      они должны лежать на столе? они должны существовать в этой вселенной? они должны быть приготовлены отдельно и смешаны?
      это разный уровень подробности описания. "приготовь плов" максимально верхнеуровневое описание. а если уж вдаваться в детали, то надо описывать не только атрибуты, но и процессы.


      1. mrsantak
        02.07.2024 10:36

        Приготовь плов - это описание действия, а декларативный подход - это описание целевого состояния, без описания действий, которые к нему приведут. Откуда этот плов возьмётся (будет приготовлен, достан из холодильника, куплен) - уже за пределами скоупа декларативного описания. Подробность описания никак не связана с декларативностью/императивностью.


  1. saboteur_kiev
    02.07.2024 10:36

    Первый вывод, который можно сделать — этот дистрибутив идеально подходит для использования на серверах из-за своей стабильности и безопасности

    Безопасность в случае корпораций, решается не свежестью дистрибутива, а наличием большой команды поддержки, которая предлагает ентерпрайз саппорт.
    В данном случае, у компании которая ведет дистрибутив, должно быть достаточно людей, чтобы отслеживать и быстро устранять уязвимости, не выпуская новые версии, а быстрые патчи во все поддерживаемые версии дистрибутивов (LTS)

    Как один человек может гарантировать большую степень безопасности - неясно. Тоже и со стабильностью. С выводом не согласен.


    1. unreal_undead2
      02.07.2024 10:36
      +1

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


      1. gimcnuk
        02.07.2024 10:36
        +1

         Nix OS можно взять за основу

        У одной большой корпорации есть Fedora Atomic. Другая большая корпорация пытается лепить Ubuntu Core Desktop. Без особого успеха пока, но брать стороннюю ОС они вряд ли будут.


      1. saboteur_kiev
        02.07.2024 10:36

        Большие корпорации могут потянуть и поддержку своего дистрибутива

        Прям сомневаюсь.. Это могут делать наверное огромные корпорации, а во-вторых IT корпорации. Есть же и другие, которым заниматься софтом это заводить свой IT r&d отдел, что может быть дороже ентерпрайз подписки на готовый популярный дистрибутив.


        1. unreal_undead2
          02.07.2024 10:36

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


          1. saboteur_kiev
            02.07.2024 10:36

            Ну вы же понимаете разницу между написанием прикладного софта, и системного?
            Между условной java и c++/rust ?

            Это весьма разные компетенции и различные взгляды. Кроме того поддержка своего дистрибутива это еще и куча вопросов по лицензиям. Сотня тысяч sales-managers, даже если их поддерживает ИТ отдел с 1000 сотрудников, никак не готовы вкладываться, чтобы разрабатывать собственный дистрибутив. Особенно сейчас, в в условиях, когда рынок немного перегружен.


            1. unreal_undead2
              02.07.2024 10:36

              между написанием прикладного софта, и системного? Между условной java и c++/rust ?

              В большой корпорации может быть и то и другое, и ассемблер с верилогом до кучи...

              Естественно, на поддержку дистрибутива выделяются люди из тысяч разработчиков, и на не из сотен тысяч сейлзов или рабочих на фабриках.


              1. saboteur_kiev
                02.07.2024 10:36

                К сожалению не выделяется, а нанимаются новые. Так как те, которые уже работают в корпорации, если они не занимаются написанием своей ОС или поддержкой дистрибутива, а пишут прикладной софт, они не могут взять и стать специалистами.
                А нанять новых людей и новых менеджеров - это деньги.

                Топовые менеджеры деньги считать умеют. И проще купить ентерпрайз саппорт существующего дистрибутива, чем мутить свой, если ты не айти компания. Ну или прям ты должен этим гореть и думать как потом это дело монетизировать. Но получить откат и премию за ентерпрайз подписку гораздо проще.


                1. unreal_undead2
                  02.07.2024 10:36

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


    1. NickNill
      02.07.2024 10:36

      Тем не менее как то люди пишут свои дистрибутивы чуть ли не в одиночку + community... Но это надо не иметь личной жизни и чтобы ещё за это на фирме платили


  1. albozaur
    02.07.2024 10:36

    Например, для ssd это может быть nvme0n1, а для HDD - sda, sdb и т.п.

    А разве для HDD не hda, hdb и проч? и уже для SSD которые по SATA sda, sdb и т.д?.


    1. unreal_undead2
      02.07.2024 10:36

      IDE ещё живо?


  1. mltk
    02.07.2024 10:36