1.Linux的组成

    kernel+rootfs

    kernel:进程管理、内存管理、网络管理、安全管理、文件系统管理、驱动程序

    rootfs:程序和glibc

        库:函数集合,function,调用接口(头文件负责描述)

            过程调用:procedure  ,无返回值

            结果调用:function

        程序:二进制文件

2.内核设计流派

        单内核(monolithic kernel):Linux

            把所有功能集成于同一个程序

        微内核(micro kernel):Windows, Solaris

            每种功能使用一个单独子系统实现

3.内核特点及组成

    支持模块化:.ko(内核对象)

    支持内核模块的装载和卸载

4.内核的组成

    核心部件:  /boot/vmlinuz-VERSION-release

                      伪文件系统:ramdisk

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

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

    模块文件:/lib/modules/VERSION-release

5.centos6启动流程

(1)主动读取BIOS,通过CMOS加载硬件信息 ,并进行POST,指定第一个可启动的设备

            ROM:BIOS,Basic Input and Output System,保存着计算机系统最重要的基本输入输出程序,系统信息设置,开机加电自检程序

            RAM:保存各项参数的设定

(2)读取第一个可启动设备MBR的引导加载程序(grub)的启动信息

        <1>MBR:  446 boot loader  64:分区表  2 :55aa

                BIOS通过硬件的INT13中断功能来读取MBR的

        <2>Windows:ntloader  仅是启动OS

               Linux:   提供菜单;  转交系统控制权;  直接指向内核文件

                        LILO:LInuxLOader

                        GRUB: GRandUnified Bootloader

                                primary boot loader:1st stage,1.5stage

                                secondary boot loader:2 stage,分区文件


                    bootloader的1stage是在MBR内进行的,1.5stage是再0面0磁道0扇区的后续扇区,2stage是在/boot分区上边

                1stage是 寻找/boot分区的文件系统驱动

                1.5stage内就是/boot分区文件系统驱动,识别/boot分区

                2stage是/boot分区相关操作

                /boot/grub下的stage类文件(除了stage2)都是备份


        <3>ramdisk:使用缓存或缓冲来加速对磁盘上文件的访问

                centos5:initrd  工具程序:mkinitrd

                centos6:initramfs   工具程序:mkinitrd,dracut\


                自己创建initramfs文件

                    mkinitrd [-v] [-with=模块名称] initrd文件名 内核版本

                        -v 显示mkinitrd的过程

                        --with=[模块名称]:模块名称指的是模块的名字,不需填写文件名

                    如果在救援模式下,需要切根,因为救援模式下好多库文件不存在


        <4>解压缩内核到内存中,

                加载可识别的所有硬件设备(以自己的功能重新检查一次硬件,不一定适用BIOS的检测结果)

                加载硬件驱动

                以只读方式挂载根系统

                运行用户空间的第一个程序:/sbin/init

        <5>内核内容

        

wKioL1fXx0XwqAJ9AAA1mdK5ajA507.png

(3)内核执行init程序,获取默认运行信息

         <1>init程序类型:

                SysV: init, CentOS 5之前

                        配置文件:/etc/inittab

                Upstart: init,CentOS6

                        配置文件:/etc/inittab, /etc/init/*.conf

                Systemd:systemd, CentOS 7

                        配置文件:/usr/lib/systemd/system

                                        /etc/systemd/system

            <2>运行级别

                    0  halt(系统直接关机)

                    1 单用户模式下,用在系统出问题时的维护

                    2 类似下面的runlevel 3,但无NFS服务

                    3 纯文本模式

                    4  系统保留功能

                    5 字符界面

                    6 重新启动


                 切换等级:init #

                 查看等级: runlevel who -r

        <3>/etc/inittab文件相关知识

            每一行定义一种action以及与之对应的process

            id : runlevel : action : process

                id:代表init的主要工作选项,只是简单代表说明

                runlevel:在那些等级下运行

                action:  initdefault:代表默认的runlevel设置值

                sysinit:代表系统初始化的操作选项

                ctrlaltdel:代表ctrl+alt+del三个按键是否可以重新启动

                wait:代表后面设置的命令项目必须要执行完毕才能继续下面的其他操作

                respawn:代表后边字段的命令可以无限制的重新启动

                process:可以进行的命令

                例如:

                    ca::ctrlaltdel:/sbin/shutdown -t3 -r now

                    id:3:initdefault:

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

                    l0:0:wait:/etc/rc.d/rc0

                    l1:1:wait:/etc/rc.d/rc1

                    1:2345:respawn:/sbin/mingetty tty

                    x:5:resawn:/etc/prefdm -nodaemon  x window 则是这行决定的

        <4>/etc/init/*.conf

(4)init程序执行/etc/rc.d/rc.sysinit文件

        取得网络环境与主机类型:/etc/sysconfig/network

        设置显示与启动过程中的欢迎界面(textbanner)

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

        挂载/etc/fstab文件中定义的文件系统

        设置系统时间:读入/etc/sysconfig/clock设置值  修改时区的话,把/user/share/zoneinfo/Asia  /Shanghai复制到/etc/local下

        激活udev和selinux

        激活swap设备

        初始化软件磁盘阵列、初始化lvm文件系统、、磁盘配额

        加载内核相关设置:/etc/sysctl.conf

        用户自定义模块加载:/etc/sysconfig/modules.conf设置

        清除启动过程中产生的临时文件

        将启动相关信息加载到/var/log/dmesg中

(5)启动核心的外挂模块/etc/modeprobe.conf文件

(6)init执行各个批处理文件

        <1>各个运行级别脚本所在目录:

            /etc/rc.d/rc 0.d

            /etc/rc.d/rc 1.d

            /etc/rc.d/rc 2.d

            /etc/rc.d/rc 3.d

            /etc/rc.d/rc 4.d

            /etc/rc.d/rc 5.d

            /etc/rc.d/rc 6.d

         <2>脚本文件运行规则:

                进入到某个运行级别的脚本目录/etc/rc.d/rc?.d

                k*:  k##*: ##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务

                s*:  S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务


                s开头的文件,运行

                k开头的文件,关闭

        <3>chkconfig命令详解

                查看服务所在级别的启动或关闭情形

                    chkconfig [--list] name

                添加服务给chkconfig管理

                SysV的的服务脚本放置于/etc/init.d

                    chkconfig --add name

                服务脚本格式信息

                        #!/bin/bash

                        #LLLL 表示初始在哪个级别下运行  “-”表示都不启动

                        # LLLL mm nn  mm表示启动次序  nn表示古币次序

                删除

                        chkconfig --del name

                修改制定的链接类型

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

                        --level LLLL:省略是表示2345

                图形化界面ntsysv


(7)init执行/etc/rc.d/rc.local

        正常情况下,最后启动一个服务S99local没有链接至/etc/init.d下的脚本,而是指向了/etc/rc.d/rc.local脚本

        不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中

(8)执行/bin/login程序,等待用户登录

            1:2345:respawn:/usr/sbin/mingettytty1

            2:2345:respawn:/usr/sbin/mingettytty2

            ...

            6:2345:respawn:/usr/sbin/mingettytty6

            mingetty会自动调用login程序

            x:5:respawn:/etc/X11/prefdm -nodaemon

(9)登录后以shell控制主机

            BIOS加载硬件信息--》post加电自检--》加载MBR里grub信息--》stage1.5--》stage2--》initramfs--》    rootfs-->init-->/etc/inittab-->设置默认运行级别-->初始化/etc/rc.d/rc.sysinit-->/etc/rc.d/rc#.d-->/etc/rc.local


7.使用gzip -d 解压缩gz格式文件,此文件必须是.gz后缀,要不无法解压缩


8.破解centos5的root口令

    (1)进入centos5 的grub界面,按a修改内核选项



wKioL1fX5YzAy6SIAACZ2GlTVsg520.png

    (2)在命令行尾部追加1 或 S 或single,然后按enter键保存修改

wKiom1fX5zLjf76sAABbTATPxu0732.png

    (3)进入如下命令行模式,用passwd root  修改密码

wKiom1fX502yDB18AAAqKgwt8is227.png

    (4)重新启动,用刚才修改的密码登录系统

wKiom1fX53fT1lb0AAcvjWNpwco385.png


9.编写centos5服务脚本

    (1)在/root/bin写编写脚本testsrv,内容如下

wKioL1fX6OeiqWZUAAAlGjmCq-I204.png

    (2)在/root/bin和/etc/init.d目录下分别执行chkconfig --add testsrv发现无法成功加载testsrv服务wKiom1fX6TyQHevlAAAu6cr-KMs317.png


把脚本复制到/etc/init.d下,执行上述命令,发现可以实现

wKiom1fX6X3ineuyAABP87H8FNY488.png

    (3)

在/etc/rc.d/rc3.d下查看testsrv文件时什么字母开头的

wKiom1fX6aOiknkQAAARNv3-Axo134.png

发现此命令在level 3启动等级下,是需要开启的服务,与设定一致