Skip to content

Instantly share code, notes, and snippets.

@voleoo
Created October 2, 2025 13:09
Show Gist options
  • Save voleoo/c93eef6adebb1156b83547fa6bfd6f18 to your computer and use it in GitHub Desktop.
Save voleoo/c93eef6adebb1156b83547fa6bfd6f18 to your computer and use it in GitHub Desktop.
vnc services
# Автозапуск віртуального дисплея `:99` з XFCE (і опціонально VNC) на Linux
Цей гайд налаштовує **Xvfb** як віртуальний X-сервер на дисплеї `:99`, запускає **XFCE** як сесію поверх нього та (за потреби) додає **x11vnc** для віддаленого доступу. Усе оформлено у вигляді `systemd` сервісів, щоб все стартувало автоматично при завантаженні системи.
---
## Вимоги
- Debian/Ubuntu-подібна система з `systemd`
- Встановлений XFCE (в тебе вже встановлено)
- Пакети: `xvfb`, `x11vnc` (опціонально)
### Встановлення пакетів
```bash
sudo apt update
sudo apt install -y xvfb x11vnc
```
> Якщо VNC не потрібен — `x11vnc` можна не ставити.
---
## 1) Сервіс `[email protected]` — піднімає віртуальний X-сервер
Створити юніт:
```bash
sudo tee /etc/systemd/system/[email protected] >/dev/null <<'EOF'
[Unit]
Description=Start Xvfb on display %i
After=network.target
[Service]
ExecStart=/usr/bin/Xvfb :%i -screen 0 1920x1080x24 -ac +extension GLX +render
Restart=always
# User буде задано у конкретному інстансі або заміни на конкретного юзера:
# User=root
# Або прибери цей рядок і запусти як root-сервіс
[Install]
WantedBy=multi-user.target
EOF
```
> **Примітка:** Якщо хочеш запускати від конкретного користувача (наприклад `superman`), **заміни** рядок `# User=root` на `User=superman`.
> Якщо хочеш запустити як root — розкоментуй `User=root`.
> Якщо рядок `User=` не вказаний — сервіс буде виконуватись як root.
**Увімкнути та запустити для дисплея `:99`:**
```bash
sudo systemctl daemon-reload
sudo systemctl enable [email protected]
sudo systemctl start [email protected]
```
Перевірити статус:
```bash
systemctl status [email protected]
```
---
## 2) Сервіс `[email protected]` — запускає XFCE-сесію на віртуальному дисплеї
Створити юніт:
```bash
sudo tee /etc/systemd/system/[email protected] >/dev/null <<'EOF'
[Unit]
Description=XFCE desktop on Xvfb display %i
After=xvfb@%i.service
[Service]
Environment=DISPLAY=:%i
ExecStart=/usr/bin/startxfce4
Restart=always
# Дивись примітку щодо User у попередньому сервісі:
# User=superman
# або User=root
[Install]
WantedBy=multi-user.target
EOF
```
**Увімкнути та запустити:**
```bash
sudo systemctl daemon-reload
sudo systemctl enable [email protected]
sudo systemctl start [email protected]
```
Статус:
```bash
systemctl status [email protected]
```
---
## 3) (Опціонально) `[email protected]` — VNC-доступ до дисплея `:99`
> **Безпека:** За замовчуванням приклад нижче запускає VNC **без пароля** (`-nopw`). Для продуктивного використання рекомендую створити файл пароля:
> ```bash
> x11vnc -storepasswd
> # створить файл ~/.vnc/passwd
> ```
> і **замінити** у `ExecStart` ключ `-nopw` на `-rfbauth /home/<USER>/.vnc/passwd`.
Створити юніт:
```bash
sudo tee /etc/systemd/system/[email protected] >/dev/null <<'EOF'
[Unit]
Description=VNC server on display %i
After=xfce@%i.service
[Service]
Environment=DISPLAY=:%i
# Заміни -nopw на -rfbauth /home/<USER>/.vnc/passwd для пароля
ExecStart=/usr/bin/x11vnc -display :%i -nopw -forever -listen 0.0.0.0 -xkb
Restart=always
# User=superman
# або User=root
[Install]
WantedBy=multi-user.target
EOF
```
**Увімкнути та запустити:**
```bash
sudo systemctl daemon-reload
sudo systemctl enable [email protected]
sudo systemctl start [email protected]
```
За замовчуванням `x11vnc` слухає порт `5900`. Підключайся VNC-клієнтом до `IP:5900`.
---
## Приклади корисних команд
```bash
# Журнали конкретного сервісу
journalctl -u [email protected] -e -f
journalctl -u [email protected] -e -f
journalctl -u [email protected] -e -f
# Перезапуск
sudo systemctl restart [email protected]
sudo systemctl restart [email protected]
sudo systemctl restart [email protected]
# Вимкнути автозапуск
sudo systemctl disable [email protected]
```
---
## Типові проблеми і рішення
- **Чорний екран у VNC / немає панелі XFCE**
Переконайся, що `DISPLAY=:%i` вказано у `[email protected]` та що `xvfb@99` запущено раніше. Дивись `After=xvfb@%i.service`.
- **`startxfce4` не знаходиться**
Встанови `xfce4` пакет: `sudo apt install -y xfce4 xfce4-goodies`.
- **Клавіатура/розкладка у VNC**
Додай `-xkb` у `x11vnc` (вже додано). За потреби встанови `x11-xkb-utils` і налаштуй `setxkbmap` у автозапуск XFCE.
- **Права користувача**
Якщо запускаєш від не-root користувача, задекларуй `User=<ім'я>` в юнітах, і переконайся, що у нього є права читати `~/.vnc/passwd` (якщо використовуєш пароль).
---
## Зміна роздільної здатності
Змініть параметр `-screen 0 1920x1080x24` у `[email protected]` на бажаний, наприклад `2560x1440x24`.
---
## Швидкий старт (копіпаст)
```bash
# 1) Пакети
sudo apt update && sudo apt install -y xvfb x11vnc
# 2) Xvfb (як root або вкажи User=... у файлі)
sudo tee /etc/systemd/system/[email protected] >/dev/null <<'EOF'
[Unit]
Description=Start Xvfb on display %i
After=network.target
[Service]
ExecStart=/usr/bin/Xvfb :%i -screen 0 1920x1080x24 -ac +extension GLX +render
Restart=always
# User=root
[Install]
WantedBy=multi-user.target
EOF
# 3) XFCE
sudo tee /etc/systemd/system/[email protected] >/dev/null <<'EOF'
[Unit]
Description=XFCE desktop on Xvfb display %i
After=xvfb@%i.service
[Service]
Environment=DISPLAY=:%i
ExecStart=/usr/bin/startxfce4
Restart=always
# User=root
[Install]
WantedBy=multi-user.target
EOF
# 4) (Опційно) VNC
sudo tee /etc/systemd/system/[email protected] >/dev/null <<'EOF'
[Unit]
Description=VNC server on display %i
After=xfce@%i.service
[Service]
Environment=DISPLAY=:%i
ExecStart=/usr/bin/x11vnc -display :%i -nopw -forever -listen 0.0.0.0 -xkb
Restart=always
# User=root
[Install]
WantedBy=multi-user.target
EOF
# 5) Увімкнення сервісів
sudo systemctl daemon-reload
sudo systemctl enable [email protected] [email protected]
sudo systemctl start [email protected] [email protected]
# 6) (Опційно) Увімкнути VNC
sudo systemctl enable [email protected] && sudo systemctl start [email protected]
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment