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.

Revisions

  1. voleoo created this gist Oct 2, 2025.
    232 changes: 232 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,232 @@
    # Автозапуск віртуального дисплея `: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]
    ```