Skip to content

Instantly share code, notes, and snippets.

@s3rgeym
Last active April 6, 2024 11:59
Show Gist options
  • Save s3rgeym/bd33f94ab96c96bc6719035fcac2b807 to your computer and use it in GitHub Desktop.
Save s3rgeym/bd33f94ab96c96bc6719035fcac2b807 to your computer and use it in GitHub Desktop.
Установка Arch Linux с шифрованием всего диска либо раздела и Btrfs

image

Вся суть харча™ (на самом деле все далеко не так...)

Установка Arch Linux с шифрованием всего диска либо раздела и Btrfs

Как записать образ на флешку

Качаем Ventoy.

Screenshot 2022-06-01 110230

Выбираем Option --> Partition style --> GPT как на скрине.

Качаем ISO-образ Arch Linux [ и копируем/перемещаем ] в корень на созданном разделе флешки.

Screenshot 2022-06-01 110523

Так же нужно выделить немного места под Arch Linux, если не предполагается использование отдельного диска.

Запускаем Explorer/Проводник и кливаем правой по иконке This PC/Этот Компьютер, выбираем Manage (перед этим нужно выбрать Show more options):

Screenshot 2022-06-01 130403

В Disk Managment нужно сжать какой-нибудь раздел, выделив под Arch 80-100GB:

Screenshot 2022-06-01 130613

Выбор загрузочного устройства в BIOS/UEFI

Во время включения компьютера при появлении логотипа жмем раза клавиши F2 / F12 / Del (зависит от производителя).

Во вкладке Boot отключаем Secure Boot. Это виндовое изобретение, которое не позволяет запускать неподписанные EFI. Можно еще включить Launch CSM / CMS Boot / CMS OS / Legacy OS для возможности загрузки с устройств, содержащих метку MBR (может потребоваться, например, для установки Windows 7). В этой же вкладке меняем приоритет загрузки устройств, делая флешку первой. Сохраняем изменения и выходим.

Когда загрузится Ventoy, выбираем в меню Arch Linux...

Выбор пароля

В качестве пароля указывайте фразу длинее 20 символов. Не используйте пароли, которые вами уже использовались на ресурсах, напрямую подключенных к СОРМ (Вконтакте, Одноклассники, Mail, Yandex, Rambler и тп), избегайте распространенных паролей, которые утекли в сеть, и, конечно, же не вздумайте проверять стойкость пароля через сайт Касперского (вы его просто добавите в базу для брута, которую используют правоохранительные органы). В качестве пароля можно использовать фразу на одном из вымирающих языков, например, абхазском или ады-гей-ском, набранную на английской раскладке. Взломостойкими являются бредовые фразы, так как такой пароль нельзя подобрать с помощью цепей Маркова (например, "краб катит листья яблок"). Так же можно намеренно допускать ошибки в словах. Помните Олбанский и «Онотоле, пыш-пыш»?

Касаемо, фраз, то их не советуют использовать, потому как с помощью цепей маркова в теории можно подобрать пароль. В документации советуют генерировать пароль с помощью pwgen, а потом пытаться его запомнить придумывая слова, начинающиеся на эти буквы... Фактически этот же способ используется в xkcdpass, но только вместо ввода первых букв фразы, мы вводим случаные слова

Аппаратное vs программное шифрование

SED — Self Encrypted Drives. Samsung EVO и PRO поддерживают аппаратное шифрование с использованием спецификации TCG OPAL 2.0. Фактически единственным вариантом программного шифрования в Linux является LUKS. Аппаратное и программное шифрование в общем и целом работают похожим образом и имеют свои достоинства и недостатки.

Почему Luks, а не аппаратное шифрование? — Диски с аппаратным шифрованием (SED) в 2018 году по заказу королевской полиции Нидерландов были взломаны, путем замены прошивки, в результате без пароля удалось получить доступ к данным. Этот трюк был проделан на старых SSD EVO 840 и EVO 850... Статья в журнале ксакеп. Новые диски вроде как избавлены от этих проблем, но это не точно и никто не гарантирует отсутствия аппаратных закладок, и никак не решается проблема с "быстрым переподключением" к другому устройству для считывания данных.

Другие недостатки аппаратного шифрования:

  • UEFI от некоторых производителей, например, ASUS и Acer, "забывают" загрузочные записи после перехода устройства в залоченное состояние... Acer не найдя загрузочных записей, начинает искать загрузчики по захардокоженным путям и первой грузит Windows...
  • sedutil не поддерживает спящий режим, поэтому потребуется пользоваться сторонней утилитой со всеми вытекающими рисками.
  • Ну и, конечно, мы не можем выбрать какой-то другой алгоритм шифрования кроме AES.

К сожалению программное шифрование намного медленее (где-то в 1.5-2x), потому как шифрование в самошифрующихся дисках осуществляется отдельным AES чипом (без поддержки AES-NI все еще печальнее). Однако, скорости записи не особо критична, потому как при просмотре видео с Youtube, тот же iostat -d показывает, что на диск пишется в среднем... 600кб/сек. При скачивании файлов из интернета мы ограничены скоростью соединения, которая явно меньше 3000Mb/s, а вот при копировании файлов скорость сначала будет высокой, а потом упадет из-за перенагрева чипа. Если для вас критична скорость записи...

Результаты моих тестов:

# Samsung SSD 980 500GB + Btrfs
$ dd if=/dev/zero of=testfile bs=64k count=128k conv=fdatasync oflag=direct
131072+0 records in
131072+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 7.26142 s, 1.2 GB/s

# WD Blue SN550 NVMe SSD, LUKS + Btrfs
$ dd if=/dev/zero of=testfile bs=64k count=128k conv=fdatasync oflag=direct 
131072+0 records in
131072+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 16.6447 s, 516 MB/s

Стоит упомянуть, что значительная часть SATA SSD поддерживает «установку пароля через BIOS», но выглядит это как ворота на замке без забора посреди чистого поля, так как эти пароли часто хранятся в открытом виде (наглядно), либо есть сервисный мастер пароль (см. тут)... и в конце-концов можно тупо перепаять контроллер. К шифрованию это не имеет никакого отношения.

IN SOVIET RUSSIA ИСПОЛЬЗОВАТЬ ШИФРОВАНИЕ ДАННЫХ НА ДИСКАХ НУЖНО ВСЕГДА ЧТОБЫ НЕ СЕСТЬ НА 🍾!

SED: самошифрующиеся диски

Следует отметить, что данные на самошифоующихся данных шифруются всегда, но отключен запрос пароля. Пароли администратора и пароль от SID устанавливаются на заводе и нигде не указаны.

Сначала нужно скачать и записать на флешку live-образ.

Грузимся с live и далее все действия выполняем с него.

Установка пароля и запись PBA.

$ sedutil-cli --scan
Scanning for Opal compliant disks
/dev/nvme1  2  Samsung SSD 970 EVO 250GB                2B2QEXE7

# для того чтобы задать новый пароль (взамен заводского)
# нужно выполнить PSID Revert, так как будет сгенерирован новый ключ
# шифрования, но СТАРЫЕ ДАННЫЕ БУДУТ ФАКТИЧЕСКИ УТЕРЯНЫ
# PSID указан на наклейке SSD 
$ sedutil-cli --PSIDrever <PSID> /dev/nvme1n1

# задаем временный пароль
$ sedutil-cli --initialSetup p /dev/nvme1n1

На live уже есть PBA, который нужно записать на диск.

$ gunzip /usr/sedutil/UEFI64-1.15.1.img.gz 
$ sedutil-cli --loadPBAimage p /usr/sedutil/UEFI64-1.15.1.img /dev/nvme1n1

Включаем блокировку диска и запрос пароля после отключения питания:

$ sedutil-cli --enableLockingRange 0 p /dev/nvme1n1
$ sedutil-cli --setMBREnable on p /dev/nvme1n1  

Теперь можно поставить настоящий пароль:

$ sedutil-cli --setsidpassword p <your-password> /dev/nvme1n1
$ sedutil-cli --setadmin1pwd p <your-password> /dev/nvme1n1

PS: пароль администратора может отличаться от SID пароля

Для разблокировки:

$ sedutil-cli --disableLockingRange 0 <your-password> /dev/nvme1n1
$ sedutil-cli --setMBREnable off <your-password> /dev/nvme1n1  

Теперь можно вытащить флешку и выключить питание...

Примечание: в AUR есть sedutil-cli, установить его после завершения установки Arch Linux.

Ссылки:

Установка Arch Linux

Есть стандартная утилита для установки Arch Linux. Достаточно просто вбить arch-install в терминале, но лучше все слелать вручную, так как все нижеописанные действия предстоит проделывать не единожды.

Настройка WiFi

Если вы подключены от провода, то ничего настраивать не надо.

Для Wi-Fi нужно выполнить ряд действий:

$ iwctl

# Получим список сетевых интерфейсов
[iwd]# device list
                           Devices
-------------------------------------------------------------
  Name          Address          Powered    Adapter    Mode
-------------------------------------------------------------
  wlan0         ...              on         ...        ...

# Сначала просканируем сети
[iwd]# station <interface> scan

# А потом посмотрим все сети к которым можно подключиться
[iwd]# station <interface> get-networks
                               Available networks                             *
--------------------------------------------------------------------------------
    Network name                    Security          Signal
--------------------------------------------------------------------------------
    ...  
    <sid>                           psk               ****

# Подключаемся
[iwd]# station wlan0 connect <sid>

Проверка:

$ ping -c5 ya.ru

Синхронизация пакетов

Перед установкой желательно обновить базу пакетов и pgp-ключей для проверки подписи пакетов:

$ pacman -Sy archlinux-keyring

Разметка диска

Для Btrfs лучше всего подходит SSD.

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

fdsik -l

Пусть нам нужно поставить систему на nvme0n1.

Размечаем диск под систему, руководствуясь правилом от большего к меньшему:

cfdisk nvme0n1 

Должно получиться что-то типа этого:

раздел точка монтирования тип файловой системы размер описание
nvme0n1p1 / btrfs Весь объем минус размер efi/boot arch linux
nvme0n1p2 /boot vfat 512 MiB-1 GiB загрузочный раздел

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

Форматирование загрузочного раздела

Если у вас уже установлена Windows, пропускайте шаг с форматированием загрузочного раздела.

Форматируем загрузочный раздел:

mkfs.vfat -F32 -n ESP /dev/nvme0n1p2

Созданному разделу нужно выставить флаг boot, чтобы UEFI с него грузилось:

$ parted /dev/nvme0n1  
GNU Parted 3.5
Using /dev/nvme0n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
...
 2      499GB   500GB  1074MB  fat32        Boot        msftdata

(parted) set 2 boot on                                                    
(parted) q                                                                
Information: You may need to update /etc/fstab.

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

Если ваш диск не поддерживает аппаратное шифрование либо оно вам не подходит по каким-то причинам...

Создаем шифрованный раздел:

cryptsetup -q -i 15000 luksFormat /dev/nvme0n1p1

С помощью --cipher можно указать алгоритм шифрования, если не устраивает дефолтный.

-i, --iter-time — это время в миллисекундах, которое требуется процессору на расшифровку ключа.

Производительность различных алгоритмов можно протестировать:

$ cryptsetup benchmark                                              
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1      2475976 iterations per second for 256-bit key
PBKDF2-sha256    4665521 iterations per second for 256-bit key
PBKDF2-sha512    1859177 iterations per second for 256-bit key
PBKDF2-ripemd160  972705 iterations per second for 256-bit key
PBKDF2-whirlpool  752206 iterations per second for 256-bit key
argon2i      11 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id     11 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
#     Algorithm |       Key |      Encryption |      Decryption
        aes-cbc        128b      1353.5 MiB/s      5450.8 MiB/s
    serpent-cbc        128b       124.9 MiB/s       918.1 MiB/s
    twofish-cbc        128b       247.8 MiB/s       468.1 MiB/s
        aes-cbc        256b      1009.3 MiB/s      4422.6 MiB/s
    serpent-cbc        256b       128.4 MiB/s       922.5 MiB/s
    twofish-cbc        256b       252.1 MiB/s       468.0 MiB/s
        aes-xts        256b      4542.7 MiB/s      4508.0 MiB/s
    serpent-xts        256b       787.7 MiB/s       802.5 MiB/s
    twofish-xts        256b       443.9 MiB/s       449.0 MiB/s
        aes-xts        512b      3688.6 MiB/s      3750.5 MiB/s
    serpent-xts        512b       826.0 MiB/s       812.8 MiB/s
    twofish-xts        512b       449.7 MiB/s       449.1 MiB/s

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

cryptsetup luksOpen /dev/nvme0n1p1 crypt

Последний аргумент это имя под под которым блочное устройство будет доступно в /dev/mapper.

Создание Btrfs

Создаем на шифрованном разделе файловую систему Btrfs:

mkfs.btrfs -n 32k -L arch ARCH_DEVICE

-n указываем размер узла дерева в котором хранятся данные. Чем он больше, тем лучше сжимается...

  • Тут и далее вместо ARCH_DEVICE указываем /dev/mapper/crypt при использовании LUKS либо просто /dev/nvme0n1p1.

Btrfs ‒ это одна из самых продвинутых файловых систем в Linux. Многие считают ZFS достойной альтернативой, но она не включена в ядро. Btrfs поддерживает механизм CoW (copy-on-write), создание снапшотов и сжатие данных... Снапшоты — это снимки файловой системы, точки для восстановления. Сжатие данных позволяет экономить место на диске, отказаться от использования архивов, но различные форматы изображений и видео и так поддерживают сжатие, поэтому оно не всегда полезно. За 4 года использования Btrfs я не сталкивался с какими-то критическими багами, и она меня не раз спасали от утраты данных. Простой пример: sudo rm -rf /<тут закрался пробел>.

В Btrfs нет привычных разделов, есть только подтома, которые можно сравнить с обычными каталогами. У них нет фиксированного размера, однако его можно ограничить с помощью quota. Снапшоты, если упускать некоторые детали, являются теми же самыми подтомами, те их можно монтировать и выполнять аналогичные операции.

Монтируем RootFS:

mount ARCH_DEVICE /mnt

Возможные сабвольюмы:

subvolume mount описание
@ / Корневой каталог (системные файлы)
@home /home Домашний каталог с пользовательскими данными. Нужен отдельный так как при откате системы к предыдущему состоянию очень важно сохранить существующий прогресс (куки браузера, конфиги, документы, файлы проектов и т.д.)
@snapshots /.snapshots Содержит снапшоты корня, которые создает snapper
@home.snapshots /home/.snapshots Содержит снапшоты хомяка, которые создает snapper
@machines /var/lib/machines Если не существует, то создаст systemd
@portables /var/lib/portables Если не существует, то создаст systemd
@docker /var/lib/docker Рекомендации самого Docker с их сайта
@docker_btrfs /var/lib/docker/btrfs Docker создает саьвольюмы по этому пути
@var_lib /var/lib Вместо создания @machines, @portables, @docker можно создать только этот, если в /var/lib не будет храниться чего-то важного (предполагается, что будут делаться снапшоты только корня и/или хомяка)
@var /var Аналогично выше описанному
@var_log или просто @log /var/log Логи как правило не представляют интереса, но в снапшотах занимают дополнительное место
@swap /swap или /var/swap, или /var/lib/swap Хранит файл подкачки. Должен монтироваться с nodatacow

Подтома @machines, @portables, @.snapshots, @home.snapshots и @docker (опционально при использовании docker) нужны чтобы не заморачиваться с переносом вложенных подтомов при замене старого подтома на снапшот. Однако, вся эта плоская структура подтомов скорее нужна на серверах. Чтобы не заморачиваться я словетую использовать Btrfs Asssistant.

Создаем нужные подтома:

btrfs sub create /mnt/@
btrfs sub create /mnt/@home

Отмонтируем RootFS:

umount /mnt

Монтируем подтома и загрузочный раздел:

mount -o compress=zstd:9,@ ARCH_DEVICE /mnt

# Примонтируем остальное
# x-mount.mkdir создает несуществующую директорию

# mount -o x-mount.mkdir /dev/nvme0n1p2 /mnt/boot

# Используем более закрытые права на каталог с
mkdir -m 700 /mnt/boot
mount BOOT_DEVICE /mnt/boot

mount -o x-mount.mkdir,compress=zstd:9,subvol=@home ARCH_DEVICE /mnt/home

Через двоеточие указывается уровень сжатия. Для десктопа лучшим является 9, обеспечивающий 15x максимальное сжатие. При нем скорость записи падает до 100 MiB/s, но при скачивании файлов из сети у нас скорость ~12 MiB/s (100 MBit/s)... Нам важна только скорость чтения, а она не падает меньше 2 GiB/s, те примерно равна скорость записи SSD (и не должна быть меньше нее в идеале). Протестировать уровни сжатия можно так:

$ zstd -T0 -b1 -e19
 1#Synthetic 50%     :  10000000 ->   3152996 (x3.172), 2539.0 MB/s, 2642.0 MB/s
 2#Synthetic 50%     :  10000000 ->   3129011 (x3.196), 1169.9 MB/s, 2647.2 MB/s
 3#Synthetic 50%     :  10000000 ->   3230491 (x3.096),  344.1 MB/s, 2115.2 MB/s
 4#Synthetic 50%     :  10000000 ->   3339961 (x2.994),  283.0 MB/s, 1899.2 MB/s
 5#Synthetic 50%     :  10000000 ->   3290137 (x3.039),  162.8 MB/s, 1788.2 MB/s
 6#Synthetic 50%     :  10000000 ->   3278503 (x3.050),  142.8 MB/s, 1823.8 MB/s
 7#Synthetic 50%     :  10000000 ->   3321448 (x3.011),  133.6 MB/s, 1696.6 MB/s
 8#Synthetic 50%     :  10000000 ->   3315141 (x3.016),  118.1 MB/s, 1696.1 MB/s
 9#Synthetic 50%     :  10000000 ->   3355994 (x2.980),   94.3 MB/s, 1573.8 MB/s
10#Synthetic 50%     :  10000000 ->   3363166 (x2.973),   68.0 MB/s, 1593.6 MB/s
11#Synthetic 50%     :  10000000 ->   3363170 (x2.973),   43.5 MB/s, 1590.3 MB/s
12#Synthetic 50%     :  10000000 ->   3362882 (x2.974),   36.2 MB/s, 1577.1 MB/s
13#Synthetic 50%     :  10000000 ->   3354692 (x2.981),   14.2 MB/s, 1610.2 MB/s
14#Synthetic 50%     :  10000000 ->   3354678 (x2.981),   15.0 MB/s, 1605.5 MB/s
15#Synthetic 50%     :  10000000 ->   3353801 (x2.982),   11.5 MB/s, 1597.6 MB/s
16#Synthetic 50%     :  10000000 ->   3080678 (x3.246),   10.3 MB/s, 2535.2 MB/s
17#Synthetic 50%     :  10000000 ->   3136878 (x3.188),   3.63 MB/s, 2184.5 MB/s
18#Synthetic 50%     :  10000000 ->   3145664 (x3.179),   3.73 MB/s, 2066.9 MB/s
19#Synthetic 50%     :  10000000 ->   3140424 (x3.184),   3.04 MB/s, 2101.9 MB/s

Установка системных пакетов

Установим ядро, драйвера и базовый набор пакетов:

pacstrap /mnt base base-devel linux linux-firmware linux-headers btrfs-progs cryptsetup efibootmgr ntfs-3g exfat-utils git micro terminus-font wget xorg zsh

Добавьте к этому списку xf86-video-amdgpu для видеокарт AMD или nvidia. А так же патчи безопасности для процессоров: amd-ucode или intel-ucode.

Генерация fstab

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

genfstab -U /mnt | sed 's/,relatime/,noatime,commit=300,discard=async/' >> /mnt/etc/fstab

Тут мы изменили с целью оптимизации некоторые параметры монтирования:

  • Каждый раз когда мы открываем файл, записывается время его изменения, noatime запрещает запись времени модификации файла.
  • Btrfs хранит кеш в оперативной памяти и сбрасывает его на диск через интервал указанный в секундах в параметреcommit.
  • discard=async предотвращает микрофризы при выполнении TRIM.

Первые два параметра продлевают ресурс SSD.

Вход в окружение chroot

Делаем chroot и "грузимся" в систему:

arch-chroot /mnt

Время и локаль

Редактируем /etc/locale.gen:

$ micro /etc/locale.gen

Нужно найти и расскоментировать (убрать в начале #) сл строки:

en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8

Генерируем локали:

$ locale-gen
Generating locales...
  ru_RU.UTF-8... done
  en_US.UTF-8... done
Generation complete.

Задаем локаль по-умолчанию:

localectl set-locale LANG=en_US.UTF-8
# системная локаль
echo LANG=en_US.UTF-8 > /etc/locale.conf
# или
locale > /etc/locale.conf

Смотрим список раскладок клавиатуры для консоли Linux (та в которую можно попасть, нажав Ctrl + Alt + F1-6):

localectl list-keymaps | grep ru

Загружаем раскладку:

loadkeys ruwin_ct_sh-UTF-8

Теперь мы можем по ctrl+shift переключать раскладку с английской на русскую.

Посмотрим шрифты для консоли:

ls /usr/share/kbd/consolefonts | less

Загрузим какой-нибудь шрифт с поддержкой кириллицы:

# 1080p
setfont ter-v14n
# 4k
setfont ter-v18b

Эти настройки нужно сохранить:

echo 'KEYMAP="ruwin_ct_sh-UTF-8"' >> /etc/vconsole.conf
 
# либо так
localectl set-keymap --no-convert ruwin_ct_sh-UTF-8

# И сохраняем шрифт
echo 'FONT="ter-v18n"' >> /etc/vconsole.conf

Ищем нужную временную зону:

$ timedatectl list-timezones | grep Mosc
Europe/Moscow

Задаем временную зону:

timedatectl set-timezone 'Europe/Moscow'

Включаем синхронизацию времени с NTP-сервером:

timedatectl set-ntp true

Опционально устанавливаем часы компьютера:

hwclock --systohc

Настройка имени хоста (машины)

В имени хоста можно использовать латинские символы, цифры, -, _, ....

В качестве имени хоста можно указать:

  • если у вас сервер, то доменное имя;
  • username-laptop или username-pc username-LaptopModel, username-archlinux или username-arch;
  • фамилию, кличку, звезду, планету... случайны набор символов;
  • не указывать его, оставив по умолчанию archlinux.

Имя хоcта нужно для вашей идентификации в локальной сети. Это имя можно использовать вместо локального ip-адреса, который может измениться. Например, вы можете через VPN подключиться к локальной сети в офисе, а далее через ssh your_hostname к своей машине...

hostnamectl set-hostname YOURHOSTNAME

Редактируем хосты:

micro /etc/hosts

Содержимое должно быть примерно таким:

127.0.0.1 l     ocalhost
::1             localhost
127.0.1.1       <YOUR_HOSTNAME>.localdomain <YOUR_HOSTNAME>
# строки ниже опциональны и приведены в примере из man
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

Initramfs

Linux грузится с помощью образа initramfs: сначала файловая система монтируется в оперативную память (Initial-RAM-File-System), загружаются драйвера, монтируется реальная файловая система, и наконец мы получаем возможность войти в систему.

Редактируем настройки образа в файле /etc/mkinitcpio.conf:

micro /etc/mkinitcpio.conf

Добавьте драйвера видеокарт в образ:

# AMD
MODULES=(amdgpu)

# или NVIDIA
MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)

# или встройка AMD + дискретка NVIDIA
MODULES=(amdgpu nvidia nvidia_modeset nvidia_uvm nvidia_drm)

Добавление видеодрайверов позволяет решить проблем с редактированием конфигов при подключении мониторов, запуске игр игр на дискретке...

ВАЖНО!!!!!! В хуки добавляем btrfs и encrypt (при исп LUKS) до filesystems:

HOOKS=(... encrypt btrfs filesystems ...)

Хуки — это скрипты с функцией run_hook, которые выполняются последовательно при загрузке initrmafs.

Изменим дефолтный уровень сжатия для zstd:

# COMPRESSION_OPTIONS
# Additional options for the compressor
COMPRESSION_OPTIONS=(-T0 -15)

Теперь сгенериреум образ:

mkinitcpio -P

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

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

useradd -m -G users -s /bin/zsh <YOUR_USERNAME>
  • -m ‒ создать каталог пользователя в /home;
  • -G ‒ дополнительные группы, передаваемые через запятую. Добавив себя в группу systemd-journal, вы сможете без sudo просматривать логи с помощью journalctl...

Устанавливаем для него пароль:

$ passwd <YOUR_USERNAME>
New password: 
Retype new password:
passwd: password updated successfully

В целях безопасности лочим пользователя root, чтобы из под него нельзя было авторизоваться:

$ passwd -l root
passwd: password changed.

Разрешаем sudo для себя (одноименной группы, создаваемой по умолчанию):

echo '%<YOUR_USERNAME> ALL=(ALL:ALL) ALL' > /etc/sudoers.d/<YOUR_USERNAME>

Так же можем отредактировать sudoers, разрешив пользователям в группе wheel доступ к sudo:

$ micro /etc/sudoers

# Нужно найти раскомментировать строку:
%wheel ALL=(ALL:ALL) ALL

Часто в инструкциях пользователя добавдяют в группу sudo. Группы wheel и sudo делают одно и то же: дают доступ к выполнению команды sudo. Так уж исторически сложилось, что в debian-based дистрибутивах используют группу sudo, а в RHEL ‒ wheel.

Загрузчик системы

Загружаться мы будем через systemd-boot. Для этого установим EFI:

bootctl install

Создаем загрузочную запись. Для начала сохраним PARTUUID шифрованного раздела в конфиг, так как его запомнить проблематично:

blkid -o value -s PARTUUID /dev/nvme0n1p2 > /boot/loader/entries/arch.conf

Отредактируем конфиг:

micro /boot/loader/entries/arch.conf

Он должен выглядеть примерно так:

title   Arch Linux
initrd  /amd-ucode.img
initrd  /initramfs-linux.img
linux   /vmlinuz-linux
options cryptdevice=PARTUUID=fa65a43e-eb75-48f0-aee1-975a50c2e00d:cryptroot:allow-discards root=/dev/mapper/cryptroot rootflags=subvol=/@ rw nvme_core.default_ps_max_latency_us=0

Последняя строчка, если не используется LUKS будет выглядеть так:

options root=PARTUUID=fa65a43e-eb75-48f0-aee1-975a50c2e00d rootflags=subvol=/@ rw nvme_core.default_ps_max_latency_us=0
  • Параметр nvme_core.default_ps_max_latency_us=0 нужен для некоторых моделей SSD M.2. Без него файловая система через неопределенное время переходит в read only.
  • initrd /amd-ucode.img - это подгрузка микрокодов процессора для исправления различных уязвимостей. /amd-ucode.img заменяем на /intel-ucode.img.

Установите микрокоды проца (в зависимости от производителя):

pacman -Sy amd-ucode
# либо
pacman -Sy intel-ucode

Настроим загрузчик:

micro /boot/loader/loader.conf
timeout 4
default arch.conf
console-mode max
editor no

Добавляем переменные окружения

/etc/environment — это лучшее место для задания переменных, которые будут установлены глобально для всех пользователей...

Сделаем редактором по-умолчанию micro для всех взамен старперского vim (мы его даже не стали устанавливать) из которого не могут выйти 95% пользователей Linux (<ESC>, :qa!, <Enter>).

echo 'EDITOR=micro' >> /etc/environment

Переменные окружения, которые должны быть доступны только для вас и приложений, запускаемых от вашего пользователя, в дальнейшем можно добавлять в ~/.zshenv, ~/.zlogin, ~/.xprofile, ~/.profile как export KEY=VALUE. Общие для всех переменные можно установить в сценариях /etc/profiles.d/<filename>.sh.

Если система стартует через systemd (со startx не будет работать), то пользовательские переменные окружения в виде KEY=VALUE можно установить в ~/.config/environments.d/<filename>.conf либо в /etc/environment.d/<filename>.conf (общие для всех).

Выбор графического окружения (DE)

Xfce или крыса

pacman -Sy xfce4 xfce4-goodies network-manager-applet lightdm lightdm-gtk-greeter
systemctl enable lightdm

Плюсы:

  • Выглядит минималистично... как Gnome 2, форком которого он и стал, но Gnome за это время уже сменил кучу версий Gtk.
  • Легковесность — пакеты занимают мало места, и система потребляет мало ресурсов. В xfce по умолчанию менее 900 пакетов в то время как для KDE или Gnome их нужно на треть больше...
  • Стабильность: разработчики что-то ломают нечасто.

Минусы:

  • Вытекают из стабильности: баги не исправляют годами. Например, тот же gnome-keyring, будет у вас упорно запрашивать пароль даже если для связки ключей вы установите тот же пароль, что и для пользователя (эта проблема решается именно так в Gnome).
  • Многие простые вещи, например, создание ярлыка на рабочем столе, требуют кучу дополнительных телодвижений (нужно создать Launcher, указать имя, выбрать исполняемый файл и иконку для него).
  • Трудность настройки.
  • Ограниченная поддержка HDPi.
  • Не поддерживает Wayland (тут сомнительный минус, так как последний скорее всего так никогда и не победит иксы).
  • Нет расширений как в Gnome, есть убогий аналог Plasmoid'ов.

Заключение: все так себе, но жить можно. Некоторые делают из Xfce конфетку, выбрасывая стандартные панели и пр.

Gnome

pacman -S gnome gnome-extra
systemctl enable gdm

Плюсы:

  • Закос под MacOS с довольно таки минималистичным интерфейсом;
  • Лучшая поддержка Wayland;
  • Сам Gnome ломается редко в отличии от расширений...

Минусы:

  • Без расширений не очень удобен в использовании.
  • Расширения ломаются после каждого обновления.
  • Нужно отдельно настраивать внешний вид для приложений под Qt, например, ч/з Kvantum.
  • Потребляет ресурсов не меньше чем Windows.

Заключение: не с проста во многих дистрибутивах является DE по умолчанию, например, в Ubuntu, Fedora, что говорит о доверии со стороны разработчиков дистрибутивов, подтверждает тезис о стабильной работе самой системы, но не сторонних расширений...

Plasma/KDE или просто кеды

pacman -S plasma kde-applications
systemctl enable sddm

Плюсы:

  • Похож на Windows 10.
  • Темы можно устанавливать глобально для Qt и Gtk приложений.
  • Настройка почти всего без ковыряния текстовых конфигов! Огромное количество настроек.

Минусы:

  • Постоянные баги.
  • С поддержкой Wayland проблемы.
  • Потребляет много ресурсов примерно как Gnome.

Заключение: поддержка Wayland обычным пользователям не нужна, а с большинством багов можно смириться + Steam Deck работает на KDE Plasma, а значит есть надежда, что баги будут исправляться быстрее, как и появляться новые фичи, так как Габен занесет денег...

Настройка сети [ на целевом хосте ]

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

systemctl enable NetworkManager

Грузимся в систему

Можно не выходить, а выполнить что-то типа:

startx
systemctl start gdm
systemctl start sddm

Но если хочется проверить загрузку...

Выходим из chroot:

exit

Теперь можно перегрузиться и вытащить флешку:

reboot

Настройка системы

Управление пакетами

Для управления пакетами я советую использовать yay (yet another yaourt).

Главное преимущество Arch Linux в AUR, а поэтому нам нужен пакетный менеджер с его поддержкой. Раньше для этих целей использовали yaourt, но за прошедшие годы последний уступил пальму первенства.

$ cd /tmp
$ git clone https://aur.archlinux.org/yay-bin
$ cd yay-bin
$ makepkg -si

Настройка SWAP/ZRAM

Ядру Linux, независимо от размера оперативной памяти, нужно периодически сбрасывать страницы памяти в SWAP.

Для экономии ресурса SSD SWAP можно размещать в сжатом виде в оперативной памяти (ZRAM).

Установка:

$ yay -S zram-generator-git zram-generator-defaults

Включение ZRAM:

$ sudo systemctl restart systemd-zram-setup@zram0

Рекомендованные настройки SWAP для SSD:

/etc/sysctl.d/99-swappiness.conf

vm.swappiness=100
vm.vfs_cache_pressure=10

Применяем настройки:

$ sudo sysctl --system

Docker

Очень удобная вещь для разворачивания приложений. Требует минимум настройки и система не засирается хвостами.

$ yay -S docker docker-compose

# Добавим пользователя в группу docker, чтобы использовать команду docker без sudo
$ sudo usermod -aG docker $USER

# Перегрузимся
$ reboot

Юсаге:

# (Пере)собрать и запустить контейнеры
$ docker-compose up -d

# Остановить контейнеры
$ docker-compose stop

# Запустить остановленные ранее контейнеры
$ docker-compose start

# Остановить и удалить контейнеры
$ docker-compose down

docker-compose.yml:

version: '3.9'

services:
  postgres:
    container_name: postgres
    image: postgres:alpine
    env_file: .env
    networks:
      - internal
    ports:
      - '54320:5432'
    restart: unless-stopped
    volumes:
      - ./data/postgres:/var/lib/postgresql/data:rw

  pgadmin:
    container_name: pgadmin
    image: dpage/pgadmin4
    depends_on:
      - postgres
    env_file: .env
    networks:
      - internal
    ports:
      - "5050:80"
    restart: unless-stopped
    volumes:
      - ./data/pgadmin:/var/lib/pgadmin:rw

  redis:
    container_name: redis
    image: redis:alpine
    networks:
      - internal
    ports:
      - "63790:6379"
    restart: unless-stopped
    volumes:
      - ./data/redis:/var/lib/redis:rw

networks:
  internal:

.env:

POSTGRES_USER=docker
POSTGRES_PASSWORD=password
POSTGRES_DB=db
PGADMIN_DEFAULT_EMAIL=pgadmin4@pgadmin.org
PGADMIN_DEFAULT_PASSWORD=admin

В pgadmin заходим через localhost:5050, в качестве имени хоста базы указываем имя сервиса, те postgres вместо традиционного localhost и порт 54320,

Snapper

Snapper ‒ это менеджер снапшотов (снимков состояния файловой системы) для Btrfs. Он может их создавать/удалять по таймеру, а так же позволяет восстанавливать отдельные файлы.

$ yay -Sy snapper

Установим так же хук, который будет делать снапшоты после каждого обновления пакетов:

$ yay -S snap-pac

Снапшоты делаются каждый час, если не переопределить это поведение:

$ systemctl edit snapper-timeline.timer

[Timer]
OnCalendar=<period>

Настройки по-умолчанию предполагают слишком длительное хранение снапшотов, что может привести к постоянной проблеме нехватки места, если у вас SSD маленького объема.

Создаем новый шаблон файла конфигураций, чтобы не редактировать дефолтный:

$ cd /usr/share/snapper/config-templates
$ cp default config
$ micro config

Где значения TIMELINE_LIMIT_<PRERIOD> указывают сколько хранить N последних снапшотов за час (HOURLY)/день (DAILY)/неделю (WEEKLY)/месяц (MONTHLY)/год (YEARLY).

Пример конфига:

...
TIMELINE_LIMIT_HOURLY="10"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="0"
TIMELINE_LIMIT_YEARLY="0"
...

Храним 10 последних за час и 7 ежедневных (хранится самый первый за день).

snapper -c root create-config -t config /
snapper -c home create-config -t config /home
systemctl enable snapper-timeline.timer
systemctl enable snapper-cleanup.timer

Восстановление удаленного файла

# Смотрим номер последнего снапшота
sudo snapper -c <config> list -a

# Восстанавливаем файл
sudo snapper -c <config> undochange 0..<number> /path/to/file

Заменяем корневой сабвольюм на снапшот

Если не планируете пользоватся GUI, то может пригодиться...

В более сложных случаях может потребоваться восстановление системы:

$ sudo su

$ mount /dev/mapper/root /mnt

$ ls /mnt 
@ @home @.snapshots ...

$ cd /mnt

# Смотрим снапшоты
$ ls @.snaphosts
... 42 ...

# Переименовываем старый корневой сабвольюм
$ mv @ @old

# Помним, что snapshot и subvolume это одно и тоже, считай, а значит мы монтировать снапшот 
# Делаем снимок снапшота, по-сути копирем его, так как снапшоты, создаваемые snapper readonly
$ btrfs sub snap @.snaphots/42/snapshot @

# Редактируем fstab, если он содержит subvolid
# Ищем `subvol=/@` и удаляем `subvolid=N,`
$ micro @/etc/fstab

# Или же можно прописать subvolid
$ sudo btrfs sub show @ | grep 'Subvolume ID'
        Subvolume ID:           XXX

# Монтируем сабвольюм
$ mount -o remount /

# Теперь можно удалить @old
$ btrfs su de @old

GUI

image

Это стандартная утилита для дистрибутива Garuda Linux (основан на Arch'е как Manjaro и пр. суррогаты). Графический менеджер для управления снапшотами и восстановления из них.

yay -S btrfs-assistant btrfsmaintenance

Для использования Btrfs Assistant не подходит плоская схема, при которой подтома со снапшотами (@snapshots, @home.snapshots и тп) монтируются в /.snapshots или /home/.snapshots. При восстановлении из снапшота, делает снапшот савольюма, а затем заменяет его на выбранный снапшот, все дочерние сабвольюмы и снапшоты перемещаются.

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

Все пакеты стараемся ставить через yay. Flatpak используем только в крайних случаях: а) если пакета нет в репозитории, б) он сломался и не работает. Идея, конечно, хороша, но VS Code из Flatpak не юзабелен, а в каком-нибудь Brave не возможно подключиться к Tor. Бинарники из pip/npm можно ставить с помощью pipx/npx.

Flatpak

Графические приложения можно устанавливать через Flatpak. Приложения запускаются в изолированной среде, и они не имеют права на запись в системные каталоги хоста. Принцип работы схож с Docker. Если кратко: мы запускаем приложение в виртуалке на основе LXC(прим. контейнерезация — это разновидность виртуализации). По идее оно не может повредить систему, так как внутри Flatpak контейнера нельзя использовать sudo, но украсть данные это не помешает личные данные из хомяка...

yay -S flatpak
flatpak install -y Krita 

Плюсы:

  • Безопасность: приложения запускаются в контейнерах и имеют ограниченный доступ к файловой системе. Так же можно, например, ограничить доступ к сети.
  • Частичные, так называемые дельта-обновление - не нужно скачивать пакет целиком, так как исп. ostree , работающий по тому же принципу, что и git, те при обновлении скачиваются только различия между версиями.
  • Не нужна настройка, например, шрифтов как в Telegram и тд.
  • Зависимости идут в виде отдельных рантаймов, общих для других приложений в отличие от AppImage, где все-все зависимости идут с приложением.
  • Решает проблему с устаревшими зависимостями после обновления системы.

Минусы:

  • Приложения запускаются дольше (не мгновенно).
  • Занимают дополнительное место за счет рантаймов. Например одновременно могу стоять две версии org.gnome.Platform и три org.kde.Platform.
  • Нельзя доставить зависимости, например, те которые видим в выводе yay -Qi. Проблема со шрифтами.
  • Не работает интеграция с Gnome, KDE у того же Chromium.
  • Невозможно полноценно использовать IDE, установленные через Flatpak из-за его ограничений. В качестве решения этой проблемы авторы советуют использовать Sdk.Extension. Например, flatpak install flathub org.freedesktop.Sdk.Extension.golang и запуск среды разработки FLATPAK_ENABLE_SDK_EXT=golang flatpak run com.visualstudio.code.
  • В Telegram нельзя перетащить файл для отправки, если он где-то в /mnt.
  • Приложения в репозитории часто требуют больше прав чем им необходимо для работы.

Topgrade

Обновляет все подряд: пакеты pacman, AUR, Flatpak... образы Docker, плагины для ZSH и тд

$ yay -S topgrade
$ topgrade

Дополнения

Добавление загрузочной записи

Linux

# Загрузочный раздел: /dev/nvme0n1p4
# EFI не удалено
efibootmgr -c -d /dev/nvme0n1 -p 4 -L "Linux Boot Manager" -l '\efi\boot\bootx64.efi'

# Удаление записи
efibootmgr -b 000X -B

# Список записей, порядок загрузки и тп
efibootmgr -v

# Смена порядка. См вывод предыдущей команды
efibootmgr -o 0002,0001,...

Windows

Проблема: после установки/обновления Windows пропадает загрузочная запись Linux.

Запускаем терминал (Windows Terminal) от имени администратора (Win+X, Alt+A) и выполняем:

PS C:\Users\yourname> bcdedit /copy '{bootmgr}' /d "Arch Linux Boot"
The entry was successfully copied to {6c4580c1-e401-11ec-b643-089798e96d74}.
PS C:\Users\yourname> bcdedit /set '{6c4580c1-e401-11ec-b643-089798e96d74}' path \efi\boot\bootx64.efi
The operation completed successfully.
PS C:\Users\yourname> bcdedit /set '{fwbootmgr}' displayorder '{6c4580c1-e401-11ec-b643-089798e96d74}' /addfirst
The operation completed successfully.
PS C:\Users\yourname>

Восстановление Windows EFI (после удаления)

Скачайте образ Windows с сайта Microsoft.

Если у вас есть флешка с Ventoi и Windows, то пропускаем запись загрузочной флешки.

Установите утилиту для создания загрузочных флешек для Windows:

$ yay -S woeusb

Записываем образ:

$ sudo woeusb --device ~/Downloads/Windows...iso /dev/sdX

Теперь нам нужно загрузиться с флешки с Windows, проделав операции по смене приоритетов...

Либо можно почитать man efibootmgr.

Грузимся с флешки, ожидаем пока закончится загрузка Windows и нажимаем Shift + F10. Откроется консоль.

В консоли выполняем следующее:

> diskpart
DISKPART> list volume
:: Смотрим, где у нас установлена Windows
:: Если вы установили, Arch Linux на другой диск, то удалите загрузочный раздел винды (но не сам раздел с Windows! см. `help`)
DISKPART> exit

:: Устанавливаем Windows EFI на загрузочный раздел
> bcdboot c:\windows

Создаем RAID-1

SSD не живут вечно, у них есть ресурс перезаписи, который в зависимости от типа памяти (SLC, MLC, TLC или QLC, где первая буква количтсво бит на ячейку 1-4) может составлять от 10000 до 2500 перезаписей ячеек. Но очень часто SDD умирают, даже не выработав его. К этому приводит неожиданная смерть контроллера. Смерть контроллера означает невозможность восстановлкения данных! Поэтому, если на вашем диске хранится что-то важное, что нельзя беекапить в облако, то лучше докупить диск и запихнуть его в зеркальный RAID.

# Создаем raid
# Используем flag --metadata=1.0, чтобы супер-блок располагался в конце диска
mdadm -v --create --metadata=1.0 /dev/md0 -l 1 -n 2 missing /dev/nvme1n1p1

# Создаем файловую систему на /dev/md0 и тп

# Монтируем созданный raid
mount ... /dev/md0 /mnt

# Копируем данные с раздела /dev/nvme0n1p1 помощью rsync'a
rsync -avh ... /mnt

# Добавляем его в массив
mdadm --add /dev/md0 /dev/nvme0n1p1

# Ждем пока данные синхронизируются
watch -n 1 /proc/mdstat

# Сохраняем конфиг
mdadm --verbose --detail --scan >> /etc/mdadm.conf

Хуки /etc/mkinitcpio.conf:

HOOKS=(base systemd autodetect modconf kms keyboard sd-vconsole block mdadm_udev sd-encrypt filesystems fsck)

mdadm_udev

У меня используется RAID-1 > LUKS > Btrfs.

options md=0,/dev/nvme0n1p1,/dev/nvme1n1p1 rd.luks.name=f2233ed8-fbe6-4199-890a-d416c7a2a62b=root root=/dev/mapper/root rootflags=rw,subvol=@
sudo mdadm --misc --detail /dev/md0

/dev/md0:
           Version : 1.2
     Creation Time : Wed Oct 25 00:17:13 2023
        Raid Level : raid1
        Array Size : 487455744 (464.87 GiB 499.15 GB)
     Used Dev Size : 487455744 (464.87 GiB 499.15 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Fri Oct 27 04:30:48 2023
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : bitmap

              Name : sergey-arch:0  (local to host sergey-arch)
              UUID : 17332b2d:1685f236:6e28b36e:277f39cf
            Events : 20482

    Number   Major   Minor   RaidDevice State
       0     259        3        0      active sync   /dev/nvme1n1p1
       1     259        6        1      active sync   /dev/nvme0n1p1
@s3rgeym
Copy link
Author

s3rgeym commented Mar 1, 2023

5.000 слов и 40.000 символов, те это тянет на 20-страничный мануал или 10 листов. Если собрать все мои тексты, то, наверное, получилась бы книга на 100 листов

~ 
❯ wget -qO- https://gist.githubusercontent.com/s3rgeym/bd33f94ab96c96bc6719035fcac2b807/raw/abaa8e4ebef737a4a8bdeebc452249e74cc9b493/Arch-Install-SED-Luks-Btrfs.md | html2text | wc -w
4858

~ 
❯ wget -qO- https://gist.githubusercontent.com/s3rgeym/bd33f94ab96c96bc6719035fcac2b807/raw/abaa8e4ebef737a4a8bdeebc452249e74cc9b493/Arch-Install-SED-Luks-Btrfs.md | wc -m    
39056

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment