在预安装 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