Manpages

NAME

init, telinit − 进 程 处 理 初 始 化

总 览

/sbin/init [ -a ] [ -s ] [ -b ] [ -z xxx ] [ 0123456Ss ]
/sbin/telinit
[ −t 秒 ] [ 0123456sSQqabcUu ]

描 述

Init
Init
是 所 有 进 程 的 父 进 程 。 它 的 首 要 任 务 是 从 一 个 存 储 在 文 件 /etc/inittab ( 参 阅 inittab(5)) 里 面 的 脚 本 里 创 建 进 程 。 这 个 文 件 通 常 有 一 些 令 init 在 每 条 用 户 可 登 录 的 线 上 派 生 getty 的 记 录 . 它 同 时 也 控 制 着 各 独 特 系 统 所 要 求 的 独 立 进 程 。

运 行 级 别

所 谓 运 行 级 别 是 一 种 系 统 软 件 环 境 配 置 , 在 此 特 定 的 环 境 中 只 允 许 某 一 组 选 定 的 进 程 存 在 。 init 给 不 同 的 运 行 级 别 派 生 的 进 程 在 /etc/inittab 文 件 中 定 义 。 Init 可 以 启 动 到 8个 不 同 的 运 行 级 别 上 : 0–6Ss。 运 行 级 别 可 以 由 超 级 用 户 通 过 telinit 命 令 来 转 换 , 此 命 令 可 以 将 转 换 信 号 传 递 给 init, 告 诉 它 切 换 到 哪 个 运 行 级 别 。

运 行 级 别 01, 和 6 为 系 统 保 留 的 专 用 运 行 级 别 。 运 行 级 别 0 用 来 关 机 , 运 行 级 别 6 用 来 重 启 计 算 机 , 运 行 级 别 1 用 来 使 计 算 机 进 入 单 用 户 模 式 。 运 行 级 别 S 不 是 给 我 们 直 接 使 用 的 , 更 多 是 为 进 入 运 行 级 别 1 时 运 行 某 些 可 执 行 脚 本 时 被 调 用 。 如 果 想 得 到 更 多 相 关 的 信 息 , 请 参 阅 手 册 页 shutdown(8)inittab(5)

运 行 级 别 7-9 虽 然 在 文 档 中 说 明 , 但 也 可 以 使 用 。 不 使 用 它 们 的 原 因 只 是 因 为 "传 统 " Unix 变 种 不 使 用 这 些 运 行 级 别 。 另 外 , 运 行 级 别 S 和 运 行 级 别 s 实 际 上 是 相 同 的 , 它 们 只 是 系 统 内 同 一 运 行 级 别 的 两 个 不 同 的 别 名 而 己 。

系 统 引 导

当 系 统 内 核 引 导 到 最 后 一 步 时 , init 进 程 被 启 动 , 它 会 自 动 查 找 /etc/inittab 文 件 , 看 看 是 否 有 类 型 为 initdefault ( 参 阅 inittab(5)) 的 记 录 . initdefault 记 录 决 定 系 统 初 始 运 行 级 别 。 如 果 没 有 这 条 记 录 ( 或 者 根 本 就 没 有 /etc/inittab ) , 那 么 , 你 必 须 在 系 统 控 制 台 输 入 想 要 进 入 的 运 行 级 别 。

运 行 级 别 Ss 把 系 统 带 入 单 用 户 模 式 , 此 模 式 不 需 要 /etc/initttab 文 件 。 单 用 户 模 式 中 , /sbin/sulogin 会 在 /dev/console 这 个 设 备 上 打 开 。

当 进 入 单 用 户 模 式 后 , init 会 从 文 件 /etc/ioctl.save 中 读 取 控 制 台 的 ioctl(2) 状 态 。 如 果 该 文 件 不 存 在 , init 则 把 线 路 设 定 为 9600 baud 并 且 带 有 CLOCAL。 当 init 退 出 单 用 户 模 式 时 , 它 会 自 当 前 的 控 制 台 的 ioctl 设 置 存 储 到 这 个 文 件 供 下 次 使 用 。

当 第 一 次 进 入 多 用 户 模 式 时 , init 会 执 行 bootbootwait 记 录 以 便 在 用 户 可 以 登 录 之 前 挂 载 文 件 系 统 。 然 后 再 执 行 相 应 运 指 定 的 各 进 程 。

当 启 动 一 个 新 的 进 程 时 , init 会 检 查 是 否 存 在 /etc/initscript 文 件 。 如 果 存 在 该 文 件 , 则 使 用 该 脚 本 来 启 动 该 进 程 。

如 果 系 统 中 存 在 文 件 /var/run/utmp/var/log/wtmp, 那 么 当 每 个 子 进 程 终 止 时 , init 会 将 终 止 信 息 和 原 因 记 录 进 这 两 个 文 件 中 。

改 变 运 行 级 别

init 启 动 了 所 有 指 定 的 子 进 程 后 , 它 会 不 断 地 侦 测 系 统 进 程 情 况 , 如 : 它 的 某 个 子 进 程 被 终 止 、 电 源 失 效 、 或 由 telinit 发 出 的 改 变 运 行 级 别 的 信 号 。 当 它 接 受 到 以 上 的 这 些 信 号 之 一 时 , 它 会 自 动 重 新 扫 描 /etc/inittab 文 件 , 并 执 行 相 应 操 作 。 所 以 , 新 的 记 录 可 以 随 时 加 入 到 此 文 件 中 。 并 且 , init 仍 然 等 待 系 统 发 出 了 上 述 信 号 。 在 更 新 了 各 种 系 统 文 件 后 , 如 果 你 希 望 得 到 即 时 的 更 新 , 你 可 以 使 用 telinit Qq 命 令 来 唤 醒 init 让 它 即 刻 重 新 检 测 /etc/inittab 文 件 。

如 果 init 不 是 在 单 用 户 模 式 并 且 接 收 到 了 一 个 电 源 失 效 信 号 ( SIGPWR) , 它 会 读 取 文 件 /etc/powerstatus, 并 执 行 该 文 件 中 指 定 的 各 种 操 作 :

F(AIL)

电 源 失 效 , 由 UPS 提 供 电 力 。 执 行 powerwaitpowerfail 记 录 。

O(K)

电 源 恢 复 , 执 行 powerokwait 记 录 。

L(OW)

电 源 失 效 并 且 UPS 电 压 也 太 低 。 执 行 powerfailnow 记 录 。

如 果 文 件 /etc/powrestatus 不 存 在 或 其 中 的 内 容 并 不 包 含 有 以 上 所 示 的 字 母 FOL , 则 init 会 当 做 读 到 了 字 母 F

我 们 不 赞 成 使 用 SIGPWR/etc/powerstatus 。 有 些 用 户 希 望 与 init 进 行 交 互 , 那 么 可 以 使 用 /dev/initctl 控 制 通 道 。 关 于 此 点 的 描 述 请 参 阅 sysvinit 包 的 源 代 码 。

init 得 到 更 新 运 行 级 别 的 请 求 , init会 向 所 有 没 有 在 新 运 行 级 别 中 定 义 的 进 程 发 送 一 个 警 告 信 号 SIGTERM 。 在 等 待 5 秒 钟 之 后 , 它 会 发 出 强 制 中 断 所 有 进 程 的 运 行 的 信 号 SIGKILL 。 注 意 , init 假 设 所 有 的 这 些 进 程 ( 包 括 它 们 的 后 代 ) 都 仍 然 在 init 最 初 创 建 它 们 的 同 一 进 程 组 里 。 如 果 有 任 何 进 程 改 变 了 它 们 的 进 程 组 , 那 么 它 就 收 不 到 这 些 信 号 。 这 样 的 进 程 , 你 需 要 分 别 进 行 手 工 的 终 止 。

TELINIT

/sbin/telinit 是 一 个 到 /sbin/init 的 软 链 接 。 它 用 一 个 单 字 符 参 数 来 通 知 init 执 行 相 应 的 操 作 。 下 面 是 相 关 的 参 数 :
0
,1,2,3,4,56

通 知 init 将 运 行 级 别 切 换 到 指 定 的 运 行 级 别

a,b,c

告 诉 init 只 运 行 那 些 /etc/inittab 文 件 中 运 行 级 别 是 abc 的 记 录

Qq

通 知 init 重 新 检 测 /etc/inittab 文 件

Ss

通 知 init 将 运 行 级 别 切 换 到 单 用 户 模 式 下

Uu

通 知 init 自 动 重 启 ( 保 留 状 态 ) , 此 操 作 不 会 对 文 件 /etc/inittab 进 行 重 新 检 测 。 执 行 此 操 作 时 , 运 行 级 别 必 须 处 在 Ss12345 之 一 , 否 则 , 该 请 求 将 被 忽 略

telinit 还 可 以 告 诉 init 两 次 发 送 SIGTERM 和 SIGKILL 信 号 的 时 间 间 隔 。 默 认 值 是 5 秒 , 你 可 以 通 过 使 用 -t sec 的 选 项 来 修 改 。

telinit 只 能 由 具 有 恰 当 权 限 的 用 户 执 行 。

init 通 过 检 查 自 己 的 进 程 号 来 判 断 自 己 是 init 还 是 telinit ; 真 的 init 的 进 程 号 永 远 都 是 1。 从 这 一 点 来 看 , 我 们 在 调 用 telinit 时 也 可 以 只 使 用 init 来 少 敲 几 个 键 .

环 境 变 量

Init 为 所 有 的 子 进 程 设 定 下 列 环 境 变 量

PATH

/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin

INIT_VERSION

如 名 字 表 示 的 那 样 . 在 决 定 一 个 脚 本 是 否 直 接 来 自 init 时 很 有 用

RUNLEVEL

当 前 系 统 的 运 行 级 别

PREVLEVEL

前 次 运 行 的 运 行 级 别 ( 仅 当 改 变 运 行 级 别 时 有 用 )

CONSOLE

系 统 控 制 台 。 此 变 量 是 由 内 核 继 承 而 来 , 如 果 没 有 此 环 境 变 量 的 定 义 , init 会 使 用 /dev/console 做 为 默 认 的 控 制 台

启 动 标 志

在 启 动 系 统 时 可 以 通 过 引 导 管 理 器 ( 比 如 , LILO) 传 递 一 些 启 动 标 志 给 initInit 接 受 下 面 几 个 :
-s, S, single

以 单 用 户 模 式 启 动 系 统 。 按 这 种 模 式 启 动 时 , /etc/inittab 需 要 被 检 查 , 并 在 单 用 户 模 式 shell 启 动 之 前 会 执 行 引 导 rc 脚 本 。

1-5

定 义 需 要 启 动 的 运 行 级 别

-b, emergency

不 运 行 任 何 启 动 脚 本 而 直 接 进 入 单 用 户 模 式 shell

-a, auto

如 果 用 缺 省 命 令 行 从 内 核 引 导 ( 没 有 用 户 干 预 ) , LILO 引 导 管 理 器 向 命 令 行 增 加 了 单 词 如 果 是 这 样 的 话 , init 把 环 境 变 量 请 注 意 你 不 能 将 这 个 东 西 用 于 任 何 安 全 评 测 - 用 户 当 然 可 以 在 命 令 行 上 手 工 输 入

-z xxx

-z 参 数 被 忽 略 . 你 可 以 用 这 个 选 项 略 微 扩 展 命 令 行 , 这 样 它 可 以 在 堆 栈 里 获 得 更 多 空 间 . 然 后 Init 就 可 以 操 作 命 令 行 , 好 让 ps(1) 显 示 当 前 运 行 级 别 .

接 口

init监 听 /dev 里 的 一 个 fifo/dev/initctl, 从 中 获 取 信 息 。 Telinit 也 使 用 这 些 和 init 进 行 通 信 。 该 界 面 没 有 完 整 的 文 档 。 如 果 对 init 有 兴 趣 , 则 可 以 学 习 src/ 目 录 中 init 源 文 件 包 中 的 initreq.h 文 件 。

信 号

init 对 以 下 信 号 产 生 响 应
SIGHUP

当 接 收 到 该 信 号 后 , init会 对 /etc/initrunlvl/var/log/inirunlvl 文 件 进 行 检 查 。 如 果 这 两 个 文 件 之 一 存 在 而 且 文 件 中 有 ASCII 字 符 的 运 行 级 别 , init 会 转 换 到 相 应 的 新 的 运 行 级 别 。
此 特 性 只 用 于 向 后 兼 容 !
. 通 常 的 情 况 是 该 文 件 并 不 存 在 , 所 以 init 执 行 类 似 于
telinit q
这 样 的 操 作 。

SIGUSR1

当 接 收 到 这 个 信 号 量 , init 会 关 闭 并 重 新 打 开 它 的 控 制 fifo, /dev/initctl。 此 操 作 对 /dev 被 重 新 挂 载 后 的 启 动 脚 本 有 用 。

SIGINT

通 常 , 当 用 户 按 了 CTRL-ALT-DEL 键 后 , 内 核 会 向 init 传 递 此 信 号 。 它 所 执 行 的 操 作 与 ctrlaltdel 相 同 。

SIGWINCH

当 键 盘 有 KeyboardSignal 按 键 按 下 时 , 内 核 向 init 传 递 此 信 号 , 它 激 活 kbrequest 动 作 .

遵 循

Init 与 System V 的 init 相 兼 容 。 它 与 /etc/init.d/etc/rc{runlevel}.d 目 录 下 的 脚 本 紧 密 地 工 作 在 一 起 。 如 果 你 的 系 统 使 用 这 种 惯 例 , 在 /etc/init.d 目 录 下 应 该 有 一 个 README 文 件 , 它 可 以 很 好 地 解 释 了 这 些 脚 本 是 如 何 工 作 的 。

相 关 文 件

/etc/inittab
/etc/initscript
/dev/console
/etc/ioctl.save
/var/run/utmp
/var/log/wtmp
/dev/initctl

警 告

Init 假 设 进 程 和 进 程 的 后 代 同 属 于 最 初 创 建 它 们 的 进 程 组 . 如 果 进 程 改 变 了 它 们 的 进 程 组 , init 就 无 法 中 止 它 们 , 因 此 , 你 可 能 会 有 两 个 进 程 读 取 一 条 终 端 线 .

诊 断

如 果 init 发 现 它 的 重 启 次 数 在 最 近 2 分 钟 里 超 过 了 10 次 , 它 就 会 认 为 程 序 命 令 串 出 错 了 。 在 系 统 控 制 台 输 出 出 错 信 息 , 并 拒 绝 重 新 启 动 , 只 有 等 到 5 分 钟 以 后 或 用 户 给 init 一 个 特 定 的 信 号 , 它 才 会 重 新 响 应 。 这 可 以 防 止 由 于 用 户 在 编 辑 /etc/inittab 文 件 时 可 能 出 现 的 输 入 错 误 或 由 于 相 关 程 序 被 无 意 删 除 后 导 致 的 大 量 占 用 系 统 资 源 。

作 者

Miquel van Smoorenburg (miquels [AT] cistron.nl) 原 始 帮 助 手 册 页 作 者 : Michael Haardt (u31b3hs [AT] pool.de).

另 见

getty(1), login(1), sh(1), who(1), shutdown(8), kill(1), inittab(5), initscript(5), utmp(5)

[中 文 版 维 护 人 ]

所 罗 门 <solomen [AT] email.cn>

[中 文 版 最 新 更 新 ]

2000/11/26

[中 国 Linux 论 坛 man 手 册 页 翻 译 计 划 ]

http://cmpp.linuxforum.net