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

Матеріал з Wiki Welard
Перейти до навігації Перейти до пошуку
 
Рядок 106: Рядок 106:
  
 
После этого подключитесь любым VNC-клиентом к <tt>127.0.0.1:5900</tt>.
 
После этого подключитесь любым VNC-клиентом к <tt>127.0.0.1:5900</tt>.
 +
== Автоматическая настройка (скрипт) ==
 +
Ниже приведён готовый скрипт для автоматической настройки всей конфигурации:
 +
 +
<syntaxhighlight lang="bash">
 +
#!/bin/bash
 +
# Automated setup script for VNC + Matchbox + virt-manager (On-Demand mode)
 +
 +
set -e
 +
 +
echo "Starting VNC + Matchbox + virt-manager configuration..."
 +
 +
echo "1. Installing required packages..."
 +
dnf install -y xorg-x11-server-Xorg tigervnc-server matchbox-window-manager virt-manager xorg-x11-server-utils
 +
 +
echo "2. Configuring vncuser..."
 +
if ! id "vncuser" &>/dev/null; then
 +
    useradd vncuser
 +
fi
 +
usermod -aG libvirt vncuser
 +
 +
echo "3. Setting temporary VNC password (vncpassword)..."
 +
mkdir -p /home/vncuser/.vnc
 +
echo "vncpassword" | vncpasswd -f > /home/vncuser/.vnc/passwd
 +
chown -R vncuser:vncuser /home/vncuser/.vnc
 +
chmod 0600 /home/vncuser/.vnc/passwd
 +
echo "WARNING: Don't forget to change VNC password using: sudo -u vncuser vncpasswd"
 +
 +
echo "4. Creating On-Demand wrapper script..."
 +
cat << "EOF_INNER" > /usr/local/bin/vnc-ondemand.sh
 +
#!/bin/bash
 +
DISPLAY_NUM=$((50 + RANDOM % 50))
 +
DISP=":$DISPLAY_NUM"
 +
 +
(
 +
    export DISPLAY=$DISP
 +
 +
    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
 +
EOF_INNER
 +
 +
chmod +x /usr/local/bin/vnc-ondemand.sh
 +
 +
echo "5. Creating systemd socket and service..."
 +
 +
cat << "EOF_INNER" > /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
 +
EOF_INNER
 +
 +
cat << "EOF_INNER" > /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
 +
EOF_INNER
 +
 +
echo "6. Reloading systemd and enabling services..."
 +
systemctl daemon-reload
 +
systemctl enable --now vnc-xinit.socket
 +
systemctl enable --now libvirt-guests
 +
 +
echo "Configuration completed successfully!"
 +
echo "---------------------------------------------------------"
 +
echo "To connect, use SSH tunnel on your PC:"
 +
echo "ssh -p 5151 -L 5900:127.0.0.1:5900 root@$(curl -s ifconfig.me || echo 'IP_SERVER')"
 +
echo "---------------------------------------------------------"
 +
</syntaxhighlight>
 +
 +
''Примечание:'' Скрипт устанавливает временный пароль <tt>vncpassword</tt>. Обязательно смените его после настройки.

Поточна версія на 15:16, 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.

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

Ниже приведён готовый скрипт для автоматической настройки всей конфигурации:

#!/bin/bash
# Automated setup script for VNC + Matchbox + virt-manager (On-Demand mode)

set -e

echo "Starting VNC + Matchbox + virt-manager configuration..."

echo "1. Installing required packages..."
dnf install -y xorg-x11-server-Xorg tigervnc-server matchbox-window-manager virt-manager xorg-x11-server-utils

echo "2. Configuring vncuser..."
if ! id "vncuser" &>/dev/null; then
    useradd vncuser
fi
usermod -aG libvirt vncuser

echo "3. Setting temporary VNC password (vncpassword)..."
mkdir -p /home/vncuser/.vnc
echo "vncpassword" | vncpasswd -f > /home/vncuser/.vnc/passwd
chown -R vncuser:vncuser /home/vncuser/.vnc
chmod 0600 /home/vncuser/.vnc/passwd
echo "WARNING: Don't forget to change VNC password using: sudo -u vncuser vncpasswd"

echo "4. Creating On-Demand wrapper script..."
cat << "EOF_INNER" > /usr/local/bin/vnc-ondemand.sh
#!/bin/bash
DISPLAY_NUM=$((50 + RANDOM % 50))
DISP=":$DISPLAY_NUM"

(
    export DISPLAY=$DISP

    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
EOF_INNER

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

echo "5. Creating systemd socket and service..."

cat << "EOF_INNER" > /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
EOF_INNER

cat << "EOF_INNER" > /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
EOF_INNER

echo "6. Reloading systemd and enabling services..."
systemctl daemon-reload
systemctl enable --now vnc-xinit.socket
systemctl enable --now libvirt-guests

echo "Configuration completed successfully!"
echo "---------------------------------------------------------"
echo "To connect, use SSH tunnel on your PC:"
echo "ssh -p 5151 -L 5900:127.0.0.1:5900 root@$(curl -s ifconfig.me || echo 'IP_SERVER')"
echo "---------------------------------------------------------"

Примечание: Скрипт устанавливает временный пароль vncpassword. Обязательно смените его после настройки.