Arch Linux
October 15

Unencrypted Arch Linux + BTRFS as ROOT + rEFInd

Пред-условия этой заметки

  • Наличие установочного USB (Bootable USB drive: Arch Linux, Rufus)
  • Motherboard boot mode: x64 UEFI
  • ОС на одном диске (будет 2 раздела)
    • 1Gb под загрузчик
    • Оставшееся пространство под систему
  • Без шифрования и secure-boot

Ну че, народ, погнали!

https://coub.com/view/9juiz80
  1. Выполнить шаги с 1.1 по 1.8 из официальной инструкции до пункта о разметке диска

1. Выбрать диск

  • ВНИМАТЕЛЬНО, выбрать диск на накоторый будет установлена система. Для просмотра дисков можно использовать утилиты: lsblk, blkid, fdisk -l
  • Пусть целевым диском будет SSD nvme0n1, тогда сохранить диск в переменную окружения: export DISK="/dev/nvme0n1"

2. Удалить старую разметку (желательно, на всякий случай)

wipefs -af $DISK
sgdisk --zap-all --clear $DISK
partprobe $DISK

3. Выполнить разметку

parted -s $DISK mklabel gpt
parted -s $DISK mkpart primary fat32 1MiB 1025MiB
parted -s $DISK set 1 esp on
parted -s $DISK mkpart primary $FILESYSTEM 1025MiB 100%

4. Форматировать разделы

Предупреждение: разделы для SSD имеют префикс `p`, SATA как правило не имеют; проверьте одной из утилит, например fdisk -l

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

mkfs.fat -F32 ${DISK}p1

Второй раздел под BTRFS

mkfs.btrfs -f ${DISK}p2

5. Сконфигурировать разделы BTRFS

Примонтировать раздел диска в папку /mnt

mount ${DISK}p2 /mnt

Создать корневой раздел BTRFS (/)

btrfs subvolume create /mnt/@

Создать под-разделы

btrfs subvolume create /mnt/@snapshots
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@libvirt
btrfs subvolume create /mnt/@cache
btrfs subvolume create /mnt/@log
btrfs subvolume create /mnt/@tmp

Структура под-раздел : точка монтирования

  • @snapshots : /.snapshots
  • @home : /home
  • @libvirt : /var/lib/libvirt (виртуальные машины)
  • @cache : /var/cache
  • @log : /var/log
  • @tmp : /var/tmp

Исключение @tmp и @log облегчит последующую работу в "recovery mode" после отката всей системы (корневого раздела /)

Размонтировать для последующей работы с созданными разделами

umount /mnt

6. Монтировать разделы

Основной раздел

export MY_OPT="rw,noatime,compress-force=zstd,space_cache=v2"
mount -o ${MY_OPT},subvol=@ ${DISK}p2 /mnt
mkdir -p /mnt/{.snapshots,home,var/lib/libvirt,var/cache,var/log,var/tmp}
mount -o ${MY_OPT},subvol=@snapshots ${DISK}p2 /mnt/.snapshots
mount -o ${MY_OPT},subvol=@home ${DISK}p2 /mnt/home
mount -o ${MY_OPT},subvol=@libvirt ${DISK}p2 /mnt/var/lib/libvirt
mount -o ${MY_OPT},subvol=@cache ${DISK}p2 /mnt/var/cache
mount -o ${MY_OPT},subvol=@log ${DISK}p2 /mnt/var/log
mount -o ${MY_OPT},subvol=@tmp ${DISK}p2 /mnt/var/tmp

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

mkdir -p /mnt/boot/efi
mount ${DISK}p1 /mnt/boot/efi

7. Установить систему

pacstrap /mnt base base-devel btrfs-progs linux-lts linux-lts-headers linux-firmware networkmanager sudo

Конфигурация

1. Сгенерировать fstab

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

2. arch-chroot

Выполнить шаги 3.1 - 3.6 из официальной инструкции

Моя краткая выжимка:

# Тайм-зона
export TIMEZONE="Europe/Amsterdam" <- заменить на свою
ln -sf /usr/share/zoneinfo/$TIMEZONE /etc/localtime
hwclock --systohc

# Локализация, английский приоритетный

export locale="ru_RU.UTF-8 UTF-8"
sed -i "s/^#\(${locale}\)/\1/" /etc/locale.gen

export locale="en_US.UTF-8 UTF-8"
sed -i "s/^#\(${locale}\)/\1/" /etc/locale.gen

echo "LANG=${locale}" > /etc/locale.conf
locale-gen

# Установить имя машины
echo $HOSTNAME > /etc/hostname

# Пароль root пользователя
passwd

# Создать пользователя
export USERNAME="hikkidev" <- заменить на свой
useradd -m -G wheel -s /bin/bash $USERNAME
passwd $USERNAME

# Привилегии sudo для группы wheel
echo "%wheel ALL=(ALL) ALL" > /etc/sudoers.d/wheel

# Заводим интернет
systemctl enable NetworkManager

Экстра-софт:

pacman -S refind efibootmgr tree btop bat eza tree

3. Настройка загрузчика rEFInd

Определить PARTUUID основного раздела, куда установлена система, в данном случае это ${DISK}p2:

blkid -s PARTUUID /dev/nvme0n1p2 -o value

Сохранить значение в переменную:

export MYUUID=$(blkid -s PARTUUID /dev/nvme0n1p2 -o value)

Установить загрузчик

refind-install

Отредактировать основные параметры загрузчика в refind.conf, файл как правило находится где-то в esp/EFI/refind/

/boot/EFI/refind/refind.conf
/boot/efi/EFI/BOOT/refind.conf
  • Включить поддержку схемы именования ядер Arch Linux для их автоматического обнаружения, раскоментировав или дописав:
extra_kernel_version_strings "linux,linux-lts,linux-zen,linux-rt,linux-rt-lts,linux-hardened"
also_scan_dirs +,boot,@/boot
  • Удалить или закоментировать примеры manual stanza в конце файла
  • Дописать в конце файла (что такое manual stanza):
include stanzas.conf

Cоздать файл stanzas.conf в папке с refind.conf (подробнее):

cat > stanzas.conf <<EOF
menuentry "Arch Linux LTS" {
    icon /EFI/refind/icons/os_arch.png
    volume primary
    loader /@/boot/vmlinuz-linux-lts
    initrd /@/boot/initramfs-linux-lts.img
    options "root=PARTUUID=$MYUUID rw rootflags=subvol=@"
    submenuentry "Boot - fallback" {
        initrd /@/boot/initramfs-linux-lts-fallback.img
    }
}
EOF
mv stanzas.conf <path to refind>/

Отредактировать параметры ядра поумолчанию в refind_linux.conf для автоматически обнаруженных ядер.

Как правило файл лежит тут: /boot/refind_linux.conf

echo "\"Boot DEFAULT\"  \"root=PARTUUID=$MYUUID rw rootflags=subvol=@ initrd=@\boot\initramfs-%v.img\"" > /boot/refind_linux.conf

Убедиться, что запись rEFInd была добавлена в загрузчик UEFI первой, выполнив:

efibootmgr

Если все ок - перезагрузка

exit
umount -R /mnt
reboot

Вход в систему + Snapper

После входа в систему рекомендую настроить BTRFS snapshots сразу

sudo pacman -S snapper snap-pac
sudo umount /.snapshots
sudo rm -rf /.snapshots
sudo snapper -c root create-config /
sudo btrfs subvolume delete /.snapshots
sudo mkdir /.snapshots
sudo mount -a
sudo chmod 750 /.snapshots
sudo chown :wheel /.snapshots
sudo snapper -c root create -d "Clean system install"

Редактировать конфиг здесь: /etc/snapper/configs/root

Включить systemd таймеры для автоматического запуска снимков и периодической очистки старых:

sudo systemctl enable --now snapper-timeline.timer
sudo systemctl enable --now snapper-cleanup.timer

Источники