Да, серверное решение на Arch Linux. Мне надо, Я хочу. Дело в том, что основаня ОС у меня Arch, и зеркало храниться локально на моем сервере. Чтобы не стягивать себе зеркала других систем, Я решил переехать на Arch Linux польностью. Виртуалки и сервер у меня на нем. Поехали настраивать.
1. Установка Arch Linux
Тут все как обычно. Грузим дистр через флешку или KVM. Получаем IP и выполняем установку.
Устанавливать систему буду через archinstall
, с минимальным набором пакетов. Только SSH, без NetworkManager. Это важно.
2. Установка QEMU-KVM
Проверка, поддержки виртуализации у CPU
lscpu | grep -i Virtualization
VT-x
для IntelAMD-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
В системном режиме вам предоставляется доступ ко всем системным ресурсам.
Предоставление общесистемного доступа обычному пользователю
- Проверяем какой сейчас текущий мод
sudo virsh uri
qemu:///session
- Добавляем текущего пользователя в группу
libvirt
sudo usermod -aG libvirt,kvm $USER
- Установим 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-канале