1.init初探

init是Linux系统操作中不可缺少的程序之一。init进程,它是一个由内核启动的用户级进程,然后由它来启动后面的任务,包括多用户环境,网络等。

内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。

根据实际看一下,我们来到/boot下,

可以看见,Grub就在这里,vmlinuz-2.6.32-358.el6.i686这个文件很重要,说通俗一点的话应该是我们的内核,在启动后加载所有驱动(这个有另外的章节再讲,这里不详述)。另外initramfs-2.6.32-358.el6.i686.img是启动init进程的一个镜像文件,包含一个最小的linux系统。

Linux内核在初始化之后会执行init进程,而init进程会挂载我们的根文件系统,但由于init程序也是在根文件系统上的,所以这就有了悖论。Linux采用两步走的方法来解决这个问题。Linux2.6版以前的方法是:除了内核vmlinuz之外还有一个独立的initrd.img映像文件,其实它就是一个文件系统映像,linux内核在初始化后会mount initrd.img作为一个临时的根文件系统,而init进程就是在initrd.img里的,然后init进程会挂载真正的根文件系统,然后umount initrd.img。但Linux2.6内核的实现方式却不太一样,虽然完成的功能是一样的。Linux2.6采用initramfs。initramfs:init ram filesystem,它是一个cpio格式的内存文件系统,其实这部分也有很多内容可以讲,我们以后再谈。

  通常的步骤是先启动内核,然后内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块,然后发现真正的root分区,挂载并执行/sbin/init。

  如果没有这个文件,计算机的启动时第一个进程都启动不起来。有他存在1号进程才可以开启。相当于是一个指挥官,他要指挥哪些程序在启动时应当存在,哪些程序不应当存在。/etc/inittab文件是init在启动时读取的文件,也就是指挥官的决策书,这个决策书规定了当前战争的局势,比如和平局势、冷战局势、战争局势。以及该局势下的核心策略。init就是这样,通过inittab这个文件控制了计算机的启动级别,及该级别下启动的进程。

[root@hao boot]# cat /etc/inittab
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

  从这里可以看出,我这里linux的default启动级别是runevel 5(注意,此处不要擅自改为6,如果默认的runlevel是6,那么就会比较麻烦,为什么会这么说,看完下面每个级别具体对应的进程就会明白)。那么具体每个级别都是什么呢?其实每个级别都有若干个进程,只不过每个级别开的进程不同。

  0:几乎所有进程都关闭,停机状态

  1:单用户模式,root账户进行操作

  2:多用户,不能使用net file system,一般很少用

  3:完全多用户,一部分启动,一部分不启动,命令行界面

  4:未使用、未定义的保留模式

  5:图形化,3级别中启动的进程都启动,并且会启动一部分图形界面进程。

  6:停止所有进程,卸载文件系统,重新启动

  这些级别中1、2、4很少用,相对而言0、3、5、6用的会较多。3级别和5级别除了桌面相关的进程外没有什么区别。为了减少资源占用,推荐都用3级别。

  那么这些级别是如何定义的呢,在/etc/rc.d/目录内,有如下目录。

[root@Hao rc.d]# ll
total 60
drwxr-xr-x. 2 root root 4096 Mar 11 13:44 init.d
-rwxr-xr-x. 1 root root 2617 Feb 22 2013 rc
drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc0.d
drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc1.d
drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc2.d
drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc3.d
drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc4.d
drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc5.d
drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc6.d
-rwxr-xr-x. 1 root root 220 Feb 22 2013 rc.local
-rwxr-xr-x. 1 root root 19472 Feb 22 2013 rc.sysinit

  在诸如rc3.d和rc5.d目录下有runlevel 3 和runlevel 5中允许和不允许启动的进程,

  再进去目录看一下。

[root@Hao rc.d]# ls rc3.d/
K01smartd K69rpcsvcgssd S10network S26acpid
K02oddjobd K73winbind S11auditd S26haldaemon
K05wdaemon K75ntpdate S11portreserve S26udev-post
K10psacct K75quota_nld S12rsyslog S28autofs
K10saslauthd K76ypbind S13cpuspeed S50bluetooth
K15htcacheclean K80kdump S13irqbalance S58ntpd
K15httpd K84wpa_supplicant S13rpcbind S80postfix
K15svnserve K87restorecond S15mdmonitor S82abrt-ccpp
K25sshd K88sssd S22messagebus S82abrtd
K30spice-vdagentd K89rdisc S23NetworkManager S90crond
K36mysqld K95firstboot S24nfslock S95atd
K50dnsmasq K99rngd S24rpcgssd S99certmonger
K50netconsole S01sysstat S24rpcidmapd S99local
K50snmpd S02lvm2-monitor S25blk-availability
K50snmptrapd S08ip6tables S25cups
K60nfs S08iptables S25netfs
root@Hao rc.d]# ls rc5.d/
K01smartd K75ntpdate S11portreserve S26udev-post
K02oddjobd K75quota_nld S12rsyslog S28autofs
K05wdaemon K76ypbind S13cpuspeed S50bluetooth
K10psacct K80kdump S13irqbalance S55sshd
K10saslauthd K84wpa_supplicant S13rpcbind S58ntpd
K15htcacheclean K87restorecond S15mdmonitor S70spice-vdagentd
K15httpd K88sssd S22messagebus S80postfix
K15svnserve K89rdisc S23NetworkManager S82abrt-ccpp
K36mysqld K95firstboot S24nfslock S82abrtd
K50dnsmasq K99rngd S24rpcgssd S90crond
K50netconsole S01sysstat S24rpcidmapd S95atd
K50snmpd S02lvm2-monitor S25blk-availability S99certmonger
K50snmptrapd S08ip6tables S25cups S99local
K60nfs S08iptables S25netfs
K69rpcsvcgssd S10network S26acpid
K73winbind S11auditd S26haldaemon

  这些都是链接文件lrwxrwxrwx,链接的路径都是/etc/init.d中的脚本文件。

[root@Hao rc.d]# ll rc3.d/ | grep ab
lrwxrwxrwx. 1 root root 19 Feb 10 19:46 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 Feb 10 19:44 S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 26 Feb 10 19:51 S25blk-availability -> ../init.d/blk-availability
lrwxrwxrwx. 1 root root 19 Feb 10 19:46 S82abrt-ccpp -> ../init.d/abrt-ccpp
lrwxrwxrwx. 1 root root 15 Feb 10 19:46 S82abrtd -> ../init.d/abrtd

  K开头的文件意味着是要关闭进程的文件,S开头的进程则是开启的进程,之后的数字表示启动的顺序,比如S23NetworkManager和S80postfix都要依赖S10network,如果这个顺序错了或者电脑了,那么和网络有关的程序都会启动错误,这个也在管理服务器的过程中也需要定期去看一下。

  对比rc3.d/目录与rc5.d/

[root@Hao rc.d]# diff  rc3.d/ rc5.d/
Only in rc3.d/: K30spice-vdagentd
Only in rc5.d/: S70spice-vdagentd

  发现spice-vdagentd服务在runlevel 3中是KILL的,在runleve5是START的,spice-vdagentd服务是Redhat桌面虚拟组件之一,所以在runlevel3中没必要开,在runleve5中是要开启的,否则Linux将无法提供桌面服务,除此之外,两个运行级别没区别。

  还记得那个之前提到的决策书吗?核心策略对应的会启动的内容都是在这里,比如和平局势(之于runlevel 1)下启用基本的民防系统(之于S01sysstat)就可以了,冷战时期(之于runlevel 3)除了民防以外,还开启了自卫系统(之于S08iptables)、消息传递(S10network)、警报机制(之于S22messagebus)、派遣间谍(之于sshd)、调动步兵部队(之于httpd)等等,如果是战争时期(之于runlevel 5)除了上面种种之外还要启动更多的战争活动,调度更强大的部队。

2.相关命令

通过chkconfig –level 3 sshd off在运行级别中的开启或者关闭服务。

通过chkconfig –list sshd来查看sshd在所有runlevel中的状态。

[root@Hao rc.d]# chkconfig --list sshd
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@Hao rc.d]# chkconfig --level 3 sshd off [root@Hao rc.d]# chkconfig --list sshd
sshd 0:off 1:off 2:on 3:off 4:on 5:on 6:off

init 6是重启,init 0是关机。

# who –r 查看当前级别

run-level 5  2012-09-02 06:23

3.附文1.不小心把init 默认的运行级别设为6怎么办

  通过查看 /etc/rc.d/rc6.d可以看到,runlevel 6中只有两个服务是开启的,分别是  S00killall和S01reboot,如果默认的运行级别设为6,那么重启之后,机器会不停重启。

如果真的意(shou)外(jian)把默认的runlevel运行级别设置成了6,那么需要如下操作更改默认运行级别。在GRUB界面按e

然后选中第二行,再按e进入

在出现的命令行后加 [\空格]1 (单用户),按Enter键确认操作并后退到Linux配置页面

再按b重启Linux进入单用户模式就可以修改了,我们这里改为3好了。然后重启就可以了。

4.推荐文章

Linux启动这个很不经意的过程里面包含了太多的内容,本文只是介绍了很小的一部分,推荐大家去深入了解,顺便推荐几篇还不错的文章。

rc.d rc.local rc.sysinit 等Linux系统脚本启动顺序详解 作者:jsxubar (朱秀龙)

Linux2.6 内核的 Initrd 机制解析 作者: dazhi.li(李 大治)

深入理解linux启动过程

最新文章

  1. ckplayer 如何在PC上完美支持 m3u8播放
  2. mysql binlog日志优化及思路
  3. MySQL DCL 整理
  4. Eclipse 工程迁移到 Android Studio
  5. 网络性能测试工具iperf详细使用图文教程
  6. Dedecms 首页调用副栏目内容方法
  7. Sql Server CTE递归
  8. 500G JAVA视频网盘分享 (Jeecg社区)
  9. Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)
  10. 二维码生成Demo
  11. C++隐式转换
  12. CodeSmith系列(三)——使用CodeSmith生成ASP.NET页面
  13. selenium+testN自动化测试框架搭建
  14. easyui时间框只选择年月
  15. 音视频编解码技术(二):AAC 音频编码技术
  16. Java 多线程(一)—— 概念的引入
  17. redis高可用(主从复制)
  18. Test Design Techniques - STATE BASED TESTING
  19. sql一些基本的语法
  20. Docker镜像保存save、加载load

热门文章

  1. mysql数据库优化之开启慢查询日志
  2. kettle表输入条件参数设置
  3. mysql存储过程 基本语法
  4. jquery获取json对象中的key小技巧
  5. Semaphore实现原理分析
  6. 转载 java基础题(面试必知)
  7. 日志log4j配置详情,日志log具体到你想不到
  8. JS学习二(循环)
  9. 团队作业1--团队展示&选题(SNS)
  10. 201521123063 JAVA程序设计 第二周学习总结