Skip to content

Latest commit

 

History

History
1065 lines (968 loc) · 43.6 KB

Установка Achlinux.md

File metadata and controls

1065 lines (968 loc) · 43.6 KB

Обозначения:

Машина-клиент -- машина, на которую устанавливают систему

Машина-настройщик -- машина, через которую устанавливают систему по ssh

Часть 0. Настройка UEFI

1) Если решили заново настроить и нет уже готовых ключей для подписи, то убеждаемся, что Secure-boot сброшен и ключи пусты (Не вернувшиеся в дефолтное состояние, а именно пустые) 2) Проверяем, что для не подписанного arch iso был отключён Secure-boot 3) Проверяем, что TPM включён

Часть 1. Настройка SSH

Установка через ssh позволяет сразу копировать готовые команды

На машине-клиент устанавливаем пароль:

passwd

На машине-клиент узнаём ip его локальный ip(Будет примерно 192.168.1.111):

ip -br a

Далее на машине-настройщике подключаемся по ssh к машине-клиенту

ssh ssh -o ServerAliveInterval=30 root@<ip машины-клиента, который узнали выше>

Note

Добавил ServerAliveInterval=30, чтобы не было отключения при бездействии.

Часть 2. Подготовка дисков:

Удаление данных с диска:

wipefs -a /dev/nvme0n1

Создание разметки и разделов:

Размечаем диск в gpt:

parted /dev/nvme0n1 mklabel gpt

Создаём 2 раздела:

parted /dev/nvme0n1 mkpart '"EFI system partition"' fat32 2048s 2GiB && \
parted /dev/nvme0n1 mkpart '"swap partition"' 2GiB 26GiB && \
parted /dev/nvme0n1 mkpart '"system partition"' 26GiB 100%

Note

Очень важно, следите за размером секторов на диске! От этого зависит скорость доступа к диску. Если при создании раздела не соблюсти кратность сектора, то контроллер будет чаще обращаться к ячейкам, а значит увеличится и время доступа к данным. В данном случае, минимальный разрешённый сектор у меня 2048s(секторов). Дополнительно тут: https://wiki.archlinux.org/title/Parted_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%92%D1%8B%D1%80%D0%B0%D0%B2%D0%BD%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

Note

Ещё интересная вещь, это указание размера разделов в процентах. Она очень удобна, когда нужно указать раздел от начала 0% или до конца 100%

Назначаем флаги для разделов (необязательно, но пусть будет):

parted /dev/nvme0n1 set 1 esp on && \
parted /dev/nvme0n1 set 2 swap on

Форматирование раздела под efi:

mkfs.fat -F32 /dev/nvme0n1p1

LUKS шифрование разделов:

LUKS шифрование даёт нам раздел, который полностью закрыт для просмотра, делая из раздела, по сути один большой файл. Его структура похожа на структуру обычного диска с разметкой диска, только вместо разметки диска, у нас заголовок LUKS и ещё есть отдельный раздел для хранения ключей, за счёт чего в LUKS можно удобно менять пароли (в отличии от того же dm-decrypt, где ключ выбирается один на все файлы) Подробнее о моём варианте шифрования можно почитать тут: https://wiki.archlinux.org/title/Dm-crypt/Encrypting_an_entire_system#LVM_on_LUKS Проверяем модули на работоспособность:

modprobe dm-crypt && \
modprobe dm-mod

Шифруем swap раздел в A 512:

cryptsetup --verbose luksFormat --key-size 512 --ha a512 /dev/nvme0n1p2

Шифруем root раздел в A 512:

cryptsetup --verbose luksFormat --key-size 512 --ha a512 /dev/nvme0n1p3

Открываем зашифрованные разделов:

cryptsetup luksOpen /dev/nvme0n1p2 swap && \
cryptsetup --allow-discards luksOpen /dev/nvme0n1p3 root

Экспортируем UUID дисков в переменные:

export NVME0N1P1=$(lsblk -dno UUID /dev/nvme0n1p1) \
NVME0N1P2=$(lsblk -dno UUID /dev/nvme0n1p2) \
NVME0N1P3=$(lsblk -dno UUID /dev/nvme0n1p3)

Экспортируем адреса зашифрованных контейнеров:

export ROOT=/dev/mapper/root \
SWAP=/dev/mapper/swap

Создание файловых систем в томах:

Создание файловой системы swap:

mkswap -L swap $SWAP

Создание файловой системы f2fs:

mkfs.f2fs -l "Arch Linux" -O extra_attr,inode_checksum,sb_checksum,compression  $ROOT

Note

Для подробностей нужно идти на Archwiki, но тут, как минимум включена полезная компрессия Подробнее тут: https://wiki.archlinux.org/title/F2FS#Compression

Монтирование разделов:

Обновление информации о дисках:

systemctl daemon-reload

Монтирование корневого раздела:

mount -o compress_algorithm=zstd:6,compress_chksum,atgc,gc_merge,lazytime $ROOT /mnt

Note

Раздел смонтирован с рекомендуемыми Archwiki параметрами Подбробнее тут: https://wiki.archlinux.org/title/F2FS#Recommended_mount_options

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

swapon $SWAP

Монтирование efi раздела:

mount --mkdir -o uid=0,gid=0,fmask=0137,dmask=0027  /dev/nvme0n1p1 /mnt/efi

Note

Делаем маску 0077, ради того, чтобы из под обычного пользователя не было доступа к этому разделу. Собственно, systemd-boot при установке про это и говорит

!Mount point '/boot' which backs the random seed file is world accessible, which is a security hole! !  
! Random seed file '/boot/loader/random-seed' is world accessible, which is a security hole! !

Мой дополнительный диск:

mount --mkdir /dev/sdb /mnt/mnt/sdb

Часть 3. Установка до подмены корневого раздела:

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

reflector --verbose -l 5 -p https --sort rate --save /etc/pacman.d/mirrorlist

Установка базовых пакетов:

pacstrap -K /mnt base base-devel git vi neovim mkinitcpio reflector

Генерирование FSTAB:

genfstab -U /mnt > /mnt/etc/fstab

Переход в CHROOT:

arch-chroot /mnt

Часть 4. Настройка в подменённом корневом разделе:

Установка времени:

Установка своего часового пояса:

ln -sf /usr/share/zoneinfo/Europe/Kaliningrad /etc/localtime

Note

Здесь выбираем собственный часовой пояс Синхронизация:

hwclock --systohc

Установка локалей:

Установка eng локали:

sed '/en_US.UTF-8 UTF-8/s/^#//' -i /etc/locale.gen

Установка ru локали:

sed '/ru_RU.UTF-8 UTF-8/s/^#//' -i /etc/locale.gen

Генерация:

locale-gen

Установка языка по умолчанию:

echo LANG=ru_RU.UTF-8 >> /etc/locale.conf

Установка шрифтов

cat <<- _EOF_ > /etc/vconsole.conf
	KEYMAP=ruwin_alt_sh-UTF-8
	FONT=ter-v16n
_EOF_

Note

ruwin_alt_sh-UTF-8 раскладка, в отличии от раскладки, предлагаемой в "Installation guide" даёт возможность в режиме терминала менять раскладку через alt + shift ter-v16n обычно, находиться внутри самого ядра. Есть проблема с тем, что после splash не загружаются внешние шрифты, поэтому выбрал из ядра тот, который поддерживает utf-8.

Создание хоста:

Создание имени хоста:

echo "ArchLinux" >> /etc/hostname

Создание внутренней сети хоста:

cat << _EOF_ >> /etc/hosts
127.0.0.1		localhost
::1			localhost
127.0.1.1		ArchLinux.localdomain	ArchLinux
_EOF_

Создание пользователя:

Создание пароля для root:

passwd

Добавляем пользователя:

useradd -mG wheel vlad

Делаем бэкап файла:

cp /etc/sudoers /etc/sudoers.backup

Редактируем сам sudoers:

sed '/\%wheel ALL=(ALL:ALL) ALL/s/^# //' -i /etc/sudoers

Проверяем на правильность:

visudo -c /etc/sudoers

Если всё хорошо, то удаляем бэкап:

rm /etc/sudoers.backup

Добавляем пароль для пользователя:

passwd vlad

Настройка компилятора и пакетного менеджера:

Для мнимой производительности для нашего пользователя переназначаем флаги GCC:

sudo -u vlad cat << _EOF_ > /home/vlad/.makepkg.conf
CFLAGS="-march=native -mtune=native -O2 -pipe -fno-plt -fexceptions \\
      -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \\
      -fstack-clash-protection -fcf-protection"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
RUSTFLAGS="-C opt-level=3 -C target-cpu=native -C link-arg=-z -C link-arg=pack-relative-relocs"
MAKEFLAGS="-j$(nproc) -l$(nproc)"
_EOF_

PARU:

Отличительной особенностью PARU является одновременно и то что он написан на Rust и то что он позволяет достаточно удобно работать с PKGBUILD Скачиваем PARU и входим в его каталог:

sudo -u vlad git clone https://aur.archlinux.org/paru.git /home/vlad/bin/paru

Создаём пакет, устанавливаем его и переходим обратно в корень

(cd /home/vlad/bin/paru/ && sudo -u vlad makepkg -si)

Добавляем возможность редактирования в paru:

sed '/\[bin\]/s/^#//' -i /etc/paru.conf && \
sed '/FileManager/s/^#//' -i /etc/paru.conf && \
sed '/FileManager/s/vifm$/nvim/' -i /etc/paru.conf

Заставляем paru держать таймер истечения действия пароля до полного выполнения работы:

sed '/SudoLoop/s/^#//' -i /etc/paru.conf

Добавление своего стека репозиториев:

Делаем копию pacman.conf:

cp /etc/pacman.conf /etc/pacman.conf.backup

В /etc/pacman.conf раcкомментируем multilib и добавояем комментарий:

sed '/\[multilib\]/{s/^#//;n;s/^#//;}' -i /etc/pacman.conf && \
sed '/\[core-testing\]/i\
\
# Default repositories\
' -i /etc/pacman.conf

Раcкомментируем параллельные загрузки и цветной вывод:

sed '/ParallelDownloads =/s/^#//' -i /etc/pacman.conf && \
sed '/Color/s/^#//' -i /etc/pacman.conf

Добавляем репозитории которые Вам нужны: Объявление через комментарий о участке со своими репозиториями

sed -i "/# after the header, and they will be used before the default mirrors./{ 
n
n
a\\
#Custom\ repositories\n
}" -i /etc/pacman.conf

CachyOS репозитории (Репозитории скомпилированный под 86-64-v3 архитектуру) Обязательно! Перед добавлением в pacman.conf добавляем ключи с их сайта:

pacman-key --recv-keys F3B607488DB35A47 --keyserver keyserver.ubuntu.com && \
pacman-key --lsign-key F3B607488DB35A47

Устанавливаем необходимые пакеты:

pacman -U 'https://mirror.cachyos.org/repo/x86_64/cachyos/cachyos-keyring-20240331-1-any.pkg.tar.zst' \
               'https://mirror.cachyos.org/repo/x86_64/cachyos/cachyos-mirrorlist-18-1-any.pkg.tar.zst'    \
               'https://mirror.cachyos.org/repo/x86_64/cachyos/cachyos-v3-mirrorlist-18-1-any.pkg.tar.zst' \
               'https://mirror.cachyos.org/repo/x86_64/cachyos/pacman-6.1.0-7-x86_64.pkg.tar.zst'

Уже потом добавляем в pacman.conf:

sed '/# Default repositories/i\
\# cachyos repos\
\[cachyos-v3\]\
Include = /etc/pacman.d/cachyos-v3-mirrorlist\
\
\[cachyos-extra-v3\]\
Include = /etc/pacman.d/cachyos-v3-mirrorlist\
\
\[cachyos\]\
Include = /etc/pacman.d/cachyos-mirrorlist\
' -i /etc/pacman.conf

Note

Репозитории написаны в порядке моего приоритета. С каждым новым вводом, следующий репозиторий будет записываться в конец списка

Note

Следите за очерёдностью репозиториев. Репозитории расположенные вверху имеют приоритет перед нижними

Обновление ключей и репозиториев:

Обновляем зеркала по скорости уже в chroot:

reflector --verbose -l 5 -p https --sort rate --save /etc/pacman.d/mirrorlist

Инициализация:

sudo -u vlad paru -Sy archlinux-keyring && sudo -u vlad paru -Su

Добавление пакетов:

Скачиваем необходимые пакеты. Микрокод, f2fs пакеты, менеджер сети, менеджер efiboot, lvm2 и дополнительные шрифты:

sudo -u vlad paru -S --needed wget man f2fs-tools amd-ucode \
efibootmgr networkmanager bluez pipewire pipewire-pulse pipewire-jack \
pipewire-v4l2 lib32-pipewire lib32-pipewire-jack lib32-pipewire-v4l2 \
noto-fonts-cjk ttf-hannom wl-clipboard terminus-font xdg-utils mailcap
sudo -u vlad paru -S --asdeps --needed bat devtools lib32-dbus lib32-pipewire-jack lib32-libavtp lib32-libsamplerate lib32-libpulse lib32-speexdsp lib32-pipewire-v4l2

Первоначальная настройка:

Включение и настройка сети и bluetooth:

Note

Если не включить экспериментальные функции для bluetooth, в journald будут предупреждения о отсутствии поддержки некоторых плагинов:

src/plugin.c:plugin_init() System does not support micp plugin
src/plugin.c:plugin_init() System does not support vcp plugin
src/plugin.c:plugin_init() System does not support mcp plugin
src/plugin.c:plugin_init() System does not support bass plugin
src/plugin.c:plugin_init() System does not support bap plugin

Проблем от отсутствия поддержки плагинов я не заметил, поэтому настройка необязательна.

Включаем экспериментальные функции bluetooth, чтобы не было предупреждений в journald:

sed '/Enables D-Bus experimental interfaces/{n;n;s/^#//;s/false/true/;}' -i /etc/bluetooth/main.conf
sed '/Enables D-Bus testing interfaces/{n;n;s/^#//;s/false/true/;}' -i /etc/bluetooth/main.conf
sed '/KernelExperimental/{s/^#//;s/false/true/;}' -i /etc/bluetooth/main.conf

Включаем юниты менеджера сети и bluetooth:

systemctl enable NetworkManager.service && \
systemctl enable bluetooth.service

Редактирование MKINITCPIO:

Копируем mkinitcpio.conf в mkinitcpio.conf.d:

cp /etc/mkinitcpio.conf /etc/mkinitcpio.conf.d/mkinitcpio.conf 

Редактировать hook mkinitcpio и включаем туда модули systemd и после block хуки sd encrypt:

sed -i '/^HOOKS=/ s/udev/systemd/' /etc/mkinitcpio.conf.d/mkinitcpio.conf  && \
sed -i '/^HOOKS=/ s/keymap consolefont/sd-vconsole/' /etc/mkinitcpio.conf.d/mkinitcpio.conf && \
sed -i "/^HOOKS=/ s/\(block\)\(.*\)$/\1 sd-encrypt\2/" /etc/mkinitcpio.conf.d/mkinitcpio.conf

Note

Когда есть systemd, хук resume не нужен https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate#Configure_the_initramfs

**Добавляем /etc/crypttab.initramfs: **

cat << _EOF_ > /etc/crypttab.initramfs
# Mount /dev/mapper/swap re-encrypting it with a fresh key each reboot
swap UUID=$NVME0N1P2 none timeout=180,tpm2-device=auto
# Mount /dev/mapper/root with the key from TPM
root UUID=$NVME0N1P3 none timeout=180,tpm2-device=auto,discard
_EOF_

Установка SECURE BOOT:

sudo -u vlad paru -S  sbctl

Проверяем, что secure boot в setup mode: Enabled (нужно удалить старые ключи из биоса):

sbctl status

Создаём свои ключи:

sbctl create-keys

Создаём свои ключи и добавляем ключи Microsoft (для поддержки windows и вшитых устройств у некоторых материнок):

sbctl enroll-keys --microsoft

Note

Если secure boot не очищенный, UEFI не даст накатить ключи. Если до этого Secure boot был забыт, можно пока пропустить этот шаг. При перезагрузке удалить ключи и уже потом накатывать

Ядра:

Установка UKI:

Добавить опции основного ядра в cmdline:

cat << _EOF_ > /etc/kernel/cmdline
options page_alloc.shuffle=1 root=$ROOT rootflags=atgc resume=$SWAP rw
_EOF_

Добавим опции для fallback (В итоге, он как запасной имеет минимальные для загрузки параметры, например будет в дальнейшем без plymouth параметров):

cat << _EOF_ > /etc/kernel/cmdline-base
options page_alloc.shuffle=1 root=$ROOT rootflags=atgc rw
_EOF_

Note

page_alloc.shuffle=1 - Этот параметр рандомизирует свободные списки распределителя страниц. Улучшает производительность при работе с ОЗУ с очень быстрыми накопителями (NVMe, Optane). Подробнее тут. Доп. информация здесь: https://ventureo.codeberg.page/source/kernel-parameters.html

root= - опция, указывающая какой раздел грузить как root (в данном случае это логический диск) resume= -опция, показывающий системе swap раздел, необходимый при сне.

rootflags=atgc - опцию, которую я не расшифровал, но тут написано зачем оно:https://wiki.archlinux.org/title/F2FS#Remounting_impossible_with_some_options

rw - разрешение на чтение запись раздела

Note

Раньше был параметр resume=$SWAP для пробуждения из гибернизации, но компоненты systemd научились работать без этого указателя.

Если стоит busybox, необходимо вернуть этот параметр.

Добавляем в переменные нужные ядра:

export MAIN_KERNEL=linux-cachyos

Добавляем пресеты для разных UKI:

cat << _EOF_ > /etc/mkinitcpio.d/$MAIN_KERNEL.preset
# mkinitcpio preset file for the '$MAIN_KERNEL' package

ALL_config="/etc/mkinitcpio.conf.d/mkinitcpio.conf"
ALL_kver="/boot/vmlinuz-$MAIN_KERNEL"

PRESETS=('default' 'fallback')

#default_config="/etc/mkinitcpio.conf.d/mkinitcpio.conf"
#default_image="/boot/initramfs-$MAIN_KERNEL.img"
default_uki="/efi/EFI/Linux/arch-$MAIN_KERNEL.efi"
default_options="--cmdline /etc/kernel/cmdline"

#fallback_config="/etc/mkinitcpio.conf.d/mkinitcpio.conf"
#fallback_image="/boot/initramfs-$MAIN_KERNEL-fallback.img"
fallback_uki="/efi/EFI/Linux/arch-$MAIN_KERNEL-fallback.efi"
fallback_options="--cmdline /etc/kernel/cmdline-base"
_EOF_

Перед установкой, возможно, захочется не компилировать некоторые ядра, а поставить нужный репозиторий:

Linux-mainline

Linux-lqx

Linux-cachyos

Создать директории в efi, если их нет

mkdir -p /efi/EFI && \
mkdir -p /efi/EFI/LINUX

Устанавливаем ядро и нужные компоненты:

sudo -u vlad paru -S --needed $MAIN_KERNEL  $MAIN_KERNEL-headers mkinitcpio-firmware
sudo -u vlad paru -S --needed --asdeps wireless-regdb linux-firmware  modprobed-db uksmd

Note

Для того, чтобы mkinitcpio не делал предупреждений о отсутствующих модулях, я поставил этот пакет(Но это не обязательно т.к. оно ни на что не влияет): https://wiki.archlinux.org/title/Mkinitcpio#Possibly_missing_firmware_for_module_XXXX

Настройки для видеокарты NVIDIA:

Если видеокарта не имеет type-c, чтобы избавиться от ошибок можно его замутить Добавляем в modprobe.d:

cat << _EOF_ > /etc/modprobe.d/blacklist_i2c.conf
blacklist i2c_nvidia_gpu
#
# If the video card does not have type-c, and support is included in the drivers, then you can mute it
_EOF_

Загрузчики:

Пересобираем ядра уже в EFI:

mkinitcpio -P

Подпись файлов efi созданными ключами:

Подписываем Windows файлы:

sbctl sign -s /efi/EFI/Boot/bootx64.efi

UEFI приложения:

memtest86:

Установка:

sudo -u vlad paru -S memtest86-efi     

Запускаем скрипт установки и следуем инструкциям:

memtest86-efi --install

Подписываем:

sbctl sign -s /efi/EFI/memtest86/memtestx64.efi

Добавлляем папку pacman.d/hooks

mkdir -p /etc/pacman.d/hooks

Добавляем триггер для подписи memtest86 при его обновлении:

cat << _EOF_ >> /etc/pacman.d/hooks/sign-memtest86-secureboot.hook
[Trigger]
Operation = Install
Operation = Upgrade
Type = Path
Target = /efi/EFI/memtest86/memtestx64.efi

[Action]
When = PostTransaction
Exec = /usr/bin/sbctl sign-all
Depends = sbctl
_EOF_

fwupd:

Установка:

sudo -u vlad paru -S --needed fwupd

Подписываем:

sbctl sign -s /usr/lib/fwupd/efi/fwupdx64.efi

Добавляем триггер для подписи fwupd при его обновлении:

cat << _EOF_ >> /etc/pacman.d/hooks/sign-fwupd-secureboot.hook
[Trigger]
Operation = Install
Operation = Upgrade
Type = Path
Target = /usr/lib/fwupd/efi/fwupdx64.efi

[Action]
When = PostTransaction
Exec = /usr/bin/sbctl sign-all
Depends = sbctl
_EOF_

Постзагрузка:

Warning

Часть инструкций ломает внешние шрифты. Пока не добавлять при установке

Plymouth:

В cmdline добавить:

sed -i -e 's/$/ loglevel=3 quite splash rd.udev.log_priority=3 vt.global_cursor_default=0/' /etc/kernel/cmdline

В hook в mkinitcpio после udev вставить plymouth:

sed -i "/^HOOKS=/ s/\(systemd\)\(.*\)$/\1 plymouth\2/" /etc/mkinitcpio.conf.d/mkinitcpio.conf 

Note

У nvidia plymouth появляется довольно поздно и это нормально. Всё из-за поздней загрузки kms

Настройка plymouth:

Установка пакетов:

sudo -u vlad paru -S plymouth plymouth-theme-arch-bgrt

Выбираем тему arch-bqrt:

plymouth-set-default-theme -R arch-bgrt

Начало настройки рабочего окружения:

Украшаем окно приветствия:

cat << _EOF_ >> /etc/issue
 \e[H\e[2J
           \e[1;36m.
          \e[1;36m/#\
         \e[1;36m/###\      \e[1;37m               #     \e[1;36m| *
        \e[1;36m/p^###\     \e[1;37m a##e #%" a#"e 6##%  \e[1;36m| | |-^-. |   | \ /
       \e[1;36m/##P^q##\    \e[1;37m.oOo# #   #    #  #  \e[1;36m| | |   | |   |  X
      \e[1;36m/##(   )##\   \e[1;37m%OoO# #   %#e" #  #  \e[1;36m| | |   | ^._.| / \ \e[0;37mTM
     \e[1;36m/###P   q#,^\
    \e[1;36m/P^         ^q\ \e[0;37mTM
_EOF_

Avahi

Note

Компонент тоже важный. Вообще в системе уже стоит systemd-resolved,но avahi устанавливается неявно вместе с pipewire, поэтому, отмечаю его отдельно, чтобы не потерялcя Что это: Avahi is a free Zero-configuration networking (zeroconf) implementation, including a system for multicast DNS/DNS-SD service discovery. It allows programs to publish and discover services and hosts running on a local network with no specific configuration. For example you can plug into a network and instantly find printers to print to, files to look at and people to talk to. It is licensed under the GNU Lesser General Public License (LGPL).

[!Что он делает:] Avahi provides local hostname resolution using a "hostname.local" naming scheme.

Установка:

sudo -u vlad paru -S --needed avahi nss-mdns

Отключаем systemd-resolved:

systemctl disable systemd-resolved.service

Включаем avahi-daemon.service:

systemctl enable avahi-daemon.service

Note

Есть аналог от systemd — systemd-resolved, но, т.к. pipewire в зависимостях требует именно avahi, и какого-то отдельного смысла в systemd-resolved нет (Кроме как убрать иконки avahi из DE), я не буду его заменять. Плюс у systemd-resolved, в отличии от Avahi есть ограничения, например он имеет ограниченный resolvconf интерфейс, и может много что с ним не работать.

AppArmor

Устанавливаем сам apparmor (audit тоже качает ):

sudo -u vlad paru -S apparmor

Запускаем юнит apparmor:

systemctl enable apparmor.service

Note

Прежде всего нужно убедиться, что ядро поддерживает apparmor

Прописываем параметры ядра:

sed -i -e 's/$/ lsm=landlock,lockdown,yama,integrity,apparmor,bpf audit=1 audit_backlog_limit=8192/' /etc/kernel/cmdline

Note

audit_backlog_limit=8192 используется для предотвращения ошибки: '''bash audit: kauditd hold queue overflow '''

Обновляем и подписываем ядро:

mkinitcpio -P

Для работы уведомлений от Apparmor нужно:

Устанавливаем пакеты:

sudo -u vlad paru -S --asdeps --needed python-notify2 python-psutil

Создаём группу аудита:

groupadd --system audit

Добавляем юзера в группу аудита:

usermod vlad -aG audit

Добавляем группу аудита в конфига аудита:

sed '/log_group = root/s/root/audit/' -i /etc/audit/auditd.conf

Создаём папку автостарт, если нет:

sudo -u vlad mkdir -p /home/vlad/.config/autostart

Добавляем .desktop файл для уведомления:

sudo -u vlad bash -c 'cat << _EOF_ >> /home/vlad/.config/autostart/apparmor-notify.desktop
[Desktop Entry]
Type=Application
Name=AppArmor Notify
Comment=Receive on screen notifications of AppArmor denials
TryExec=aa-notify
Exec=aa-notify -p -s 1 -w 60 -f /var/log/audit/audit.log
StartupNotify=false
NoDisplay=true
_EOF_'

Запускаем аудита:

systemctl enable auditd.service

Создаём файл syslog, если его нет:

touch /var/log/syslog

Сниманием комментарий с write-cahe:

sed '/write-cache/s/^#//' -i /etc/apparmor/parser.conf

Графические окружения:

Note

На этом этапе можно начинать устанавливать графическое окружение желательно выбрать одно из окружений, т.к. при параллельном использовании одно окружение может влиять на другое

Gnome

KDE

XDG-USER-DIRS

Множество программ используют спецификацию XDG, и для таких программ, как файловый менеджер можно прямо указать расположение типовых каталогов (изображения, документы и т.п.) Это неплохая альтернатива мягким ссылкам

Установка:

sudo -u vlad paru -S --needed xdg-user-dirs

Указываем папки для типовых каталогов:

sudo -u vlad mkdir -p /home/vlad/.config && \
sudo -u vlad cat << _EOF_ > /home/vlad/.config/user-dirs.dirs
# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run.
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
#
XDG_DESKTOP_DIR="/mnt/sdb/Рабочий стол"
XDG_DOWNLOAD_DIR="/mnt/sdb/Загрузки"
XDG_TEMPLATES_DIR="$HOME/Шаблоны"
XDG_PUBLICSHARE_DIR="$HOME/Общедоступные"
XDG_DOCUMENTS_DIR="/mnt/sdb/YandexDisk/Компьютер SURFACE-BOOK/Документы"
XDG_MUSIC_DIR="/mnt/sdb/Музыка"
XDG_PICTURES_DIR="/mnt/sdb/YandexDisk/Компьютер SURFACE-BOOK/Изображения"
XDG_VIDEOS_DIR="/mnt/sdb/Видео"
_EOF_

Шрифты:

sudo -u vlad paru -S --needed ttf-ubuntu-nerd ttf-spacemono ttf-meslo-nerd-font-powerlevel10k

Trim:

Непрерывный Trim:

В F2FS по умолчанию включён f2fs, который ведёт себя как непрерывный со своими особенностями

Периодический Trim:

В /etc/fstab добавить nodiscard:

genfstab -U / >> /etc/fstab

Включение, старт и вывод периодического Trim:

systemctl enable fstrim.service && \
systemctl start fstrim.service && \
systemctl status fstrim.service

Note

Естественно, если стоит f2fs, то включать периодический Trim не стоит. У f2fs есть свой Trim

SSH

Установка:

sudo -u vlad paru -S --needed openssh

%% TODO: надо сюда добавить настройки по безопасности %%

Включаем юнит:

systemctl enable sshd.service

Перезагружаемся

Note

Обязательно проверяем, что UKI файлы на 100% собраны и без ошибок Так как в этап создания initramfs теперь подвязаны драйвера nvidia и подпись файлов для secure boot, то теперь (а логичней сделать отдельный хук для этого) нужно чтобы хуки от nvidia и подписи срабатывали Нужно в конце сгенерировать mkinitcpio и подписать ядра:

mkinitcpio -P

Выходим из chroot:

exit

Отмонтируем все тома и диски если LVM:

umount -Rv /mnt &&\
swapoff /dev/mapper/swap &&\
cryptsetup close /dev/mapper/root && \
cryptsetup close /dev/mapper/swap 

Перезагружаемся:

reboot

Warning

Включаем secure boot и TPMtrusted compute в UEFI


Всё что ниже нужно делать уже после перезагрузки системы


Часть 5. Настройка после загрузки со своего ядра:

Повторное подключение по SSH:

На машине-клиент снова узнаём ip его локальный ip(Будет примерно 192.168.1.111):

ip -br a

Далее на машине-настройщике подключаемся по ssh к машине-клиенту:

ssh vlad@<ip машины-клиента, который узнали выше>

Переменные:

Note

Они нам тут ещё пригодятся

Экспортируем UUID дисков в переменные:

export NVME0N1P1=$(lsblk -dno UUID /dev/nvme0n1p1) \
NVME0N1P2=$(lsblk -dno UUID /dev/nvme0n1p2) \
NVME0N1P3=$(lsblk -dno UUID /dev/nvme0n1p3) \
ROOT=/dev/mapper/root \
SWAP=/dev/mapper/swap

Проверка Apparmor:

Проверяем, работает ли aa-notify (должно быть хоть одно выполнение команды):

pgrep -ax aa-notify

Настройка LUKS ЧЕРЕЗ TPMtrusted compute

Note

Помимо systemd-cryptenroll есть ещё Clevis, но он в итоге себя показал намного быстрее при загрузке

Systemd-cryptenroll:

Устанавливаем необходимые пакеты:

paru -S --needed tpm2-tss tpm2-tools

Проверяем распознаёт ли linux tpm модуль(Если при загрузке системы появляется ошибка tpm, то ничего страшного):

test -c /dev/tpm0 && echo OK || echo FAIL

Note

Если нет, то проверяем включён ли TPM модуль в материнке:

Создаём копию заголовка (Её лучше сразу на какую-то флешку перекинуть):

sudo cryptsetup luksHeaderBackup /dev/nvme0n1p3 --header-backup-file /mnt/sdb/header-nvme0n1p3.img

%% !!! Проверить просто sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 . Должно теперь работать без указания устройства %% Привязываем luks к systemd-cryptenroll и внедряем в tpm ключ:

sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/nvme0n1p2
sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/nvme0n1p3

Проверяем всё ли записалось:

sudo cryptsetup luksDump /dev/nvme0n1p3

Обновляем ядра и подписываем их:

sudo mkinitcpio -P

Настойка подкачки:

sudo bash -c "echo 'vm.swappiness=10'>> /etc/sysctl.d/99-sysctl.conf"

Установка и запуск планировщика, если ядро с sched-ext

paru -Sy scx-scheds && \
sudo systemctl enable --now scx

Переменные для wayland

Note

Все подробности можно посмотреть на том же nvidia-tweaks

mkdir -p ~/.config/environment.d && \
cat << _EOF_ >> ~/.config/environment.d/envvars.conf
# Wayland environment
SDL_VIDEODRIVER="wayland,x11" # Can break some native games
XDG_SESSION_TYPE=wayland
QT_QPA_PLATFORM="wayland;xcb"
MOZ_DBUS_REMOTE=1 # For shared clipboard with Xwayland apps
WLR_NO_HARDWARE_CURSORS=1 
_JAVA_AWT_WM_NONREPARENTING=1
ELECTRON_OZONE_PLATFORM_HINT=auto
ZINK_DEBUG=ioopt #https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28580
NOUVEAU_USE_ZINK=1
_EOF_

Note

Логичней использовать окружения не сессий или пользователей, а сессии графических сред. Поэтому устанавливаем не в переменные оболочки или environment, а в переменные окружения wayland

Warning

Не каждое окружение самостоятельно использует это расположение Для тайловых оконных менеджеров логичней использовать переменные внутри конфигов эти файлов

Брандмауер:

Установка:

paru -S --needed ufw

Стандартные настройки:

sudo ufw default deny && \
sudo ufw allow from 192.168.0.0/24 && \
sudo ufw limit ssh

Включение ufw:

sudo ufw enable && \
sudo systemctl enable --now ufw

Дополнительная безопасность:

Разрешения для важных файлов:

sudo chmod 600 /etc/cron.deny &&\
sudo chmod 644 /etc/group &&\
sudo chmod 644 /etc/group- &&\
sudo chmod 644 /etc/issue &&\
sudo chmod 644 /etc/passwd &&\
sudo chmod 644 /etc/passwd- &&\
sudo chmod 600 /etc/ssh/sshd_config &&\
sudo chmod 700 /root/.ssh &&\
sudo chmod 700 /etc/cron.d &&\
sudo chmod 700 /etc/cron.daily &&\
sudo chmod 700 /etc/cron.hourly &&\
sudo chmod 700 /etc/cron.weekly &&\
sudo chmod 700 /etc/cron.monthly &&\
sudo chmod 600 /etc/cron.deny &&\
sudo chmod 644 /etc/group &&\
sudo chmod 644 /etc/group- &&\
sudo chmod 644 /etc/issue &&\
sudo chmod 644 /etc/passwd &&\
sudo chmod 644 /etc/passwd- &&\
sudo chmod 600 /etc/ssh/sshd_config &&\
sudo chmod 700 /root/.ssh &&\
sudo chmod 700 /etc/cron.d &&\
sudo chmod 700 /etc/cron.daily &&\
sudo chmod 700 /etc/cron.hourly &&\
sudo chmod 700 /etc/cron.weekly &&\
sudo chmod 700 /etc/cron.monthly

pam_pwquality

pam_pwquality предоставляет защиту от перебора по словарю и помогает настроить политики паролей для всей системы. Добавление политики:

sudo bash -c 'cat << _EOF_ > "/etc/pam.d/passwd"
#%PAM-1.0
password required pam_pwquality.so retry=2 minlen=8 difok=6 dcredit=-1 ucredit=-1 lcredit=-1 [badwords=myservice mydomain] enforce_for_root
password required pam_unix.so use_authtok sha512 shadow
_EOF_'

Note

При следующем изменении пароля, нужно будет создать пароль со следующими условиями:

  • запрашивать пароль 2 дополнительных раза в случае ошибки (параметр retry);
  • длина пароля не менее 8 символов (параметр minlen);
  • новый пароль должен отличаться от старого не менее чем шестью символами (параметр difok);
  • не менее 1 цифры (параметр dcredit);
  • не менее 1 буквы в верхнем регистре (параметр ucredit);
  • не менее 1 буквы в нижнем регистре (параметр lcredit);
  • не менее 1 другого символа (параметр ocredit);
  • не содержит слов "myservice" и "mydomain";
  • работает в том числе и для пользователя root. Подробнее тут: https://wiki.archlinux.org/title/Security_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%A2%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BA_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8E_%D1%81_pam_pwquality

Настройка графического окружения:

Note

Продолжаем установку DE

En и Ру словари для aspell и huspell checkers:

sudo pacman -S aspell-ru hunspell-ru aspell-en hunspell-en_US

[!NOTE} Это словари, которые необходимы системе для подчёркивания неправильных слов

Далее будут личные настройки программы, которые можно установить уже после:

Отключаем ssh, если не нужен:

sudo systemctl disable sshd.service

Готово!