• linux开机后第一个程序--init


    背景知识

    计算机启动基本流程如下

    1)首先开机自检-POST,

    2)自检通过后根据CMOS的配置找到第一个可启动磁盘的MBR中的boot loader程序(一般在启动磁盘的第一个物理扇区,占446字节),并把控制权交给boot loader

    3)bootloader完成操作系统内核的加载,并把控制权交给内核

    4)内核继续完成系统的启动

    说明:

    1)POST,会检查自身硬件是否正常. 在BIOS进行设置,管理

    2)BIOS:保存着系统最重要的基本输入输出程序,系统信息设置、开机上电自检程序和系统启动自举程序等。

    3)CMOS:主板上的一块可读写的RAM芯片,主要用来保存当前系统的硬件配置和操作人员对某些参数的设定。由系统通过一块后备电池供电,因此无论是在关机状态中,还是遇到系统掉电情况,CMOS信息都不会丢失。现在多数厂家将CMOS设置程序做到了 BIOS芯片中,在开机时通过按下某个特定键就可进入CMOS设置程序而非常方便地对系统进行设置,因此这种CMOS设置又通常被叫做BIOS设置。

    4)MBR:主引导记录,一共512字节,详细内容如下

                    446: bootloader
                    64: fat--磁盘分区表
                    2: 55AA--bootloader是否有效的标记
     
    要了解boot loader,首先需要说下boot sequnence.
     
    5)BOOT Sequence: 按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备。引导设备中用到的程序叫 bootloader(引导加载器)。
           例如:
                  windows上的引导加载器叫ntloader
                  Linux:LILO:LInux loader
         
           为了能够引导不同的操作系统,于是有了GRUB
                  GRUB: GRand Uniform Bootloader---统一引导加载器,可引导多个引导系统,现在发展到第2代。
                            GRUB 0.X: GRUB Legacy
                            GRUB 1.x: GRUB2---2代GRUB,完全重写了
                    功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,然后解压、展开,并把系统控制权移交给内核;    
     
          GRUB: 启动加载过程     http://blog.csdn.net/u011797751/article/details/50256907
     
    6)内核加载后需要解压,展开,然后进行自身初始化,包括如下内容:
        
                    1)探测可识别到的所有硬件设备;
                    2)加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
                    3)以只读方式挂载根文件系统;
                    4)运行用户空间的第一个应用程序:/sbin/init

     7)ramdisk--虚拟内存盘,通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术

    内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问;

    这种技术在centos5中存在一个问题:内存把ramdisk当作是一个硬盘,即使这部分已经放在内存中,依然会被ramdisk当作硬盘放到缓冲区,浪费了资源,而ramfs可以被视为一个文件系统,可以直接在内存中运行,所以centos5-->6做了一个升级,ramdisk --> ramfs

                            CentOS 5: initrd,  工具程序:mkinitrd
                            CentOS 6: initramfs, 工具程序:mkinitrd, dracut

    正文开始

     1.  /sbin/init是如何运作的呢?
                CentOS 5:
                    运行级别:为了系统的运行或维护等应用目的而设定;
                        0-6:7个级别
                            0:关机
                            1:单用户模式(root, 无须登录), single  ----维护模式,比如可以重置密码;
                            2:  多用户模式,会启动网络功能,但不会启动NFS  -----维护模式;
                            3:多用户模式,正常模式;文本界面;
                            4:预留级别;可同3级别;
                            5:多用户模式,正常模式;图形界面;
                            6:重启
                        默认级别:
                            3, 5
                        切换级别:
                            init #
                        查看级别:
                            runlevel
                            who -r
     
     配置文件:/etc/inittab
                文件中每一行定义一种action以及与之对应的process,每一列如下
                 id:runlevel:action:process,例如id:5:initdefault:
     
                            action:
                                wait: 切换至此级别运行一次;
                                respawn:此process终止,就重新启动之;
                                initdefault:设定默认运行级别;process省略;
                                sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit;
                                ...
     
    一些例子:
                        id:3:initdefault:
                        si::sysinit:/etc/rc.d/rc.sysinit    #运行级别为空,表示所有级别
                        l0:0:wait:/etc/rc.d/rc 0
                        l1:1:wait:/etc/rc.d/rc 1
                        ...
                        l6:6:wait:/etc/rc.d/rc 6
                            说明:rc 0 --> 意味着读取/etc/rc.d/rc0.d/
                                K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常依赖到别的服务----要先杀;
                                S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常被依赖到的服务---要先启动;
                  运行过程如下:
                                for srv in /etc/rc.d/rc0.d/K*; do
                                    $srv stop
                                done
     
                                for srv in /etc/rc.d/rc0.d/S*; do
                                    $srv start
                                done
    etc/rc.d/init.d/目录下的所有启动脚本都被链接到/etc/rc.d/目录下的各级别目录中,比如/rc3.d, rc4.d, rc5.d
     
    CentOS 7 ,配置文件:/usr/lib/systemd/system, /etc/systemd/system 
    CentOS 6,配置文件:/etc/inittab, /etc/init/*.conf (其实用的这个)
     
     
     
    2.  chkconfig命令:   
                                             
    查看服务在所有级别的启动或关闭设定情形: chkconfig [--list] [name]      
                         
    添加:新添加了一个服务程序,需要把启动脚本放在目录/etc/rc.d/init.d (/etc/init.d),然后需要在各级别上创建链接文件
             chkconfig --add name,在配置文件中指明级别,优先级如下                
               #!/bin/bash
               #
               # chkconfig: LLLL nn nn  (这里的LLLL表示各级别,写上的就表示S,第一个nn表示S的优先级,第2个nn表示K的优先级,例如chkconfig: 345 66 33,一般K的优先级要小于S的优先级)                     
             查看链接文件,比如新建服务名字是testsrv,ls -l /etc/rc.d/rc0.d/K33testsrv      ls -l /etc/rc.d/rc3.d/S66testrv
                                      
    删除:chkconfig --del name
                                    
    修改指定的链接类型:
    chkconfig [--level levels] name <on|off|reset>
    --level LLLL: 指定要设置的级别;省略时表示2345;
     
    注意:
    正常级别下(ls /etc/rc.d/rc3.d/目录中),最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本(ls -l /etc/rc.d/rc3.d/S99local查看);因此,不便或不需写成脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中(里面放置开机服务最后一步要运行的东西);
     
     
     
     
    3. update-rc.d命令
     
    ubuntu中和chkconfig类似的开机启动控制命令
    以tomcat为例子,如果是启动命令,可以在/etc/rc.local中添加
    如果想运行脚本,则需要先将脚本复制或者软连接到/etc/init.d/目录下,然后用:update-rc.d tomcat defaults NN命令(NN为启动顺序,比如95),如果想卸载, update-rc.d -f tomcat remove
  • 相关阅读:
    CSS居中布局总结
    Jquery的普通事件和on的委托事件
    sass基础用法
    JS中常遇到的浏览器兼容问题和解决方法
    KVC
    关键字 self
    常见的出现内存循环引用的场景有哪些?
    XCODE中的蓝色文件夹与黄色文件夹
    oc 关键字
    uiwebview 兼容性
  • 原文地址:https://www.cnblogs.com/regit/p/7825924.html
Copyright © 2020-2023  润新知