PDF
Download PDF
Download page Автоматическое масштабирование экрана в ОС Astra Linux.
Автоматическое масштабирование экрана в ОС Astra Linux
Автоматическое масштабирование экрана в ОС 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 не является исполняемым или удален, то на экране приветствия масштабирование не выполняется.