Установка NixOS с шифрованным разделом /root на btrfs

Что получим в итоге:

  • Шифрованные раздел с системой
  • Голый NixOS без интерфейса, настройка будет в отдельной статье

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

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

Подготовка

На офф. сайте скачиваем Minimal ISO image под ваш процессор (64bit intel/amd в большинстве случаев).

Берем любую флешку, если вы читаете это не из 2000ых то размера вашей флешки должно хватить в любом случае. Для записи ISO на флешку из под винды рекомендую Rufus. Для записи из под линукс - dd.

После записи пихаем ее в наш ПК/ноут и грузимся с нее. Для того, чтобы загрузиться с внешнего устройства, надо после нажатия кнопки питания вашего компухтера нажимать F8 (если ПК) или F12 (если ноут) в большинстве случаев. Можете загуглить кнопку конкретно для вашего производителя ноута/материнки.

Разметка диска

Мы создадим всего 2 раздела, один FAT32 для /boot, второй BTRFS для системы.

Переходим сразу под рута

sudo -i

Смотри на наши диски в системe:

lsblk

Я пишу эту статью, используя виртуальную машину, чтобы наделать для вас скриншотов. На ВМ у меня диск называется sda (так обычно обозначается первый в системе сата диск, второй будет sdb), но на реальном ноутбуке у меня NVME диск и называется там он nvme0n1. Определитель какого типа у вас диск и далее по статье просто подменяйте на свой, в случаее необходимости.

Мы используем gdisk для разметки, вот cheatsheet с полезными командами:

  • p (показать статус)
  • d (удалить раздел)
  • n (создать раздел)
  • w (записать все, что сделали, на диск)

Запускаем утилиту разметки:

gdisk /dev/sda # В случае NVME диска /dev/nvme0n1, один раз подсказываю дальше сами

Я риспишу по пунктам, что нажать :)

  • Вводим n и жмем Enter
  • Еще раз Enter (указываем, что это 1 раздел)
  • Еще раз Enter (первый сектор)
  • Вводим +1Gi и жмем Enter (делаем бут раздел в 1 гигабайт)
  • Вводим ef00 и жмем Enter (говорим, что это EFI раздел)

Мы создали бут раздел, теперь создадим раздел под систему:

  • Вводим n и жмем Enter
  • И просто жмем Enter на все вопросы, нас устраивают значения по умолчаню. Давайте посмотрим, что получилось:
  • Вводим p и жмем Enter Вы должны увидеть вот такой результат:

gdisk example

  • Если результат вас устраивает, то вводим w и жмем Enter

Шифрование диска

Вводим:

cryptsetup luksFormat /dev/sda2 # мы шифруем второй раздел (с системой)

Задаем пароль (он будет спрашиваться у вас каждый раз на этапе загрузки системы)

Сразу же открываем и диск:

cryptsetup open  /dev/sda2 nixenc

(nixec - так диск замапится в системе на данный момент)

Создаем волумы в btrfs

Вводим команды по очереди, думать не надо, а то придется расписывать про BTRFS

pvcreate /dev/mapper/nixenc

vgcreate vg /dev/mapper/nixenc

lvcreate -n swap -L 8GB vg       # Свап, можете сделать больше/меньше

lvcreate -n root -l +100%FREE vg # Все остальное отдаем под /root

Форматируем

Для начала форматнем /boot:

mkfs.vfat -n boot /dev/sda1

Создаем и включаем swap:

mkswap /dev/mapper/vg-swap
swapon /dev/mapper/vg-swap

Теперь форматируем рут:

mkfs.btrfs -L root /dev/mapper/vg-root

Установка

Если вы устанавливаете ОС на ноутбук, то вам нужно подключится к Wi-Fi или воткнуть кабель ноут.

Подключится к Wi-Fi можно вот так:

Запускаем сервис wpa_supplicant

systemctl start wpa_supplicant 

Заходим в утилиту wpa_cli:

wpa_cli

И выполняем команды:

> add_network
> set_network 0 ssid "myhomenetwork"
> set_network 0 psk "mypassword"
> set_network 0 key_mgmt WPA-PSK
> enable_network 0

Приступаем к установке:

Монтируем рут:

mount /dev/mapper/vg-root /mnt

Монтируем бут:

mkdir /mnt/boot
mount /dev/sda1 /mnt/boot

Генерируем хардварный конфиг

nixos-generate-config --root /mnt

Теперь нам надо указать в конфиге как обращаться с нашим шифрованным разделом

Вводим команду

lsblk -o name,type,mountpoint,uuid

Получаем примерно такой вывод:

NAME          TYPE  MOUNTPOINT     UUID
loop0         loop  /nix/.ro-store 
sda           disk                 1980-01-01-00-00-00-00
├─sda1        part  /iso           1980-01-01-00-00-00-00
└─sda2        part                 1234-5678
sda           disk                 
├─sda1        part  /mnt/boot      8C6D-DD63
└─sda2        part                 d6f3e071-f449-4aab-87f4-93ee3a3fbab1 # Нам нужно это значение
  └─nixenc    crypt                qtCMVj-QKcW-0rcm-Pyud-Fqzc-tA8f-inZp3M
    ├─vg-swap lvm   [SWAP]         a7208e31-c1e7-44b8-895c-d01d0b930508
    └─vg-root lvm   /mnt     

Берем UUID второго раздела (смотрите комментарий в выводе выше), можно сделать фотку на мобильник

Открываем файл /mnt/etc/nixos/hardware-configuration.nix

И добавляем туда строчки после boot

boot.initrd.luks.devices = {
  root = {
    device = "/dev/disk/by-uuid/<здесь полученны UUID>";
    preLVM = true;
    allowDiscards = true;
  };
};

Если у вас ноутбук, то стоит сразу прописать данные от WiFi в конфиг, чтобы не мучаться в дальнейшем (мы эти данные потом удалим, при настройке системы)

Открываем файл /mnt/etc/nixos/configuration.nix и прописываем:

networking.wireless.enable = true;
networking.wireless.networks.ИМЯ_WiFi.psk = "Пароль WiFi";

Устанавливаем NixOS

nixos-install

Что дальше?

Вы можете вынуть флешку с установщиком и перезагрузить систему

Первая загрузка спросит у вас пароль от root пользователя

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

cryptsetup open /dev/sda2 nixenc
mount /dev/mapper/vg-root /mnt
mount /dev/sda1 /mnt/boot
swapon /dev/mapper/vg-swap