我正在运行Linux系统的设备,但是,在Xserver启动之前需要手动配置显示设备,否则帧缓冲设备将无法工作。
有2种方法可以实现这种“手动操作”:
在 xinit 之前运行此操作,但是,在谷歌搜索并阅读 startx 脚本之后,我发现在 xinit 运行之前没有运行脚本钩子;
在Xserver启动之前实现一个systemd单元来执行此“手动操作”,我搜索但找不到可以告诉我实际运行“startx”或启动Xserver的服务或进程的信息;
所以我把这个问题发在这里,希望有人能给我提示。
答案1
通过运行命令ps -A | grep Xorg | awk '{print $1}' | xargs pstree -s -p
我发现这Xorg
是一个子进程sddm
。
以下是我的 Fedora 36 中该命令的结果:
systemd(1)───sddm(1642)───Xorg(1645)─┬─{Xorg}(1647)
├─{Xorg}(1648)
├─{Xorg}(1649)
├─{Xorg}(1650)
├─{Xorg}(1651)
├─{Xorg}(1652)
├─{Xorg}(1653)
├─{Xorg}(1654)
└─{Xorg}(1658)
SDDM
阅读了源代码后,我终于知道了Xorg是如何在systemd init过程中启动的。
在 systemd 中graphical.target
,display-manager.service
被称为。
例如,我使用sddm.service
as display-manager.service
,它本身会在显示登录屏幕之前sddm
启动。Xorg
这取决于哪个显示管理器用户用来运行脚本。 运行后sddm
提供/etc/sddm/Xsetup
脚本,但是启动前不提供任何脚本钩子。Xorg
sddm
Xorg
如果您在 systemd init 过程中不使用任何脚本display-manager.service
,则可以使用startx
bing up Xorg
,并且可以在副xserverrc
文件中添加自己的脚本。
在这种情况下,如果你想在Xorg
真正启动之前运行一个特殊的命令,最好的方法是编写一个systemd unit
which running Before=display-manager.service
,这将确保该命令在Xorg
启动之前运行。
我将研究gdm
源代码以查找是否gdm
提供任何预启动 Xorg 脚本挂钩。
答案2
有人说你永远可以(如果没有被邀请)摆弄你自己的startx脚本以便在调用 xinit 之前启动任何命令,
如果您的独特需求是在 X 服务器之前启动命令,那么您可以注意到(通过未修改的 startx)X 服务器将由脚本执行/etc/X11/xinit/xserverrc
。
因此,只需在执行之前在此脚本中插入命令即可。
当然,如果您的命令在成功或失败时返回任何值,那么明智的做法是在继续之前对其进行测试......