Gentoo quick installation checklist [EFI, GPT, Full disk encryption]

Подготовка

Загрузиться с live cd (e.g. systemrescuecd)

Тут после старта систему лучше всего установить пароль

root@sysresccd /root % passwd
Changing password for root
Enter the new password (minimum of 5 characters)
Please use a combination of upper and lowe rcase letters and numbers
New password:
Re-enter new password:
passwd: password changed.

Посмотреть текущий ip адрес

root@sysresccd /root % ip a | grep inet

И продолжить установку уже через ssh

user@localhost $ ssh root@IP_АДРЕС

Разбить разделы

root@sysresccd /root % parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes
(parted) mkpart
Partition name?  []? EFI
File system type?  [ext2]? fat32
Start? 0%
End? 257MB
(parted) mkpart
Partition name?  []? GNU
File system type?  [ext2]? ext4
Start? 257MB
End? 100%
(parted) quit
Information: You may need to update /etc/fstab.

Отформатировать в нужную фс

root@sysresccd /root % mkfs.vfat -F32 /dev/sda1
mkfs.fat 3.0.28 (2015-05-16)

Создание зашифрованного раздела

root@sysresccd /root % cryptsetup luksFormat /dev/sda2

WARNING!
========
This will overwrite data on /dev/sda2 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase:
Verify passphrase:

root@sysresccd /root % cryptsetup luksOpen /dev/sda2 root
Enter passphrase for /dev/sda2:

root@sysresccd /root % mkfs.ext4 /dev/mapper/root
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 122033408 4k blocks and 30515200 inodes
Filesystem UUID: a8d86052-be2a-42bf-8ac9-e36dfa395177
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

Монтирование

root@sysresccd /root % mount /dev/mapper/root /mnt/gentoo
root@sysresccd /root % mkdir -p /mnt/gentoo/boot/efi
root@sysresccd /root % mount /dev/sda1 /mnt/gentoo/boot/efi

Скачивание stage3

Посмотреть последний релиз

root@sysresccd /root % curl http://distfiles.gentoo.org/releases/amd64/autobuilds/latest-stage3-amd64-hardened.txt
# Latest as of Sat, 11 Nov 2017 06:30:01 +0000
# ts=1510381801
20171109/hardened/stage3-amd64-hardened-20171109.tar.bz2 238549073

Далее вместо YYYYMMDD использовать полученную дату

Скачать stage3-amd64-hardened-YYYYMMDD.tar.bz2

root@sysresccd /root % wget http://distfiles.gentoo.org/releases/amd64/autobuilds/current-stage3-amd64/hardened/stage3-amd64-hardened-YYYYMMDD.tar.bz2
root@sysresccd /root % wget http://distfiles.gentoo.org/releases/amd64/autobuilds/current-stage3-amd64/hardened/stage3-amd64-hardened-20171109.tar.bz2.DIGESTS.asc
root@sysresccd /root % gpg --keyserver pool.sks-keyservers.net --recv-key 2D182910
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: requesting key 2D182910 from hkp server pool.sks-keyservers.net
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 2D182910: public key "Gentoo Linux Release Engineering (Automated Weekly Release Key) <releng@gentoo.org>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
root@sysresccd /root % gpg --verify stage3-amd64-*.tar.bz2.DIGESTS.asc
gpg: Signature made Fri Nov 10 07:55:07 2017 UTC using RSA key ID 2D182910
gpg: Good signature from "Gentoo Linux Release Engineering (Automated Weekly Release Key) <releng@gentoo.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 13EB BDBE DE7A 1277 5DFD  B1BA BB57 2E0E 2D18 2910

Распаковать архив

root@sysresccd /root % cd /mnt/gentoo
root@sysresccd /mnt/gentoo % tar xf /root/stage3-amd64-hardened-*.tar.bz2

Chroot в stage

root@sysresccd /mnt/gentoo % mount --bind /sys sys && mount --bind /dev dev && mount --bind /proc proc && cp /etc/resolv.conf etc/ && chroot . /bin/bash

Настройка portage

Правим /etc/portage/make.conf

CFLAGS="-O2 -pipe -march=native"

MAKEOPTS="-j9"

GENTOO_MIRRORS="http://mirror.yandex.ru/gentoo-distfiles/"

USE="bindist cryptsetup device-mapper"

PORTAGE_TMPDIR="/tmp"

EMERGE_DEFAULT_OPTS="--quiet-build"

Синхронизируем дерево

sysresccd / # mkdir /usr/portage && emerge --sync

Общая настройка системы

Устанавливаем нужную локаль

sysresccd / # eselect locale list | grep ru_RU
  [602] ru_RU
  [603] ru_RU.iso88595
  [604] ru_RU.koi8r
  [605] ru_RU.utf8
sysresccd / # eselect locale set 605
Setting LANG to ru_RU.utf8 ...
Run ". /etc/profile" to update the variable in your shell.
sysresccd / # . /etc/profile

Запускаем сборку нужных пакетов, после чего не дожидась переходим к следующему пункту (в другом терминале, не забывая про необходимость chroot).

sysresccd / # emerge sys-kernel/gentoo-sources sys-boot/grub net-misc/dhcpcd sys-fs/cryptsetup sys-kernel/genkernel sys-kernel/linux-firmware

Устанавливаем пароль root

sysresccd / # passwd
New password: 
Retype new password: 
passwd: password updated successfully

Настраиваем монтирование файловых систем

Сначала необходимо запустить blkid для того, чтобы посмотреть идентификаторы

sysresccd / # blkid
/dev/loop0: TYPE="squashfs"
/dev/sda1: UUID="2352-115B" TYPE="vfat" PARTLABEL="EFI" PARTUUID="402f385f-4adb-470f-94e6-0fcb4f37d2fe"
/dev/sda2: UUID="2e13277f-544d-4d6d-871f-1ea04495fea7" TYPE="crypto_LUKS" PARTLABEL="GNU" PARTUUID="a701cfac-dd62-4925-b3e7-e64af9f3f6bc"
/dev/sdb1: UUID="2016-10-02-07-25-26-00" LABEL="sysrcd-4.8.3" TYPE="iso9660" PTUUID="4b7ef199" PTTYPE="dos" PARTUUID="4b7ef199-01"
/dev/sdb2: SEC_TYPE="msdos" UUID="6312-E402" TYPE="vfat" PARTUUID="4b7ef199-02"
/dev/mapper/root: UUID="a8d86052-be2a-42bf-8ac9-e36dfa395177" TYPE="ext4"

После чего непосредственно править fstab

sysresccd / # nano /etc/fstab

У меня на ноутбуке получается таким образом. Нужно обратить внимание на то, что UUID для корневого раздела должен быть от /dev/mapper/root, а также на размер (и необходимость) tmpfs в зависимости от текущей системы.

UUID="2352-115B"    /boot/efi    vfat    defaults    0 2
UUID="a8d86052-be2a-42bf-8ac9-e36dfa395177"    /    ext4    defaults,discard,noatime 0 1
tmpfs    /tmp    tmpfs    noatime,nodiratime,size=12G   0 0

Настраиваем имя хоста

sysresccd / # nano /etc/conf.d/hostname

Устанавливаем таймзону

sysresccd / # ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Запускать sshd при старте системы (если необходимо, я обычно устанавливаю полностью через ssh, поэтому мне это нужно)

sysresccd / # rc-config add sshd

Дождаться завершения emerge из пункта 2 этого раздела

Настраиваем ядро

Конфигурация ядра не является тривиальной, поэтому с этим нужно быть осторожным. Главное – включить сетевую карту и не забыть про шифрование :)

Создаем директорию для конфига

sysresccd / # mkdir /usr/src/local

Смотрим какой модуль ядра обеспечивает поддержку сети

sysresccd / # lspci -nnk | grep 'Ethernet controller' -A2
lspci: Unable to load libkmod resources: error -12
02:00.0 Ethernet controller [0200]: Qualcomm Atheros QCA8172 Fast Ethernet [1969:10a0] (rev 10)
        Subsystem: Lenovo QCA8172 Fast Ethernet [17aa:3802]
        Kernel driver in use: alx

И не забываем добавить его поддержку далее (если вдруг опция окажется не такой, то использовать make nconfig и поиск по F8)

Заполняем конфигурационный файл ядра

sysresccd / # nano /usr/src/local/Kconfig

config SWEET_GENTOO
        bool "Sweet gentoo"
        default y

        # crypto
        select DM_CRYPT
        select CRYPTO_AES_NI_INTEL
        select CRYPTO_USER_API_SKCIPHER

        # ethernet
        select ALX

CRYPTO_AES_NI_INTEL может и не быть, смотрите на поддержку инструкций в вашем процессоре.

Применяем нашу конфигурацию

sysresccd / # echo 'source "../local/Kconfig"' >> /usr/src/linux/Kconfig
sysresccd / # cd /usr/src/linux
sysresccd /usr/src/linux # make defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
*** Default configuration is based on 'x86_64_defconfig'
#
# configuration written to .config
#

Компиляция ядра

make -j$(nproc) && make install

Идем пить чай, в зависимости от процессора (типично 5-15 минут)

Подробнее о том, как работать с подобным способом конфигурации ядра при обновлениях описано в https://seccomp.ru/1504674078_how_build_kernel.html

Настройка grub

sysresccd / # genkernel --luks initramfs

Исправить в /etc/default/grub GRUB_CMDLINE_LINUX=“crypt_root=/dev/sda2 root_trim=yes”, а также добавить строку GRUB_ENABLE_CRYPTODISK=y

root_trim=yes необходимо в том случае, если используется SSD

sysresccd / # nano /etc/defaut/grub

sysresccd / # grub-install --efi-directory=/boot/efi
Installing for x86_64-efi platform.
Installation finished. No error reported.

sysresccd / # grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.12.12-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-4.12.12-gentoo
done

Установка базовой системы завершена. Можно перекрестить пальцы и перезагрузиться.

В случае каких-то проблем нужно загрузиться в sysresccd и проделать следующиее:

root@sysresccd /root % cryptsetup luksOpen /dev/sda2 root
root@sysresccd /root % mount /dev/mapper/root /mnt/gentoo
root@sysresccd /root % mount /dev/sda1 /mnt/gentoo/boot/efi
root@sysresccd /root % cd /mnt/gentoo
root@sysresccd /mnt/gentoo % mount --bind /sys sys && mount --bind /dev dev && mount --bind /proc proc && cp /etc/resolv.conf etc/ && chroot . /bin/bash

После этого неплохо было бы еще настроить Secure Boot и подписать grub, но это уже за рамками данного.