Відмінності між версіями «Matchbox»
(Створена сторінка: = Настройка удалённого доступа к virt-manager через VNC и Matchbox = Данная статья описывает, как на...) |
|||
| Рядок 1: | Рядок 1: | ||
| − | = Настройка удалённого доступа к virt-manager через VNC | + | = Настройка удалённого доступа к virt-manager через VNC (On-Demand / kiosk) = |
| − | Данная статья описывает, как настроить | + | Данная статья описывает, как настроить VNC-сервер в режиме "по запросу" (Socket Activation). |
| + | VNC-сервер и оконный менеджер Matchbox запускаются только в момент подключения клиента и автоматически завершаются после отключения, что экономит ресурсы. | ||
== Шаг 1: Установка необходимых пакетов == | == Шаг 1: Установка необходимых пакетов == | ||
| − | Установите X-сервер, VNC-сервер, оконный менеджер | + | Установите 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: Создание скрипта | + | == Шаг 3: Создание скрипта запуска == |
| − | Создайте скрипт, который будет | + | Создайте скрипт-обёртку, который будет запускаться 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 | + | 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 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Сделайте файл исполняемым: | Сделайте файл исполняемым: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
| − | chmod +x /etc/ | + | 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> | ||
| − | + | Создайте файл сервиса <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 | + | 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/ | + | ExecStart=/usr/local/bin/vnc-ondemand.sh |
| − | + | StandardInput=socket | |
| − | + | StandardOutput=socket | |
| − | + | StandardError=journal | |
| − | |||
</syntaxhighlight> | </syntaxhighlight> | ||
| − | == Шаг 5: Запуск | + | == Шаг 5: Запуск == |
| − | Обновите конфигурацию systemd и запустите | + | Обновите конфигурацию systemd и запустите socket: |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
systemctl daemon-reload | systemctl daemon-reload | ||
| − | systemctl enable --now vnc-xinit. | + | 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 | + | 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.