Відмінності між версіями «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 / | + | chmod +x /usr/local/bin/vnc-ondemand.sh |
</syntaxhighlight> | </syntaxhighlight> | ||
| − | == Шаг 4: Создание systemd | + | == Шаг 4: Создание systemd socket и service == |
| − | Создайте файл <tt>/etc/systemd/system/vnc-xinit. | + | Создайте файл сокета <tt>/etc/systemd/system/vnc-xinit.socket</tt>: |
<syntaxhighlight lang="ini"> | <syntaxhighlight lang="ini"> | ||
[Unit] | [Unit] | ||
| − | Description=VNC Server | + | Description=VNC Server Socket for virt-manager |
| + | |||
| + | [Socket] | ||
| + | ListenStream=127.0.0.1:5900 | ||
| + | Accept=yes | ||
| + | |||
| + | [Install] | ||
| + | WantedBy=sockets.target | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | Создайте файл сервиса <tt>/etc/systemd/system/[email protected]</tt>: | ||
| + | <syntaxhighlight lang="ini"> | ||
| + | [Unit] | ||
| + | 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>. | ||
| + | == Автоматическая настройка (скрипт) == | ||
| + | Ниже приведён готовый скрипт для автоматической настройки всей конфигурации: | ||
| + | |||
| + | <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. Обязательно смените его после настройки.