Установка Gentoo на шифрованный LVM
Проходя свой путь линуксойда, с 2017-го года и по сей день, я не мало сменил дистрибутивов и по итогу решил отнести себя к красноглазикам, остановившись на прекрасном Gentoo.
Учитывая, что ни что не стоит на месте, данная инструкция была полностью переделана, так как подход к установке на LUKS'овый LVM раздел в 2026 году значительно изменился.
Погнали…
Сливаем Minimal Installation CD
Записываем на USB утилиткой dd, ну или если с винды, то руфус'ом
Грузимся...
Проверяем, поднята ли сеть
ping -c3 gentoo.org
Если планируется установка по ssh (что для копи/паста будет удобнее), то запускаем необходимый демон
rc-service sshd start
ssh-keygen: generating new host keys: RSA ECDSA ED25519
* Starting sshd ...
И задаём пароль рута
passwd
New password:
Retype new password:
passwd: password updated successfully
Смотрим IP адрес
ip a
И подключаемся к хосту
Далее разметим диск, чтоб он выглядел следующим образом:
/dev/nvme0n1p1 128m EFI System
/dev/nvme0n1p2 768m Linux Filesystem
/dev/nvme0n1p3 Всё остальное место Linux LVM
fdisk /dev/nvme0n1
Размечаем раздел под /efi
g - для метки GPT
n - новый
enter - по умолчания первая партиция
enter - по умолчанию первый сектор
+128m - может показаться и много, но пусть будет =)
t - тип файловой системы
1 - EFI
Размечаем под раздел /boot
n - новый
enter - по умолчания вторая партиция
enter - по умолчанию следующий сектор после будущего раздела /efi
+768m - для хранения в /boot 3-х - 4-х ядер + initramfs этого достаточно более чем...
t - тип файловой системы
83 - Linux Filesystem
Размечаем под всё остальное
n - новый
enter - по умолчания вторая партиция
enter - по умолчанию следующий сектор после будущего раздела /boot
enter - всё оставшееся место
t - тип файловой системы
enter - по умолчанию следующий раздел
44 - Linux LVM
Отлично!
Вводим p и смотрим что получилось
Command (m for help): p
Disk /dev/nvme0n1: 476,94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: TEAM TM8FP6512G
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 6078AEC1-950E-4782-8F78-F3366C2ECA5D
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 1050623 1048576 128M EFI System
/dev/nvme0n1p2 1050624 3147775 2097152 768M Linux Filesystem
/dev/nvme0n1p3 3147776 1000214527 997066752 475,4G Linux LVM
Для сохранения изменений жмём w
Форматируем первый раздел в FAT32, а второй в ext4, используя параметр -Т small, для резервирования необходимого количества инодов на разделе менее 8Гб и присвоим ему метку bootfs
mkfs.vfat -F 32 /dev/nvme0n1p1
mkfs.ext4 -T small /dev/nvme0n1p2 -L bootfs
Шифруем раздел под lvm.
Заглавными буквами пишем YES и вводим парольную фразу
cryptsetup -v -y -c aes-xts-plain64 -s 512 -h sha512 -l 5000 --use-random luksFormat /dev/nvme0n1p3
WARNING!
========
This will overwrite data on /dev/nvme0n1p3 irrevocably.
Are you sure? (Type ’yes’ in capital letters): YES
Enter passphrase for /dev/nvme0n1p3:
Verify passphrase:
Key slot 0 created.
Command successful.
Можно полюбопытствовать характеристики шифра командой
cryptsetup luksDump /dev/nvme0n1p3
Для продолжения установки открываем контейнер следующей командой и вводим пароль
cryptsetup luksOpen /dev/nvme0n1p3 gentoo
Так как у нас чистый диск для установки и вышеописанные действия заново разметили диск, мы знаем что у нас там и как, но для параноиков удостоверимся, что разделов LVM там нет
lvmdiskscan
/dev/live-base [ <679.03 MiB]
/dev/mapper/gentoo [ <49.61 GiB]
/dev/vda1 [ 384.00 MiB]
/dev/vda2 [ 49.62 GiB]
2 disks
2 partitions
0 LVM physical volume whole disks
0 LVM physical volumes
Создаём физическую группу томов, добавив в неё раздел под LVM
pvcreate /dev/mapper/gentoo
Physical volume "/dev/mapper/gentoo" successfully created.
Смотрим подробности
pvdisplay
"/dev/mapper/gentoo" is a new physical volume of "<49.61 GiB"
--- NEW Physical volume ---
PV Name /dev/mapper/gentoo
VG Name
PV Size <49.61 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID pt0bn0-GezX-vcms-rf1C-4GOK-XvS1-OKzKCq>
Создаём группу томов, именуя её gentoo
vgcreate gentoo /dev/mapper/gentoo
Volume group "gentoo" successfully created
Смотрим подробности
vgdisplay
--- Volume group ---
VG Name gentoo
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <49.61 GiB
PE Size 4.00 MiB
Total PE 12699
Alloc PE / Size 0 / 0
Free PE / Size 12699 / <49.61 GiB
VG UUID QNly8N-7SgY-kznw-twHZ-Qis6-x7K6-eHP4oF
Создаём на всём свободном месте логический диск.
lvcreate -l +100%FREE -n root gentoo
Logical volume "root" created.
Смотрим подробности
lvdisplay
--- Logical volume ---
LV Path /dev/gentoo/root
LV Name root
VG Name gentoo
LV UUID QX0NCa-BVwD-IiY7-p2BP-Mccm-4onj-jhock6
LV Write Access read/write
LV Creation host, time livecd, 2025-03-25 02:16:27 +0000
LV Status available
# open 0
LV Size <49.61 GiB
Current LE 12699
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
Для просмотра найденных групп томов используем vgscan
vgscan
Found volume group "gentoo" using metadata type lvm2
Для активации логических дисков
vgchange -ay
1 logical volume(s) in volume group "gentoo" now active
Форматируем логический диск
mkfs.ext4 /dev/mapper/gentoo-root -L rootfs
mke2fs 1.47.2 (1-Jan-2025)
Creating filesystem with 13003776 4k blocks and 3252224 inodes
Filesystem UUID: ba9b3a00-be25-45c4-b8a9-985b59df09f2
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424
Allocating group tables: done
Writing inode tables: done
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done
И монтируем его
mount /dev/mapper/gentoo-root /mnt/gentoo/
Переходим в примонтированную папку
cd /mnt/gentoo/
Скачиваем файлы для работы системы
Тут на вкус и цвет кто что хочет. Мой выбор desktop-openrc
links https://www.gentoo.org/downloads/mirrors
Распаковываем
tar xpvf stage3-amd64-desktop-openrc-202*.tar.xz --xattrs-include='*.*' --numeric-owner -C /mnt/gentoo
Приведём make.conf к следующему виду
CFLAGS="-march=native -mtune=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"
RUSTFLAGS="-C target-cpu=native"
GRUB_PLATFORMS="efi-64"
ACCEPT_LICENSE="*"
LINGUAS="ru en"
L10N="ru en_US"
GENTOO_MIRRORS="https://mirror.yandex.ru/gentoo-distfiles/"
Скопируем настройки DNS
cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
Переходим в изолированное окружение и загрузим в память некоторые параметры профиля
arch-chroot /mnt/gentoo
source /etc/profile
Монтируем остальные разделы
mount /dev/nvme0n1p1 /efi
mount /dev/nvme0n1p2 /boot
Скачаем снимок репозитория
emerge-webrsync
Для удобства (конкретно моего) соберём и установим vim, но соберём мы его без излишеств. Cкажем портажу что нам не нужны в пакете звук и шифрование. До сих пор не могу понять где это может пригодиться
nano /etc/portage/package.use/vim
app-editors/vim -crypt -sound
emerge -av vim
Для дополнения по tab установим bash-comletion
emerge -av bash-completion
Добавим ближайшее зеркало, откуда система будет качать исходные коды, но перед этим, разово, установим mirrorselect
emerge -av --oneshot app-portage/mirrorselect
mirrorselect -i -o >> /etc/portage/make.conf
Активируем ранее выбранный профиль
eselect profile list | less
eselect profile set <цифра> профиля
В переменной USE файла make.conf необходимо указать с чем собрать систему, а что выкинуть из неё. Я покажу свой пример.
YES="X x265"
NO="-bluetooth -bluray -cdda -cdr -cups -dvd -dvdr -gnome -ipv6 -kde -qt5 -qt6 -systemd -wayland -wext -wifi"
USE="$YES $NO"
Далее нам снова разово понадобится уже другая утилита cpuid2cpuflags для автоматического выбора флагов процессора
emerge --oneshot cpuid2cpuflags
Выхлопом команды echo создадим файл с необходимыми флагами
echo "*/* $(cpuid2cpuflags)" > /etc/portage/package.use/00cpu-flags
А затем обновиться с новыми флагами
emerge -avuDN @world
Укажем таймзону, локали и перезагрузим окружение
ln -sf ../usr/share/zoneinfo/Asia/Vladivostok /etc/localtime
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
echo "ru_RU.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
eselect locale list
eselect locale set <цифра>
env-update && source /etc/profile
Ставим фирмвари и (если процессор интел) микрокод
emerge -av sys-kernel/linux-firmware sys-firmware/intel-microcode
installkernel - это набор скриптов для автоматической установки новых ядер и обновления конфигурации загрузчика. Для его правильной работы добавим ему необходимые флаги
echo "sys-kernel/installkernel dracut grub" >> /etc/portage/package.use/installkernel
Установим installkernel и следом, чтоб на старте не ебаццо со сборкой ядра, установим оное бинарное
emerge -av sys-kernel/installkernel sys-kernel/gentoo-kernel-bin
В своё время, наебавшись вдоволь с genkernel, я понял, что лучший инструмент для сборки initramfs - это dracut. Подготовим для него необходимые конфиги, заменив <UUID> на то, что показывает blkid у раздела nvme0n1p3
mkdir /etc/dracut.conf.d
vim /etc/dracut.conf.d/00-microcode.conf
early_microcode="yes"
vim /etc/dracut.conf.d/10-luks.conf
add_dracutmodules+=" crypt dm "
kernel_cmdline+=" rd.luks.uuid=<UUID> "
kernel_cmdline+=" root=LABEL=rootfs "
kernel_cmdline+=" rd.luks.allow-discards "
kernel_cmdline+=" rd.luks.name=<UUID>=gentoo "
vim /etc/dracut.conf.d/20-lvm.conf
add_dracutmodules+=" lvm "
kernel_cmdline+=" rd.lvm.vg=vg "
Установим пакеты lvm и cryptsetup
echo "sys-fs/lvm2 lvm" >> /etc/portage/package.use/lvm
emerge -av sys-fs/lvm2 sys-fs/cryptsetup
и сконфигурирем initramfs для начальной загрузки
dracut --kver $(ls /lib/modules/) -f
Скажем fstab'у как монтировать диски, предварительно узнав UUID'ы при помощи blkid
vim /etc/fstab
UUID=цифры-буквы /efi vfat rw,relatime,umask=0077,tz=UTC 0 2
UUID=цифры-буквы /boot ext4 rw,relatime 0 2
UUID=цифры-буквы / ext4 rw,relatime 0 1
Обзовём нашу систему как-нибудь креативно
echo skynet > /etc/hostname
Запаролим рута
passwd
Важный момент! lvm у нас должен стартовать вместе с системой
rc-update add lvm boot
Устанавливем загрузчик и генерируем его конфиг
grub-install --efi-directory=/efi
grub-mkconfig -o /boot/grub/grub.cfg
Основа сделана! Выходим из окружения и рестартимся
exit
cd
umount -R /mnt/gentoo
reboot
Рестартимся, заходим в нашую новую, девственно чистую систему и восхищаемся ей