init命令详解

init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。

内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以init始终是第一个进程(其进程编号始终为1)。

外文名

init

属于

Linux系统操作中不可缺少的程序

进    程

一个由内核启动的用户级进程

正确位置

是/sbin/init

运行级别

那么,到底什么是运行级呢?

简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。

不同的运行级定义如下:(可以参考Red Hat Linux 里面的/etc/inittab)

# 0 - 停机(千万不能把initdefault 设置为0 )

# 1 - 单用户模式

# 2 - 多用户,没有 NFS

# 3 - 完全多用户模式(标准的运行级)

# 4 - 没有用到

# 5 - X11 (xwindow)

# 6 - 重新启动 (千万不要把initdefault 设置为6 )

这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)

相关配置

一般配置

运行级别的配置是在/etc/inittab(这段设置仅对rhel6以下版本有效,rhel6已经不再支持这些设置)行内进行的,如下所示:

12 : 2 : wait : / etc / init.d / rc 2

第一个字段:id标识符(是一个任意指定的标签);

第二个字段:运行级别(这里是2);

第三个字段:运行方式,表示进入运行级别时,init应该运行第四个字段内的命令一次,而且init应该等待该命令结束。/etc/init.d/rc命令运行启动和终止输入以便进入运行级别2时所需的任何命令。

第四个字段:进程:(命令执行设置运行级别时的一切“杂活”)它启动已经没有运行的服务,终止不应该再在新运行级别内运行的服务。根据Linux版本的不同,采用的具体命令也不同,而且运行级别的配置也是有差别的。

init启动时,它会在/etc/inittab内查找一个代码行,这一行指定了默认的运行级别:

id : 2 : initdefault :

你可以要求init在启动时,进入非默认运行级别,这是通过为内核指定一个“single”或“emergency”命令行参数来实现的。比如说,内核命令行参数的指定可通过LILO来执行。这样一来,你就可以选择单用户模式了(即运行级别1)。

系统正在运行时,telinit命令可更改运行级别。运行级别发生变化时, init 就会从/etc/inittab运行相应的命令。

特殊配置

/etc/inittab中,有几个特殊的特性,允许init重新激活特殊事件。这些特殊特性都是用第三个字段中的特殊关键字标记出来的。比如:

1. powerwait

允许init在电源被切断时,关闭系统。其前提是具有U P S和监视U P S并通知init电源已被切断的软件。

2. ctrlaltdel

允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动系统。注意,如果该系统放在一个公共场所,系统管理员可将C t r l + A l t + D e l组合键配置为别的行为,比如忽略等。

3. sysinit

系统启动时准备运行的命令。比如说,这个命令将清除/tmp。

上面列出的特殊关键字尚不完整。其他的关键字及其使用详情,可参考你的inittab手册页。

一个重要的运行级别就是单用户模式(运行级别1),该模式中,只有一个系统管理员使用特定的机器,而且尽可能少地运行系统服务,其中包含登录。单用户模式对少数管理任务(比如在/usr分区上运行fsck)而言,是很有必要的,因为这需要卸载分区,但这是不可能的,除非所有的服务系统已被杀死。

一个正在运行的系统可以进入单用户模式,具体做法是利用init,请求运行级别1。内核启动时,在内核命令行指定single或emergency关键字,就可进入运行级别1了。内核同时也为init指定命令行, init从关键字得知自己不应该采用默认的运行级别(内核命令行的输入方式和你启动系统的方式有关)。

有时,以单用户模式进行启动是必要的,这样一来,用户在装入分区之前,或至少在装入分散的/usr分区之前,能手工运行fsck(在分散的文件系统上,任何活动都可能使其更为分散,所以应该尽可能地运行fsck)。

如果自动化的fsck在启动时失败了,启动脚本init的运行将自动进入单用户模式。这样做是为了防止系统使用不连贯的文件系统,这个文件系统是f s c k不能自动修复的。文件系统不连贯的现象极为少见,而且通常会导致硬盘的不连贯或实验性的内核释放,但最好能做到防患于未然。

由于安全上的考虑,在单用户模式下,启动外壳脚本之前,配置得当的系统会要求用户提供root密码。否则,它会简单地为L I L O输入合适的一行代码,以r o o t的身份登录(当然,如果/etc/passwd已经由于文件系统的问题而不连贯了,就不适合这里的原则了,为对付这种情况,你最好随时准备一张启动盘)。

不同的运行级有不同的用处,也应该根据自己的不同情形来设置。

例如,如果丢失了root口令,那么可以让机器启动进入单用户状态。在启动后的 lilo 提示符下输入:

init=/bin/sh rw 使机器进入运行级1 ,并把 root 文件系统挂为读写。他会跳过所有系统认证,让你可以使用passwd 程序来改变root口令,然后启动到一个新的运行级。

JAVA编程

init 通常做为 initialization 的缩写使用。即:设定初值,初始化的意思。
  如果在编程中看到init开头的函数名称,大多也是指明该函数为初始化功能。

英文缩写

init通常为 通常做为 initialization 的缩写使用

风格

BSD风格

BSD init 运行存放于'/etc/rc'的初始化 shell 脚本,然后启动基于文本模式的终端(getty)或者基于图形界面的终端(窗口系统,如 X)。 这里没有运行模式的问题,因为文件 'rc' 决定了 init 如何执行。

优点: 简单且易于手动编辑。

缺点: 如果第三方软件需要在启动过程执行它自身的初始化脚本,它必须修改已经存在的启动脚本,一旦这种过程中有一个小错误,都将导致系统无法正常启动。

值得注意的是,现代的 BSD 派生系统一直支持使用 'rc.local' 文件的方式,它将在正常启动过程接近最后的时间以子脚本的方式来执行。这样做减少了整个系统无法启动的风险。然后,第三方软件包可以将它们独立的 start/stop 脚本安装到一个本地的 'rc.d' 目录中(通常这是由 ports collection/pkgsrc 完成的)。都被分成更小的子脚本,和 SysV 类似。rcorder 通常根据在 rc.d目录中脚本之间的依赖关系来决定脚本的执行顺序。 [1] 

SysV风格

System V init 检查 '/etc/inittab' 文件中是否含有 'initdefault' 项。 这告诉 init 系统是否有一个默认运行模式。如果没有默认的运行模式,那么用户将进入系统控制台,手动决定进入何种运行模式。

优点: 灵活性强

缺陷: 比较复杂 [1] 

运行模式

编辑

System V中运行模式描述了系统各种可能的状态。通常会有 8 种运行模式,即运行模式 0 到 6 和 S 或者 s。其中运行模式 3 为"保留的"运行模式:

  • 0. 关机

  • 1. 单用户模式

  • 6. 重启

除了模式 0, 1, 和 6, 每种 Unix 和 Unix-like 系统对运行模式的定义不太一样。通常在 /etc/inittab 文件中定义了各种运行模式的工作范围。 [1] 

默认的运行模式

操作系统

默认的运行模式

AIX

2

Arch Linux

3

CentOS

3

Debian GNU/Linux

2

Gentoo Linux

3

Mandriva Linux

5

Mac OS X

3

Red Hat Linux / Fedora Core

3 or 5

Slackware Linux

3

Solaris

3

SUSE Linux

5

Ubuntu (Server and Desktop)

2 [1] 

跳过init

Linux系统中,现代的bootloader(如 LILO 或者 GRUB),用户可以在初始化过程中最后启动的进程来取代默认的 /sbin/init。 通常是在 bootloader 环境中通过执行 init=/foo/bar 命令。例如,如果执行 init=/bin/bash,启动单用户 root 的 shell 环境,无需用户密码。

BSD的变种,大多数平台, bootstrap 程序是可以被打断的,然后执行 boot -s 命令进入单用户模式。

单用户模式并不没有跳过 init,它仍然可以执行 /sbin/init,但是它将使 init 询问 exec() 将要执行的命令 (默认为 /bin/sh) 的路径,而不是采用正常的多用户启动顺序。 如果内核启动时在 /etc/ttys 文件中被标注为 "不安全" (在某些系统中,当前的"安全模式" 可能会有些变化), 在允许这种情况(或者回退到单用户模式,如果用户执行 CTRL+D),init 将首先询问 root 用户的密码。 如果该程序退出,内核将在多用户模式下重新执行 init。 如果系统从多用户模式切换到单用户模式,还将碰到上述的情况。

如果内核加载后, init 不能被正常启动, 这将导致 panic 错误,此时系统将不可使用。想要通过 init 自身来改变 init 的路径,不同的版本情况不太一样(NetBSD中可执行 boot -a ; FreeBSD中利用 init_path 命令装载变量)。 [1] 

其他风格

编辑

很多人一直努力地从某些方面改进传统的 init 守护进程,使它变得更完善。下面列出的是一些改进,没有特别的顺序:

  • SystemStarter, 用来替代 launchd — Apple Mac OS X开启进程

  • Initng, 完全代替 init ,可以异步开启进程

  • Upstart, 完全代替 init ,可以异步开启进程 由Ubuntu使用

  • Service Management Facility, 完全代替/重新设计 Solaris 启动 Solaris 10

  • runit, 跨平台的完全代替 init 可以并行启动服务

  • BootScripts, GoboLinux

  • Mudur, 用 Python 写成的 init 替代品, 可以异步开启进程,Pardus Linux 发行版

  • systemd, 完全替代init,可并行启动服务,并能减少在shell上的系统开销,为Fedora所使用

下面列出的项目还没有大范围的使用:

  • eINIT, 完全代替 init ,可以异步开启进程,但是完成这个过程可以不使用 shell 脚本

  • svscan 来自 daemontools 被用作 1 号进程 - 似乎将被 runit 替代

  • cinit

  • twsinit, 部分用 x86 汇编写成, 只是用来证明一种概念

  • minit

  • OpenRC

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值