Linux初始化过程

现在的工作有一部分是运维方面的,所以要求对Linux要比较熟悉。我之前对Linux的使用仅局限于一些常用的命令和脚本,并没有深入去学习。一直以来对Linux的初始化过程都比较模糊,在网上找很多文章都语焉不详,并没有让我有豁然开朗的感觉。这几天在研究Systemd,读到这篇博客,觉得说得很清楚。特此总结一下。

  1. 操作系统启动过程中,Linux内核加载完成之后,内核初始化的最后一步就是运行init程序。init程序负责在系统启动时运行一些服务程序和脚本,来让一些重要和必要的服务开机就能运行起来。系统基本服务程序如network,crond,iptables等和用户安装服务程序如mysqld,nginx等,都是通过init系统来完成开机启动过程。

  2. Linux世界中init系统有许多种类,不同的发行版采用不同的实现。大多数Linux发行版的init系统是和System V相兼容的,被称为"System V init(sysvinit)",这是人们最熟悉的init系统。早期的Ubuntu也是使用sysvinit,但是Ubuntu从6.10开始,使用Upstart替换sysvinit,成为Ubuntu新一代init系统。现在也有一些linux发行版如Fedora,Debian也开始或者计划采用systemd来作为init系统。

  3. Ubuntu下,init系统程序位于/sbin/init,大多数Linux发行版的init程序都位于目录/sbin或者/bin之下。

  4. Sysvinit中的一个概念:运行级别(Run Level)。 它是一个数字,代表系统现在处于什么样的运行模式中,sysvinit根据运行级别来判断需要启动哪些服务。常有的运行级别有:

  5. 两个重要的文件和目录:
    /etc/inittab中存放了系统启动时的默认运行级别,假设为N。如图:

/etc/rcN.d/目录下的程序就是对应N运行级别下的程序,系统进入运行级别N时,会按顺序依次运行该目录下的相应程序来完成初始化过程。如图:

  1. sysvinit在启动时,就会读取/etc/inittab文件,获得默认的运行级别(假设为N),然后依次启动/etc/rcN.d中的相应程序,完成开机的初始化过程。

  2. 由于很多程序是需要放在多个运行级别下运行的,所以为了避免冗余,/etc/rcN.d/目录下放的其实是真正启动程序的软链接,真正的启动程序一般放在/etc/init.d/之下的。如:

  3. 软链接的命名,sysvinit用程序的文件名来存储了程序一些简单控制信息。软链接的名字格式: S/K + NN + NAME。 系统进入默认运行级别时,init会杀掉所有以K开头的程序,启动以S开头的程序,按照NN的大小,从低到高开始启动和停止程序。NAME是程序的名字,也是启动之后进程的名字。

  4. /etc/rc.local这个是可执行shell脚本,不仅仅运行在级别3(Multi-User Mode)下,在级别2(Multi-User mode without networking)和级别5(GUI Mode)也会有。所以只要机器正常开机,这个脚本就会自动运行,一般情况下这个脚本内容为空。如果你需要将一些程序加入开机自启的话,就将程序命令增加到这个脚本即可。

  5. 在sysvinit中,服务是按照顺序来执行的,这很影响效率。另一方面,sysvinit中,服务是预设的,不能实时启动(比如在系统被挂载了一个磁盘的时候自动启动)。而Upstart可以解决这些问题。

  6. Upstart是基于事件机制的。可以按需启动服务,性能和很多方面都比sysvinit强,所以upstart被后来的Ubuntu等linux发行版采用。

  7. 在Upstart中,程序执行单位被称为作业(job),所有的init作业都必须放在目录/etc/init之下,使用Upstart自己的配置文件来描述Job内容。Upstart启动时,从/etc/init/目录中读取各个job的配置文件,获取所有job,然后发出Startup信号,所有监听这个信号的作业会被执行。在作业执行过程中,作业本身也可以自己发出信号,其他监听这个信号的服务接着就会被启动执行。Upstart通过这样的方式来达到异步和实时控制作业的启动执行。

  8. Service命令
    service SCRIPT COMMAND [options] 如: service nginx start # 启动nginx服务

    这个命令的作用是: 运行一个sysvinit程序或者Upstart作业。 所以它是一个既支持Upstart作业,又支持sysvinit程序的命令。运行时,service首先从/etc/init.d/中去找SCRIPT,如果没有找到再去/etc/init目录下去找同名作业配置文件,然后运行这些程序/作业。

comments powered by Disqus