Artix Linux. Установка с полным/частичным шифрованием

Kate

Administrator
Команда форума
Artix Linux - это systemd-free дистрибутив линукс на основе Arch Linux. Он использует свои репозитории, но присутствует частичная совместимость с репозиториями Arch и AUR. Artix Linux предоставляет выбор систем инициализации (OpenRC, Runitб, s6, dinit). В этом гайде будет рассмотрен пример с использованием OpenRC.

Что будет рассматриваться​

  • [BootPartial] - "Почти полное" шифрование диска, более быстрое время загрузки, но менее безопасное из-за возможности заложить эксплоит в незашифрованный раздел boot
  • [BootFull] - Полное шифрование диска, более медленное время загрузки.
  • [UEFI] - Зашифрованный корневой раздел с системным разделом EFI
Шифрование будет производиться с помощью Linux Unified Key Setup (LUKS).

Разделы дополнительно будут разделены с помощью Logical Volume Manager (LVM).

Boot device​

Чтобы установить систему создадим загручное устройство. Скачаем образ LiveCD/LiveUSB c официального сайта. Для новичков советую скачать образ с графическим окружением, например xfce, это упростит копирование и вставку команд в консоль.

После скачивание берем устройство для создания LiveCD/LiveUSB (обычно используется флешка). На него нужно записать сам образ. Для Windows я использую Rufus. Для Linux используйте команду:

dd bs=4M if=path/to/artix.iso of=/dev/sdX oflag=nocashe status=progress
Где X в /dev/sdX это название блочного устройства.

Если вы используйте виртуальную машину, то укажите нужный iso образ при создании новой виртуальной машины

После загрузки с LiveCD/LiveUSB откройте терминал и введите:

sudo su
для запуска все последующих команд от имени администратора

Начало установки​

Установка с использованием Calamares рассматриваться не будет.

Для работы с разделами диска будет использоваться parted. Он не входит в стандартный пакет LiveCD/LiveUSB Artix Linux, поэтому скачаем его с репозиториев, прежде обновив базу:

pacman -Sy parted
Узнайте букву X желаемого целевого установочного диска:

parted -l
Убедитесь, что на этом диске нет ничего важного, затем удалите его таблицу разделов и перезапишите все ее содержимое с помощью:

dd bs=4096 if=/dev/urandom iflag=nocache of=/dev/sdX oflag=direct status=progress || true
В целях безопасности ДОЖДИТЕСЬ завершения этого длительного процесса. Затем запустите:

sync
Для очистки очереди запланированных операций ввода-вывода с диском. Кроме того, рекомендуется перезагрузиться после выполнения этого и снова запустить терминал.

Разделы диска​

[BootPartial]

  • /dev/sdX - Физический диск с таблицей разделов MBR
  • /dev/sdX1 - Загрузочный незашифрованный раздел размером 1 GB
  • /dev/sdX2 - Зашифрован с помощью LUKS (Linux Unified Key Setup) и разделен на разделы в контейнере LVM (Logical Volume Manager)
    • /dev/mapper/lvm-volSwap - Раздел подкачки, размер которого > = размер вашей оперативной памяти
    • /dev/mapper/lvm-volRoot - Корневой раздел, который занимает 100% оставшегося свободного места
[BootFull]

  • /dev/sdX - Физический диск с таблицей разделов MBR
  • /dev/sdX1 - Зашифрован с помощью LUKS (Linux Unified Key Setup) и разделен на разделы в контейнере LVM (Logical Volume Manager)
    • /dev/mapper/lvm-volBoot - Зашифрованный boot раздел размером 1 ГБ
    • /dev/mapper/lvm-volSwap - Раздел подкачки, размер которого > = размер вашей оперативной памяти
    • /dev/mapper/lvm-volRoot - Корневой раздел, который занимает 100% оставшегося свободного места
[UEFI]

  • /dev/sdX - Физический диск с таблицей разделов GPT
  • /dev/sdX1 - Системный раздел EFI размером 512 MB
  • /dev/sdX2 - Зашифрован с помощью LUKS (Linux Unified Key Setup) и разделен на разделы в контейнере LVM (Logical Volume Manager)
    • /dev/mapper/lvm-volSwap - Раздел подкачки, размер которого > = размер вашей оперативной памяти
    • /dev/mapper/lvm-volRoot - Корневой раздел, который занимает 100% оставшегося свободного места

Создание разделов​

[BootPartial]​

Создайте новую таблицу разделов MBR:

parted -s /dev/sdX mklabel msdos
Настройте раздел /dev/sdX1 для /boot и установите boot флаг:

parted -s -a optimal /dev/sdX mkpart "primary" "fat16" "0%" "1024MiB"
parted -s /dev/sdX set 1 boot on
Создайте раздел /dev/sdX2, который займет оставшееся свободное место - после 1 ГБ /boot и установите флаг lvm:

parted -s -a optimal /dev/sdX mkpart "primary" "ext4" "1024MiB" "100%"
parted -s /dev/sdX set 2 lvm on
Просмотрите является ли выравнивание разделов правильным:

parted -s /dev/sdX print
parted -s /dev/sdX align-check optimal 1
parted -s /dev/sdX align-check optimal 2

[BootFull]​

Создайте новую таблицу разделов MBR:

parted -s /dev/sdX mklabel msdos
Создайте раздел /dev/sdX1, который займет все пространство, и установите флаги загрузки и lvm:

parted -s -a optimal /dev/sdX mkpart "primary" "ext4" "0%" "100%"
parted -s /dev/sdX set 1 boot on
parted -s /dev/sdX set 1 lvm on
Просмотрите является ли выравнивание разделов правильным:

parted -s /dev/sdX print
parted -s /dev/sdX align-check optimal 1

[UEFI]​

Создайте новую таблицу разделов GPT:

parted -s /dev/sdX mklabel gpt
Создайте раздел /dev/sdX1 для /boot/EFI и установите ESP флаг:

parted -s -a optimal /dev/sdX mkpart "primary" "fat32" "0%" "512MiB"
parted -s /dev/sdX set 1 esp on
Создайте раздел /dev/sdX2, который займет оставшееся свободное место - после 512 MB /boot/efi и установите флаг lvm:

parted -s -a optimal /dev/sdX mkpart "primary" "ext4" "512MiB" "100%"
parted -s /dev/sdX set 2 lvm on
Просмотрите является ли выравнивание разделов правильным:

parted -s /dev/sdX print
parted -s /dev/sdX align-check optimal 1
parted -s /dev/sdX align-check optimal 2

Настройка и шифрование логических томов​

Шифрование диска будет использовать Linux Unified Key Setup (LUKS), который является частью расширенной версии cryptsetup.

Чтобы принудительно загрузить модули ядра Linux, связанные с Serpent и другими надежными шифрованиями, с вашего LiveCD/LiveUSB, запустите:

cryptsetup benchmark
Физический раздел LUKS можно создать и отформатировать следующим образом:

# [BootPartial]
cryptsetup --verbose --type luks1 --cipher serpent-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 --use-random --verify-passphrase luksFormat /dev/sdX2

# [BootFull]
cryptsetup --verbose --type luks1 --cipher serpent-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 --use-random --verify-passphrase luksFormat /dev/sdX1

# [UEFI]
cryptsetup --verbose --type luks1 --cipher serpent-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 --use-random --verify-passphrase luksFormat /dev/sdX2
Описание опций:

  • verbose - Выводит дополнительную информацию о выполнении команды.
  • type luks1 - Для использования более общей версии LUKS (Из-за ограничений grub)
  • cipher serpent-xts-plain64 - Выбирает, какой шифр использовать
  • key-size 512 - Размер ключа шифра
  • hash sha512 - Алгоритм хеширования, используемый для получения ключа.
  • iter-time 10000 - Количество миллисекунд, затрачиваемое на обработку парольной фразы
  • use-random - Выбирает, какой генератор случайных чисел использовать
  • verify-passphrase - Используется для luksFormat и luksAddKey для парольной фразы
При выполнении программа попросит подтвердить перезапись данных. Введите капсом "YES":

# WARNING!
# ========
# This will overwrite data on /dev/sdX irrevocably.
# Are you sure? (Type 'yes' in capital letters): YES
Далее введите парольную фразу:

# Enter passphrase for /dev/sdX:
# Verify passphrase:
# Key slot 0 created.
# Command successful.
Раздел, зашифрованный с помощью LUKS, необходимо открыть и смонтировать с помощью LVM системы:

# [BootPartial]
cryptsetup luksOpen /dev/sdX2 lvm-system

# [BootFull]
cryptsetup luksOpen /dev/sdX1 lvm-system

# [UEFI]
cryptsetup luksOpen /dev/sdX2 lvm-system
Для открытия раздела введите парольную фразу

# Enter passphrase for /dev/sdX:
Теперь можно создать физический том с LVM и ранее использовавшегося идентификатора (lvm-system) следующим образом:

pvcreate /dev/mapper/lvm-system
Имея физический том, можно создать группу логических томов с именем lvmSystem следующим образом:

vgcreate lvmSystem /dev/mapper/lvm-system
В саму группу добавляем логические тома (Для swap я задал 1 ГБ, но рекомендуется задать >= кол-ву оперативной памяти):

# [BootPartial]
lvcreate --contiguous y --size 1G lvmSystem --name volSwap
lvcreate --contiguous y --extents +100%FREE lvmSystem --name volRoot

# [BootFull]
lvcreate --contiguous y --size 1G lvmSystem --name volBoot
lvcreate --contiguous y --size 1G lvmSystem --name volSwap
lvcreate --contiguous y --extents +100%FREE lvmSystem --name volRoot

# [UEFI]
lvcreate --contiguous y --size 1G lvmSystem --name volSwap
lvcreate --contiguous y --extents +100%FREE lvmSystem --name volRoot

Форматирование разделов​

Загрузочный раздел:

# [BootPartial]
mkfs.fat -n BOOT /dev/sdX1

# [BootFull]
mkfs.fat -n BOOT /dev/lvmSystem/volBoot

# [UEFI]
mkfs.fat -n ESP -F 32 /dev/sdX1
Корневой раздел:

mkfs.ext4 -L ROOT /dev/lvmSystem/volRoot
Раздел подкачки:

mkswap -L SWAP /dev/lvmSystem/volSwap
Эта команда выведет сообщение типа:

# Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
# LABEL=SWAP, UUID=d91f0877-4b84-40c3-82f9-88d2398303b3
Скопируйте куда-нибудь свой swap UUID. Он понадобится вам позже.

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

Корнем будет /mnt, куда мы и будем устанавливать систему

swapon /dev/lvmSystem/volSwap
mount /dev/lvmSystem/volRoot /mnt
mkdir /mnt/boot

# [BootPartial]
mount /dev/sdX1 /mnt/boot

# [BootFull]
mount /dev/lvmSystem/volBoot /mnt/boot

# [UEFI]
mount --mkdir /dev/sdX1 /mnt/boot/efi
Обязательно проверьте точки монтирования (Вывод для UEFI):

artix-live:[root]:/home/artix# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 73.3M 1 loop /run/artix/sfs/livefs
loop1 7:1 0 1.1G 1 loop /run/artix/sfs/rootfs
sda 8:0 0 8G 0 disk
├─sda1 8:1 0 511M 0 part /mnt/boot/efi
└─sda2 8:2 0 7.5G 0 part
└─lvm-system 254:0 0 7.5G 0 crypt
├─lvmSystem-volSwap 254:1 0 1G 0 lvm [SWAP]
└─lvmSystem-volRoot 254:2 0 6.5G 0 lvm /mnt
sr0 11:0 1 1.2G 0 rom /run/artix/bootmnt

Настройка и установка пакетов.​

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

basestrap /mnt base base-devel openrc elogind-openrc linux-hardened linux-hardened-headers nano
Вместо стандартного ядра будет установлена предпочтительная защищенная версия

Теперь генерируем fstab:

fstabgen -U /mnt >> /mnt/etc/fstab
Зайдем на установленную среду:

artix-chroot /mnt /bin/bash
Дальше все операции будут производиться в ней

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

passwd
Для этого введите пароль два раза:

# New password:
# Retype new password:
# passwd: password updated successfully
Обновите базу пакетов:

pacman -Sy

Язык, часовой пояс​

Настройка часового пояса:

# ln -s /usr/share/zoneinfo/Continent/City /etc/localtime
Где Continent/City имя вашего местоположения. Например Europe/Moscow:

ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
Настройка аппаратных часов:

hwclock --systohc
Генерация локалей:

echo -e "en_US.UTF-8 UTF-8" >> /etc/locale.gen
Данная команда добавит в конец файла строчку с английской локалью, но если вам нужен другой язык, то откройте файл /etc/locale.gen в любом редакторе.

Например используя nano:

nano /etc/locale.gen
Находим строчку с нужным языком и раскомментируемеё. Для русского это:

#ru_RU.UTF-8 UTF-8
CTRL+Q поиск, CTRL+O сохранение, CTRL+X выход

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

Чтобы проверить раскомментированные локали введите следующую команду:

grep -v '^#' /etc/locale.gen
После выполняем генерацию выбранных локалей:

locale-gen
Настройка языка системы:

Сам язык системы задаётся в файле /etc/locale.conf:

echo "LANG=en_US.UTF-8" > /etc/locale.conf
Вместо en_US.UTF-8 вставьте нужную локаль

Настройка сети и хоста​

Далее изменяйте your_host_name на нужное имя хоста.

Настройка имени хоста (это обязательно для OpenRC):

echo "hostname=your_host_name" > /etc/conf.d/hostname
Теперь добавите записи в hosts. это удобнее делать через редактор:

nano /etc/hosts
Добавьте данные строчки в этот файл:

127.0.0.1 localhost
::1 localhost
127.0.1.1 your_host_name.localdomain your_host_name
Если система имеет постоянный IP-адрес, его следует использовать вместо 127.0.1.1.

Установите DHCP клиент:

pacman -S dhcpcd dhclient
Желательным выбором для управления сетевыми интерфейсами является Network Manager, для установки и активации службы необходимо запустить следующее:

pacman -S gcr networkmanager networkmanager-openrc
rc-update add NetworkManager default

Загрузчик и ядро​

Mkinitcpio​

Файл /etc/mkinitcpio.conf позволяет настраивать различные параметры ядра. В части HOOKS. Между ключевыми словами block и filesystems необходимо поместить encrypt lvm2, чтобы включить полное шифрование диска. Также может быть полезно включить ключевое слово resume, чтобы включить параметры приостановки на диске.

Откройте файл:

nano /etc/mkinitcpio.conf
Вставьте хуки: encrypt, lvm2, resume в нужные места

HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems fsck)
Должно быть так:

HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block encrypt lvm2 resume filesystems fsck)
Дабы избежать возможных проблем в будущем стоит удалить пакет artix-grub-theme, если он присутствует:

pacman -Rc artix-grub-theme
Так как мы используем защищенное ядро, то стандартное стоит удалить, если оно присутствует:

pacman -Rc linux linux-headers
Чтобы избежать ошибок установки cryptsetup, одновременно обновите pacman и openssl и установите устаревший openssl:

pacman -S openssl openssl-1.1 pacman
Теперь нужно установить эти пакеты:

pacman -S lvm2 cryptsetup nano glibc mkinitcpio
Initramfs должен перегенерироваться, если этого не произошло, то выполните команду:

mkinitcpio -p linux-hardened

Grub​

Система установлена, теперь нужно установить загрузчик. Используем мультисистемный GRUB

Для начала его нужно установить:

pacman -S grub
Как вы помните мы записывали swap UUID, теперь нужно записать root UUID:

# [BootPartial]
blkid -s UUID -o value /dev/sdX2

# [BootFull]
blkid -s UUID -o value /dev/sdX1

# [UEFI]
blkid -s UUID -o value /dev/sdX2
Вывод будет примерно такой. Это и есть наш root UUID:

# 896c201f-f454-4d41-9b67-345a8b6a217c
Чтобы grub нашел зашифрованные LUKS разделы, нужно настроить это. Откроем /etc/default/grub:

nano /etc/default/grub
Теперь изменим строку GRUB_CMDLINE_LINUX_DEFAULT:

GRUB_CMDLINE_LINUX_DEFAULT="cryptdevice=UUID=xxx:lvm-system loglevel=3 quiet resume=UUID=yyy net.ifnames=0"
Где xxx это root UUID, а yyy это swap UUID.

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

GRUB_CMDLINE_LINUX_DEFAULT="cryptdevice=UUID=896c201f-f454-4d41-9b67-345a8b6a217c:lvm-system loglevel=3 quiet resume=UUID=d91f0877-4b84-40c3-82f9-88d2398303b3 net.ifnames=0"
Раскомментируйте, чтобы включить загрузку с зашифрованных устройств LUKS:

GRUB_ENABLE_CRYPTODISK="y"
Затем вы можете установить GRUB и сгенерировать его config:

# [Boot]
grub-install --target=i386-pc --boot-directory=/boot --bootloader-id=artix --recheck /dev/sdX
grub-mkconfig -o /boot/grub/grub.cfg

# [UEFI]
pacman -S efibootmgr
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=artix --recheck /dev/sdX
grub-mkconfig -o /boot/grub/grub.cfg
Примечание. Каждое изменение в конфигурации GRUB должно сопровождаться командой выше.

Другие пакеты​

Для расшифровки и использования томов LUKS/LVM необходимо установить и активировать следующие службы:

pacman -S device-mapper-openrc lvm2-openrc cryptsetup-openrc
rc-update add device-mapper boot
rc-update add lvm boot
rc-update add dmcrypt boot
Служба udev (eudev / eudev-openrc) должна быть запущена по умолчанию на уровне выполнения sysinit. Его активацию можно подтвердить следующим образом:

rc-status sysinit | grep udev
Должен вывести это:

# udev [ stopped ]
# udev-trigger [ stopped ]
Dbus должна быть установлена и активирована. Если это не так, это можно сделать следующим образом:

rc-update add dbus default
Логин systemd проектов должен быть установлен как часть базовых мета пакетов:

rc-update add elogind boot
Haveged — это простой демон энтропии, полезный для генерации непредсказуемых случайных чисел:

pacman -S haveged haveged-openrc
rc-update add haveged default
Cronie стандартный демон UNIX, который запускает определенные программы в запланированное время:

pacman -S cronie cronie-openrc
rc-update add cronie default
Демоны NTP, ACPI, Syslog-NG можно установить и активировать следующим образом:

pacman -S ntp ntp-openrc acpid acpid-openrc syslog-ng syslog-ng-openrc
rc-update add ntpd default
rc-update add acpid default
rc-update add syslog-ng default
Необязательные зависимости:

pacman -S dosfstools gptfdisk libisoburn mtools btrfs-progs os-prober
Пакеты микрокодов ядра для дополнительных инструкций процессора:

# intel
sudo pacman -S intel-ucode iucode-tool

# amd
sudo pacman -S amd-ucode iucode-tool

Последние шаги​

Выйдите из chroot и размонтируйте тома:

exit
umount -R /mnt
swapoff -a
Для очистки очереди запланированных операций ввода-вывода с диском:

sync
Теперь систему можно перезагрузить:

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

Устранение ошибок при загрузке​

Если ваша система не загрузилась по той или иной причине, то надо сначала загрузиться с LiveCD/LiveUSB.

Теперь расшифруем LVM и смонтируем разделы:

# [BootPartial]
cryptsetup luksOpen /dev/sdX2 lvm-system
mount /dev/lvmSystem/volRoot /mnt
mount /dev/sdX1 /mnt/boot
swapon /dev/lvmSystem/volSwap

# [BootFull]
cryptsetup luksOpen /dev/sdX1 lvm-system
mount /dev/lvmSystem/volRoot /mnt
mount /dev/lvmSystem/volBoot /mnt/boot
swapon /dev/lvmSystem/volSwap

# [UEFI]
cryptsetup luksOpen /dev/sdX2 lvm-system
mount /dev/lvmSystem/volRoot /mnt
mount /dev/sdX1 /mnt/boot/efi
swapon /dev/lvmSystem/volSwap
Если вы видите подобную ошибку при попытке монтирования:

# mount: /mnt: special device /dev/lvmSystem/volRoot does not exist.
# dmesg(1) may have more information after failed mount system call.
То выполните эту команду и заново выполните монтирование LVM:

vgchange -a y lvmSystem
Зайдём в смонтированную среду:

artix-chroot /mnt /bin/bash
При завершении работ выполняем:

exit
umount -R /mnt
swapoff -a
sync
reboot

Minimal GRUB​

71febc6c50252f806429f02e0e28a553.png

Если после введения парольной фразы вы видите Minimal GRUB как показано на скриншоте, то скорее всего GRUB не нашёл файл /boot/grub/grub.cfg или его директорию.

Заходим в систему через LiveCD/LiveUSB и выполняем:

# [Boot]
grub-install --target=i386-pc --boot-directory=/boot --bootloader-id=artix --recheck /dev/sdX
grub-mkconfig -o /boot/grub/grub.cfg

# [UEFI]
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=artix --recheck /dev/sdX
grub-mkconfig -o /boot/grub/grub.cfg
Если вы загрузили LiveCD/LiveUSB в boot режиме, но вам нужно сконфигурировать GRUB для UEFI, то выполните только эту команду:

grub-mkconfig -o /boot/grub/grub.cfg
Это сработает, если до этого вы запускали grub-install с нужными аргументами.

Hibernation device not found​

c0ca5ca8d67fb82364e9ca341042e8ca.PNG

Если после введения парольной фразы вы видите: "hibernation device 'UUID=xxx' not found" и "device '/dev/mapper/lvmSystem-volRoot' not found", то скорее всего GRUB не смог найти UUID устройства или в mkinitcpio.conf отсутствует какой-то HOOK.

Неправильный UUID​

Заходим в систему через LiveCD/LiveUSB и откроем /etc/default/grub:

nano /etc/default/grub
Перепроверяем, строчку GRUB_CMDLINE_LINUX_DEFAULT. Возможно вы не правильно написали UUID или пропустили какой-либо аргумент. Просмотрите выше пунт по настройке GRUB.

Если нашли ошибку выполняем:

grub-mkconfig -o /boot/grub/grub.cfg

Отсутствует HOOK​

Заходим в систему через LiveCD/LiveUSB.

Для принудительной загрузки модулей ядра Linux, связанных с Serpent выполним:

cryptsetup benchmark
Откроем /etc/mkinitcpio.conf:

nano /etc/mkinitcpio.conf
Проверяем все ли хуки на месте:

HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block encrypt lvm2 resume filesystems fsck)
Применим изменения:

mkinitcpio -p linux-hardened


 
Сверху