Правильный Linux. Пробуем NixOS, уникальный, странный и очень удобный дистрибутив
Сколько раз в жизни ты переустанавливал Linux? А сколько раз устанавливал одинаковый набор пакетов на несколько разных машин? И не приходилось ли тебе начинать все сначала из-за неудачного обновления системы или конфигов? Все это не только утомляет, но и грозит серьезными потерями, если речь идет о бизнесе. Избежать таких проблем поможет NixOS — дистрибутив, который можно в одну команду привести к нужному тебе состоянию.
Декларативный и функциональный
NixOS — это дистрибутив Linux, построенный вокруг двух ключевых идей:
Вместо этого NixOS предлагает описать необходимое состояние системы в специальном конфигурационном файле, где будет перечислено все, начиная от пакетов и заканчивая возможностью логина по SSH с помощью пароля. Далее достаточно выполнить одну команду, и, в каком бы состоянии система ни находилась в данный момент, пакетный менеджер приведет ее к требуемому.
Другими словами, если тебе нужна система с установленным 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 с официального сайта и записываем ее на флешку:
Затем перезагружаем машину и грузимся с флешки. NixOS встретит тебя приветствием командной строки.
Первое, что мы должны сделать, — подготовить диск для установки. Проще всего сделать это с помощью parted (в данном примере мы создаем один большой раздел ext3 на диске с разметкой в стиле DOS):
Мы будем ставить систему на зашифрованный диск, поэтому для начала инициализируем шифрование:
Теперь обновляем репозитории:
И генерируем дефолтовые файлы конфигурации:
Команда сохранит на диск два файла: configuration.nix и hardware-configuration.nix. Первый — это и есть тот самый файл описания состояния системы, с которым мы будем работать в дальнейшем. Содержимое второго изменять не надо — оно создается автоматически на основании железа, на которое устанавливается NixOS.
Наконец, устанавливаем систему и перезагружаемся:
Устанавливаем NixOS
Configuration.nix
Файл configuration.nix — основа дистрибутива. В нем пользователь указывает всю желаемую/необходимую конфигурацию (состояние) системы от пользователей и пакетов до шрифтов и в любой момент может ее изменять. Система будет выглядеть ровно так, как ее опишет пользователь в этом файле.
Конечно, можно не заморачиваться и найти уже готовый конфиг на том же Гитхабе и взять его «попользоваться». Но это не имеет особого смысла, потому что рано или поздно придется во всем разбираться самому, да и попасться тебе может какое-нибудь непотребство, а не конфиг.
Чтобы изменения конфигурации вступили в силу, необходимо выполнить команду
и перезагрузиться.
Перед этим работоспособность конфига можно проверить командой
Правим конфиг NixOS
Выбираем загрузчик
Выбери жизнь, выбери семью, выбери загрузчик.
Если ты установил систему на диск с разметкой DOS (как было описано в статье), то в configuration.nix необходимо добавить следующие строки:
Для UEFI-систем достаточно двух строчек:
Имя машины и часовой пояс
Здесь все совсем просто:
Заодно сразу активируем NetworkManager:
Создаем пользователей
Добавим пользователя vasya:
По умолчанию у пользователя не будет пароля, поэтому сразу после логина под его именем стоит запустить команду passwd и указать пароль.
Ставим пакеты
Повседневно используемые программы вроде htop, Thunderbird и Vim устанавливаются без особых заморочек. Перечисляешь то, что хочешь поставить, сохраняешь, делаешь nixos-rebuil switch и пользуешься:
Эти же пакеты можно устанавливать не только записывая их названия в конфигурационный файл, но и командой
Команду можно выполнять с правами root и без. В первом случае пакет будет установлен общесистемно и станет доступным всем пользователям, во втором — только установившему пользователю. В любом случае все пакеты устанавливаются в /nix/store, поэтому, если два пользователя поочередно установят один и тот же пакет, он будет скачан только один раз, а пользователи получат доступ к нему через символические ссылки.
Символические ссылки не перезаписываются при переустановке/обновлении пакета. Поэтому пользователи могут ставить разные версии одних и тех же пакетов без «пересечений».
С названиями пакетов могут быть сложности, поэтому лучше проверять правильность их написания тут.
Хранилище пакетов NixOS
Ставим проприетарные пакеты
С проприетарными пакетами в NixOS не все так просто. Можно разрешить ставить любые проприетарные пакеты командой export NIXPKGS_ALLOW_UNFREE=1, но лучше будет разрешать ставить только нужные, а все остальные будут под запретом. Например, так:
GUI
NixOS, как и любой другой дистрибутив, позволяет выбирать GUI. Для этого понадобится примерно такая конструкция:
Другие настройки
NixOS поддерживает огромное количество настроек, которые можно указать в configuration.nix. Узнать о них можно с помощью команды nixos-option:
Но это только разделы настроек, можно копнуть и глубже:
И еще глубже:
Также можно использовать онлайн-поисковик по опциям.
NixOS и опции управления сервисами
Откаты
Так же как и пакеты, конфигурации не перезаписываются, вместо этого создаются новые для возможности переключаться между ними и безболезненно откатывать состояние. Все версии файла, которые были применены командой nixos-rebuild, хранятся в GRUB, и при загрузке можно будет выбрать не дефолтную = последнюю версию, а нужную и потом уже сделать ее загружаемой по умолчанию.
Конфигурации NixOS в GRUB
Посмотреть список доступных конфигураций позволяет команда
Можно и без перезагрузки откатиться к предыдущему конфигу командой
или к еще более раннему командой
где N — это номер версии конфига. Чтобы этот конфиг загружался по умолчанию, нужна команда
Обновления
NixOS можно обновлять через каналы. Канал — это нечто вроде репозитория пакетов. И так же, как репозитории, они могут быть стабильные и нестабильные (для смелых). Существуют и small-каналы — своего рода серверные редакции репозиториев с быстрыми security-обновлениями и небольшим количеством исключительно серверного софта для платформы x86_64. Посмотреть доступные каналы можно по ссылке.
Для переключения на канал достаточно двух команд:
Обновления можно получать автоматически по расписанию. Для этого достаточно добавить в конфиг строку
Чтобы обновления пакетов соответствовали версии системы, также необходима строка
где 18.03 — версия системы.
Выводы
При всей своей необычности NixOS весьма дружелюбен: не мешает пользователю работать, не создает горы хлама в системе и знает, что такое безопасность. К любым странностям со временем привыкаешь, и использовать NixOS повседневно на десктопе может оказаться очень удобно.
(c) Валерия Губарева
Digital Security (@DSecRU)
Сколько раз в жизни ты переустанавливал Linux? А сколько раз устанавливал одинаковый набор пакетов на несколько разных машин? И не приходилось ли тебе начинать все сначала из-за неудачного обновления системы или конфигов? Все это не только утомляет, но и грозит серьезными потерями, если речь идет о бизнесе. Избежать таких проблем поможет NixOS — дистрибутив, который можно в одну команду привести к нужному тебе состоянию.
Декларативный и функциональный
NixOS — это дистрибутив Linux, построенный вокруг двух ключевых идей:
- Декларативное описание конфигурации (или, лучше сказать, состояния) системы.
- Функциональный менеджер пакетов, допускающий откаты и параллельную установку приложений.
Вместо этого NixOS предлагает описать необходимое состояние системы в специальном конфигурационном файле, где будет перечислено все, начиная от пакетов и заканчивая возможностью логина по SSH с помощью пароля. Далее достаточно выполнить одну команду, и, в каком бы состоянии система ни находилась в данный момент, пакетный менеджер приведет ее к требуемому.
Другими словами, если тебе нужна система с установленным 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
Первое, что мы должны сделать, — подготовить диск для установки. Проще всего сделать это с помощью parted (в данном примере мы создаем один большой раздел ext3 на диске с разметкой в стиле DOS):
Код:
$ parted /dev/sda
(parted) mklabel msdos
(parted) mkpart primary ext4 0% 100%
(parted) quit
Код:
$ 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
Код:
$ nix-channel --update
Код:
$ nixos-generate-config --root /mnt
Наконец, устанавливаем систему и перезагружаемся:
Код:
$ nixos-install
Устанавливаем NixOS
Configuration.nix
Файл configuration.nix — основа дистрибутива. В нем пользователь указывает всю желаемую/необходимую конфигурацию (состояние) системы от пользователей и пакетов до шрифтов и в любой момент может ее изменять. Система будет выглядеть ровно так, как ее опишет пользователь в этом файле.
Конечно, можно не заморачиваться и найти уже готовый конфиг на том же Гитхабе и взять его «попользоваться». Но это не имеет особого смысла, потому что рано или поздно придется во всем разбираться самому, да и попасться тебе может какое-нибудь непотребство, а не конфиг.
Чтобы изменения конфигурации вступили в силу, необходимо выполнить команду
Код:
$ nixos-rebuild switch
Перед этим работоспособность конфига можно проверить командой
Код:
$ nixos-rebuild test
Правим конфиг NixOS
Выбираем загрузчик
Выбери жизнь, выбери семью, выбери загрузчик.
Если ты установил систему на диск с разметкой DOS (как было описано в статье), то в configuration.nix необходимо добавить следующие строки:
Код:
## Включаем GRUB
boot.loader.grub.enable = true;
## Нам нужен GRUB 2
boot.loader.grub.version = 2;
## Загрузчик должен быть установлен на /dev/sda
boot.loader.grub.device = "/dev/sda";
## Включаем поддержку зашифрованных дисков
boot.loader.grub.enableCryptodisk = true;
Код:
boot.loader.systemd-boot.enable = true;
## Разрешить EFI вносить изменения
boot.loader.efi.canTouchEfiVariables = true;
Имя машины и часовой пояс
Здесь все совсем просто:
Код:
networking.hostName = "mymachine";
time.timeZone = "Europe/Moscow";
Код:
networking.networkmanager.enable = true;
Создаем пользователей
Добавим пользователя vasya:
Код:
users.users.vasya = {
isNormalUser = true;
# Дополнительная информация
description = "Userov User";
# Группы, в которые входит пользователь
extraGroups = [ "networkmanager" ];
};
Ставим пакеты
Повседневно используемые программы вроде htop, Thunderbird и Vim устанавливаются без особых заморочек. Перечисляешь то, что хочешь поставить, сохраняешь, делаешь nixos-rebuil switch и пользуешься:
Код:
environment.systemPackages = with pkgs; [
htop
thunderbird
vim
]
Код:
$ nix-env -iA "package_name"
Символические ссылки не перезаписываются при переустановке/обновлении пакета. Поэтому пользователи могут ставить разные версии одних и тех же пакетов без «пересечений».
С названиями пакетов могут быть сложности, поэтому лучше проверять правильность их написания тут.
Хранилище пакетов NixOS
Ставим проприетарные пакеты
С проприетарными пакетами в NixOS не все так просто. Можно разрешить ставить любые проприетарные пакеты командой export NIXPKGS_ALLOW_UNFREE=1, но лучше будет разрешать ставить только нужные, а все остальные будут под запретом. Например, так:
Код:
{
allowUnfreePredicate = (pkg: elem (builtins.parseDrvName pkg.name).name [ "package_name_1" "package_name_2" ]);
}
GUI
NixOS, как и любой другой дистрибутив, позволяет выбирать GUI. Для этого понадобится примерно такая конструкция:
Код:
services.xserver = {
# Включаем иксы
enable = true;
# Выбираем окружение рабочего стола
desktopManager.gnome3.enable = true;
# и/или менеджер окон
windowManager.i3.enable = true;
};
Другие настройки
NixOS поддерживает огромное количество настроек, которые можно указать в configuration.nix. Узнать о них можно с помощью команды nixos-option:
Код:
$ nixos-option
This attribute set contains:
assertions
boot
containers
ec2
environment
fileSystems
fonts
gnu
gtkPlugins
hardware
...
Код:
$ nixos-option services
This attribute set contains:
accounts-daemon
acpid
activemq
...
Код:
$ nixos-option services.openssh
This attribute set contains:
allowSFTP
authorizedKeysFiles
challengeResponseAuthentication
enable
extraConfig
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
Код:
$ /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";
Выводы
При всей своей необычности NixOS весьма дружелюбен: не мешает пользователю работать, не создает горы хлама в системе и знает, что такое безопасность. К любым странностям со временем привыкаешь, и использовать NixOS повседневно на десктопе может оказаться очень удобно.
(c) Валерия Губарева
Digital Security (@DSecRU)