【问题标题】:centos 7 replace systemd with a scriptcentos 7 用脚本替换 systemd
【发布时间】:2019-02-10 05:35:00
【问题描述】:

我想做以下事情:我想用 script 替换我的 CentOS 7 安装中的 systemd 程序,即最终将启动一个 shell,用户可以在其中以 root 用户身份在系统控制台上输入命令。

为此,我使用了 init=/sbin/myInit 参数。在这个脚本中我做了一些初始化,最后我调用 bash 来让用户输入命令。交互式 bash 总是出现在屏幕上。

很遗憾,输入存在问题,我无法解决:输入无法正常工作。当我按 enter 时,只有第二个 enter 起作用,但屏幕上没有执行新行。当我输入一些字符时,并不是所有的字符都被读取。控制台似乎处于某种 Unicode 模式(stty -a 显示 iutf8 参数),并且 bash 无法正确读取输入。输出很好,我脚本中的所有 echo 命令都正确打印在屏幕上(我只打印 ASCII 字符)。

我尝试了各种组合,使用不同的 LC_ALL 设置(LC_ALL=CLC_ALL=C.utf-8、没有 LC_ALLLANG 变量初始化),将 stdin/stdout/stderr 重定向到 /dev/console/dev/tty0/dev/tty1TERM 变量被初始化为 linux 值,但没有任何作用。我尝试了 unicode_startunicode_stop 命令,但 unicode_stop 不起作用,并且我收到错误消息“stty:标准输入:无法执行所有请求的操作”。如果我运行 showkey 命令,然后按 enter 键,则检测到正确的 keycode 28,与正常启动相同。

比这更奇怪的是,如果我使用 init=/bin/bash 内核参数,输入工作正常,如果我手动运行我的脚本,它也工作正常.如果我将 bash 可执行文件复制到类似 /bin/mys 的位置,并使用 init=/bin/mys,则会出现相同的输入问题。似乎 initrd 图像对 /bin/bash 的处理方式不同。也许它执行了一些初始化或其他操作,使 bash 能够从终端正确读取。为什么我们在 init=/bin/bashinit=/bin/mys 之间会有这种差异?它最终是相同的可执行文件。

我做错了什么?

作为一个关于 init 程序的一般问题,有人可以解释一下 init 程序应该如何正常工作吗?它必须响应的任何特定信号,要执行的任何控制台初始化?

我试图解决这个问题好几天了,但我找不到任何解决方案。在网上我找不到任何关于此的文章。因此,任何建议将不胜感激。谢谢你。

【问题讨论】:

    标签: linux bash console init systemd


    【解决方案1】:

    我设法为此提出了一个解决方案。

    原来,在启动时,控制台没有初始化。我查看了stty -a的输出在正常启动和脚本启动(init=/sbin/myInit)之间的差异,它们之间存在一些差异:正常启动时的控制台有以下活动标志:brkint ignpar ixon imaxbell isig icanon iexten echo,而在脚本启动时,这些标志被清除(stty 用 - 报告它们)。我不确定它们的意思,除了我很快注意到的回声标志,因为在每次按键时,屏幕上都没有打印任何字符。

    所以我决定在 /dev/console 的初始化脚本中设置这些标志。在挖掘 stty 手册页后,我找到了 sane 选项,它为正常的控制台使用设置了最重要的标志。所以我在我的初始化脚本中添加了 stty -F /dev/console sane 行。

    但是,有一个小问题。如果控制台已被进程打开,则 stty 命令似乎无法更改某些控制台选项。所以我在脚本中做的第一件事是通过 0/dev/nullstdin/stdout/stderr 重定向到 /dev/null /em>,然后添加 stty sane 行,然后将 stdin/stdout/stderr 重定向回 /dev/console

    我还注意到一个名为 plymouth 的进程,它可能是由 CentOS initrd 启动的,所以在挂载根目录和执行 init 脚本之前。我不确定该进程是否打开了系统控制台,但我决定通过从 dracut 中省略 plymouth 模块重构个性化的 initrd 来消除它(选项 -o 普利茅斯)。

    执行此操作后,脚本运行正常,脚本启动的 bash 进程可以正确读取控制台。

    希望有一天这对某人有所帮助。干杯

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 2017-12-26
      • 1970-01-01
      • 2019-08-24
      • 2019-01-11
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多