linux系统启动首先从BIOS开始检测硬件信息=》开始启动引导程序。读取MBR(磁盘上第0磁道第一个扇区)也就是Master Boot Record 即主引导记录。MBR记录了预启动信息和分区表信息。然后将grub(作用:设定内核映象在磁盘分区的位置)信息复制到内存中。为启动内核做准备。===》加载内核。内核初始化产生一个PID为1的init进程。

***这里需要注意的安装win+linux双系统。先安装w 然后linux。因为 win的引导程序会覆盖其它系统的引导程序。造成linux 的grub缺失,无法启动***

       由于内核运行起来是毫无用途的,需要一个系统能够定义,管理和控制init进程的行为,并负责组织和运行完成初始化的工作,从而让系统进入一个用户设定的运行模式中,这个系统就是init系统。

        init(为英语:initialization的简写)是 unix和 类Unix 系统中用来产生其它所有进程的程序。它以守护进程的方式存在,其进程号为1。Linux系统在开机时加载Linux内核后,便由Linux内核加载init程序,由init程序完成余下的开机过程。

        init 的运行方式历经: sysvinit  , upstart ,  systemd

        早期的linux系统的init运行方式兼容UNIX  system V(Unix系统的一个版本)下init运行方式。

        System V 下init的运行方式:

        System V init 检查 '/etc/inittab' 文件中是否含有 'initdefault' 项。 这告诉 init 系统是否有一个默认的运行。System V init  描述了 8中状态  。0-6 和S 或s .linux 设置了6各级别:#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)

unix system v  默认是 3级别启动。 linux服务器大多版本默认是3级别。而桌面版本一般为5.(图形化界面)。如何查看 :   $ runlevel  或  $ who -r.

            Sysvinit 的优点是概念简单。Service 开发人员只需要编写启动和停止脚本,概念非常清楚;将 service 添加/删除到某个 runlevel 时,只需要执行一些创建/删除软连接文件的基本操作;这些都不需要学习额外的知识或特殊的定义语法(UpStart 和 Systemd 都需要用户学习新的定义系统初始化行为的语言)。

            其次,sysvinit 的另一个重要优点是确定的执行顺序:脚本严格按照启动数字的大小顺序执行,一个执行完毕再执行下一个,这非常有益于错误排查。UpStart 和 systemd 支持并发启动,导致没有人可以确定地了解具体的启动顺序,排错不易。

         2006年的时候Ubuntu 打算把系统用在笔记本上。最大的困境是:sysvinit 对移动设备(USB 设备的设备)的热插拔支持不够。于是开发了upstart 基于事件机制.比如 U 盘插入 USB 接口后,udev 得到内核通知,发现该设备,这就是一个新的事件。UpStart 在感知到该事件之后触发相应的等待任务,比如处理/etc/fstab 中存在的挂载点。采用这种事件驱动的模式,upstart 完美地解决了即插即用设备带来的新问题。UpStart采用了异步方式 可以:更快地启动系统;当新硬件被发现时动态启动服务;硬件被拔除时动态停止服务。这些特点使得 UpStart 可以很好地应用在桌面或者便携式系统中,处理这些系统中的动态硬件插拔特性。但是UPstart没有完全摆脱 runlevel机制。只是在兼容的基础上相应的优化了runlevel机制。

      为了减少系统启动时间,systemd 的目标是:尽可能启动更少的进程,尽可能将更多进程并行启动,减少了启动进程间的依赖。没有必要的进程可以在需要使用的时候才启动。此外systemd开创了新的管理体系。以前运行级别(runlevel)的概念被新的运行目标(target)所取代。target的命名体系类似于“multi-user.target"和原来的运行级别3(runlevel 3)相对应。在centos7中由于使用了新systemd管理机制。不再使用runlevel的概念,所以/etc/inittab不在被系统使用。

        centos7下systemd 管理体系理默认的target通过软链接来实现的。

        (由于版面的问题  把  inode值  属主属组和日期  删除)

[root@jf7 ~]# ll /etc/systemd/system/default.target
 lrwxrwxrwx.    /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target

如果想修改运行目标。只需要把这个软链接删除。软链接到新的运行目标。

# rm -rf /etc/systemd/system/default.target
# ln -s /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

我们来查看下centos7下 /etc/inittab文件

$ cat /etc/inittab 
 # inittab is no longer used when using systemd.
 # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
 # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
 # systemd uses 'targets' instead of runlevels. By default, there are two main target
 # multi-user.target: analogous to runlevel 3
 # graphical.target: analogous to runlevel 5
 # To view current default target, run:
 # systemctl get-default
 # To set a default target, run:
 # systemctl set-default TARGET.target

很明确定义了新的target的位置:/usr/lib/systemd/system/ctrl-alt-del.target

同样查看下: (由于版面的问题  把  inode值  属主属组和日期  删除)

# ll /usr/lib/systemd/system/runlevel*
 lrwxrwxrwx   /usr/lib/systemd/system/runlevel0.target -> poweroff.target
 lrwxrwxrwx   /usr/lib/systemd/system/runlevel1.target -> rescue.target
 lrwxrwxrwx   /usr/lib/systemd/system/runlevel2.target -> multi-user.target
 lrwxrwxrwx   /usr/lib/systemd/system/runlevel3.target -> multi-user.target
 lrwxrwxrwx   /usr/lib/systemd/system/runlevel4.target -> multi-user.target
 lrwxrwxrwx  /usr/lib/systemd/system/runlevel5.target -> graphical.target
 lrwxrwxrwx   /usr/lib/systemd/system/runlevel6.target -> reboot.target

此外,systemd 管理体系还引入了 命令行工具systemctl。 systemctl  可以看作是service和chkconfig

得组合体。不过不用担心。就的service命令在centos7下依旧可以使用,不过,它会重定向所有命令到新的systemctl 工具。

几个例子:

     

(sysvint)
        #service  network  start |stop |status
        #chkconfig httpd on
        ( systemclt)
        # systemctl start|stop|status network.service 
        #systemctl  enable httpd.service

目前: Ubuntu 15.04及后续版本在默认的init上都安装了 systemd.

        介绍完主流init系统后,开始继续启动系统。(centos7之前 PID 为1的进程是由 /sbin/init产生。而 centos7的PID为1的进程由 /usr/lib/systemd/systemd 产生。)

        BIOS - mbr  -grub  -加载内核到内存 - /etc/inittab- /etc/rc.d/rc.sysinit -启动内核模块/etc/modules.conf-启动指定级别下的脚本rcx.d-执行/etc/rc.d/rc.local -/bin/login

        虽然前面说了新的init系统的诸多好处:不过现在毕竟centos7的企业用户群体总体上不多。我们还是需要熟练掌握centos7一下的版本的启动。方便以后的管理。而且centos7 在命令层面上完全向下兼容。

        梳理了,开机启动流程。可以来些小的应用。    

        比如:在/etc/rc.d/rc.local  里面挂载移动设备,添加个性化服务启动。如果,改阶段那个服务启动不了,导致。启动阻塞。是否可以先进入单用户模式,在/etc/rc.d/rc.local 文件下注释掉服务。待开机后在测试,修复呢?

        最主要的是。熟悉了开机启动后。可以根据开机的错误信息。排查是那个阶段出现的错误。比如系统一起重启。查看  /etc/inittab 是否设置了runlevel6模式。开机脚本错误是不是应该单用户进入系统排查。/etc/rc.d/rcx.d下面的脚本,必要是可以把S开头的脚本先改名为K 。待系统启动后在恢复。


本文转自 swallow_zys  51CTO博客,原文链接:http://blog.51cto.com/12042068/1893078,如需转载请自行联系原作者