1、linux系统的组成部分:

    内核:对进程、内存、网络协议栈、文件系统、驱动程序、安全功能等进行管理

    根文件系统


2、运行中的系统环境分两层:

    内核空间:又叫内核模式;运行内核级代码,主要实现系统调用

    用户空间:又叫应用程序;运行用户级别的进程或线程。


3、内核存放的位置:

    /boot:


4、rootfs:根文件系统:

    有/下的必须的一些目录,/sbin,/bin,/lib,/lib64,/root,/var,/tmp,/etc,/usr,/proc,/sys,/home,等等


5、内核的设计流派:

    单内核设计:把所有功能集成与同一个程序,如linux

    微内核设计:每种功能使用一个单独的子系统实现,如:Windows、Solaris


6、linux内核特点:

    支持模块化:所有内核模块以 ".ko"结尾(ko:kernel object)

    支持模块运行时,动态装载及卸载


7、linux支持的模块有两种

    .ko:kernel object,内核模块

    .so:shared object,共享模块

    

8、内核的组成:

    核心文件:/boot目录下,

    模块文件:/lib/modules目录下

    ramdisk文件:

核心文件:/boot目录下,

[root@localhost boot]# ls /boot

config-3.10.0-514.el7.x86_64

extlinux

grub

grub2

initramfs-0-rescue-2870a7d09372452a93f532a5bc3afdad.img

initramfs-3.10.0-514.el7.x86_64.img

initramfs-3.10.0-514.el7.x86_64kdump.img

initrd-plymouth.img

symvers-3.10.0-514.el7.x86_64.gz

System.map-3.10.0-514.el7.x86_64

vmlinuz-0-rescue-2870a7d09372452a93f532a5bc3afdad

vmlinuz-3.10.0-514.el7.x86_64  //核心文件,z表示压缩文件,3.10.0表示内核版本号,514表示发行号本地版本号

[root@localhost boot]# 


模块文件:位于:/lib/modules目录下,有一个与核心文件(版本号+发行号)名称一致的文件。

[root@localhost modules]# ls /lib/modules

3.10.0-514.el7.x86_64

注意:如果内核提供了多个版本,则在此目录下会有多个对应的内核模块文件


[root@localhost modules]# ls /lib/modules/3.10.0-514.el7.x86_64/

build              modules.builtin      modules.modesetting  source

extra              modules.builtin.bin  modules.networking   updates

kernel             modules.dep          modules.order        vdso

modules.alias      modules.dep.bin      modules.softdep      weak-updates

modules.alias.bin  modules.devname      modules.symbols

modules.block      modules.drm          modules.symbols.bin

[root@localhost modules]# 


ramdisk文件:ramdisk的作用是将内存的部分空间当做磁盘用,它是用来存放系统的临时根文件系统,去加载磁盘驱动程序,但它不是必须的。不同版本的linux存放的命名不一样。

centos5:/boot/initrd-VERSION-relase.img

centos6/7:/boot/initramfs-VERSION-release.img

如:centos7:

[root@localhost modules]# ls /boot/

config-3.10.0-514.el7.x86_64

extlinux

grub

grub2

initramfs-0-rescue-2870a7d09372452a93f532a5bc3afdad.img

initramfs-3.10.0-514.el7.x86_64.img    //ramdisk文件

initramfs-3.10.0-514.el7.x86_64kdump.img

initrd-plymouth.img

symvers-3.10.0-514.el7.x86_64.gz

System.map-3.10.0-514.el7.x86_64

vmlinuz-0-rescue-2870a7d09372452a93f532a5bc3afdad

vmlinuz-3.10.0-514.el7.x86_64

[root@localhost modules]# 

注意:centos6/7中用initramfs代替centos5中的initrd是因为rd是基于磁盘的,本身rd已经在内存了,但是还是要缓存一次;这样做避免了双缓存,达到了提速的目的。







9、centos系统的启动流程:

①、POST:加点自检(检查计算硬件的基本组成部分,如cpu、内存、io等设备是否存在且正常),实现POST的代码位于主板上的ROM芯片上,不施加外部手段,是不能修改ROM的;ROM芯片中有CMOS、BIOS两种;物理的地址空间由ROM和RAM两部分组成。

②、Boot Sequence:启动过程(即引导过程)

BIOS中设置按次序查找各引导设备,第一个有引导程序(bootload)的设备即为本次启动要用到的设备

  a、bootloader分类:引导加载器,用来引导程序,它本身也是一个程序。

    windows的BootLoader:ntloader

    linux的BootLoader:LILO(linux loader)和GRUB(grand uniform BootLoader)

        GRUB:centos5/6:grub 0.x,grub legacy;

            centos7:grub 1.x ,grub2


  b、bootloader的作用:提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户的选定的内核装载在RAM中的特定空间中,并解压展开,然后把系统控制权移交给内核。


  c、bootloader的安装位置:MBR中

    MBR:master boot loader,共512字节:前446字节存放bootloader(LILO、GRUB),中64字节:存放分区表,后2字节:55AA表示mbr有效,其他值则表示mbr不可用。


  d、grub各阶段作用:

    stage1:bootloader

    stage1_5:分区文件系统驱动

    stage2:引导/boot/grub分区,由bootloader加载第二阶段(如果用mbr去加载此阶段,字节数有限制;grub可以将此阶段放在磁盘上,可以做很多菜单,因为没有空间限制),然后在去加载内核。

    

  e、加载内核(kernel)

    kernel自身初始化:

        探测可识别的到所有硬件设备

        加载硬件的驱动程序,有可能会借助于ramdisk加载驱动

        以只读方式挂载根文件系统(rootfs)

        运行用户空间的第一个应用程序(/sbin/init)

            init程序类型:

                centos5:sysv init,配置文件位置:/etc/inittab

                centos6:upstart,配置文件位置:/etc/inittab及/etc/init/*.conf

                centos7:systemd,配置文件位置:/usr/lib/systemd/system及/etc/systemd/system

  

  f、ramdisk:linux内核特性之一

    使用缓冲和缓存来加速对磁盘上的文件的访问。

    initramfs取代initrd:减少缓冲次数

    centos5:initrd,工具程序:mkinitrd

    centos6/7:initramfs,工具程序:dracut、mkinitrd


10、总结:系统初始化流程(内核级别)

    post--->boot sequence(bios中设置)--->bootloader(mbr)--->kernel(有可能借助ramdisk)--->rootfs(readonly)--->启动/sbin/init进程





11、/sbin/init

    centos5:sysv init

    init运行级别:为了系统的运行或维护等目的而设定的机制;共有0-6个级别。

        0:关机,shutdown

        1:单用户模式(single user):root用户,无需认证,维护模式

        2:多用户模式(multi user):会启动网络功能,但不会启动NFS,它是维护模式

        3:多用户模式(multi user):完全功能模式,文本界面,不会激活桌面系统

        4:预留级别:目前无特别使用目的,但习惯以同“3”级别功能使用

        5:多用户模式(multi user):完全功能模式,会启动图形界面

        6:重启,reboot

    默认级别:3,5

    init运行级别切换:

        #init N  :N代表init的级别

    级别查看:

        #who -r

        #runlevel     

            [root@localhost ~]# who -r

                 run-level 5  2017-12-31 09:27                   last=3

            [root@localhost ~]# runlevel

                3 5

            [root@localhost ~]# 


    centos5中:通过配置文件/etc/inittab来决定init进程来做些什么,在centos中,inittab文件中的每一行执行一种操作。


12、inittab文件配置格式:

    每行定义一种action以及与之对应的process(仅适用于centos5);

     inittab文件格式:id:runlevels:action:process

        id:每行定义一个任务的具体标识符

        runlevels:在哪些级别启动此任务,如:#,###,也可以为空,表示所有级别

        action:在什么条件下启动此任务

            wait:等待切换至此任务所在的级别时执行一次操作

            respawn:一旦此任务终止时,就自动重启动此任务

            initdefault:设定默认运行级别,此时,process可以省略

            sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本文件

        process:具体的任务是什么,可以是程序也可以是脚本。。


inittab中action示例:

    id:3:initdefault

    si::sysinit:/etc/rc.d/rc.sysinit

    lo0:0:wait:/etc/rc.d/rc0  //意味着去启动或关闭/etc/rc.d/rc3.d/目录下服务脚本所控制的服务(s*:表示要启动的服务,k*要停止的服务)

    tty1:2345:respawn:/usr/sbin/mingetty1  //此为启动6个终端服务,如果此处删除一个,则ctrl+shift+F#就会少一个。

     tty2:2345:respawn:/usr/sbin/mingetty2  //mingetty会调用login程序,打开虚拟终端程序除了mingetty之外,还有诸如getty。

     tty3:2345:respawn:/usr/sbin/mingetty3 

     tty4:2345:respawn:/usr/sbin/mingetty4 

     tty5:2345:respawn:/usr/sbin/mingetty5 

     tty6:2345:respawn:/usr/sbin/mingetty6 

         

13、rc脚本介绍:


   rc脚本的功能:接受一个运行级别数字为参数

        k*:要停止的服务;k##*,##表示优先级,数字越小,越是优先关闭,依赖别的服务的服务要先关闭,被依赖的后关闭

         s*:要启动的服务;s##*,##表示优先级,数字越小,越优先启动,被依赖的服务先启动,依赖别的服务的服务后启动。

    rc脚本框架:

        for srv in /etc/rc.d/rc#.d/k*;do

            $srv stop

        done

        for srv in /etc/rc.d/rc#.d/s*;do

            $srv start

        done


    /etc/rc.d/*(或/etc/rc.d/init.d/*)脚本执行方式:

        方法一:#/etc/init.d/SRV_SCRIPT {start|stop|restart|status}

        方法二:service SRV_SCRIPT {start|stop|restart|status}

注意:/etc/rc.d/rc.local:开机会自动运行一次,如果不会写脚本,可将需要的命令放在此处。


    chkconfig命令:管控/etc/init.d/目录下每个服务脚本在各级别下的启动或关闭状态。

        查看:#chkconfig --list [name]

        添加:#chkconfig --add name

        删除:#chkconfig --del name

    能被chkconfig添加服务的脚本定义之一:

        #chkconfig:LLL NN NN    //脚本中定义的格式,LLL表示运行的级别,当为空时表示在所有init级别上;NN分别是关闭优先级和启动优先    

        #description:


    修改指定的链接类型:

        chkconfig [--level LEVEL] name <on|off|reset>

            --level:指定要控制的级别,不写默认为2345

        示例:#chkconfig --level 35 srv on

            #chkconfig --list srv

    注意:下次开机起作用,当前不受影响。


正常级别下:最后启动的一个服务s99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/local脚本;因此不便或不需要写为服务脚本的程序期望开机自动运行时,直接放置于此脚本文件中即可。/etc/rc.d/rc.local的另一文件文件路径/etc/rc.local。关系如下:

[root@localhost ~]# ls -l /etc/rc.local 

lrwxrwxrwx. 1 root root 13 Aug 29 20:05 /etc/rc.local -> rc.d/rc.local

[root@localhost ~]# 


14、centos5常用的系统初始化脚本文件:/etc/rc.d/rc.sysinit)

  脚本文件的功能:

    ①、设置主机名

    ②、设置欢迎信息

    ③、激活udev和selinux

    ④、挂载/etc/fstab文件中定义的所有文件系统

    ⑤、检查根文件系统,并以读写的方式重新挂载根文件系统

    ⑥、设置系统时钟

    ⑦、根据/etc/sysctl.conf文件的设置,来设置内核参数

    ⑧、激活lvm及软raid设备

    ⑨、激活swap设备

    ⑩、加载额外设备的驱动程序

    11、清理操作。


 

15、总结:用户空间的启动流程

    /sbin/init(通过读取/etc/inittab文件完成各种任务:设置默认运行级别--->运行系统初始化脚本,完成系统初始化--->关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务--->设置登陆终端--->启动图形终端【非必须】)





16、centos6:init程序介绍:

    init程序:upstart,但依然为/sbin/init,其配置文件:/etc/init/*.conf;/etc/inittab(仅用于定义默认级别)

注意:*.conf为upstart风格的配置文件。


    rcs.conf:系统初始化脚本

    rc.conf:启动或关闭服务

    start-ttys.conf:定义启动哪些终端服务。


17、centos7:init程序介绍

    init程序:systemd,配置文件:/usr/lib/systemd/system/*;/etc/systemd/system/*

注意:在centos5/6中定义的开机启动的服务,这些服务在开机时会自动启动,但在centos7中,定义的启动服务,开机时并未启动,只有在被访问时,才会启动。所以centos7开机比较快。

同时,systemd没有init中的级别概念。


    centos7完全兼容sysV脚本机制,因此,service命令依然可以使用,不过,建议使用systemctl命令来控制服务。


systemctl {start| stop |restart |status} name[.service]