Установка 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