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–6 和 S 或 s。 運 行 級 別 可 以 由 超 級 使 用 者 通 過 telinit 命 令 來 轉 換 , 此 命 令 可 以 將 轉 換 信 號 傳 遞 給 init, 告 訴 它 切 換 到 哪 個 運 行 級 別 。
運 行 級 別 0, 1, 和 6 為 系 統 保 留 的 專 用 運 行 級 別 。 運 行 級 別 0 用 來 關 機 , 運 行 級 別 6 用 來 重 啟 電 腦 , 運 行 級 別 1 用 來 使 電 腦 進 入 單 使 用 者 模 式 。 運 行 級 別 S 不 是 給 我 們 直 接 使 用 的 , 更 多 是 為 進 入 運 行 級 別 1 時 運 行 某 些 可 執 行 稿 本 時 被 調 用 。 如 果 想 得 到 更 多 相 關 的 信 息 , 請 參 閱 手 冊 頁 shutdown(8) 和 inittab(5)。
運 行 級 別 7-9 雖 然 在 文 件 中 說 明 , 但 也 可 以 使 用 。 不 使 用 它 們 的 原 因 只 是 因 為 "傳 統 " Unix 變 種 不 使 用 這 些 運 行 級 別 。 另 外 , 運 行 級 別 S 和 運 行 級 別 s 實 際 上 是 相 同 的 , 它 們 只 是 系 統 內 同 一 運 行 級 別 的 兩 個 不 同 的 別 名 而 己 。
系 統 引 導
當 系 統 核 心 引 導 到 最 後 一 步 時 , init 進 程 被 啟 動 , 它 會 自 動 查 找 /etc/inittab 檔 案 , 看 看 是 否 有 類 型 為 initdefault ( 參 閱 inittab(5)) 的 記 錄 . initdefault 記 錄 決 定 系 統 初 始 運 行 級 別 。 如 果 沒 有 這 條 記 錄 ( 或 者 根 本 就 沒 有 /etc/inittab ) , 那 麼 , 你 必 須 在 系 統 控 制 台 輸 入 想 要 進 入 的 運 行 級 別 。
運 行 級 別 S 或 s 把 系 統 帶 入 單 使 用 者 模 式 , 此 模 式 不 需 要 /etc/initttab 檔 案 。 單 使 用 者 模 式 中 , /sbin/sulogin 會 在 /dev/console 這 個 設 備 上 打 開 。
當 進 入 單 使 用 者 模 式 後 , init 會 從 檔 案 /etc/ioctl.save 中 讀 取 控 制 台 的 ioctl(2) 狀 態 。 如 果 該 檔 案 不 存 在 , init 則 把 線 路 設 定 為 9600 baud 並 且 帶 有 CLOCAL。 當 init 退 出 單 使 用 者 模 式 時 , 它 會 自 當 前 的 控 制 台 的 ioctl 設 置 存 儲 到 這 個 檔 案 供 下 次 使 用 。
當 第 一 次 進 入 多 使 用 者 模 式 時 , init 會 執 行 boot 和 bootwait 記 錄 以 便 在 使 用 者 可 以 登 入 之 前 掛 載 檔 案 系 統 。 然 後 再 執 行 相 應 運 指 定 的 各 進 程 。
當 啟 動 一 個 新 的 進 程 時 , init 會 檢 查 是 否 存 在 /etc/initscript 檔 案 。 如 果 存 在 該 檔 案 , 則 使 用 該 稿 本 來 啟 動 該 進 程 。
如 果 系 統 中 存 在 檔 案 /var/run/utmp 和 /var/log/wtmp, 那 麼 當 每 個 子 進 程 終 止 時 , init 會 將 終 止 信 息 和 原 因 記 錄 進 這 兩 個 檔 案 中 。
改 變 運 行 級 別
當 init 啟 動 了 所 有 指 定 的 子 進 程 後 , 它 會 不 斷 地 偵 測 系 統 進 程 情 況 , 如 : 它 的 某 個 子 進 程 被 終 止 、 電 源 失 效 、 或 由 telinit 發 出 的 改 變 運 行 級 別 的 信 號 。 當 它 接 受 到 以 上 的 這 些 信 號 之 一 時 , 它 會 自 動 重 新 掃 描 /etc/inittab 檔 案 , 並 執 行 相 應 操 作 。 所 以 , 新 的 記 錄 可 以 隨 時 加 入 到 此 檔 案 中 。 並 且 , init 仍 然 等 待 系 統 發 出 了 上 述 信 號 。 在 更 新 了 各 種 系 統 檔 案 後 , 如 果 你 希 望 得 到 即 時 的 更 新 , 你 可 以 使 用 telinit Q 或 q 命 令 來 喚 醒 init 讓 它 即 刻 重 新 檢 測 /etc/inittab 檔 案 。
如 果 init 不 是 在 單 使 用 者 模 式 並 且 接 收 到 了 一 個 電 源 失 效 信 號 ( SIGPWR) , 它 會 讀 取 檔 案 /etc/powerstatus, 並 執 行 該 檔 案 中 指 定 的 各 種 操 作 :
F(AIL) |
電 源 失 效 , 由 UPS 提 供 電 力 。 執 行 powerwait 和 powerfail 記 錄 。 | ||
O(K) |
電 源 恢 復 , 執 行 powerokwait 記 錄 。 | ||
L(OW) |
電 源 失 效 並 且 UPS 電 壓 也 太 低 。 執 行 powerfailnow 記 錄 。 |
如 果 檔 案 /etc/powrestatus 不 存 在 或 其 中 的 內 容 並 不 包 含 有 以 上 所 示 的 字 母 F, O 或 L , 則 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,5 或
6
通 知 init 將 運 行 級 別 切 換 到 指 定 的 運 行 級 別
a,b,c |
告 訴 init 只 運 行 那 些 /etc/inittab 檔 案 中 運 行 級 別 是 a, b 或 c 的 記 錄 | ||
Q 或 q |
通 知 init 重 新 檢 測 /etc/inittab 檔 案 | ||
S 或 s |
通 知 init 將 運 行 級 別 切 換 到 單 使 用 者 模 式 下 | ||
U 或 u |
通 知 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) 傳 遞 一 些 啟
動 標 誌 給 init ,
Init 接 受 下 面 幾
個 :
-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