Victor3D

Установка Arch Linux

Здесь будут описаны шаги по успешной установке Arch Linux. Предполагается, что вы уже скачали свежий iso-образ и загрузились с него, т.е. видите на экране приглашение командной строки:

Arch Linux 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

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

Разметка диска отличается от того, загрузились ли вы в режиме BIOS или UEFI.

Узнать имена дисков можно командой:

$ fdisk -l

BIOS

С помощью fdisk создаем раздел / с типом Linux - это минимально необходимо.

UEFI

Пусть нам нужно поставить систему на nvme0n1.

Размечаем диск под систему, руководствуясь правилом от большего к меньшему:

cfdisk nvme0n1 

Должно получиться что-то типа этого:

раздел точка монтирования тип файловой системы размер описание
nvme0n1p1 / btrfs Весь объем минус размер efi/boot arch linux
nvme0n1p2 /boot vfat 512 MiB-1 GiB загрузочный раздел

Размещая тот же boot в конце диска, мы сможем в последующем менять его размер, откусывая место от предыдущего.

Форматирование загрузочного раздела UEFI

Если у вас уже установлена Windows, пропускайте шаг с форматированием загрузочного раздела.

Форматируем загрузочный раздел:

mkfs.vfat -F32 -n ESP /dev/nvme0n1p2

Созданному разделу нужно выставить флаг boot, чтобы UEFI с него грузилось:

$ parted /dev/nvme0n1  
GNU Parted 3.5
Using /dev/nvme0n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
...
 2      499GB   500GB  1074MB  fat32        Boot        msftdata

(parted) set 2 boot on                                                    
(parted) q                                                                
Information: You may need to update /etc/fstab.

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

Если вы хотите использовать ext4:

$ mkfs.ext4 /dev/vda1

Вместо vda1 используйте свой вариант.

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

Использование файловой системы BTRFS

После этого монтируем вашу файловую систему, в которую будет происходить установка в /mnt:

$ mount /dev/vda1 /mnt

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

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

pacstrap /mnt base base-devel linux linux-firmware linux-headers

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

Дополнительные системные пакеты:

pacstrap /mnt acpi atool autoconf bind-tools cdparanoia cdrkit cmake conky cronie dialog dhcpcd dosfstools exfat-utils f2fs-tools fetchmail file-roller git gpart htop imagemagick inetutils links lynx man-db mc mcabber mediainfo mtools mutt namcap nano ncdu neofetch net-tools netctl networkmanager newsboat nfs-utils nmap ntfs-3g ntp odt2txt openssh p7zip pass pkgfile poppler ranger reflector rpmextract rsync sudo terminus-font udftools unrar w3m weechat whois wget wpa_supplicant yt-dlp zip

Xorg X-сервер, WM, DE и программы:

pacstrap /mnt xorg-server xorg-xinit xorg-xkill xf86-input-synaptics mesa xterm lxterminal terminator lightdm lightdm-gtk-greeter lxappearance qt5ct geany ttf-liberation ttf-dejavu ttf-bitstream-vera ttf-font-awesome ttf-ubuntu-font-family cbatticon transmission-gtk filezilla i3lock xautolock scrot xfce4-screenshooter mpv dmenu pulseaudio pulseaudio-alsa alsa-utils thunderbird gmrun tint2 feh gpicview openbox obconf i3-wm i3lock i3blocks i3status pcmanfm gvfs network-manager-applet volumeicon veracrypt keepassxc redshift zathura mupdf picom ffmpegthumbnailer gparted gsimplecal libreoffice-fresh libreoffice-fresh-ru firefox-i18n-ru firefox firefox-adblock-plus nitrogen papirus-icon-theme udiskie capitaine-cursors xdg-user-dirs

Установка рабочего стола Mate:

pacstrap /mnt mate mate-extra mate-media mate-power-manager mint-backgrounds mint-themes mint-y-icons-git mate-menu mint-x-icons

Если у вас используется файловая система btrfs:

pacstrap /mnt btrfs-progs snapper grub-btrfs snap-pac

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

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

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

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

Генерация fstab

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

genfstab -U /mnt | sed 's/,relatime/,noatime,commit=300,discard=async/' >> /mnt/etc/fstab

Тут мы изменили с целью оптимизации некоторые параметры монтирования:

  • Каждый раз когда мы открываем файл, записывается время его изменения, noatime запрещает запись времени модификации файла.
  • Btrfs хранит кеш в оперативной памяти и сбрасывает его на диск через интервал указанный в секундах в параметреcommit.
  • discard=async предотвращает микрофризы при выполнении TRIM.

Первые два параметра продлевают ресурс SSD.

Вход в окружение chroot

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

arch-chroot /mnt

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

Редактируем /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)

# или NVIDIA
MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)

# или встройка AMD + дискретка NVIDIA
MODULES=(amdgpu nvidia nvidia_modeset nvidia_uvm nvidia_drm)

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

ВАЖНО!!!!!! В хуки добавляем btrfs до filesystems и keymap:

HOOKS=(... btrfs keymap filesystems ...)

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

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

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

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

mkinitcpio -P

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

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

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.

Загрузчик системы BIOS

Если у вас BIOS, вам нужен grub (замените vda на ваш диск):

pacman -S grub-bios --noconfirm
grub-install /dev/vda
grub-mkconfig -o /boot/grub/grub.cfg

Загрузчик системы UEFI

Загружаться мы будем через systemd-boot. Для этого установим EFI:

bootctl install

Создаем загрузочную запись. Для начала сохраним PARTUUID:

blkid -o value -s PARTUUID /dev/nvme0n1p2 > /boot/loader/entries/arch.conf

Отредактируем конфиг:

nano /boot/loader/entries/arch.conf

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

title   Arch Linux
initrd  /amd-ucode.img
initrd  /initramfs-linux.img
linux   /vmlinuz-linux
options root=PARTUUID=fa65a43e-eb75-48f0-aee1-975a50c2e00d rootflags=subvol=/@ rw nvme_core.default_ps_max_latency_us=0
  • Параметр nvme_core.default_ps_max_latency_us=0 нужен для некоторых моделей SSD M.2. Без него файловая система через неопределенное время переходит в read only.
  • initrd /amd-ucode.img - это подгрузка микрокодов процессора для исправления различных уязвимостей. /amd-ucode.img заменяем на /intel-ucode.img.

Установите микрокоды проца (в зависимости от производителя):

pacman -Sy amd-ucode
# либо
pacman -Sy intel-ucode

Настроим загрузчик:

nano /boot/loader/loader.conf
timeout 4
default arch.conf
console-mode max
editor no

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

/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

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

reboot

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

Управление пакетами

Для управления пакетами я советую использовать yay (yet another yaourt).

Главное преимущество Arch Linux в AUR, а поэтому нам нужен пакетный менеджер с его поддержкой. Раньше для этих целей использовали yaourt, но за прошедшие годы последний уступил пальму первенства.

$ cd /tmp
$ git clone https://aur.archlinux.org/yay-bin
$ cd yay-bin
$ makepkg -si

Но можно и установить старый добрый yaourt:

git clone https://aur.archlinux.org/package-query.git
cd package-query
makepkg -si
cd ..
git clone https://aur.archlinux.org/yaourt.git
cd yaourt
makepkg -si

Настройка SWAP/ZRAM

Ядру Linux, независимо от размера оперативной памяти, нужно периодически сбрасывать страницы памяти в SWAP.

Для экономии ресурса SSD SWAP можно размещать в сжатом виде в оперативной памяти (ZRAM).

Установка:

$ yay -S zram-generator-git zram-generator-defaults

Включение ZRAM:

$ sudo systemctl restart systemd-zram-setup@zram0

Рекомендованные настройки SWAP для SSD:

/etc/sysctl.d/99-swappiness.conf

vm.swappiness=100
vm.vfs_cache_pressure=10

Применяем настройки:

$ sudo sysctl --system

Snapper

Snapper ‒ это менеджер снапшотов (снимков состояния файловой системы) для Btrfs. Он может их создавать/удалять по таймеру, а так же позволяет восстанавливать отдельные файлы.

$ yay -Sy snapper

Установим так же хук, который будет делать снапшоты после каждого обновления пакетов:

$ yay -S snap-pac

Снапшоты делаются каждый час, если не переопределить это поведение:

$ systemctl edit snapper-timeline.timer

[Timer]
OnCalendar=<period>

Настройки по-умолчанию предполагают слишком длительное хранение снапшотов, что может привести к постоянной проблеме нехватки места, если у вас SSD маленького объема.

Создаем новый шаблон файла конфигураций, чтобы не редактировать дефолтный:

$ cd /usr/share/snapper/config-templates
$ cp default config
$ nano config

Где значения TIMELINE_LIMIT_<PRERIOD> указывают сколько хранить N последних снапшотов за час (HOURLY)/день (DAILY)/неделю (WEEKLY)/месяц (MONTHLY)/год (YEARLY).

Пример конфига:

...
TIMELINE_LIMIT_HOURLY="10"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="0"
TIMELINE_LIMIT_YEARLY="0"
...

Храним 10 последних за час и 7 ежедневных (хранится самый первый за день).

snapper -c root create-config -t config /
snapper -c home create-config -t config /home
systemctl enable snapper-timeline.timer
systemctl enable snapper-cleanup.timer

Восстановление удаленного файла

# Смотрим номер последнего снапшота
sudo snapper -c <config> list -a

# Восстанавливаем файл
sudo snapper -c <config> undochange 0..<number> /path/to/file

Заменяем корневой сабвольюм на снапшот

Если не планируете пользоватся GUI, то может пригодиться…

В более сложных случаях может потребоваться восстановление системы:

$ sudo su

$ mount /dev/mapper/root /mnt

$ ls /mnt 
@ @home @.snapshots ...

$ cd /mnt

# Смотрим снапшоты
$ ls @.snaphosts
... 42 ...

# Переименовываем старый корневой сабвольюм
$ mv @ @old

# Помним, что snapshot и subvolume это одно и тоже, считай, а значит мы монтировать снапшот 
# Делаем снимок снапшота, по-сути копирем его, так как снапшоты, создаваемые snapper readonly
$ btrfs sub snap @.snaphots/42/snapshot @

# Редактируем fstab, если он содержит subvolid
# Ищем `subvol=/@` и удаляем `subvolid=N,`
$ nano @/etc/fstab

# Или же можно прописать subvolid
$ sudo btrfs sub show @ | grep 'Subvolume ID'
        Subvolume ID:           XXX

# Монтируем сабвольюм
$ mount -o remount /

# Теперь можно удалить @old
$ btrfs su de @old

Это стандартная утилита для дистрибутива Garuda Linux (основан на Arch‘е как Manjaro и пр. суррогаты). Графический менеджер для управления снапшотами и восстановления из них.

yay -S btrfs-assistant btrfsmaintenance

Для использования Btrfs Assistant не подходит плоская схема, при которой подтома со снапшотами (@snapshots, @home.snapshots и тп) монтируются в /.snapshots или /home/.snapshots. При восстановлении из снапшота, делает снапшот савольюма, а затем заменяет его на выбранный снапшот, все дочерние сабвольюмы и снапшоты перемещаются.

Автоматическая настройка (почти)

Если вам лень настраивать руками, после монтирования корня в /mnt можно воспользоваться скриптом:

$ curl http://dev.victor3d.com.br/arch-install/installer > installer
$ chmod +x installer
$ ./installer