首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解/etc/inittab

理解/etc/inittab
EN

Unix & Linux用户
提问于 2019-11-05 07:58:52
回答 2查看 5.4K关注 0票数 1

我使用以下/etc/inittab文件(systemv):

代码语言:javascript
复制
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

# The default runlevel.
id:5:initdefault:

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.

si::sysinit:/etc/init.d/rcS

# What to do in single-user mode.
~~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin
S0:12345:respawn:/sbin/getty -L 115200 ttyS0

为了理解事情是如何运作的,如果你对1-3的回答能区分两种情况,我会很感激的:

  1. 我用串口连接到我的系统。
  2. 我有一台“常规”台式电脑。

问题:

  1. 如果我再添加一个getty行,一旦linux启动,我会看到两个独立的终端?
  2. 如果我打开几行getty,如何分配哪个getty将运行我的si::sysinit:/etc/init.d/rcS命令,哪个getty将运行其他脚本的命令?(根据系统运行级别运行脚本的人)换句话说:在/etc/inittab文件中,我可以为不同的gettys分配不同的命令吗?(我指的是那些将由这些盖提斯开放的航站楼)
  3. 在/etc/init.d/rc5文件夹中的最后一个脚本运行以下命令: su no -c /bin/sh,输出是: sh:无法设置终端进程组(1618):不适当的ioctl用于设备sh:在这个shell sh中没有作业控制-4.3$ whoami,所以我验证了我是无名小卒,但是为什么它写前两行?还有为什么提示符是sh-4.3$而不是任何人@.
  4. 我在用串行连接。我能否更改/etc/inittab文件和init将运行的最后一个脚本,以便:
    1. 以低特权用户的身份登录前运行程序(init进程将等待终止)
    2. 一旦程序退出,就获得我的系统的常规登录提示。
    3. 创建低特权用户并让他在init过程中运行此程序的最佳方法是什么(如果我不想使用无人用户)
EN

回答 2

Unix & Linux用户

发布于 2019-11-05 08:25:39

  1. 是的,假设给行一个唯一的标识符,并且配置的终端线路是可用的: S1:12345:respawn:/sbin/getty -L 115200 ttyS1将在连接到ttyS1的串行端口上打开一个终端。
  2. inittab中的行不是连续的,也不是与登录相关的。每一行描述在给定的一组运行级中要采取的操作。因此,si::sysinit:/etc/init.d/rcS指定init在处理系统初始化时应该运行/etc/init.d/rcS;这发生在登录之前。(详见这个inittab(5)命令页 )。要在特定的终端上为不同的gettys分配不同的命令,您可以配置getty调用本身,例如通过更改它启动的login程序(大多数getty实现中的-l选项):S0:12345:respawn:/sbin/getty -l 115200 -L /bin/my-t0-登录ttyS0 S1:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t1-登录
  3. /etc/init.d/rc 5在登录之前运行,并且它运行的程序没有连接到终端(“正确”,这就是getty所做的--它为您打开终端并连接它启动的程序),所以当调用su nobody -c /bin/sh时,shell找不到它所期望的终端设置,因此禁用作业控制。sh-4.3$提示符在作为/bin/sh运行时是Bash4.3‘S默认提示符。
  4. 如果您的程序应该只在用户开始登录时运行,那么您可以将其连接到getty使用的登录序列;但是这样的程序将作为root运行。根据您所追求的目标,您可能最好使用initscript而不是/etc/inittab自定义,或者sudo和shell的启动脚本。
票数 0
EN

Unix & Linux用户

发布于 2019-11-05 11:09:00

刚才一秒钟(很长!)答案已张贴。我必须说,第一条解释得很好。目前,我想就第三点发表评论:这不是一个时间问题,而是控制一个“真实虚拟”tty的进程,而不仅仅是一个“控制台假人”。

在启动shell“具有作业控制”之前,必须设置打开ttyN。“泛型”命令是getty。从你得到的东西,你可以启动一个外壳,而不仅仅是在那之后。

这就像尝试首先启动一个窗口管理器,然后启动xorg,而不是将它们与xinit一起“引导”。我认为。“会议领袖”。

因为

代码语言:javascript
复制
xx:12:...:program

相反地:

代码语言:javascript
复制
aa:1:...:pr_1
bb:1:...:pr_2

...you得到一个N:M关系(如果你滥用了--很多RLs,每个RLs都有许多不同的程序)。你可以走得更远,但自从不同种类的RC-“标准”已经接管。"Runcoms“使用它们,inittab看起来很简单,但是所有的复杂性都在这些脚本中。

但是你的inittab看起来简单而正确--只有最后的注释和"z6“条目.

也许你的“苏没人”只是需要一个“盖蒂. ttyN”之前/周围。su而不是login,没有重生。至少应该给出另一条错误信息,而不是“不恰当”。

结论(阅读第二个答案后):你不需要一个复杂的init.d系统,原始的输入标签是足够灵活的。只要把概念和细节都弄清楚。

您可以设置三个运行级别:一个带有ttyNs,一个带有ttySN,另一个RL启动两者。它是一个引导参数,您可以添加到引导加载程序中。在您的情况下,运行级别"5“只是默认的。您可以选择一个内核、一个root=和一个要插入的运行级别。

“重生”行动实际上是需要sysvinit的。它做不到的更多,在脚本中实现的可能性也更小。但是,如果您退出(或崩溃)的“最后”shell级别,您需要一个安全网。

sysvinit甚至可以通过错误的“产生太快-忽略5分钟.”来检测错误配置。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/550431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档