Декларативная разметка дисков в NixOS с помощью Disko: от конфигурации до готовой файловой системы
Ручная установка Linux обычно начинается одинаково: загрузка с Live-образа, запуск `fdisk` или `parted`, создание таблицы разделов, форматирование дисков в `ext4` или `btrfs`, настройка подтомов и последовательное монтирование всех компонентов в `/mnt`. Такой сценарий рабочий, но для NixOS он выглядит несколько противоречиво.
Главная идея NixOS заключается в том, что состояние системы описывается декларативно - в конфигурационных файлах. Поэтому ручная разметка диска плохо сочетается с общей философией дистрибутива. Если потребуется развернуть идентичную систему на другом ноутбуке, сервере или виртуальной машине, придётся заново вспоминать команды, размеры разделов и параметры монтирования.
Эту задачу решает Disko - утилита, позволяющая описать структуру накопителя в Nix-файле, а затем применить её одной командой. Такой подход превращает установку NixOS в воспроизводимый процесс: конфигурацию можно хранить в Git, изменять, переносить между машинами и использовать повторно. Практическое руководство по теме также доступно в материале о [декларативной разметке дисков NixOS](https://habr.com/ru/articles/1073844/?utm_campaign=1073844&utm_source=habrahabr&utm_medium=rss).
Ниже рассмотрим два варианта:
- простую схему с загрузочным и корневым разделами;
- конфигурацию с LUKS-шифрованием, swap и LVM.
Материал ориентирован прежде всего на новичков, которые только знакомятся с NixOS и хотят сразу выстроить правильный процесс установки.
Подготовка Live-среды
После загрузки установочного образа необходимо подключить компьютер к интернету. При проводном соединении обычно дополнительных действий не требуется. Для Wi-Fi можно воспользоваться стандартными средствами Live-системы, например `iwctl`, а затем проверить доступность сети с помощью `ping`.
Перед началом разметки полезно определить имя целевого диска:
```bash
lsblk
```
В виртуальной машине устройство может называться `/dev/vda`, на обычном компьютере - `/dev/sda`, а для NVMe-накопителя чаще используется `/dev/nvme0n1`. Это значение нужно проверять особенно внимательно: ошибочный выбор диска приведёт к удалению данных.
Далее перейдём во временный каталог:
```bash
cd /tmp
```
Именно здесь удобно хранить файл `disko.nix`, пока идёт установка. Конфигурацию можно написать вручную или взять за основу готовый пример из официального набора Disko. Шаблоны обычно содержат проверенные схемы для распространённых сценариев.
Базовая конфигурация Disko
Минимальный вариант включает GPT-разметку, EFI-раздел и корневую файловую систему. Упрощённая структура может выглядеть так:
```nix
{
disko.devices = {
disk.main = {
device = "/dev/vda";
type = "disk";
content = {
type = "gpt";
partitions = {
ESP = {
size = "1G";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
};
};
root = {
size = "100%";
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
};
};
};
};
};
}
```
Ключевой атрибут здесь - `disko.devices`. Именно его Disko анализирует при запуске. Внутри описываются физические накопители, разделы, файловые системы, шифрование, LVM, RAID и другие уровни хранения.
Атрибут `disk.main` задаёт имя конкретного диска. Название `main` условно: его можно заменить на `system`, `storage` или любое другое удобное обозначение. Важнее параметр `device`, где указывается реальный путь к накопителю.
Тип `gpt` определяет таблицу разделов. Раздел `ESP` форматируется в `vfat` и монтируется в `/boot`, что необходимо для загрузки систем в режиме UEFI. Оставшееся пространство занимает корневой раздел с файловой системой `ext4`.
Такой вариант представляет собой базовую конфигурацию Disko NixOS: минимум компонентов, простая диагностика и отсутствие дополнительных уровней абстракции.
LUKS, swap и LVM
Для ноутбука или компьютера с важными данными предпочтительнее зашифрованная схема. В этом случае содержимое накопителя защищается с помощью LUKS, а swap можно разместить внутри зашифрованного контейнера. Один из возможных вариантов:
```nix
{
disko.devices = {
disk.main = {
device = "/dev/vda";
type = "disk";
content = {
type = "gpt";
partitions = {
ESP = {
size = "1G";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
};
};
luks = {
size = "100%";
content = {
type = "luks";
name = "crypted";
settings = {
allowDiscards = true;
};
content = {
type = "lvm_pv";
vg = "pool";
};
};
};
};
};
};
lvm_vg.pool = {
lvs = {
root = {
size = "80%";
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
};
swap = {
size = "20%";
content = {
type = "swap";
};
};
};
};
};
}
```
Здесь загрузочный EFI-раздел остаётся незашифрованным, поскольку прошивке необходимо получить доступ к загрузочным файлам. Остальная часть диска помещается в LUKS-контейнер.
Внутри контейнера создаётся физический том LVM (`lvm_pv`), который подключается к группе томов `pool`. Затем группа разделяется на логические тома: `root` для операционной системы и `swap` для подкачки. Проценты можно заменить фиксированными размерами, если требуется более точное планирование пространства.
Параметр `allowDiscards` позволяет передавать команды TRIM через слой шифрования. Это может быть полезно для SSD, однако решение следует принимать с учётом модели угроз и особенностей конкретного оборудования.
Применение конфигурации
Когда файл подготовлен, его можно применить командой Disko:
```bash
disko --mode disko ./disko.nix
```
Перед запуском обязательно проверьте путь к диску и содержимое конфигурации. Операция разметки уничтожит существующие данные на выбранном накопителе. После выполнения команды Disko создаст таблицу разделов, файловые системы, контейнер LUKS, LVM-тома и точки монтирования согласно описанию.
При использовании шифрования система запросит пароль для LUKS. Его следует запомнить: без него доступ к зашифрованной части диска будет невозможен.
После успешного завершения можно проверить результат:
```bash
lsblk
mount
```
Важное преимущество такого подхода - декларативная разметка дисков NixOS не ограничивается первоначальной установкой. Файл можно сохранить вместе с системной конфигурацией, дополнить параметрами резервного копирования, изменить файловую систему или использовать при создании новой виртуальной машины.
Установка самой системы
Разметка диска и установка NixOS - связанные, но всё же отдельные этапы. После выполнения Disko файловые системы уже подготовлены и смонтированы, однако необходимо сформировать системную конфигурацию:
```bash
nixos-generate-config --root /mnt
```
Затем редактируется `/mnt/etc/nixos/configuration.nix`, добавляются загрузчик, сетевые настройки, пользователи и нужные пакеты. Финальная установка выполняется стандартной командой:
```bash
nixos-install
```
Если конфигурация дисков и настройки NixOS хранятся в одном репозитории, автоматическая установка NixOS на диск становится значительно удобнее: новый компьютер можно развернуть по заранее подготовленному набору файлов, не повторяя ручные операции.
Практические рекомендации
Перед применением схемы на физическом устройстве стоит сначала протестировать её в QEMU или VirtualBox. Это позволяет убедиться, что размеры разделов, точки монтирования и параметры загрузки заданы корректно.
Для серверов имеет смысл заранее продумать структуру хранения: отделить систему от данных, выделить место под журналы и резервные копии, а swap не делать чрезмерно большим. На ноутбуках, напротив, особое внимание нужно уделить шифрованию и корректной работе гибернации.
Если используется Btrfs, в конфигурацию можно добавить подтома для `/`, `/home`, логов и временных данных. Такой вариант упрощает создание снимков и восстановление системы, но требует более внимательного проектирования. Настройка файловой системы в NixOS через Disko особенно полезна тогда, когда структура подтомов должна воспроизводиться на нескольких устройствах.
В результате установка NixOS с помощью Disko превращается из набора одноразовых команд в понятный декларативный сценарий. Описав диски в Nix, можно воспроизводимо создавать простую или зашифрованную схему, использовать LVM, swap и разные файловые системы, а затем переносить конфигурацию на новое оборудование. Именно такой подход лучше всего соответствует философии NixOS: инфраструктура хранится в коде, а ручные действия сводятся к минимуму.


