Да, серверное решение на Arch Linux. Мне надо, Я хочу. Дело в том, что основаня ОС у меня Arch, и зеркало храниться локально на моем сервере. Чтобы не стягивать себе зеркала других систем, Я решил переехать на Arch Linux польностью. Виртуалки и сервер у меня на нем. Поехали настраивать.

1. Установка Arch Linux

Тут все как обычно. Грузим дистр через флешку или KVM. Получаем IP и выполняем установку.

Устанавливать систему буду через archinstall, с минимальным набором пакетов. Только SSH, без NetworkManager. Это важно.

2. Установка QEMU-KVM

Проверка, поддержки виртуализации у CPU

lscpu | grep -i Virtualization
  • VT-x для Intel
  • AMD-Vi для AMD
pacman -S qemu-full qemu-img \ 
          libvirt virt-install \
          virt-manager virt-viewer \
          edk2-ovmf swtpm guestfs-tools \
          libosinfo bridge-utils netctl dnsmasq
  • qemu-full — эмулятор KVM пользовательского пространства, управляет связью между хостами и виртуальными машинами
  • qemu-img — обеспечивает создание, преобразование, изменение и моментальные снимки автономных образов дисков
  • libvirt — API с открытым исходным кодом, демон и инструмент для управления виртуализацией платформы
  • virt-install — инструмент CLI для создания гостевых виртуальных машин
  • virt-manager — инструмент GUI для создания и управления гостевыми виртуальными машинами
  • virt-viewer — консоль GUI для подключения к работающим виртуальным машинам
  • edk2-ovmf — включает поддержку UEFI для виртуальных машин
  • swtpm — эмулятор TPM (Trusted Platform Module) для виртуальных машин
  • guestfs-tools — предоставляет набор расширенных инструментов CLI для управления виртуальными машинами
  • libosinfo — библиотека для управления информацией об ОС для виртуализации.
  • bridge-utils — утилики, позволяющие объединять сетевые интерфейсы в мосты
  • netctl — сетевой менеджер, управляющий сетью через профили
  • dnsmasq — используется для создания виртуальных сетей для libvirt

Драйверы VirtIO для гостевых ОС Windows

Перейдите в репозиторий Fedora People и загрузите virtio-win.iso.

Сохраните его в любом месте на диске и прикрепите к CD-ROM при создании виртуальной машины Windows.

Расположение по умолчанию на основе Debian/RedHat - `/usr/share/virtio-win/

Включение libvrt

В документации описана разница между микросервисами и монолитом. То есть как изменяется управление демонами системы.

Нам нужно выбрать, как мы будем запускать и управлять libvrt. Выбираем один из методов и перезагружаемся

Микросервисный подход:

for drv in qemu interface network nodedev nwfilter secret storage; do
    sudo systemctl enable virt${drv}d.service;
    sudo systemctl enable virt${drv}d{,-ro,-admin}.socket;
done

Монолитный:

sudo systemctl enable libvirtd.service

Разработка libvrt идет в сторону микросервисов. Я пользуюсь уже этим методом. Особой разницы на данный момент нет.

Затем перезагружаемся

3. Проверка виртуализации

sudo virt-host-validate qemu

Если вы получили предупреждения, перейдите к соответствующим разделам. Повторно выполните указанную выше команду, чтобы проверить изменения.

4. Поддержка Intel CPU IOMMU

IOMMU, похоже, отключен в ядре. Добавьте intel_iommu=on к аргументам командной строки ядра.

/etc/default/grub

GRUB_CMDLINE_LINUX="... intel_iommu=on iommu=pt"

Добавляем в строку дополнительные аргументы и переконфигурирем Grub

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

Перезапускаем машину

5. Поддержка AMD SEV

Для процессоров APU с функцией SEV вы можете получить следующее предупреждение:

WARN (AMD Secure Encrypted Virtualization, похоже, отключена в ядре. Добавьте kvm_amd.sev=1 к аргументам командной строки ядра)

Если вы используете Intel, вы можете проигнорировать предупреждение ниже, так как оно касается только процессоров AMD.

WARN (неизвестно, поддерживает ли эта платформа Secure Guest).

Подробности можно посмотреть в документации

Включение AMD SEV используя modprobe

echo "options kvm_amd sev=1" >> /etc/modprobe.d/amd-sev.conf
sudo reboot

Включение AMD SEV используя Grub

/etc/default/grub

GRUB_CMDLINE_LINUX="... mem_encrypt=on kvm_amd.sev=1"

Добавляем параметры mem_encrypt=on kvm_amd.sev=1 в Grub и переконфигурируем Grub

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

6. TuneD

Есть такая софтина. TuneD, которая тюнит KVM под разные нужды. Кратко тут описано, что это и для чего. Рассмотрим просто установку.

TuneD распространяется в Arch Linux через AUR. По этому нужен для AUR пакетный менеджер. Я буду использовать yay

yay -S tuned

Запускаем TuneD и добавляем в автозапуск

systemctl enable --now tuned.service

Проверяем какой сейчас загружен профиль

tuned-adm active

Показать готовые профили

tuned-adm list

Установить профиль

tuned-adm profile virtual-host

7. Настройка сетевого интерфейса

Эта тема довольно большая. Потому как каждый воспринимает по своему, как будет у него настроена сеть. Кому-то потребуется по enp3s0 подключаться самому серверу, а сеть для VM раздавать по eth2. Кто-то хочет совместить все в одном интерфейсе, используя bridge.

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

В документации Arch Linux описаны все варианты. Я буду использовать более простой для себя.

Создадим конфигурацию для сетевого моста:

/etc/netctl/br0

Description="Bridge connection br0"
Interface=br0
Connection=bridge
BindsToInterfaces=(enp3s0)   # укажите интерфейс вашей сетевой карты (enp3s0 — это пример)
IP=static                   # или dhcp, если хотите, чтобы IP назначался автоматически
Address=('192.168.1.4/24')  # статический IP-адрес для моста
Gateway='192.168.1.1'        # адрес шлюза
DNS=('192.168.1.1')          # DNS-сервер (в данном случае тот же, что и шлюз)
  • поле BindsToInterfaces укажите физический интерфейс вашей сети (например, enp3s0, проверьте с помощью ip a).
  • Если вы хотите, чтобы IP-адрес назначался автоматически, замените IP=static на IP=dhcp.

Затем включим конфигурацию и установим автозапуск

netctl enable br0
netctl start br0

Вводим ip a и видим, что нас сетевой интерфейс enp3s0 не имеет IP адреса, а IP перешел к br0

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

Рекомендуется после создания и проверки на VM, перезагрузить сервер. Чтобы проверить настройки сети применяются корректно.

Та же, если мы выдаем br0 тот же адрес, что и был на физическом интерфейсе. Удалите файл с настройками который находится тут /etc/systemd/network/

Иначе на двух разных интерфейсах будет 1 IP, что приведет к отказу работы сети для самого сервера и всех виртуальных машин.

8. Libvrt подключения

libvirt как два метода подключения к гипервизору KVM

Session Mode

В режиме сеанса обычный пользователь подключается к экземпляру для каждого пользователя. Позволяет каждому пользователю управлять собственным пулом виртуальных машин. Это также режим по умолчанию.

Преимущество этого режима в том, что разрешения не являются проблемой. Поскольку не требуется доступ root.

Недостаток в том, что этот режим использует QEMU User Networking (SLIRP). Это стек IP-адресов в пространстве пользователя, который приводит к накладным расходам, что приводит к низкой производительности сети.

И если вы хотите реализовать опцию, требующую привилегий root. Вы не сможете этого сделать.

System Mode

В системном режиме вам предоставляется доступ ко всем системным ресурсам.

Предоставление общесистемного доступа обычному пользователю

  1. Проверяем какой сейчас текущий мод
sudo virsh uri
qemu:///session
  1. Добавляем текущего пользователя в группу libvirt
sudo usermod -aG libvirt,kvm $USER
  1. Установим ENV с URI по умолчанию
echo 'export LIBVIRT_DEFAULT_URI="qemu:///system"' >> ~/.bashrc
sudo virsh uri

Установка ACL для каталога образов KVM

Проверяем права доступа к директории

sudo getfacl /var/lib/libvirt/images
getfacl: Removing leading '/' from absolute path names
# file : var/lib/libvirt/images/
# owner: root
# group: root
user::rwx
group::--x
other::--x

Рекурсивно удаляем существующие ACL

sudo setfacl -R -b /var/lib/libvirt/images/

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

sudo setfacl -R -m "u:${USER}:rwX" /var/lib/libvirt/images/

Заглавная буква X означает, что разрешение на выполнение распространяется только на дочерние папки, а не на дочерние файлы.

Включить специальные разрешения ACL по умолчанию

sudo setfacl -m "d:u:${USER}:rwx" /var/lib/libvirt/images/

Если этот шаг пропущен, то для новых директорий или файлов, созданных в директории образов, этот ACL установлен не будет.

Проверяем разрешения ACL в директории images

sudo getfacl /var/lib/libvirt/images/
getfacl: Removing leading '/' from absolute path names
# file : var/lib/libvirt/images/
# owner: root
# group: root
user::rwx
user:tatum:rwx
group::--x
mask::rwx
other::--x
default:user::rwx
default:user:tatum:rwx
default:group::--x
default:mask::rwx
default:other::--x

9. Включаем подсеть по-умолчанию

Сетевой интерфейс virbr0 с подсетью 192.168.120.0/24 - по-умолначию отключен. Если он вам необходим. Можно активировать таким образом

virsh net-start default && virsh net-autostart default && virsh net-list

Редактируем интерфейс virbr0

Выгружаем XML-файл с настройками

sudo virsh net-dumpxml default >/tmp/default.xml

Удаляем интерфейс

sudo virsh net-destroy default && virsh net-undefine default

Редактируем наш дамп-файл интерфейса и создаем его заново

sudo virsh net-define /tmp/default.xml

Запускаем интерфейс и даем ему автозапуск

sudo virsh net-start default && virsh net-autostart default

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

sudo virsh net-dumpxml default

Пример XLM файла, который создает изолированную сеть. Достум между VM и хостом сохраняется

<network>
  <name>isolated-net</name>
  <bridge name="virbr1" stp='on' delay='0'/>
  <forward mode="none"/>
  <ip address="192.168.2.1" netmask="255.255.255.0"/>
</network>

10. Storage folders

Создаем папку для хранения пула

mkdir -p /home/user/pool

Создаем пул

sudo virsh pool-define-as pool dir - - - - "/home/user/pool"
  • pool - это имя нашего пула

Запускаем его и включаем автозапуск

sudo virsh pool-start pool
sudo virsh pool-autostart pool

Проверяем список пулов

sudo virsh pool-list --all

Так же првоверяем подробные настройки пула

sudo virsh pool-dumpxml pool

11. Cockpit

Установка очень проста

sudo pacman -S cockpit
sudo systemctl enable --now cockpit.socket

Переходим по адресу https://[ip]:9090

Логинимся под пользователем, который состоит в группе libvirt. Учетная запись root отключена по-умолчанию

Казалось бы, вот тебе и web-морда для libvirt, но тут не так все сразу доступно. Нужно еще остановить доп пакеты

sudo pacman -S cockpit-files \
              cockpit-machines \
              cockpit-storaged \
              cockpit-packagekit
  • cockpit-files - файловый менеджер, встроенный в cockpit. Работает из под прав того пользователя, из под которого залогинились. Позволяет загружать файлы на сервер.
  • cockpit-machines - добавляется менеджер виртуальных машин. Хотя казалось бы, он должен устанавливаться по-умолчанию
  • cockpit-storaged - как по мне, он должен называться cockpit-disks, потому что он показывает сколько места на примонтированных дисках, а не позволяет работать со storage-объектами самого libvrt. Возможно после установки этого пакета становится доступным пункт в cockpit: “Виртуальные машины -> Пулы носителей”
  • cockpit-packagekit - позволяет в cockpit проверять наличие новых обновлений и показывать это в cockpit интерфейсе

Есть еще пакеты:

  • cockpit-pcp- для работы с метриками виртуальных машин (CPU, mem, etc.)
  • cockpit-podman - ну думаю понятно, что нужен для работы с Podman. В моем случае, пока не нужен

Дополнительные настройки cockpit

Сейчас настройки довольно скудные. В директории /etc/cockpit храниться не много

/etc/cockpit/disallowed-users - указан список пользователей, которые не имеют прав на подключение через cockpit. В списке есть root юзер

/etc/cockpit/ws-certs.d - тут хранятся самоподписанные сертификаты, которые cokcpit создает в момент первого запуска. Сертификаты генерируются на 1 год. Можно подкладывать свои.

В случае когда, сертификат просрочился, старые серты можно удалить и перезапустить cockpit, будут сгенерированы новые. По крайней мере Я это понял так, судя по документации

В теории, должен быть еще файл /etc/cockpit/cockpit.conf, но в Arch Linux, его почему-то нет. Пока я с ним не разбирался, для домашнего сервера мне хватает и этого.

Заключение

Данный гайд был написан для своих личных целей, чтобы пропустить всю информацию через себя. Я искал альтернативы Proxmox на Arch Linux. Найти понятное дело не получилось. Но такой функционал меня вполне устаивает.

Анонсы и еще больше информации в Telegram-канале