Nix os установка

Часть 4. Дистрибутив NixOS

Nix os установка

Функциональный менеджер пакетов Nix

Константин Черемнов
23.09.2010 Следите за выходом новых статей этой серии.

Следите за выходом новых статей этой серии.

1. Введение

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

Рисунок 1. Описание компонентов системы

Кликните, чтобы увидеть увеличенное изображение

Вот и получается целый дистрибутив с незатейливым названием NixOS.

2. Конфигурационный файл системы

Процесс установки большинства дистрибутивов состоит из последовательного набора этапов, включающих:

  • Выбор региональных настроек
  • Подготовка жесткого диска: разбивка на разделы, форматирование
  • Определение точек монтирования (root, swap, home)
  • Настройка оборудования
  • Выбор устанавливаемых пакетов
  • Установка компонентов системы
  • Установка загрузчика

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

Установка NixOS проходит в не интерактивном режиме. Определяются настройки для вышеуказанных этапов и сохраняются в конфигурационный файл configuration.

nix, который располагается в каталоге будущей системы (/etc/nixos/configuration.nix). Затем запускается процедура установки, которая на основе конфигурации из configuration.

nix производит установку системы в нужное место с указанными настройками.

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

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

3. Создание установочного диска

Образ установочного диска можно скачать с http://nixos.org/nixos/index.html. Но процедура установки требует интернет-соединения для загрузки некоторых файлов, а на установочном диске может не оказаться пакета для поднятия вашего интернет-соединения(например, ppp-диалера там нет). Тогда создадим свой установочный диск, в который включим нужные пакеты:

  • Потребуется установить самую новую версию Nix (http://nixos.org/releases/nix/).
  • Загрузить информацию о предкомпилированных пакетах: $ nix-channel –add http://nixos.org/releases/nixpkgs/channels/nixpkgs-unstable$ nix-channel –update
  • Загрузить коллекцию пакетов Nixpkgs: $ svn checkout https://svn.nixos.org/repos/nix/nixos/trunk nixpkgs
  • Загрузить NixOS: $ svn checkout https://svn.nixos.org/repos/nix/nixos/trunk nixos
  • В каталоге nixos создать символическую ссылку на коллекцию пакетов: $ ln -s nixpkgs/pkgs nixos/
  • Создать описание установочного диска, добавив нужные пакеты. Создается файл installation-with-ppp.nix следующего содержания: {config, pkgs, …}:{ require = [/path/to/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix]; environment.systemPackages = [ pkgs.ppp ];}атрибут systemPackages содержит список дополнительных пакетов. Включите в список нужные для поднятия интернет-соединения пакеты. В этом примере на установочном диске станет доступен ppp-диалер.
  • Запускается сборка $ export NIXOS_CONFIG=/path/to/installation-with-ppp.nix$ nix-build /path/to/nixos -A config.system.build.isoImage Если процедура сборки прошла успешно, то в текущем каталоге в подкаталоге result/iso будет лежать образ установочного диска. Осталось записать его на диск.

При другом варианте создания установочного диска все пакеты, нужные для установки системы, загружаются и копируются на установочный диск. Для этого устанавливается атрибут isoImage.storeContents:

{config, pkgs, …}:{ require = [/path/to/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix]; isoImage.storeContents = [config.system.build.toplevel.drvPath];}

Загрузившись с установочного диска, входим под root с пустым паролем. На всякий случай можем воспользоваться руководством пользователя, которое открыто на виртуальной консоли 7 (нажать Alt+F7).

4.1. Подготовка жесткого диска

Первым делом подготовим корневой раздел для будущей системы и заодно swap-раздел и дополнительные разделы, если они нужны. Из доступных утилит для оперирования жестким диском есть fdisk.

Когда корневой раздел будет готов, его нужно примонтировать к /mnt, чтобы установочный скрипт нашел его.

4.2. Определение оборудования

Начинаем формировать конфигурацию системы. Лучше всего начать с определения оборудования с помощью утилиты nixos-hardware-scan. Вывод этой команды является Nix-выражением, описывающим параметры оборудования, его можно непосредственно подставлять в configuration.nix:

$ nixos-hardware-scan > /mnt/etc/nixos/configuration.nix

готова заготовка конфигурационного файла.

4.3. Настройка точек монтирования

Дополняем конфигурационный файл атрибутами настроек.

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

Каждый из элементов есть набор атрибутов со следующими полями: mountPoint (точка монтирования в файловой системе), device (устройство), fsType ( тип файловой системы, передаваемый команде mount через флаг -t; по умолчанию “auto”), options ( опции монтирования, передаваемые команде mount через флаг -o; по умолчанию “defaults”). Альтернативный вариант указания раздела вместо device использует атрибут label, в котором указывается название раздела, если конечно файловая система поддерживает (для ext2/ext3 см. mke2fs -L). Если установить атрибут autocreate в значение true, то директория монтирования создастся автоматически, когда она не существует. Например:

fileSystems = [ { device = “/dev/hda1”; mountPoint = “/”; } { device = “/dev/hda2”; fsType = “ext3”; mountPoint = “/data”; options = “data=journal”; } { label = “bigdisk”; mountPoint = “/bigdisk”; } ];

swap-разделы указываются в отдельном атрибуте swapDevices. Значением атрибута является список элементов, определяющих swap-разделы по пути к устройству (атрибут device), либо по названию раздела (атрибут label, см. mkswap -L). Например:

swapDevices = [ { device = “/dev/hda7”; } { device = “/var/swapfile”; } { label = “bigswap”; } ]В качестве загрузчика в NixOS используется Grub. Раздел, на который следует установить загрузчик, указывается в атрибуте boot.grubDevice. К примеру:
boot = { # … grubDevice = “/dev/sda”; };

указывает установить загрузчик в mbr первого жесткого диска.

Если на жестком диске установлены другие операционные системы, которые нужно загружать, то добавляем их в меню Grub через атрибут boot.extraGrubEntries, например:

boot = { # … extraGrubEntries = ” title Windows chainloader (hd0,1)+1 “; };

Получится файл конфигурации подобный этому (/mnt/etc/nixos/configuration.nix):

{ boot = { initrd = { extraKernelModules = [ “ohci_hcd” “ehci_hcd” “pata_amd” “sata_nv” “usb_storage” ]; }; kernelModules = [ ]; grubDevice = “/dev/sda”; }; fileSystems = [ { mountPoint = “/”; label = “nixos”; } ]; swapDevices = [ { label = “swap”; } ]; nix = { maxJobs = 1; }; networking = { enableIntel3945ABGFirmware = false; enableIntel2200BGFirmware = false; }; services = { xserver = { videoDriver = “nvidia”; }; };}

Примеры конфигурационных файлов лежат в каталоге /etc/nixos/nixos/doc/config-examples.

С момента написания этой статьи к этому моменту настройки конфигурационного файла могли измениться, поэтому лучше уточнить их в http://hydra.nixos.org/job/nixos/trunk/manual/latest/download руководстве.

Когда конфигурационный файл будет готов, запускаем процедуру установки:

Если установка прошла успешно, перегружаемся:

Загрузившись в установленную систему, входим под пользователем root и сразу устанавливаем пароль для root:

И добавляем пользовательский логин:

$ useradd -c 'First user' -m user$ passwd user

В NixOS нет менеджера управления системой, но и ручная правка файлов конфигурации крайне нежелательна, это касается и пользовательских пакетов. Конфигурирование системы и пользовательских пакетов производится всё через тот же /etc/nixos/configuration.nix с помощью утилиты nixos-rebuild.

Чтобы знать, какие атрибуты можно использовать в configuration.nix, собираем руководство:

$ nix-build /etc/nixos/nixos -A config.system.build.manual

теперь в файле ./result/share/doc/nixos/manual.html в разделе “Chapter 5. List of Options” смотрим интересующие настройки.

Для примера, поискав настройки для утилиты sudo, находим атрибут security.sudo.configFile, который принимает содержимое sudoers файла. Добавляем его в configuration.nix:
{…security.sudo.configFile=”root ALL=(ALL) ALLuser ALL=(ALL) NOPASSWD: ALL”;…}

Далее нужно пересобрать систему:

в каталоге /etc появится файл sudoers с указанным содержимым.

Утилита nixos-rebuild принимает следующие команды: build – производится сборка конфигурации, но её активирование не производится (команда удобна для проверки файла конфигурации на корректность); switch – сборка конфигурации, активирование и запись в загрузочное меню; boot – сборка и запись в загрузочное меню без активирования; test – сборка, активирование без записи в меню загрузки; dry-run – просмотреть что будет собрано;

Так как операции в Nix не являются деструктивными, то и в NixOS новая конфигурация системы не перекрывает предыдущую, а в меню загрузки появится новый пункт для этой конфигурации. Если новая конфигурация окажется неработоспособной, то вернуться к предыдущей удачной конфигурации можно лишь выбрав соответствующий пункт меню загрузки, после чего можно отменить последнюю конфигурацию командой:

$ nixos-rebuild –rollback boot

Для поддержания системы в актуальном состоянии нужно изредка обновлять её из репозитария. Это делает скрипт nixos-checkout (запускается с правами суперпользователя). После обновления формируется новая конфигурация утилитой nixos-rebuild.

7. Добавление собственных настроек

NixOS состоит из набора модулей, каждый из которых реализует определенный компонент системы (Рис. 1). Их реализация (Nix-выражения) находится в каталоге /etc/nixos/nixos/modules/.

Добавим собственный модуль, для примера возьмем ppp.

Описываем модуль в файле pppd.nix:

# (1){config, pkgs, …}:# (2)let # (4) options = { services.ppp = { dev = pkgs.lib.mkOption { default = “modem”; example = “ttyACM0”; description = “Modem device”; }; }; };in# (3){ require = [options]; #(5) environment.etc = [ { mode = “0666”; source = pkgs.writeText “chat-default” ''ABORT “NO CARRIER”ABORT “NO DIALTONE”ABORT “ERROR”… ''; target = “ppp/chat-bwc”; } { mode = “0666”;# (6) source = pkgs.writeText “bwc” ''${config.services.ppp.dev}230400defaultrouteuser 'bwc'connect '/nix/var/nix/profiles/default/sbin/chat -v -f /etc/ppp/chat-bwc' ''; target = “ppp/peers/bwc”; } ];}

(1) – принимает параметры

(2) – интерфейс модуля

(3) – реализация модуля

(4) – описание настроек для использования в configuration.nix; для этого используется функция mkOption, принимающая три аргумента: default – значение, которое настройка принимает по-умолчанию, description и example – описание настройки и пример значения используются в руководстве

(5) – формирвание конфигурационных файлов в каталоге /etc; source принимает исходный файл, target указывает куда разместить файл в каталоге /etc, а mode – режим доступа файла

(6) – при формировании конфигурационного файла в него подставляется значение настройки config.services.ppp.dev, определенной в интерфейсе модуля

Список модулей хранится в файле /etc/nixos/nixos/modules/module-list.nix. Добавим в этот файл ссылку на наш модуль, чтобы Nix определил его:

[# … ./tasks/swap.nix ./tasks/swraid.nix ./tasks/tty-backgrounds.nix# /path/to/pppd.nix]

Пересобрав руководство (manual) видим, что в нем появилось описание нашей настройки.

Теперь в файл конфигураци можно добавить атрибут ppp:

# …services = {# … ppp = { dev = “ttyACM0”; };};

После пересборки системы:

$ sudo nixos-rebuild switch

в каталоге /etc/ppp появятся скрипты дозвона:

$ cat /etc/ppp/peers/bwcttyACM0230400defaultroute…

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

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

Ресурсы для скачивания

Источник: https://www.ibm.com/developerworks/ru/library/l-nix_4/

Мои приключения с NixOS, часть 1

Nix os установка

Недавно у меня стало заканчиваться место на диске, в связи с экспериментами с виртуализацией, и я решил попробовать включить сжатие на всю ФС.

Беглый гуглёж показал, что связка LVM + ext4 сжатие не поддерживает, и чтобы получить возможность компрессии ФС, нужно мигрировать на другую ФС, я выбрал btrfs, поскольку она поддерживает компрессию.

Самый простой способ сменить разметку диска – переразметить его с переустановкой системы, так что я решил воспользоваться поводом и поставить NixOS в качестве эксперимента, благо времени на настройку у меня в данный момент достаточно.

NixOS – дистрибутив GNU/Linux, основанный на пакетном менеджере Nix, использующем свой функциональный DSL. Вот некоторые из её преимуществ, которые и заинтересовали меня:

  • Возможность полностью декларативной настройки системы.Вся конфигурация системы описывается в едином файле /etc/nixos/configuration.nix. Это касается и загрузчика, и initramfs, и запускаемых сервисов, и их настроек. Более того, поскольку конфигурация пишется на чистом функциональном языке, результат сборки системы из файла /etc/nixos/configuration.nix не зависит от текущего состояния системы и всегда один и тот же, что подводит ко второму достоинству.
  • Надёжные обновления.Из сказанного в предыдущем пункте также следует, что обновление системы так же надёжно, как установка системы с нуля.
  • Все изменения конфигурации атомарны.Каждое изменение конфигурационного файла с последующей перестройкой системы порождает новое поколение, при этом система всегда остаётся в консистентном состоянии, отвечающем текущему состоянию конфигурационного файла, и всегда есть возможность откатиться на любое предыдущее состояние системы.
  • Интеграция nix с пакетными менеджерами различных языков. Более того, его можно использовать как менеджер зависимостей для C++. Более полное завлекалово можно посмотреть здесь. Для меня одним из сигналов стало то, что на NixOS Wiki я нашёл более актуальную информацию по GVT-g, чем на Arch Wiki.

Теперь, когда мы разобрались, зачем это нам может быть нужно, посмотрим, что здесь с установкой. Скачать образ NixOS можно здесь. Доступны различные варианты загрузки, как классические образы дисков, так и VirtualBox appliances, AMI для Amazon EC2 и образы для Microsoft Azure. Рассмотрим установку с образа LiveCD. Записать образ на диск/флешку можно с помощью dd.

После загрузки мы получим в управление консоль, откуда можно либо запустить графический интерфейс с помощью systemctl start display-manager, либо провести установку прямо из консоли. Графического установщика пока нет. На tty8(Alt-F8) доступен мануал NixOS. В принципе, весь порядок установки описан в нём достаточно подробно, поэтому я лишь кратко перескажу порядок установки:

  1. Настроить сеть в установщике с помощью NetworkManager, либо вручную.
  2. Разбить диск на разделы и отформатировать их.
  3. Примонтировать все разделы системы в /mnt и поддиректории.
  4. Сгенерировать начальный файл конфигурации: # nixos-generate-config –root /mnt
  5. Поправить файл конфигурации /etc/nixos/configuration.nix. Он прокомментирован, поэтому с начальной настройкой проблем быть не должно. Если настраиваете Wi-Fi с помощью networkmanager, нужно не забыть его добавить в environment.systemPackages и сказать NixOS, что используется он, а не wpa_supplicant: # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.networking.networkmanager.enable = true;

    Также имеет смысл сразу включить в список системных пакетов w3m или links для просмотра документации, либо какой-нибудь DM. Настройка для разных DE и DM отличается, поэтому здесь я не буду на ней останавливаться.

    Также стоит заметить, что помимо системного набора пакетов, у каждого пользователя есть свой собственный набор пакетов, задаваемый в переменной users.user..packages. Кроме того, пакеты можно устанавливать, не прописывая их в системной конфигурации, с помощью команды nix-env -i .

    Удалять, соответственно nix-env -e . Эти команды можно выполнять, как от имени суперпользователя, так и от имени обычного пользователя. В первом случае пакет устанавливается общесистемно, во втором – локально для установившего пользователя. При этом также используются различные каналы установки, т. е.

    система у вас может обновляться из канала nixos-stable, а пользовательские пакеты – из nixos-unstable. Можно включить автообновление:
    system.autoUpgrade.enable = true;

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

  6. Собственно установка:

    В конце установки вас попросят установить пароль для root.После этого шага, если вы где-то напартачили в конфигурации, nixos-install после правок можно будет запустить заново.

  7. Система установлена, можно перезагружаться.

Теперь несколько слов об опыте использования. Останавливаться на том, как выполняется администрирование системы, я не буду, это описано в мануале, да и я сам с этим не до конца разобрался. Поэтому просто напишу о некоторых особенностях, с которыми мне довелось столкнуться.

Как я уже упоминал ранее, каждая пересборка системы с помощью nixos-rebuild switch генерирует новую запись в загрузчике. Если конфиг часто меняется, это приводит к захламлению меню загрузчика, что может мешать в случае, если загрузчиком является systemd-boot. Почистить мусор от старых поколений можно командами:

# nix-collect-garbage -d# nix-rebuild switch

В этом случае, удалится всё, что относится ко всем поколениям, кроме последнего. Первую команду можно также выполнить от имени пользователя, но в этом случае удалится не всё, например, останутся лишние записи в загрузчике.

Также мне понадобилось использовать программу, не вошедшую в репозитории NixOS – acpilight. Эта программа позволяет рулить подсветкой дисплея и клавиатуры через ACPI.

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

Пример оверлея можно посмотреть у меня в репозитории.

Из интересных фич, на которые я наткнулся при чтении мануала по nixpkgs, можно отметить возможность создания кастомных пакетов для Vim и Emacs, включающих в себя уже готовую конфигурацию и набор плагинов.

Также можно отметить возможность создания отдельных окружений для разработки с помощью nix-shell. Например, вот так выглядит создание окружения для этого блога:
Создаём файл shell.nix для nix-shell:

$(nix-build '' -A bundix)/bin/bundix

Полученный файл shell.nix будет иметь вид вроде:

with (import {});let env = bundlerEnv { name = “setser.github.io-bundler-env”; inherit ruby; gemfile = ./Gemfile; lockfile = ./Gemfile.lock; gemset = ./gemset.nix; groups = [ “default” “jekyll_plugins” ]; };in stdenv.mkDerivation { name = “setser.github.io”; buildInputs = [ env ];}

Теперь можно запустить nix-shell, и в нём собирать проект. С помощью nix-build можно собрать пакет с приложением(в данном случае блогом), он будет лежать в result.

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

Что касается количества пакетов и их свежести, repology.org говорит, что у NixOS с этим всё очень даже неплохо: по количеству пакетов и по их свежести она входит в первые пять репозиториев. Необходимость освоения нового языка для конфигурации несколько повышает порог вхождения.

NixOS – весьма перспективная система, но в данный момент есть всё ещё некоторые шероховатости, особенно при работе с проектами на Haskell. Некоторые её особенности, такие как, например, воспроизводимость сборки системы, будут полезны в CI/CD и при отладке. Декларативная конфигурация полезна для облачных приложений, а атомарные обновления – крайне полезная вещь для десктопа, да и не только.

UPD: залил свой конфиг на GitHub. Также добавил в статью пример оверлея.

Источник: https://setser.github.io/2019/02/01/nixos-part-1.html

Nix: начало

Nix os установка

Всем привет!

Итак, от идейной теории перейдём к практике. Надо же, наконец, попробовать этот Nix на вкус…

Платформа

Я долго думал, где же проводить все свои эксперименты, и решил-таки делать их на NixOS, через VirtualBox. Конечно, заявлено о работе Nix и на OS X, но уж лучше на NixOS, нативнее будет. 😉 Сказано – сделано. Иду сюда и скачиваю последний (а именно версии 15.09) образ для VB. Импортирую, запускаю, вижу знакомый KDE. Начнём. Все манипуляции проводятся в Konsole.

ВАЖНО! У меня нет цели тупо продублировать официальное Nix-руководство на русском языке. В рамках этой и следующих статей я лишь хочу пройтись по интересующим меня практичным аспектам работы с Nix. Разумеется, особое ударение будет сделано на Haskell-разработку в Nix-среде. 😉

Устанавливаем пакет

В начале мы имеем фактически голую систему, в которой нет даже Vim. Вот с него и начнём.

Простейший способ установить какой-либо пакет на NixOS таков: идём сюда и ищем пакет. Нахожу vim-7.4.827, нажимаю на него – и вижу следующее:

Install command: $ nix-env -iA nixos.pkgs.vim (NixOS channel)Nix expression: pkgs/applications/editors/vim/default.nixPlatforms: i686-linux, x86_64-linuxHomepage: http://www.vim.orgLicense: Not specifiedMaintainers: Jason O'Conal Long description: Not specified

Первая строка – то что нам нужно, название Install command говорит само за себя. Ввожу:

$ nix-env -iA nixos.pkgs.viminstalling ‘vim-7.4.827’these paths will be fetched (5.65 MiB download, 27.06 MiB unpacked): /nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827fetching path ‘/nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827’…*** Downloading ‘https://cache.nixos.org/nar/1pxi5nvpvfn27lxi789qjqb5gp2dbsabagc2y7ldnj8c20py9ix1.nar.xz’ (signed by ‘cache.nixos.org-1’) to ‘/nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827’… % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed100 5782k 100 5782k 0 0 601k 0 0:00:09 0:00:09 –:–:– 681kbuilding path(s) ‘/nix/store/77qhgp784j2qia0v9dj98b76cra70qmm-user-environment’created 2 symlinks in user environment

Сразу после этого команда vim уже доступна в консоли. А теперь давайте разбираться.

Где

Во-первых, куда именно установился vim? Как мы уже знаем, Nix устанавливает каждый пакет в своё уникальное место, где-то в недрах /nix/store/. Более того, мы уже видели это место, оно было показано нам в сообщении при установке:

these paths will be fetched (5.65 MiB download, 27.06 MiB unpacked): /nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827

Давайте проверим:

$ ls /nix/store/ | grep vimyblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827

Да, это тот самый хэш. Заглянем внутрь:

$ ls /nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827/bin share

Вполне ожидаемое содержимое: внутри bin лежат исполняемые файлы (такие как vim, vimdiff, vimtutor), а внутри share/vim/vim74/ – Vim-плагины.

Профиль и окружение

Итак, vim теперь живёт в своём уютном мирке. Однако если мы проверим, откуда доступна команда vim, то увидим следующее:

$ which vim/home/demo/.nix-profile/bin/vim

Хм… Странно. Разве мы не должны были увидеть /nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827/bin/vim? Что это за ~/.nix-profile/ такой?

Посмотрим-ка на него внимательнее:

$ ls -al ~/.nix-profile… .nix-profile -> /nix/var/nix/profiles/per-user/demo/profile

Ага, перед нами символьная ссылка, и ведёт она куда-то в недра /nix. Заглянем поглубже:

$ ls -al /nix/var/nix/profiles/per-user/demo/profile… /nix/var/nix/profiles/per-user/demo/profile -> profile-1-link

Опять ссылка. Глубже:

$ ls -al /nix/var/nix/profiles/per-user/demo/profile-1-link… /nix/var/nix/profiles/per-user/demo/profile-1-link -> /nix/store/77qhgp784j2qia0v9dj98b76cra70qmm-user-environment И вновь ссылка, на этот раз на нечто любопытное: в хранилище /nix/store мы видим некое user-environment. Так, пользовательское окружение… Уж не то ли самое это окружение, куда устанавливается мой софт? Проверим:
$ ls -al /nix/store/77qhgp784j2qia0v9dj98b76cra70qmm-user-environment/total 92… bin -> /nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827/bin… manifest.nix -> /nix/store/2i6jvy2q2m8gcgiszsh4zw5dvx7133hd-env-manifest.nix… share -> /nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827/share

Так вот же оно! Внутри моего окружения я вижу ссылки на части установленного мною vim. Теперь-то понятно, почему команда vim была доступна через ~/.nix-profile/: это просто цепочка ссылок. Концептуально её можно изобразить так:

my-profile -> user-environment -> software

Только что мы узнали нечто очень важное. Оказывается, утверждение, что “у каждого пользователя есть своё собственное окружение, куда он устанавливает софт”, не совсем корректно, ибо может ввести нас в заблуждение.

Складывается впечатление, будто в моём домашнем каталоге есть какой-то особый каталог, в который устанавливаются мои пакеты, типа /home/demo/.my-nix-packages/trali-vali/vim-7.4.827/.

В действительности же это не так: все пакеты хранятся в /nix/store, а в моём профиле есть лишь упоминание о некоторых из них.

Кстати, а давайте проверим эту догадку. Вдруг мы неправы?

Общий vim

Создадим-ка второго пользователя, по имени demo2, и, войдя под ним, проверим:

$ vimvim: command not found

Мы знаем, что vim в системе уже существует, но пользователь demo2 не знает об этом. Давайте повторим процедуру установки vim:

$ nix-env -iA nixos.pkgs.viminstalling ‘vim-7.4.827’

Опа, как мы и предполагали! Пользователь demo2 запросил установку пакета vim, но поскольку этот пакет уже живёт в нашей системе, никакой установки в действительности не произошло. Уверен, вы уже догадались, что же произошло на самом деле: в окружении пользователя demo2 просто появились символьные ссылки на тот же самый пакет vim. Убедимся же в этом:

$ which vim/home/demo2/.nix-profile/bin/vim$ ls -al ~/.nix-profile… /home/demo2/.nix-profile -> /nix/var/nix/profiles/per-user/demo2/profile$ ls -al /nix/var/nix/profiles/per-user/demo2/profile… /nix/var/nix/profiles/per-user/demo2/profile -> profile-1-link$ ls -al /nix/var/nix/profiles/per-user/demo2/profile-1-link… /nix/var/nix/profiles/per-user/demo2/profile-1-link -> /nix/store/77qhgp784j2qia0v9dj98b76cra70qmm-user-environment$ ls -al /nix/store/77qhgp784j2qia0v9dj98b76cra70qmm-user-environmenttotal 92… bin -> /nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827/bin… manifest.nix -> /nix/store/2i6jvy2q2m8gcgiszsh4zw5dvx7133hd-env-manifest.nix… share -> /nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827/shareЭто именно то, что мы и ожидали увидеть: тот же самый хэш, та же самая версия vim! Таким образом, концептуально сложившуюся ситуацию можно изобразить так:
demo-profile -> /nix/store/user-environment -> /nix/store/vim-7.4.827 /demo2-profile

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

Видит око, да зуб неймёт

Постойте, возразите вы, но если два пользователя demo и demo2 пользуются одним и тем же пакетом vim – это же опасно! А что если demo2 возьмёт и удалит его! Ну или сломает чего-нибудь! Это что же, у demo vim тоже исчезнет или поломается??!

Резонное возражение. Давайте похулиганим от имени demo2. Попробуем переименовать исполняемый файл vim:

$ cd /nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827/bin$ mv vim vimTraliValimv: cannot move ‘vim’ to ‘vimTraliVali’: Read-only file system

Ага, разбежались! Вы должны помнить из предыдущей статьи, что Nix воспринимает пакеты так же, как значения в Haskell-коде: будучи единожды созданными, они уже не могут быть изменены. В этом и заключается Nix-чистота (purity). Оба пользователя ссылаются на пакет vim, но ни один из них не владеет им.

Ну хорошо, возразите вы вновь, но ведь Nix же умеет удалять пакеты?! Ладно, не будем ничего ломать, но что произойдёт, если demo2 удалит vim?

Разумеется, Nix умеет удалять пакеты, сделаем же это:

$ nix-env –uninstall vimuninstalling ‘vim-7.4.827’building path(s) ‘/nix/store/0fw4wpbrgix115lh93ahfik2r0hvv7n0-user-environment’created 0 symlinks in user environment$ vimvim: command not found

О нет, что же мы натворили-то?! Как же теперь быть бедному demo? А давайте проверим. Перелогинимся под demo и:

$ vim –versionVIM – Vi IMproved 7.4 (2013 Aug 10, compiled Jan 01 1970 00:00:01)Included patches: 1-827

Магия? Вовсе нет. Когда мы выполнили команду:

$ nix-env –uninstall vim

никакого удаления в действительности не произошло. В самом деле, если бы пакет vim реально исчез – как бы тогда его мог видеть пользователь demo? Как вы уже, вероятно, догадались, произошло только одно: удаление той самой символьной ссылки на пакет vim из профиля demo2.

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

Это похоже на указатель в языке C: если мы потеряли некую “ссылку” на область памяти в куче – всё, эта память потеряна для нас навсегда, однако это вовсе не означает, что эта память тут же была очищена, ведь на эту же область памяти вполне может ссылаться кто-то другой.

Пока пользователь demo продолжает ссылаться на пакет vim, этот пакет никак не может быть удалён. Оно и понятно: если бы мы могли удалить пакет, на который кто-то ссылается, тогда у кого-то что-нибудь сломалось бы, а это недопустимо.

Ну хорошо, а что же будет, если и demo удалит vim? Сказано – сделано:

$ nix-env –uninstall vimuninstalling ‘vim-7.4.827’$ vimvim: command not found

Всё, скончался наш vim. Впрочем, скончался ли? Ведь мы же помним тот самый хэш, ну-ка проверим:

$ ls -al /nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827/bin/vim… /nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827/bin/vim

Опа… А почему же vim никуда не исчез? А потому что мы мусор не почистили.

Помните идею GC (сборщика мусора)? Удалять только то, что никому не нужно. Так вот в Nix есть собственный GC. Пакет vim больше никому не нужен, ведь оба пользователя, когда-то работающие с ним, удалили его. Значит, теперь можно почистить мусор. Это не происходит автоматически, нужно запустить команду:

И вот теперь – всё. Помимо всего прочего, мы увидим строку:

deleting ‘/nix/store/yblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827’

Покойся с миром, vim.

А если воскресить?

Давайте заново установим vim. В конце концов, он мне нужен, привык я к нему:

$ nix-env -iA nixos.pkgs.viminstalling ‘vim-7.4.827’…

И вот vim вновь с нами. Но самое интересное в том, что если мы посмотрим в /nix/store/, то увидим:

$ ls /nix/store/ | grep vimyblqgyrn4jgwfg89qp9041i0n2z26v5b-vim-7.4.827

Круто, правда? Хэш-то тот же самый! А всё потому, что это не просто какое-то случайное криптозначение, а хэш от входных конфигурационных параметров для данного пакета. Ну а раз vim тот же самый и входные параметры те же – значит и хэш останется прежним.

И сколько бы раз мы ни удаляли и не устанавливали пакет vim одной и той же версии – результат будет гарантированно одинаковым.

Да-да, это хорошо нам знакомая философия чистой функции – если на вход подали те же значения, то и на выходе всегда получим одно и то же.

В итоге

В итоге мы поняли, что Nix – весьма умная система. Лишнюю работу не делает, чистоту хранит, безопасно удаляет. Ну точно в духе Haskell! 😉

Разумеется, всё вышеизложенное – это лишь азы азов. А вот в следующих статьях начнутся вещи поинтереснее.

Источник: https://ruhaskell.org/posts/utils/2015/11/26/nix-hello-world.html

NixOS: обзор, установка и использование дистрибутива

Nix os установка

Сколько раз в жизни вы переустанавливали Linux? А сколько раз устанавливали одинаковый набор пакетов на несколько разных машин? И не приходилось ли вам начинать все сначала из-за неудачного обновления системы или конфигов? Все это не только напрягает, но и грозит серьезными потерями, если речь идет о бизнесе. Избежать таких проблем поможет NixOS — дистрибутив, который можно в одну команду привести к нужному вам состоянию.

Декларативный и функциональный

NixOS — это дистрибутив Linux, построенный вокруг двух ключевых идей:

  1. Декларативное описание конфигурации (или, лучше сказать, состояния) системы.
  2. Функциональный менеджер пакетов, допускающий откаты и параллельную установку приложений.

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

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

РЕКОМЕНДУЕМ:
Гипервизор на Linux KVM и libvirt c поддержкой LVM

Другими словами, если вам нужна система с установленным Apache, PHP, MySQL, SSH и с некоторыми дополнительными настройками, вы просто описываете все это в одном конфиге, а затем отдаете команду на развертывание системы. Независимо от того, свежеустановленная это ОС или уже используемая, вы получите абсолютно идентичную систему с идентичным набором пакетов и конфигов.

Все это возможно благодаря пакетному менеджеру Nix. В классических дистрибутивах Linux пакетный менеджер при установке пакета «размазывает» его содержимое по всей системе: запускаемые файлы в /usr/bin, библиотеки в /usr/lib, остальные компоненты — в /usr/share.

В результате ты получаете проблемы с неудачным обновлением/удалением пакетов (когда могут остаться файлы-сироты), ад зависимостей (когда два приложения требуют разные версии /usr/lib/libjpeg.so, например) и легкий способ уничтожить всю систему, неудачно обновившись.

Пакетный менеджер Nix размещает все установленные пакеты в собственных подкаталогах внутри каталога /nix/store. К примеру, установленный пакет Git будет располагаться в каталоге /nix/store/nawl092prjblbhvv16kxxbk6j9gkgcqm-git-2.14.

1, где набор цифр — это хеш, образованный от окружения сборки пакета: файлов исходников, дерева зависимостей, флагов компилятора и другого.

Поэтому с помощью Nix можно установить одновременно не только две версии одного приложения, но и даже две разные сборки.

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

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

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

NixOS позволяет устанавливать софт не только root, но и обычным пользователям (в этом случае пакет будет установлен в домашний каталог), а также имеет встроенный сборщик мусора, который автоматически удалит все пакеты-зависимости, если они больше никому не нужны.

В NixOS нет инсталлятора, но если вы когда-нибудь устанавливали Arch Linux, то у вас не должно возникнуть проблем. Для начала скачиваем последнюю версию NixOS с официального сайта и записываем ее на флешку:

$ wget https://d3g5gsiof5omrk.cloudfront.net/nixos/18.03/nixos-18.03.133192.45f52f765cd/nixos-graphical-18.03.133192.45f52f765cd-x86_64-linux.iso$ sudo dd if=nixos-graphical-18.03.133192.45f52f765cd-x86_64-linux.iso of=/dev/sdX

Затем перезагружаем машину и грузимся с флешки. NixOS встретит вас приветствием командной строки.

Первое, что мы должны сделать, — подготовить диск для установки. Проще всего сделать это с помощью parted (в данном примере мы создаем один большой раздел ext3 на диске с разметкой в стиле DOS):

(parted) mkpart primary ext4 0% 100%

Мы будем ставить систему на зашифрованный диск, поэтому для начала инициализируем шифрование:

# export NIXOS_NAME=”name” # Придумай свое имя# cryptsetup luksFormat /dev/sda1# cryptsetup luksOpen /dev/sda1  ${NIXOS_NAME}

Затем примонтируем диск к каталогу /mnt:

# mkfs.ext4 -L ${NIXOS_NAME} /dev/mapper/${NIXOS_NAME}# mount /dev/mapper/${NIXOS_NAME} /mnt

Теперь обновляем репозитории:

И генерируем дефолтовые файлы конфигурации:

# nixos-generate-config –root /mnt

Команда сохранит на диск два файла: configuration.nix и hardware-configuration.nix. Первый — это и есть тот самый файл описания состояния системы, с которым мы будем работать в дальнейшем. Содержимое второго изменять не надо — оно создается автоматически на основании железа, на которое устанавливается NixOS.

Наконец, устанавливаем систему и перезагружаемся:

Установка NixOS

Configuration.nix

Файл configuration.nix — основа дистрибутива. В нем пользователь указывает всю желаемую/необходимую конфигурацию (состояние) системы от пользователей и пакетов до шрифтов и в любой момент может ее изменять. Система будет выглядеть ровно так, как ее опишет пользователь в этом файле.

Конечно, можно не заморачиваться и найти уже готовый конфиг на том же Гитхабе и взять его «попользоваться». Но это не имеет особого смысла, потому что рано или поздно придется во всем разбираться самому, да и попасться вам может какое-нибудь непотребство, а не конфиг.

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

и перезагрузиться.

Перед этим работоспособность конфига можно проверить командой

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

Выбираем загрузчик

Если вы установили систему на диск с разметкой DOS (как было описано в статье), то в configuration.nix необходимо добавить следующие строки:

boot.loader.grub.enable = true;boot.loader.grub.version = 2;# Загрузчик должен быть установлен на /dev/sdaboot.loader.grub.device = “/dev/sda”;# Включаем поддержку зашифрованных дисковboot.loader.grub.enableCryptodisk = true;

Для UEFI-систем достаточно двух строчек:

boot.loader.systemd-boot.enable = true;# Разрешить EFI вносить изменения boot.loader.efi.canTouchEfiVariables = true;

Имя машины и часовой пояс

Здесь все совсем просто:

networking.hostName = “mymachine”; time.timeZone = “Europe/Moscow”;

Заодно сразу активируем NetworkManager:

networking.networkmanager.enable = true;

Создаем пользователей

Добавим пользователя vasya:

    # Дополнительная информация    description = “Userov User”;     # Группы, в которые входит пользователь    extraGroups = [ “networkmanager” ];

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

РЕКОМЕНДУЕМ:
Аналоги Bash Unix инструментов в PowerShell Windows

Ставим пакеты

Повседневно используемые программы вроде htop, Thunderbird и Vim устанавливаются без особых заморочек. Перечисляете то, что хотите поставить, сохраняете, делаете nixos-rebuil switch и пользуетесь:

environment.systemPackages = with pkgs; [

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

# nix-env -iA “package_name”.

Команду можно выполнять с правами root и без. В первом случае пакет будет установлен общесистемно и станет доступным всем пользователям, во втором — только установившему пользователю.

В любом случае все пакеты устанавливаются в /nix/store, поэтому, если два пользователя поочередно установят один и тот же пакет, он будет скачан только один раз, а пользователи получат доступ к нему через символические ссылки.

Символические ссылки не перезаписываются при переустановке/обновлении пакета. Поэтому пользователи могут ставить разные версии одних и тех же пакетов без «пересечений».

С названиями пакетов могут быть сложности, поэтому лучше проверять правильность их написания тут.

Хранилище пакетов NixOS

Ставим проприетарные пакеты

С проприетарными пакетами в NixOS не все так просто. Можно разрешить ставить любые проприетарные пакеты командой export NIXPKGS_ALLOW_UNFREE=1, но лучше будет разрешать ставить только нужные, а все остальные будут под запретом. Например, так:

    allowUnfreePredicate = (pkg: elem (builtins.parseDrvName pkg.name).name [ “package_name_1” “package_name_2” ]);

GUI

NixOS, как и любой другой дистрибутив, позволяет выбирать GUI. Для этого понадобится примерно такая конструкция:

    # Выбираем окружение рабочего стола    desktopManager.gnome3.enable = true;    windowManager.i3.enable = true;

Другие настройки

NixOS поддерживает огромное количество настроек, которые можно указать в configuration.nix. Узнать о них можно с помощью команды nixos-option:

This attribute set contains:

Но это только разделы настроек, можно копнуть и глубже:

This attribute set contains:

И еще глубже:

$ nixos-option services.opensshThis attribute set contains:challengeResponseAuthentication

Также можно использовать онлайн-поисковик по опциям.

NixOS и опции управления сервисами

Откаты

Так же как и пакеты, конфигурации не перезаписываются, вместо этого создаются новые для возможности переключаться между ними и безболезненно откатывать состояние. Все версии файла, которые были применены командой nixos-rebuild, хранятся в GRUB, и при загрузке можно будет выбрать не дефолтную = последнюю версию, а нужную и потом уже сделать ее загружаемой по умолчанию.

Конфигурации NixOS в GRUB

Посмотреть список доступных конфигураций позволяет команда ls -l /nix/var/nix/profiles/system-*-link.

Можно и без перезагрузки откатиться к предыдущему конфигу командой nixos-rebuild switch –rollback или к еще более раннему командой /nix/var/nix/profiles/system-N-link/bin/switch-to-configuration switch, где N — это номер версии конфига. Чтобы этот конфиг загружался по умолчанию, нужна команда /run/current-system/bin/switch-to-configuration boot.

Обновления

NixOS можно обновлять через каналы. Канал — это нечто вроде репозитория пакетов. И так же, как репозитории, они могут быть стабильные и нестабильные (для смелых). Существуют и small-каналы — своего рода серверные редакции репозиториев с быстрыми security-обновлениями и небольшим количеством исключительно серверного софта для платформы x86_64.

Посмотреть доступные каналы можно по ссылке.

Для переключения на канал достаточно двух команд:

# nix-channel –add ссылка# nixos-rebuild switch –upgrade

Обновления можно получать автоматическими по расписанию. Для этого достаточно добавить в конфиг строку

system.autoUpgrade.enable = true;

Чтобы обновления пакетов соответствовали версии системы, также необходима строка

system.stateVersion = “18.03”;

где 18.03 — версия системы.

РЕКОМЕНДУЕМ:
Использование NixOS

Выводы

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

(8 4,50 из 5)
Загрузка…

Источник: https://tech-geek.ru/nixos/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.