Автоматическое масштабирование экрана в ОС Astra Linux

Условия, при которых автоматическое масштабирование экрана должно работать при подключении пользователя к гостевой ОС Astra Linux:

  • для протокола SPICE: запущенный процесс spice-vdagent в сессии пользователя. Дополнительно нужно выполнить настройку, описанную ниже, в том числе для экрана приветствия;
  • для протокола TERA: запущенный процесс tera-vdagent в сессии пользователя. Дополнительные настройки могут выполняться при установке TERA (см. документ СЛЕТ.10001-01 90 09 «Руководство администратора. Настройка компонента TERA»).

Для настройки автоматического масштабирования экрана для протокола SPICE нужно:

  • отредактировать файл /etc/udev/rules.d/50-spice-vdagent.rules, создав правило для udev:
ACTION=="change", KERNEL=="card0", SUBSYSTEM=="drm", RUN+="/usr/local/bin/x-resize"
BASH
  • перезапустить сервис udev командой:
sudo systemctl restart udev
BASH
  • создать исполняемый файл  /usr/local/bin/x-resize:

Исполняемый файл x-resize поддерживает автоматическое масштабирование экрана ОС как в одномониторной, так и в многомониторной конфигурации.

#!/bin/sh
PATH=/usr/bin:/bin
LOG_FILE="/tmp/xrandr_script.log"

# Функция логирования
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

# Начало выполнения скрипта
log_message "Starting X11 display configuration script"

# Определение дисплея и пользователя графической сессии
desktopuser=""
display=""
log_message "Searching for active X11 sessions..."

session_ids=$(loginctl show-seat seat0 | grep Sessions= | cut -d'=' -f2)
log_message "Found session IDs: $session_ids"

for id in $session_ids
do
    log_message "Checking session $id"
    session_info=$(loginctl show-session $id --p Id --p Remote --p Name --p Type --p Class --p Active --p IdleHint --p LockedHint)
    session_line=$(echo "$session_info" | tr '\n' ' ')
    log_message "Session $id info: $session_line"
    
    if echo "$session_line" | grep -E "Remote=no.*Class=(user|greeter).*(Active=yes|LockedHint=yes)" >/dev/null 2>&1
    then
        display="$(loginctl show-session $id --p Display | cut -d'=' -f2)"
        desktopuser="$(loginctl show-session $id --p Name | cut -d'=' -f2)"
        log_message "Found active session: user=$desktopuser, display=$display"
        break
    fi
done

# Проверка что есть DISPLAY и он один
if [ $(echo "$display" | tr -cd ':' | wc -c) -ne 1 ]; then
    log_message "ERROR: No single DISPLAY X-session found or multiple displays detected"
    exit 1
fi

# Установка найденного display-кода в переменную DISPLAY
export DISPLAY="$display"
log_message "Setting DISPLAY to: $DISPLAY"

# Определение auth
xauth=""
log_message "Searching for Xauth file..."

# Обработка процессов Xorg
xauth_candidates=$(pgrep -x Xorg | while read pid; do
    /bin/ps -o cmd= -p $pid | awk -F "-auth" '{print $2}' | awk '{print $1}'
done)

log_message "Xauth candidates from Xorg processes: $xauth_candidates"

# Поиск xauth файла, точно соответствующего DISPLAY
found_xauth=""
display_num="${DISPLAY#:}"
log_message "Searching for xauth matching DISPLAY number: $display_num"

for candidate in $xauth_candidates; do
    if [ -r "$candidate" ]; then
        if echo "$candidate" | grep -q ":[^0-9]*\<${display_num}\>[^0-9]" || 
           echo "$candidate" | grep -q ":[^0-9]*\<${display_num}\>$"; then
            found_xauth="$candidate"
            log_message "Found xauth exactly matching DISPLAY: $found_xauth"
            break
        fi
    fi
done

if [ -z "$found_xauth" ]; then
    log_message "No xauth file found matching DISPLAY $DISPLAY in Xorg processes"
fi

xauth="$found_xauth"

# Если не нашли в процессах, пробуем домашнюю директорию пользователя
if [ -z "$xauth" ] || [ ! -r "$xauth" ]; then
    if [ -n "$desktopuser" ]; then
        user_home=$(eval echo "~$desktopuser")
        xauth="$user_home/.Xauthority"
        log_message "Trying user Xauth file: $xauth"
    fi
fi

# Финальная проверка доступности xauth
if [ -z "$xauth" ] || [ ! -r "$xauth" ]; then
    log_message "ERROR: Cannot access xauth file: $xauth"
    exit 1
fi

export XAUTHORITY=$xauth
log_message "Setting XAUTHORITY to: $XAUTHORITY"

# Применение xrandr ко всем подключенных мониторам
log_message "Starting monitor configuration..."

connected_monitors=$(xrandr | awk '/ connected/ {print $1}')
log_message "Found connected monitors: $connected_monitors"

if [ -z "$connected_monitors" ]; then
    log_message "ERROR: No connected monitors found"
    exit 1
fi

for monitor in $connected_monitors; do
    log_message "Configuring monitor: $monitor"
    if xrandr --output "$monitor" --auto; then
        log_message "Successfully configured monitor: $monitor"
    else
        log_message "ERROR: Failed to configure monitor: $monitor"
    fi
done

log_message "X11 display configuration completed successfully"
BASH
  • сделать файл исполняемым:
sudo chmod +x /usr/local/bin/x-resize
BASH

Для масштабирования экрана приветствия для протокола SPICE выполнить:

  • заблокировать автостарт kscreen, переименовав расширение или удалив данные файлы из указанных директорий: /usr/share/fly-dm/autostart/greeter/kscreend_autostart.desktop, /usr/share/fly-dm/preload/greeter/kscreend_preload.desktop;
  • сделать символьную ссылку на ярлык для автозапуска spice-vdagent для экрана приветствия:
sudo ln -s /etc/xdg/autostart/spice-vdagent.desktop /usr/share/fly-dm/autostart/greeter/spice-vdagent.desktop
BASH
  • перезапустить процесс fly-dm командой:
sudo systemctl restart fly-dm
BASH

Если файл /usr/bin/fly-monitor-hotplug.sh не является исполняемым или удален, то на экране приветствия масштабирование не выполняется.