Victor3D

Установка Arch Linux на ZFS

Здесь будут описаны шаги по успешной установке Arch Linux на файловую систему ZFS.

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

sudo pacman -Sy archiso
mkdir ~/iso
cp -r /usr/share/archiso/configs/releng/* ~/iso

echo -e '
[archzfs]
Server = https://archzfs.com/$repo/$arch
SigLevel = Optional TrustAll' >> ~/iso/pacman.conf

echo -e '
linux-headers
archzfs-dkms
zfs-utils' >> ~/iso/packages.x86_64

sudo mkarchiso -vo ~/iso/out ~/iso

Далее нужно загрузиться с подготовленного iso-образа операционной системы.

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

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

Для 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

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

parted -a opt /dev/nvme0n1
print 
mklabel gpt 
mkpart primary 5MB% 512MB # Boot/EFI
mkpart primary 512MB 100% # Остальное место для ZFS
set 1 boot on # Boot flag
set 1 esp on # EFI flag
quit

Создать ZFS-пул

zpool create \
  -o ashift=12 \
  -O acltype=posixacl -O canmount=off \
  -O dnodesize=auto -O normalization=formD \
  -O atime=off -O xattr=sa -O mountpoint=none \
  -R /mnt zroot /dev/nvme0n1p2 # Partition 2

Создать датасеты и примонтировать

# Корневой датасет
zfs create -o canmount=noauto -o mountpoint=/ zroot/rootfs

# Установить загрузочный признак корневому датасету
zpool set bootfs=zroot/rootfs zroot

# Создать дополнительные датасету
zfs create zroot/rootfs/home

# Примонтировать корневой датасет
zfs mount zroot/rootfs

# Настроить файл кэша
mkdir -p  /mnt/etc/zfs
zpool set cachefile=/etc/zfs/zpool.cache zroot
cp /etc/zfs/zpool.cache /mnt/etc/zfs/zpool.cache

Настройка boot раздела

mkfs.vfat /dev/nvme0n1p1
mkdir /mnt/boot
mount /dev/nvme0n1p1 /mnt/boot

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

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

pacstrap /mnt base base-devel linux linux-headers linux-firmware grub efibootmgr \
  nano zsh gdm gnome openssh

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

Для поддержки видеокарт Intel:

pacstrap /mnt xf86-video-intel libva-intel-driver

Для поддержки видеокарт AMD:

pacstrap -i /mnt xf86-video-amdgpu --noconfirm

Генерация fstab

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

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

Настройка поддержки ZFS в системе

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

arch-chroot /mnt

echo -e '
[archzfs]
Server = https://archzfs.com/$repo/x86_64' >> /etc/pacman.conf

# ArchZFS GPG keys (see https://wiki.archlinux.org/index.php/Unofficial_user_repositories#archzfs)
pacman-key -r DDF7DB817396A49B2A2723F7403BD972F75D9D76
pacman-key --lsign-key DDF7DB817396A49B2A2723F7403BD972F75D9D76

pacman -Sy zfs-dkms

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

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

$ nano /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

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

hostnamectl set-hostname YOURHOSTNAME

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

nano /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

Сортировка pacman mirrorlist

pacman -S reflector
reflector --score 120 -l 50 -f 20 --sort rate -c RU --verbose --save /etc/pacman.d/mirrorlist

Initramfs

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

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

nano /etc/mkinitcpio.conf

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

# Intel
MODULES=(i915)

# AMD
MODULES=(amdgpu)

Добавить поддержку ZFS в раздел MODULES/HOOKS:

MODULES=(zfs)
HOOKS=(base udev autodetect modconf block keyboard keymap zfs filesystems)```

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

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

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

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

mkinitcpio -p linux

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

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

useradd -m -G users -s /bin/bash <YOUR_USERNAME>
  • -m ‒ создать каталог пользователя в /home;
  • -G ‒ дополнительные группы, передаваемые через запятую: audio,games,lp,optical,power,scanner,storage,video,wheel. Добавив себя в группу 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:

$ nano /etc/sudoers

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

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

Настройка GRUB

Добавить в файле /etc/default/grub значение переменной GRUB_CMDLINE_LINUX_DEFAULT=”zfs=zroot/rootfs”

mkdir /boot/grub
nano /etc/default/grub # GRUB_CMDLINE_LINUX_DEFAULT="zfs=zroot/rootfs"
grub-mkconfig -o /boot/grub/grub.cfg
grub-install --target=x86_64-efi --efi-directory=/boot

Настройка служб для ZFS

systemctl enable zfs.target zfs-import-cache \
  zfs-mount zfs-import.target gdm

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

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

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

echo 'EDITOR=nano' >> /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 (общие для всех).

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

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

systemctl enable NetworkManager

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

Выходим из chroot:

exit
umount -R /mnt
zfs umount -a
zpool export -a

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

reboot