Featured image of post GPT (UEFI) for Btrfs (/ and /boot) over dm-crypt

GPT (UEFI) for Btrfs (/ and /boot) over dm-crypt

К чему я пришёл в разметке винта и выборе файловых систем

Введение

Программа на фото статьи это GParted. Люблю, практикую. Удобно и просто можно творить с разделами всё, что вздумается. Не смог выбрать, что поставить заглавным изображением статьи. Пусть будет моя текущая разметка 😄
Системы я переставлял и переставляю довольно часто, пару раз в год будет. Причины разные: то сервачок собрал, то на рабочий ПК поменял на ноутбук, то на компьютер родителей винт побольше поставил… По мелочи в общем. Опыт и с Windows, и с разными дистрибутивами Linux имел обширный, как мне кажется. Статься в целом, больше болтология, не обижайтесь. Если кто-то вдруг обнаружит, что на сайте комментарии уже как полгода можно оставлять, буду искренне рад 😄

Тип таблицы разделов

Как я думал раньше: “Вот, есть старый добрый MBR, а GPT придумали с этими их UEFI-ями проклятыми, чтобы на ноуты катать и не давать людям другие ОСи ставить! 4 раздела ограничение - ну и что. Хочешь больше - логические в помощь.” Думал я так до января 2022, а потом получил по работе ноутбук, ну и конечно, стал думать как чем бы его зарядить. “А попробую-ка GPT, ну никогда не брал ведь. Пусть будет, какая разница. Работать будет и ладно”. Итог: GPT UEFI форева! Почему…

  1. Нет ограничения по количеству разделов
  2. Нет области прописывания загрузчика в начале диска, то есть BIOS грузит не диск, следуя на нём по ссылке в самом начале, а конкретную найденную на одном из сколько хош FAT32 разделов программу.
  3. GRUB видит всех соседей на диске, а также сам BIOS так как оказалось, что точка входа в него это точно такая же UEFI программа. Можно из меню загрузчика попасть в BIOS, оттуда опять в загрузчик, оттуда опять в BIOS, ну вы поняли…
  4. Когда ты ставишь Windows и она сносит MBR тебя даже не спрашивая (своё красноречивое, нецензурное мнение по поводу уважения Microsoft к продуктам иным, нежели тем, которые были разработаны в Microsoft, я писать здесь не буду), а потом тебе нужно с LiveUSB восстанавливать GRUB, или просто система неудачно обновилась какая-то. Не важно, что случилось. Ты просто грузишь другую ОС прямо из BIOS-a! Вот это мне очень понравилось.
  5. Недостатком, но просто мелочью по факту, является то, что программы UEFI могут быть только на разделах FAT32. Ну и ладно. Создал и забыл.
  6. Windows в начале не планировалась, но когда появилась, оказалось, что она прекрасно может стать на любые по порядку разделы, а не только на первый как в случае MBR, а это очень большой плюс.

Файловые системы

Я переехал на BTRFS везде, и на рабочей машине, и на сервере, и раздел архива (авто, мото, фото …) тоже на BTRFS. Очень люблю и уважаю, попробовал тоже недавно. Искал разные замеры производительности и понял, что в среднем BTRFS такая же, как EXT4, но медленнее XFS. “Брать или не брать?” - думал я. Так вот взял по одной простой, но понятной причине: мои машины это не высоконагруженные сервера и разницы я не почувствую этой в производительности 😄 Выбором остался доволен.

  1. У меня на домашнем сервере BTRFS RAID1 на двух HDD Barracuda 1TB - программный рейд, без проблемы и с одного тычка.
  2. Встроенные: сжатие, дефрагментация, контроль ошибок (по которому можно судить, когда винты умирают), снапшоты. Сказка!
  3. Как оказалось, GRUB грузит BTRFS и грузится с BTRFS без проблем!
  4. Жаль нет встроенного шифрования. Пришлось навесить сверху dm-crypt - и ничего, всё отлично.
  5. Весь BTRFS это как логический раздел с резиновыми разделами внутри, которые не располагаются привычно нам друг за другом, а просто есть, скопом 😄 Не нужно добавлять места, если закончилось или как-то продумывать что, сколько будет есть.

Из забавного, пришлось переносить ОС с одного железа на другое. Так вот с BTRFS выглядело это примерно так.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# монтируем корень btrfs на старой машине
mount /dev/sda1 -o subvol=/ /mnt
# то же на новой машине
ssh user@new-pc mount /dev/sda1 -o subvol=/ /mnt
# делаем readonly снапшот раздела с системой
btrfs subvolume snapshot -r /mnt/@manjaro /mnt/@manjaro-ro
# пересылаем по SSH! обалдеть просто...
btrfs send /mnt/@manjaro-ro | ssh user@new-pc btrfs receive /mnt/@manjaro-ro
# там на месте из полученного readonly делаем readwrite снапшот
ssh user@new-pc btrfs subvolume snapshot /mnt/@manjaro-ro /mnt/@manjaro
# удаляем readonly
ssh user@new-pc btrfs subvolume del /mnt/@manjaro-ro
# размонтируем всё
umount /mnt
ssh user@new-pc umount /mnt

Так просто и легко я ещё не перезжал. Что нужно не забыть, конечно, сделать потом руками:

  1. Поправить UUID-ы в /etc/fstab
  2. Поправить /etc/hostname
  3. grub-install ... && grub-mkconfig ...

Разделы GPT

  1. Если Windows нужно будет больше места - отрежу с конца у Manjaro
  2. Если нужен будет ещё Linux, то для него понадобиться тоже EFI раздел, а вот boot - нет! Потому что из одного BTRFS boot могут грузиться сколько хочешь линуксов - просто разделы (subvolume) разные

Операционные системы

  1. Лучше Manjaro трудно что-то представить. Мне очень нравиться всё - документация, утилиты, простота контроля обновления ядра с mhwd-kernel, совместимость со всей документацией Vanilla Arch. Свежий софт, но не настолько как у Fedora, что тоже радует! Есть mari0
  2. Windows 10, просто для игрушек и Steam.

Важные заметки

  1. Windows никого не спрашивает и форматирует раздел с флагами boot,esp в FAT32 и кладёт туда свой EFI. Решилось ручным созданием раздела EFI-Windows и навешиванием на него этих флагов. Linux-у фиолетово где они висят - на загрузку не влияет, а вот установка Windows влезла в нужное мне место.
  2. Я вначале boot не выносил и он тоже был зашифрован! Работает на ура! Есть одна неприятность: GRUB драйвера не подтягивает и для расшифровки раздела использует программно реализованные алгоритмы, не привлекая аппаратные возможности CPU. Первоначальная расшифровка занимала у меня 5-7 секунд. Люди в сети жалованись на десятки… Для меня было не критично те 5-7 секунд, тем более, что на работе потом это не сказывается, только на самом начале загрузки, но решил убрать эту задержку, безопасность мне параноидальная тоже не нужна.
  3. Для восстановления загрузчика нужно также примонтировать efivars перед chroot
  4. Вот отличная документация по вопросу восстановления загрузчика
  5. Лучше документации по установке системы, чем эта, на зашифрованный раздел (по всякому) просто представить трудно
  6. UUID-ы из /etc/fstab должны совпадать с нужными Вам из вывода blkid

Не важные заметки

  1. А вот так у меня выглядит экран загрузки благодаря plymouth. Тема Pack 2 - Flame. (подёргивания картинки только в браузере, во время загрузки всё гладко)
  2. Здесь я тему выбрал себе для самого Grub. Вот та, которую я взял.
  3. dm-crypt можно пропатчить и сделать nuke пароль. Если его ввести, то все ключи будут уничтожены и раздел уже не расшифровать. Сколько бы вас не пытали, они уже ничего не получат… ха-ха.. ха… мда.. ну что есть, то есть

Grub recovery script

Имена разделов точно как у меня на изображении к посту. Это поможет сориентироваться.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# расшивровуем раздел с системой
cryptsetup luksOpen /dev/nvme0n1p1 cryptroot
# монтируем систему
mount /dev/mapper/cryptroot -o subvol=@root /mnt
# монтируем boot
mount /dev/nvme0n1p2 -o subvol=@boot /mnt/boot
# создаём папку efi если нет
mkdir -p /mnt/boot/efi
# монтируем efi в boot
mount /dev/nvme0n1p3 /mnt/boot/efi
# монтируем кучу всего для chroot
for i in dev proc sys ; do mount --bind /$i /mnt/$i; done
# монтируем efivars а то grub не встанет
mount --bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars
# запрыгиваем в нашу систему
chroot /mnt
# ставим grub. тут нужны пояснения
# 1. в случае с mbr мы привыкли указывать диск, куда прописать загрузчик
#    в случае с efi он ничего никуда не прописывает, а просто наполняет /boot
# 2. bootloader-id это просто для красоты - именно так BIOS будет подписывать нашу ось в списке
#    можно и не писать, там по умолчанию будет manjaro
grub-install --bootloader-id="Manjaro"
# если профукал весь раздел /boot вместе с образами ядра, то вот так они перегенерятся
pacman -S linux
# собираем initramfs образы
mkinitcpio -P
# собираем меню grub
grub-mkconfig -o /boot/grub/grub.cfg
# выходим из chroot
exit
# размонтируем и закрываем всё в обратном порядке
umount /mnt/sys/firmware/efi/efivars
for i in dev proc sys; do umount /mnt/$i; done
umount /mnt/boot/efi
umount /mnt/boot
umount /mnt
cryptsetup luksClose cryptroot

Простыми словами о загрузке ОС (EFI)

  1. BIOS запускается и находит всё FAT32, в которых есть папка EFI и знакомые ему файлы. Грузит одну из найденных програм, какую попросили.
  2. Программа EFI штука не такая тупая как MBR и может делать, что угодно. В нашем случае, она лезет на /boot раздел c GRUB, открывает для себя BTRFS и подгужает меню GRUB и именно здесь загружается и отрисовывается тема, которую мы выбрали для GRUB
  3. Теперь мы в меню GRUB выбираем что грузить
  4. GRUB загружает в оперативку целяком initramfs того, что мы попросили грузить. Это то, что мы генерили командой mkinitcpio. Initcpio это программа на подобии EFI, но когда его придумывали, EFI ещё не было, был только тупой MBR. Что-то мне кажется, что можно напрямую с EFI грузить систему без лишней прослойки. Ну да ладно… Кроме того, вместе с initramfs именно тут грузится уже ядро, так как оно вынесено на /boot тоже.
  5. Initcpio это слоёный пирог хуков, которые выполняются по очереди. Каждый делает что-то важное и нужное. Так вот если мы поставили plymouth, вот тут же, в одном из самых первых хуков на экран рисуется какая-то красотень, чтобы спрятать кучу логов загрузки.
  6. Один из хуков это encrypt или plymouth-encrypt. Вот как раз этот кусочек слоёного пирога initramfs спрашивает у нас пароль от зашифрованного root-а. То есть, до этого момента он вообще не трогался 😄
  7. Расшифровка, создание первого процесса, запуск служб, драйвером, графической оболочки и процего шлака.

Вопросы

Если будут вопросы или чем помочь, подсказать как у меня настроен конкретно тот или иной кусок - пишите в Telegram или в комментарии. Буду рад помочь!

All rights reserved
Создано при помощи Hugo
Тема Stack, дизайн Jimmy