Вопрос или проблема
Я калибровал свой сенсорный экран и увидел, что лучшим инструментом является xinput_calibrator. Поэтому я использовал его. У него есть два варианта (один из которых не работал), поэтому я здесь ради второго. Он говорит, что я должен выполнить эту команду “в скрипте, который запускается с вашей X-сессией”:
xinput set-int-prop "3M 3M USB Touchscreen - EX II" "Evdev Axis Calibration" 32 14410 2146 14574 2115
Поэтому я попробовал ~/.xinitrc
, ~/.xsession
и ~/.xsessionrc
, которых не существовало. Поэтому я создал их, и содержанием этой команды были именно они. Первые два файла вызвали сбой входа в систему (после входа я возвращаюсь на экран входа).
С последним файлом калибровка работала, но только после входа в систему…
Мне нужно, чтобы эта команда запускалась до появления диалога входа в систему. Я подумал о добавлении этой команды в конец /etc/X11/xinit/xinitrc
, но это не дало результата (ничего не изменилось). Также я пытался добавить её в конец /etc/X11/Xsession.d/40x11-common_xsessionrc
(после проверки некоторых файлов), но результат был точно таким же, как и при добавлении её в ~/.xsessionrc
.
Как я могу сделать так, чтобы эта команда запускалась до появления экрана входа (это до запуска оконного менеджера или до старта X-сессии)?
(Я использую Kubuntu с оконным менеджером по умолчанию, если это имеет значение)
ОБНОВЛЕНИЕ Поскольку я использую Kubuntu, моим дисплейным менеджером является kdm. Как предлагает принятый ответ, я отредактировал файл /etc/kde4/kdm/Xsetup
, и как упоминается здесь, я добавил команду перед той, которая там по умолчанию. И это работает отлично 🙂
Все файлы, которые вы пытались изменить, читаются после входа в систему. Кроме того, ~/.xinitrc
и ~/.xsession
— это полный набор команд, которые выполняются в сессии; ~/.xinitrc
читается, если вы запускаете xinit
или startx
из текстового режима, а ~/.xsession
читается, если вы запускаете “пользовательскую сессию” (название может варьироваться) из графического приглашения на вход.
Вам нужно настроить ваш дисплейный менеджер, программу, которая показывает приглашение на вход. Для kdm, дисплейного менеджера KDE, добавьте вашу команду в /etc/kde4/kdm/Xsetup
(или /etc/kde3/kdm/Xsetup
для старых версий) (это путь на Debian, я не проверял, использует ли Kubuntu тот же путь).
Для gdm (дисплейного менеджера Gnome) добавьте вашу команду в /etc/gdm/Init/Default
. Для xdm (традиционного дисплейного менеджера X) добавьте вашу команду в /etc/X11/xdm/Xsetup
.
Я предлагаю вам создать свой собственный конфигурационный файл, простой пример:
/usr/lib/X11/xorg.conf.d/20-calibration.conf
Содержимое файла:
Section "InputClass"
Identifier "Calibration"
MatchProduct "3M 3M USB Touchscreen - EX II"
Option "Calibration" "14410 2146 14574 2115"
EndSection
Это должно сработать.
У меня Debian 12 с LXDE. В crontab я добавил
@reboot systemctl stop lightdm.service; openvt -sw /path/to/myscript.sh; systemctl start lightdm.service
myscript.sh содержит
printf "\nВведите что-нибудь: "; read k; printf "\nЯ получил $k\nВведите ENTER, чтобы продолжить загрузку "; read k
Таким образом, процесс загрузки останавливается и позволяет мне ввести строку (например, это может быть пароль для расшифровки папки, добавив -s к ‘read’, чтобы скрыть пароль).
Другим решением является создание файла юнита systemd, например, /usr/lib/systemd/system/myservice.service, содержащего
[Unit]
Before=lightdm.service
[Service]
Type=oneshot
ExecStart=openvt -sw /path/to/myscript.sh
[Install]
WantedBy=multi-user.target
Тестируйте с помощью systemctl start myservice
Включите (чтобы запускалось при старте) с помощью systemctl enable myservice
Вы можете попробовать /etc/rc.local ?
.
Когда у вас OpenSUSE, вы можете скопировать свой скрипт в /etc/init.d и выполнить insserv с именем скрипта. insserv активирует скрипт: http://man-wiki.net/index.php/8:insserv.
.
Ответ или решение
Для того чтобы скрипт выполнялся до появления экрана входа в систему, необходимо правильно использовать возможности дисплей-менеджера. Дисплей-менеджер отвечает за показ экрана входа и управление сессиями, соответственно, выполнение команд на этой стадии требует взаимодействия именно с его настройками.
Теория
Основная задача – выполнить команду, которая калибрует сенсорный экран, на этапах загрузки системы до появления интерфейса ввода учетных данных. В контексте операционной системы Linux, такой процесс может быть интегрирован с помощью дисплей-менеджера, который запускается после загрузки ядра, но перед началом пользовательской сессии. Варианты дисплей-менеджеров могут включать KDM, GDM, или другие, в зависимости от графической оболочки и окружения рабочего стола.
Для достижения цели, команды должны быть добавлены в соответствующий конфигурационный файл, который используется дисплей-менеджером при инициализации X-сервера (графической оболочки).
Пример
В случае использования KDM (KDE Display Manager) ситуация самостоятельного внесения изменений в конфигурационные файлы требует:
-
Редактирование Xsetup: Это файл, который KDM использует для выполнения команд перед отображением экрана входа. Путь к этому файлу может варьироваться в зависимости от дистрибутива, например, в Debian или Kubuntu он может находиться по адресу
/etc/kde4/kdm/Xsetup
. -
Добавление команды в Xsetup: Добавьте вашу команду калибровки:
xinput set-int-prop "3M 3M USB Touchscreen - EX II" "Evdev Axis Calibration" 32 14410 2146 14574 2115
-
Проверка корректности: После редактирования, перезагрузите систему и проверьте результат выполнения.
Для другого дисплей-менеджера, например, GDM (GNOME Display Manager), команда должна быть добавлена в файл /etc/gdm/Init/Default
, а для традиционного XDM – в /etc/X11/xdm/Xsetup
.
Применение
Рассмотрим, как применить концепцию для оптимальной конфигурации:
-
Создание конфигурации для X11: В случае более глубокой интеграции, создание конфигурационного файла в X11 поможет избежать ручного добавления команд в дисплей-менеджер и обеспечит гибкость при изменений.
Например, создайте файл
/usr/share/X11/xorg.conf.d/20-calibration.conf
с содержимым:Section "InputClass" Identifier "Calibration" MatchProduct "3M 3M USB Touchscreen - EX II" Option "Calibration" "14410 2146 14574 2115" EndSection
-
Использование systemd: Если система поддерживает systemd, возможно выполнение команд до начала обслуживания графической сессии через создание сервисного файла.
Пример systemd-сервисного файла:
[Unit] Description=Pre-Login Touchscreen Calibration Before=display-manager.service [Service] Type=oneshot ExecStart=/usr/bin/xinput set-int-prop "3M 3M USB Touchscreen - EX II" "Evdev Axis Calibration" 32 14410 2146 14574 2115 [Install] WantedBy=multi-user.target
Активируйте сервис командой:
systemctl enable my-touchscreen-calibration.service
Этот стратегический подход позволяет калибровать сенсорный экран на ранних этапах загрузки системы, обеспечивая корректное функционирование перед взаимодействием пользователя с системой. Такой подход не только решает текущую задачу, но и обеспечивает удобство в будущем, оставляя возможность для легкой модификации и поддержки конфигурации.