Matchbox

Матеріал з Wiki Welard
Перейти до навігації Перейти до пошуку

Настройка удалённого доступа к virt-manager через VNC (On-Demand / kiosk)

Данная статья описывает, как настроить VNC-сервер в режиме "по запросу" (Socket Activation). VNC-сервер и оконный менеджер Matchbox запускаются только в момент подключения клиента и автоматически завершаются после отключения, что экономит ресурсы.

Шаг 1: Установка необходимых пакетов

Установите X-сервер, VNC-сервер, оконный менеджер, virt-manager и утилиту xset:

dnf install -y xorg-x11-server-Xorg tigervnc-server matchbox-window-manager virt-manager xorg-x11-server-utils

Шаг 2: Создание пользователя

Создайте пользователя vncuser и добавьте его в группу libvirt:

useradd vncuser
usermod -aG libvirt vncuser

Установите пароль для VNC (от имени пользователя):

sudo -u vncuser mkdir -p /home/vncuser/.vnc
echo "ВАШ_ПАРОЛЬ" | sudo -u vncuser vncpasswd -f > /home/vncuser/.vnc/passwd
sudo -u vncuser chmod 0600 /home/vncuser/.vnc/passwd

Шаг 3: Создание скрипта запуска

Создайте скрипт-обёртку, который будет запускаться systemd для каждого подключения. Сохраните его в /usr/local/bin/vnc-ondemand.sh:

#!/bin/bash

DISPLAY_NUM=$((50 + RANDOM % 50))
DISP=":$DISPLAY_NUM"

(
    export DISPLAY=$DISP

    # Ожидание готовности X-сервера
    for i in {1..50}; do
        xset q &>/dev/null && break
        sleep 0.1
    done

    /usr/bin/matchbox-window-manager &
    /usr/bin/virt-manager --no-fork
) &

APP_PID=$!

/usr/bin/Xvnc $DISP -inetd -geometry 1280x1050 -depth 24 \
    -rfbauth /home/vncuser/.vnc/passwd \
    -localhost yes \
    -SecurityTypes VncAuth

kill $APP_PID 2>/dev/null

Сделайте файл исполняемым:

chmod +x /usr/local/bin/vnc-ondemand.sh

Шаг 4: Создание systemd socket и service

Создайте файл сокета /etc/systemd/system/vnc-xinit.socket:

[Unit]
Description=VNC Server Socket for virt-manager

[Socket]
ListenStream=127.0.0.1:5900
Accept=yes

[Install]
WantedBy=sockets.target

Создайте файл сервиса /etc/systemd/system/[email protected]:

[Unit]
Description=VNC Server per-connection for virt-manager
After=network.target

[Service]
Type=simple
User=vncuser
Environment=HOME=/home/vncuser
ExecStart=/usr/local/bin/vnc-ondemand.sh
StandardInput=socket
StandardOutput=socket
StandardError=journal

Шаг 5: Запуск

Обновите конфигурацию systemd и запустите socket:

systemctl daemon-reload
systemctl enable --now vnc-xinit.socket
systemctl enable --now libvirt-guests

Шаг 6: Подключение

На локальном компьютере создайте SSH-туннель:

ssh -p 5151 -L 5900:127.0.0.1:5900 root@IP_SERVERA

После этого подключитесь любым VNC-клиентом к 127.0.0.1:5900.