centos 7用脚本替换systemd

问题描述 投票:-1回答:1

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

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

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

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

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

我究竟做错了什么 ?

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

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

linux bash console init systemd
1个回答
0
投票

我设法为这一个解决了问题。

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

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

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

我还注意到一个名为plymouth的进程,可能是由CentOS initrd启动的,因此在挂载root并执行init脚本之前。我不确定这个过程是否打开了系统控制台,但是我决定通过从dracut(选项-o plymouth)中省略plymouth模块来重建个性化的initrd来消除它。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.