Содержание


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

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

Comments

Серия контента:

Этот контент является частью # из серии # статей: Функциональный менеджер пакетов Nix

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

Этот контент является частью серии:Функциональный менеджер пакетов Nix

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

1. Введение

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

Рисунок 1. Описание компонентов системы
Рисунок 1. Описание компонентов системы
Рисунок 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];
}

4. Установка

Загрузившись с установочного диска, входим под 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"; }
 ]

4.4. Настройка загрузчика

В качестве загрузчика в NixOS используется Grub. Раздел, на который следует установить загрузчик, указывается в атрибуте boot.grubDevice. К примеру:

 boot = {
  # ...
  grubDevice = "/dev/sda";
 };

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

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

 boot = {
  # ...
  extraGrubEntries = "\n title Windows\n chainloader (hd0,1)+1\n ";
 };

4.5. Установка системы

Получится файл конфигурации подобный этому (/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 руководстве.

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

 $ nixos-install

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

 $ reboot

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

 $ passwd

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

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

5. Конфигурирование

В 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) ALL
user  ALL=(ALL)    NOPASSWD: ALL
";
...
}

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

$ nixos-rebuild switch

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

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

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

$ nixos-rebuild --rollback boot

6. Обновление системы

Для поддержания системы в актуальном состоянии нужно изредка обновлять её из репозитария. Это делает скрипт 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}
230400
defaultroute
user '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/bwc
ttyACM0
230400
defaultroute
...

8. Заключение

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

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


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


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=538146
ArticleTitle=Функциональный менеджер пакетов Nix: Часть 4. Дистрибутив NixOS
publish-date=09232010