Відмінності між версіями «Matchbox»

Матеріал з Wiki Welard
Перейти до навігації Перейти до пошуку
(Створена сторінка: = Настройка удалённого доступа к virt-manager через VNC и Matchbox = Данная статья описывает, как на...)
 
Рядок 1: Рядок 1:
−
= Настройка удалённого доступа к virt-manager через VNC и Matchbox =
+
= Настройка удалённого доступа к virt-manager через VNC (On-Demand / kiosk) =
  
−
Данная статья описывает, как настроить лёгкий VNC-сервер, который запускает только оконный менеджер Matchbox и virt-manager для управления виртуальными машинами.
+
Данная статья описывает, как настроить VNC-сервер в режиме "по запросу" (Socket Activation). 
 +
VNC-сервер и оконный менеджер Matchbox запускаются только в момент подключения клиента и автоматически завершаются после отключения, что экономит ресурсы.
  
 
== Шаг 1: Установка необходимых пакетов ==
 
== Шаг 1: Установка необходимых пакетов ==
−
Установите X-сервер, VNC-сервер, оконный менеджер и virt-manager:
+
Установите X-сервер, VNC-сервер, оконный менеджер, virt-manager и утилиту xset:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
−
dnf install -y xorg-x11-server-Xorg tigervnc-server matchbox-window-manager virt-manager
+
dnf install -y xorg-x11-server-Xorg tigervnc-server matchbox-window-manager virt-manager xorg-x11-server-utils
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Рядок 18: Рядок 19:
 
Установите пароль для VNC (от имени пользователя):
 
Установите пароль для VNC (от имени пользователя):
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
−
mkdir -p /home/vncuser/.vnc
+
sudo -u vncuser mkdir -p /home/vncuser/.vnc
−
echo "ВАШ_ПАРОЛЬ" | vncpasswd -f > /home/vncuser/.vnc/passwd
+
echo "ВАШ_ПАРОЛЬ" | sudo -u vncuser vncpasswd -f > /home/vncuser/.vnc/passwd
−
chmod 0600 /home/vncuser/.vnc/passwd
+
sudo -u vncuser chmod 0600 /home/vncuser/.vnc/passwd
 
</syntaxhighlight>
 
</syntaxhighlight>
  
−
== Шаг 3: Создание скрипта автозапуска X11 ==
+
== Шаг 3: Создание скрипта запуска ==
−
Создайте скрипт, который будет запускать Matchbox и virt-manager. Сохраните его в <tt>/etc/X11/xinit/xinitrc.d/custom_start.sh</tt>:
+
Создайте скрипт-обёртку, который будет запускаться systemd для каждого подключения.
 +
Сохраните его в <tt>/usr/local/bin/vnc-ondemand.sh</tt>:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
#!/bin/bash
 
#!/bin/bash
−
/usr/bin/matchbox-window-manager &
+
 
−
/usr/bin/flock -w 1 /var/tmp/virt-manager.lock -c "/usr/bin/virt-manager &> /var/tmp/virt-manager.log"
+
DISPLAY_NUM=$((50 + RANDOM % 50))
−
wait
+
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
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
Сделайте файл исполняемым:
 
Сделайте файл исполняемым:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
−
chmod +x /etc/X11/xinit/xinitrc.d/custom_start.sh
+
chmod +x /usr/local/bin/vnc-ondemand.sh
 +
</syntaxhighlight>
 +
 
 +
== Шаг 4: Создание systemd socket и service ==
 +
Создайте файл сокета <tt>/etc/systemd/system/vnc-xinit.socket</tt>:
 +
<syntaxhighlight lang="ini">
 +
[Unit]
 +
Description=VNC Server Socket for virt-manager
 +
 
 +
[Socket]
 +
ListenStream=127.0.0.1:5900
 +
Accept=yes
 +
 
 +
[Install]
 +
WantedBy=sockets.target
 
</syntaxhighlight>
 
</syntaxhighlight>
  
−
== Шаг 4: Создание systemd-сервиса ==
+
Создайте файл сервиса <tt>/etc/systemd/system/vnc-xinit@.service</tt>:
−
Создайте файл <tt>/etc/systemd/system/vnc-xinit.service</tt>:
 
 
<syntaxhighlight lang="ini">
 
<syntaxhighlight lang="ini">
 
[Unit]
 
[Unit]
−
Description=VNC Server with Matchbox and virt-manager
+
Description=VNC Server per-connection for virt-manager
 
After=network.target
 
After=network.target
  
Рядок 48: Рядок 85:
 
User=vncuser
 
User=vncuser
 
Environment=HOME=/home/vncuser
 
Environment=HOME=/home/vncuser
−
ExecStart=/usr/bin/xinit /etc/X11/xinit/xinitrc.d/custom_start.sh -- /usr/bin/Xvnc :0 -geometry 1280x1050 -depth 24 -rfbauth /home/vncuser/.vnc/passwd
+
ExecStart=/usr/local/bin/vnc-ondemand.sh
−
Restart=always
+
StandardInput=socket
−
 
+
StandardOutput=socket
−
[Install]
+
StandardError=journal
−
WantedBy=multi-user.target
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
−
== Шаг 5: Запуск сервисов ==
+
== Шаг 5: Запуск ==
−
Обновите конфигурацию systemd и запустите сервисы:
+
Обновите конфигурацию systemd и запустите socket:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
systemctl daemon-reload
 
systemctl daemon-reload
−
systemctl enable --now vnc-xinit.service
+
systemctl enable --now vnc-xinit.socket
 
systemctl enable --now libvirt-guests
 
systemctl enable --now libvirt-guests
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== Шаг 6: Подключение ==
 
== Шаг 6: Подключение ==
−
На локальном компьютере создайте тунелирования порта:
+
На локальном компьютере создайте SSH-туннель:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
−
ssh -L 5999:127.0.0.1:5900 root@IP_SERVERA
+
ssh -p 5151 -L 5900:127.0.0.1:5900 root@IP_SERVERA
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
После этого подключитесь любым VNC-клиентом к <tt>127.0.0.1:5900</tt>.
 
После этого подключитесь любым VNC-клиентом к <tt>127.0.0.1:5900</tt>.

Версія за 15:13, 8 квітня 2026

Настройка удалённого доступа к 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.