1) Если решили заново настроить и нет уже готовых ключей для подписи, то убеждаемся, что Secure-boot сброшен и ключи пусты (Не вернувшиеся в дефолтное состояние, а именно пустые) 2) Проверяем, что для не подписанного arch iso был отключён Secure-boot 3) Проверяем, что TPM включён
На машине-клиент устанавливаем пароль:
passwd
На машине-клиент узнаём ip его локальный ip(Будет примерно 192.168.1.111):
ip -br a
Далее на машине-настройщике подключаемся по ssh к машине-клиенту
ssh ssh -o ServerAliveInterval=30 root@<ip машины-клиента, который узнали выше>
Note
Добавил ServerAliveInterval=30, чтобы не было отключения при бездействии.
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 можно удобно менять пароли (в отличии от того же 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
Подбор зеркал: Зачастую, стандартный подбор зеркал является неоптимальным. Поэтому с помощью 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
Установка своего часового пояса:
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_
Note
Все эти флаги взяты отсюда: https://ventureo.codeberg.page/v2022.07.01/source/generic-system-acceleration.html#makepkg-conf
Отличительной особенностью 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
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.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_
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 был забыт, можно пока пропустить этот шаг. При перезагрузке удалить ключи и уже потом накатывать
Добавить опции основного ядра в 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_
Перед установкой, возможно, захочется не компилировать некоторые ядра, а поставить нужный репозиторий:
Создать директории в 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
Если видеокарта не имеет 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_
mkinitcpio -P
Подписываем Windows файлы:
sbctl sign -s /efi/EFI/Boot/bootx64.efi
Установка:
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_
Установка:
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
Часть инструкций ломает внешние шрифты. Пока не добавлять при установке
В 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
Установка пакетов:
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_
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 (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
Устанавливаем пакеты:
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
На этом этапе можно начинать устанавливать графическое окружение желательно выбрать одно из окружений, т.к. при параллельном использовании одно окружение может влиять на другое
Множество программ используют спецификацию 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
В F2FS по умолчанию включён f2fs, который ведёт себя как непрерывный со своими особенностями
В /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
Установка:
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
На машине-клиент снова узнаём 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
Проверяем, работает ли aa-notify (должно быть хоть одно выполнение команды):
pgrep -ax aa-notify
Note
Помимо systemd-cryptenroll есть ещё Clevis, но он в итоге себя показал намного быстрее при загрузке
Устанавливаем необходимые пакеты:
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"
paru -Sy scx-scheds && \
sudo systemctl enable --now scx
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 предоставляет защиту от перебора по словарю и помогает настроить политики паролей для всей системы. Добавление политики:
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
sudo pacman -S aspell-ru hunspell-ru aspell-en hunspell-en_US
[!NOTE} Это словари, которые необходимы системе для подчёркивания неправильных слов
sudo systemctl disable sshd.service