ArchLinux із шифрованою фаловою системою на USB
Встановлення

У цій нотатці я хочу, найперше для себе, записати послідовну інструкцію з підготовки USB “флешки” із ArchLinux та зашифрованою корневою файловою системою. Таку флешку я завжди маю при собі й за необхідності можу скористатися будь-яким (ну, майже будь-яким) ПК чи ноутом і завантажити повноцінну систему.

Це буде мінімальна істаляція без графічного середовища лише з усім необхідним особисто для мене. Конфігурацію графічного середовища я винесу в окрему нотатку, тут зосередимося лише на процесі встановлення.

Чому саме ArchLinux? Знаєте, дистрибутив немає значення - особисто мені на данний момент часу подобається саме Arch :)

Перш ніж розпочати

Для встановлення на флешку, як ви вже здогадалися, нам потрібна флешка. Якщо будемо встановлювати графічне середовище (а ми будемо), офісні програми та інше, то мінімальний розмір флешки має бути 16Гб. Іншу буде потрібно для завантаження інсталяційного образу, тут буде достатньо 4Гб (дякую, Любчик, що ненадовго позичив таку)

Завантажувальний образ

Завантажуємо образ дистрибутиву та створюємо завантажувальний образ командою:

dd bs=4M if=/path/archlinux.iso of=/dev/sdX status=progress && sync

де, /path/archlinux.iso - шлях до скачаного образу, а /dev/sdX - шлях до непідмонтованого USB диску.

До речі, якщо вже є встановлений ArchLinux, тоді цей крок можна пропустити і перейти відразу до встановлення.

BIOS чи UEFI

Сьогодні існує дві систем взаємодії між материнською платою та операційною системою: устарівша BIOS (basic input/output system) та більш сучасна UEFI (unified extensible firmware interface). Оскільки я точно не знаю на якому ПК доведеться завантажувати свій Linux, мені потрібно передбачити обидва варіанта, що я й планую зробити.

Файлова система

Як я вже писав, встановлення буду робити на зашифрований корінь. Я ж не хочу, щоб мої ключі доступів, якщо загублю флешку, потріпили у чиїсь руки? І ще кілька слів про swap - його не буде, оскільки я не бачу необхідності у файлі підкачи для резервної системи на флешці.

Завантажуємо інсталяційну систему

Після того, як завантажимо систему, потрібно підключення до інтернет. Якщо у нас ідеальна ситуація із провідним інтернетом та автоматичною роздачею адресів, то все має бути просто. Перевіримо:

ping -c1 google.com

WiFi

Із WiFi мережею все залежить, якщо відсутні необхідні драйвера для мережевої карти, тоді ми не зможемо підключитися. Перевіримо командою:

lspci -k | grep -A3 "Network controller"

Нічого? Тоді шукаємо кабель та провідний інтернет.

Якщо драйвер присутній, тоді глянемо на назву інтерфейсу:

iw dev

Увімкнемо інтерфейс:

ip link set wifiname up

І пошукаємо нашу мережу:

iw dev wifiname scan | grep "SSID:"

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

iw dev wifiname connect "networkname"

Щоб підключитися до мережі із WPA/WPA2 шифруванням потрібно потрібно виконати команду:

wpa_supplicant -i wifiname -c <(wpa_passphrase "networkname" "password")

Якщо успішно підключилися до мережі, то тепер можемо й IP адресу отримати:

dhcpcd wifiname

Перевіряємо:

ping -c1 google.com

Час

Синхронізуємо час:

timedatectl set-ntp true

Підготуємо флешку

Як я писав раніше, ця флешка буде сумісною з BIOS та UEFI, тому нам потрібно відповідно підготувати розмітку файлової системи. Переглянемо список пристроїв:

lsblk

Підключаємо основну флешку і знову виконаємо цю ж команду. Бачу, що новий пристрій має назву /dev/sdb

Розмітка файлової системи

Для розмітки я буду використовувати gdisk:

gdisk /dev/sdb

Очистимо флешку командою d:

Command (? for help): d
No partitions

Створюємо новий GUID файлової системи:

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Додамо 10MB MBR на початку диску:

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-XXXXXX), default = 64) or {+-}size{KMGTP}:
Last sector (64-XXXXXX), default = XXXXXX) or {+-}size{KMGTP}: +10MB
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF02

Створюємо 500MB ESP:

Command (? for help): n
Partition number (2-128, default 2):
First sector (34-XXXXXX), default = YYYY) or {+-}size{KMGTP}:
Last sector (64-XXXXXX), default = XXXXXX) or {+-}size{KMGTP}: +500MB
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF00

Усе, що залишилось, форматуємо під Linux:

Command (? for help): n
Partition number (3-128, default 3):
First sector (34-XXXXXX), default = YYYY) or {+-}size{KMGTP}:
Last sector (64-XXXXXX), default = XXXXXX) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):

Перевірю, що я натворив:

Command (? for help): p

Має бути щось таке:

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048           22527   10.0 MiB    EF02  BIOS boot partition
   2           22528         1046527   500.0 MiB   EF00  EFI System
   3         1046528        30605278   14.1 GiB    8300  Linux filesystem

Записуємо зміни на диск:

Command (? for help): w

Фоматуємо файлові системи

Перевіряємо:

lsblk /dev/sdb

Маємо побачити ось такий результат:

NAME     MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sdb        8:16   1 14.6G  0 disk
├─sdb1     8:17   1   10M  0 part
├─sdb2     8:18   1  500M  0 part
└─sdb3     8:19   1 14.1G  0 part

sdb1 - не форматуємо. Це буде BIOS/MBR партиція.

Форматуємо 500MB для систем із EFI із файловою системою FAT32:

mkfs.fat -F32 /dev/sdb2

Залишається наша корнева система, яку ми зараз зашифруємо. Назву я її empty - просто так цікавіше:

cryptsetup -y -v luksFormat --type luks2 /dev/sdb3
cryptsetup open /dev/sdb3 empty
mkfs.ext4 /dev/mapper/empty

Встановлюємо базову систему

Як я й говорив, буде лише необхідний мінімум пакетів.

Монтуємо

Підключаємо корневу файлову систему:

mount /dev/mapper/empty /mnt

Підключаємо /boot:

mkdir /mnt/boot
mount /dev/sdb2 /mnt/boot

Базова система

Встановлюємо базові пакети:

pacstrap /mnt base base-devel

fstab

Створюємо файл із партиціями:

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

Базова конфігурація системи

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

PARTUUID

Проте, перш ніж змінити корінь, нам потрібно дізнатися ідентифікатор шифрованої партиції. Виконуємо команду:

blkid

Маємо побачити щось таке:

/dev/sdb1: PARTLABEL="BIOS boot partition" PARTUUID="9c57888f-b4df-4a9c-9180-61df16492a91"
/dev/sdb2: UUID="F3B4-203F" TYPE="vfat" PARTLABEL="EFI System" PARTUUID="5282a0c4-0a17-4f19-95d4-cba48ec75773"
/dev/sdb3: UUID="9a94e427-e405-44d9-8ce8-75a30c511a80" TYPE="crypto_LUKS" PARTLABEL="Linux filesystem" PARTUUID="7369da28-d876-4f9b-9b57-6104d0d2ef79"
/dev/mapper/empty: UUID="7623ee46-74f1-4f2a-b5f0-30dfa11be3f4" TYPE="ext4"

Копіюємо ідентифікатор sdb3, а саме:

PARTUUID="7369da28-d876-4f9b-9b57-6104d0d2ef79"

Він нам знадобиться пізнаше для налаштування завантажувача.

chroot

Заходимо у нове середовище:

arch-chroot /mnt /bin/bash

Часова зона

Видаляємо поточне налаштування:

rm /etc/localtime

Підключаю Київ:

ln -s /usr/share/zoneinfo/Europe/Kiev /etc/localtime

Створюємо /etc/adjtime:

hwclock --systohc

Дальше мені потрібно обрати локаль:

vi /etc/locale.gen

Я обрав en_US.UTF-8 UTF-8 та uk_UA.UTF-8 UTF-8

Генеруємо локалізації:

locale-gen

Задаємо змінну LANG у файлі /etc/locale.conf

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

hostname

Створимо файл /etc/hostname:

echo usb > /etc/hostname

Редагую /etc/hosts:

vi /etc/hosts

Додам рядок:

127.0.1.1    usb.localdomain    usb

Образ ядра

Для того, щоб ядро завантажилося коректно і ми могли підмонтувати зашифровану файлову систему, нам потрібно внести правки у файл mkinitcpio.conf:

vi /etc/mkinitcpio.conf

Наш рядок із HOOKS має виглядати ось так:

HOOKS=(base udev autodetect modconf block encrypt filesystems keyboard fsck)

Генеруємо RAM образ:

mkinitcpio -p linux

Журнал логів

Щоб не перевантажувати нашу флешку непотрібними логами, мінімалізуємо їх розмір. У файлі /etc/systemd/journald.conf необхідно змінити два параметри:

Storage=volatile
SystemMaxUse=16M

Завантажувач

Встановлюємо grub та efibootmgr пакети:

pacman -S grub efibootmgr

Вносимо правки у файлі /etc/default/grub для коректного підключення шифрованого кореневого тому (ось тепер і використаємо PARTUUID, що запам’ятовували вище):

GRUB_DEFAULT=0
GRUB_TIMEOUT=2
GRUB_DISTRIBUTOR="Encrypted"
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX="cryptdevice=PARTUUID=7369da28-d876-4f9b-9b57-6104d0d2ef79:empty"
GRUB_PRELOAD_MODULES="part_gpt part_msdos"

Тепер можемо встановити для режиму MBR/BIOS:

grub-install --target=i386-pc --boot-directory /boot /dev/sdb

Та для UEFI:

grub-install --target=x86_64-efi --efi-directory /boot --boot-directory /boot --removable

Генеруємо конфігураційний файл GRUB:

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

Підтримка мережі

Особисто я надаю перевагу NetworkManager, но, поки ми будемо без графічного інтерфейсу, нам потрібно щось простіше - управління мережею із консолі. Давайте встановимо необхідні пакети:

pacman -S ifplugd iw wpa_supplicant dialog

Щоб точно бути впевненим у назвах мережевих інтерфейсів eth0 та wlan0, виконаємо команду:

ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules

Відео драйвера

Для підтримки більшості популярних відеокарт необхідно встановити:

pacman -S xf86-video-ati xf86-video-intel xf86-video-nouveau xf86-video-vesa

Підтримка touchpad

Як же без touchpad на ноуткубах:

pacman -S xf86-input-synaptics

Батарея

Ну, ви зрозуміли:

pacman -S acpi

Користувач нової системи

Найперше задамо пароль для користувача root

passwd

Користувач з правами sudo

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

useradd -m -g users -G audio,disk,lp,network,power,storage,video,wheel -s /bin/bash kovalyshyn

Якщо я не хочу вводити пароль кожного разу при виклику команди sudo, тоді у файлі /etc/sudoers відкриваємо рядок:

%wheel ALL=(ALL) NOPASSWD: ALL

І додаємо ще один пакет

pacman -S polkit

Нова система

Виходимо із режиму зміни кореневої системи:

exit

Відключаємо диски та завантажуємося із нашої нової флешки:

umount /mnt/boot /mnt
reboot

Перед завантаженням ви маєте ввести пароль до файлової системи. Якщо пароль правильний, тоді система завантажиться.

Оскільки ми ще не встановили жодного графічного середовища, то заходимо у консоль Linux

Провідна мережа

Запускаємо службу, що відповідає за автоматичне налаштування провідної мережі:

cp /etc/netctl/examples/ethernet-dhcp /etc/netctl/eth0-arch_usb
systemctl start netctl-ifplugd@eth0.service

Wifi

Для підключення до Wifi мережі використовуємо команду:

wifi-menu -o

Час

Корегуємо час через інтернет протокол:

timedatectl set-ntp true

Фінал

Усе! Наша флешка готова! Залишилось налаштувати графічне середовище. Але це вже материал для іншої нотатки.

*****
Written by Vitaly Kovalyshyn on 06 January 2019