linux 系统启动流程

假设以个人架设的linux主机为例:当你按下电源键之后,计算机硬件会主动读取BIOS来加载硬件信息及进行硬件系统的自我测试,之后系统会主动读取系统第一个可启动的设备,此时就可以读入引导装载程序了。

引导程序可以指定使用哪个内核文件来启动,并实际加载内核到内存中解压缩与执行,此时内核就能够开始在内存内活动,并检测所有硬件信息,与加载适当的驱动程序来使这部主机开始运行,等到内核检测硬件与加载驱动程序之后就可以启动系统了。

linux系统的启动流程如下:

1、 加载BIOS的硬件信息与进行自我测试,并依据设置取得第一个可启动的设备。

       boot Sequence:按次序查找各引导设备,第一个有引导程序的设备即为本地启用要用到的设备   (BIOS) 

2、 读取执行第一个启动设备内MBR的Bootloader(grub)    

                Boot Loader的功能:要认识操作系统的文件格式,并根据这个加载内核到内存中去执行。

                MBR是整个硬盘的第一个扇区内的一个块,充其量整个大小也有446,要加载boot的分区的驱动程序,ll -h `locate *ext4.ko`可以看到驱动程序有631k,因此446个字节根本装不下,不能加载驱动程序,因此linux将boot loader的程序代码执行与设置分为两个阶段:

                                阶段1、446个字节,不属于任何一个分区,他是硬盘上面第一个扇区,也没有文件系统,不需要驱动,

                                阶段1.5、位于第一个扇区后面的扇区,用于存放/boot分区的文件系统的驱动程序,因为/boot是被ext4格式化的,因此需要驱动程序,才能该分区,/boot/grub/*,可以看到1.5阶段的一些文件(备份使用)(fdisk -l 可以看到分区是从第一个柱面开始分的,所以还有0柱面8M的空间,用于存放这些数据,所以空间非常充裕 hexdump -C -n 15000 /dev/sda)。

                                阶段2、挂载/boot目录,加载内核文件,加载虚拟文件系统,挂载根文件系统,就是第三步所实现的功能,2st及内核等通常放置于一个基本磁盘分区(非raid,非lvs等/boot目录可以单独分区,如果想把根做成raid等非基本磁盘分区)。

                grub功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核版本装载到RAM中的特定空间中,解压,展开,而后把系统控制权移交给内核

3、 依据Bootloader的设置加载Kernel文件到内存中,Kernel会开始检测硬件与加载驱动程序(此时接管bios工作)。

                内核文件:/boot/vmlinuz-2.6.32-642.el6.x86_64

                驱动程序:/lib/modules/

                            该文件存在磁盘上,内核需要加载磁盘驱动,才能挂载根目录,访问驱动程序,所以此时根根本无法挂载,因此就需要一个虚拟文件系统文件

                虚拟文件系统文件:/boot/initramfs-2.6.32-642.el6.x86_64.img

                            在内存中解压成一个伪根文件系统,内核借此加载适当的驱动程序,最总释放虚拟文件系统,并挂载实际根目录文件系统。

                            通过/bootloader加载到内存中,然后在内存中仿真成一个根目录,且此仿真在内存中的文件系统能够提供一个可执行程序,通过该程序来加载启动过程中所最需要的驱动程序    (USB,raid,lv,scsi等),等载入完成之后,内核就能识别真正的根了,然后进程根切换,切换完成后,调用/sbin/init来开始后续的正常启动流程。

                              该文件的查看方法:有file initramfs-2.6.32-642.el6.x86_64.img可以看到该文件是压缩文件因此:

                                       1、mv initramfs-2.6.32-642.el6.x86_64.img initramfs-2.6.32-642.el6.x86_64.img.gz

                                            gzip -d initramfs-2.6.32-642.el6.x86_64.img.gz

                                            cat initramfs-2.6.32-642.el6.x86_64.img | cpio -id 

                                       2、zcat initramfs-2.6.32-642.el6.x86_64.img | cpio -id 

                            该文件删除后的恢复方法:            

                                                        1、救援模式

                                                        2、chroot /mnt/sysimage  切换根  救援模式的工具比较少 因此切换到根

                                                        3、mkinitrd /boot/initramfs-`uname -r`.img   `uname -r`  此操作要在/boot目录下运行

                                                        4、exit;exit;reboot

4、 在硬件驱动成功后,Kernel会主动调用init进程,而init进程会取得run-level信息

                     Init:准备软件执行环境,包括系统主机名,网络设置,文件系统格式及其他服务的启动等。

                     配置文件:/etc/inittab,在配置文件有一个重要的设置,就是默认run-level 

5、 Init 执行/etc/rc.d/rc.sysinit文件来准备软件执行的操作环境,配合好整个系统(如网络,时区)

                            功能:
                                        1、设置主机名:
                                        2、设置欢迎信息
                                        3、激活udey和selinux
                                        4、挂载/etc/fstab文件中的定义的所有文件系统
                                        5、检测根文件系统,并以读写方式重新挂载根文件系统

                                        6、设置系统时钟;
                                        7、根据/etc/sysctl.conf文件的设定,来设定内核参数;
                                        8、激活lvm及软raid
                                        9、激活swap设备
                                        10、加载额外设备的驱动程序;
                                        11、清理操作;

6、 启动核心的外挂模块(/etc/modprobe.conf)

                  用户加载自定义模块的驱动程序,通常该文件可以自行产生。

7、 Init运行runl-level的各个服务的启动(script方式)

                运行级别:为了系统运行或维护的目的而设定的机制

                          0-6:7个级别

                          0:关机shutdown

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

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

                          3、多用户模式(mutli suer),完全功能模式;文本界面;

                          4、预留级别:目前无特别适用目的,但习惯以同3界别使用;

                          5、多用户级别(multi user),完全功能模哦;

                               6、重启模式,reboot

                  centos 6中/etc/inittab设置的默认级别为:

                                       id:5:initdefault:

                         其中:

                                id:runlevels:action:process

                                id:一个任务的标识符

                                 runlevels:在哪些级别下启用此任务;

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

                                process:任务

                          action:

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

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

                                   initdefault:设定默认运行级别;此时process会省略

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

 

                    启动对应级别下的服务(看默认级别,如果默认级别是5 就运行5下面的程序):

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

                                       。。。。

                                   11:0:wait:/etc/rc.d/rc 5

                                   12:0:wait:/etc/rc.d/rc 6

                              init要读取/etc/inittab配置文件完成初始化,该配置文件中有一堆的/etc/rc.d/rc 0,每个级别都有分别做了定义,他会等到你切换到该级别上来,切换过来后,init会到该级别下,将所有k开头的文件stop掉,所有s启动起来,这就是有些服务开机自动能启动的原因。Fl,rc5.d 目录下面的文件都是软连接,对应的都是/etc/init.d/下面对应的服务脚本,且配置文件在/etc/sysconfig/目录下,rc5.d目录下都是以k或者s打头的,后面跟的数字代表执行的顺序,且是以字符进行排序,表示执行的优先级。

                     当然我们也可以自定义/etc/inittab中的服务:

                                例如:

                                                             1、进入/etc/init.d下建立脚本

                                                                    #!/bin/bash

                                                                    #chkconfig:35 88 22

                                                                    #description:test service 

                                                                        echo "How are you?"

                                                              2、chmod +x testrv

                                                              3、chkconfig –add testsrv

                                                              4、chkconfig –list testsrv

                                                                                    testrv    0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭

                                                              5、service testsrv

                                                              6、chkconfig –del testsrv

                                                            注意:chkconfig [–level <levels>] [–type <type>] <name> <on|off|reset|resetpriorities>

8、 Init执行/etc/rc.d/rc.local文件

                             目录下中的/rc.local脚本,我们有任何启动时就要运行的脚本可以写到该文件中,在开机启动的时候就会自动被加载。

9、 Init执行终端机模拟程序mingetty来启动login进程,最后等待用户登录

10、登录后开始以shell控制合主机。

POST –> Boot Sequence (BIOS) –> Boot Loader (MBR) –> kernel(ramdisk) –rootfs –> switchroot    –> /sbin/init –>(/etc/init/*.conf,/etc/inittab) –> 设定默认运行级别 –> 运行系统初始化脚本 –> 关闭或启动对应级别下的服务 –> 启动终端

内核模块的增删查

    目前内核都是具有可读取模块化驱动程序的功能,我们也可以理解为驱动程序,那么到底目前内核中加载了多少模块呢?

    lsmod:查询内核中加载的模块 常配合grep使用

                    Module                  Size  Used by                    
                    nls_utf8                1455  1 
                    fuse                   79892  2 
                    rfcomm                 71079  4 
                    sco                    17493  2 
                    bridge                 85674  0 
                    
                    模块名称           模块大小   此模块是否被其他模块所使用

    modinfo:查询模块信息

        格式:modinfo [-adln] [module_name][filename]

        选项:

                        -a:仅列出作者名称

                        -d:仅列出该modules的说明

                         -l:仅列出授权

                        -n:仅列出该模块的详细路径

    insmod:加载内核模块(需要用户自行加载一个完整文件名的模块)

        格式:insmod [/full/path/module_name][parameters]

                            insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko(必须要完整的文件名)

    modprobe:加载内核模块

        格式:modprobe [-lcfr] module_name

        选项:

                        -c:列出目前系统所有模块

                        -l:列出目前在/lib/modules/`uname -r`/kernel 当中的所有模块完整文件名

                        -f:起那个会加载模块

                        -r:类似rmmod,就是删除某个模块

    rmmod:删除模块

        格式:rmmod [-fw] module_name

        选项:

                        -f:强制将模块删除掉,不管是否使用

                        -w:若该模块正被使用,则rmmod会等待该模块被使用完毕后才删除他

   

原创文章,作者:Naruto,如若转载,请注明出处:http://www.178linux.com/45390

(0)
NarutoNaruto
上一篇 2016-09-12
下一篇 2016-09-12

相关推荐

  • 计算机运维基础知识 Linux版

    计算机系统由硬件系统和软件系统组成 第一代计算机   电子管时代 第二代计算机   晶体管时代 第三代计算机   集成电路时代 第四代计算机   大规模集成电路时代 1964年,世界第一代计算机ENICA。用来计算弹道轨迹。 冯诺依曼  计算机之父 运算器,控制器,存储器,输入设备,输出设备。 巨型计算机,大…

    Linux干货 2016-08-04
  • Linux命令帮助及history命令的使用

    1.Linux命令帮助的获取详解 在Linux中获取命令帮助时,内部命令和外部命令的获取方式是有区别的: 即 (1)内部命令:#help COMMAND             #man bash     (2)外部命令:<1> # COMMAND –help &nb…

    Linux干货 2016-08-05
  • 计算机基础入门及Pyhton基础

    编程基础 计算机基础 程序(program识别并执行的指令 计算机是执行程序的机器 现代计算机 艾伦·麦席森·图灵奠定了现在计算机的逻辑工作方式的基础 冯·诺依曼提出计算机应该有五大部件组成:输入/输出设备、运算器、控制器、输出设备。这是现代计算机基本框架。 语言基础 计算机语言:与计算机之间交互的语言 机器语言:一定位数的二进制代码成为机器指令,指令集合则…

    2017-09-16
  • 文件、目录练习

    将/etc/issue文件的内容转换为大写保存到/tmp/issue.out文件中: 将当前系统登录用户信息转换为大写后保存至/tmp/who.out文件中: 将/root/下文件列表,显示成一行,文件名之间用空格隔开: file1文件的内容为“1 2 3 4 5 6 7 8 9 10”计算出所有数字的总和: 处理字符串“xt.,| 1 jr#!$mn 2 …

    Linux干货 2016-08-05
  • 2016-11-4作业

    1、创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载选项  mkfs.ext4 -b 2048  -L "TEST" -m 1 /dev/sdb6 2、写一个脚本,完成如下功能: (1) 列出当前系统识别到…

    Linux干货 2016-11-06
  • CetnOS6启动流程以及LVM下的fstab及boot恢复实验

    centos6启动流程 主动读取BIOS,通过CMOS加载硬件信息 ,并进行POST,指定第一个可启动的设备 ROM:BIOS,Basic Input and Output System,保存着计算机系统最重要的基本输入输出程序,系统信息设置,开机加电自检程序RAM:保存各项参数的设定 读取第一个可启动设备MBR的引导加载程序(grub)的启动信息 MBR:…

    Linux干货 2017-05-13