登录/桌面管理器出现之前的对话框/应用程序

登录/桌面管理器出现之前的对话框/应用程序

在预安装 ubuntu (或任何 linux dist)后,我想向用户显示一条消息/警告,表明在第一次启动期间正在发生某些安装或配置。不幸的是,由于安全限制,与 x11 相关的任何内容都无法工作(root 无法为用户显示)。

由于这个原因,我决定使用对话框和自毁服务(迄今为止我发现的最佳方法)。

该服务正在尝试执行以下脚本(替换为睡眠,因为它不相关)。我正在尝试更改为 tty2 以显示对话框,进行一些驱动程序安装(在预置期间无法编译),添加打印机等。

在虚拟机中使用虚拟机,这工作得很好。不幸的是,使用机器,这是行不通的。它更改为 tty2,但在切换到登录管理器之前我得到的只是黑屏(在本例中是在睡眠期间)。

这适用于Before-Statement 中的 XDM/SDDM,但不适用于 GDM3 和它需要与后者一起工作

我尝试在 -Statement 中添加显示管理器Before以及其中列出的几个服务display-manager.service,但没有成功。这可能是由于 gdm3 二进制文件本身的性质造成的。

问题:如何延迟 gdm/display-manager.service upstart 直到我的服务完成?或者是否有更好的方法来显示警告,直到我的脚本完成?

服务

[Unit]
Description=FirstBoot
Wants=network-online.target
[email protected] plymouth-quit.service network.target network-online.target
Before=gdm3.service
Requires=cups.service

[Service]
Type=oneshot
ExecStart=/bin/bash /home/admin00/firstboot.sh
ExecStop=/bin/systemctl disable firstboot.service
ExecStopPost=/bin/sh -c 'rm /etc/systemd/system/firstboot.service'
StandardInput=tty
TTYPath=/dev/tty2
TTYReset=yes
TTYVHangup=yes

[Install]
WantedBy=multi-user.target

剧本

#!/bin/bash
ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")"

if ! chvt 2 &>/dev/null; then
    break
fi

(
sleep 30s
) | dialog --title "IT Afterconfiguration" --infobox "\n           P L E A S E\n             W A I T\n\n  Your system is being configured" 8 40

dialog --no-cancel --no-ok --pause '   Continuing in ...' 6 27 5 --

rm -rf $ABSOLUTE_PATH

答案1

您可以Type=oneshot在您的服务中设置并设置RemainAfterExit=yes.

Type=oneshot确保“我准备好了”信号仅在服务完成(而不仅仅是启动)后发送,并且gdm3由于Before=服务中的语句而应等待。您需要RemainAfterExit- 语句,以便将服务设置为active运行后(而不仅仅是dead)。

Type=详细请参见-描述这里

旁注:默认值Type(如果未设置)为simple,即一旦您的进程开始,下一个进程/服务将被释放。

答案2

我决定尝试一下After=gdm.service,这似乎有效。可能有一些东西在启动时使用 gdm 启动/修改,但我无法弄清楚。因此我同意了After-声明。

为了使其正常工作,我必须chvt在脚本末尾添加另一个以返回登录管理器的 tty1。

也许添加一点睡眠 ExecStartPre 会很有用。使用虚拟机并行测试这一点,它太快了,否则会立即跳回登录管理器。我想这取决于所使用的机器。

服务

# Using gdm/lightdm/lxdm, the dialog script needs to be started After=gdm.service, else you receive a blank screen
# With sddm/xdm you can start the dialog script i.e. Before=sddm.service

[Unit]
Description=FirstBoot
Wants=network-online.target cups.service
[email protected] plymouth-quit.service network.target network-online.target cups.service gdm.service

[Service]
Type=oneshot
ExecStart=/bin/bash /home/admin00/firstboot.sh
ExecStop=/bin/systemctl disable firstboot.service
ExecStopPost=/bin/sh -c 'rm /etc/systemd/system/firstboot.service'
StandardInput=tty
TTYPath=/dev/tty2
TTYReset=yes
TTYVHangup=yes

[Install]
WantedBy=multi-user.target

脚本

#!/bin/bash
ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")"

#Change to tty2 to display the dialog
if ! chvt 2 &>/dev/null; then
    break
fi

(
script stuff
) | dialog --title "IT Afterconfiguration" --infobox "\n           P L E A S E\n             W A I T\n\n  Your system is being configured" 8 40

dialog --no-cancel --no-ok --pause '   Continuing in ...' 6 27 5 --
clear

rm -rf $ABSOLUTE_PATH

#Change back to tty1 / login manager
if ! chvt 1 &>/dev/null; then
        break
fi

相关内容