Linux系统启动流程


POST(加电自检)-->bootsequence(引导次序,BIOS-->Boot LoaderMBR-->Kernel+ramdisk(临时根,initrdinitramfs-->mount rootfs(根切换)-->/sbin/init(配置文件,CentOS 5:/etc/inittab, CentOS6 /etc/init/*.conf


设置默认运行级别-->指定系统初始化脚本-->初始化额外的硬件设备并加载驱动程序-->启动(关闭)服务(/etc/rc.d/rc#.d/etc/rc.d/init.d/-->/etc/rc.d/rc.local-->设置CtrlAltDel组合的功能-->启动终端(mingetty),并在终端附加登录程序(login-->如果级别为5,则要启动X server


一、POST加电自检:

  当我们打开计算机电源,计算机首先会读取BIOS信息,BIOS中记录了CPU、内存、设备启动序列、硬盘等信息;然后对系统启动关键硬件设备进行检测,如果出现严重故障则停机;如果是一般故障,会发出报警提示,等待故障清楚;如果没有故障,加电自检完成。

  BIOSBasic Input Output System是保存于主板CMOS芯片中的程序代码;

  CMOSComplementaryMetal Oxide Semiconductor):是主板上的ROM芯片;


二、获取引导次序,读取MBR

  加电自检完成之后:CPU会读取BIOS信息中的设备启动序列,按照次序引导,按次序找引导设备,第一个有引导程序(MBR)的设备即为启动PC server所用到的设备;

 

  可作为启动设备:光驱,便携式移动设备,硬盘,网卡(系统引导,PXE

    PXE实现系统引导DHCPtftp(kernel+ramdisk)


  MBR(主引导记录,Master BootRecord):

  MBR位于磁盘的0磁道0扇区,占用512个字节:

446bytes:Boot Loader,主程序;
64bytes:PartitionTable,硬盘分区表,每16bytes标记一个分区,一共4分区;3个主分区,1个扩展分区,扩展分区还可以划分为若干个逻辑分区;
2bytes:MBR有效性标记;



三、Boot Loader

  操作系统内核运行之前的一段小程序,选择要启动的内核(在当前磁盘的某或某些分区上);


1Boot Loader比较常见的有GRUBLILO

LILO:LInux Loader
  0-1023范围内的柱面构成的分区的内核文件,通常应用与嵌入式计算机;
GRUB:GRand Unified Bootloader
  CentOS 5&6:Grub 0.97
  CentOS7:Grub2 1.96


2GRUBGRand Unified Bootloader

  1)、grub程序由两段组成:

    

stage1:位于MBR中(0柱面 0磁道 1扇区);
stage1_5:位于MBR随后的扇区;
stagr2:读取grub.conf配置文件,并实现引导功能的扩展;


   grub目录和配置文件位置:

Linux系统启动流程_第1张图片


  2)、grub的功能:

1、提供菜单,并提供交互式接口;
  e:进入编辑模式;
  a:直接修改内核参数;
  c:进入grub命令行模式;
2、允许用户选择要启动的内核或系统;
  允许传递引导参数给内核;
  选择界面可隐藏;
3、为编辑功能提供保护机制;
  启用内核文件:选择运行制定的内核需要先输入密码;
  传递参数:使用e命令需要先输入密码;


 

    在菜单选择倒计时界面按任意键进入grub菜单:

Linux系统启动流程_第2张图片


    按e键进入编辑菜单可以看到kernelinitrd

Linux系统启动流程_第3张图片


  3)、grub命令行接口:

>root(DEVICE):指定哪个分区为接下来要启动的系统或内核文件所在的分区;
  所有硬盘都识别为hd;
 不同的硬盘基于数字标识:如hd0,hd1等;
 同一个硬盘上的不同分区,也使用数字标识,如hd0,0 hd1,5;
 
>find(DEVICE)/path/to/file:查找文件
 
>kernel:指定要运行的内核文件;
>initrd:为要运行的内核指定其可用的ramdisk文件;
 
>boot:启动此前配置好的内核或系统;


 

  按c键进入grub命令行接口:

Linux系统启动流程_第4张图片


  4)、配置文件grub.conf

    文件位置:/boot/grub/grub.conf

Linux系统启动流程_第5张图片


  参数:

default=:选择第几个title配置的内核或系统,各title从0开始编号;
timeout=#:菜单显示的超时时长;
splashimage=/path/to/some_image_file:指定菜单的背景图片;此图片只能为14bits色,xpm格式,gzip压缩;
hiddenmenu:隐藏菜单
titleTILTE STRING:显示于菜单中的标题;
root:指定引导分区;
kernel:指定kernel位置;
initrd:指定initramfs位置;


  在grub菜单按a键可在内核加载前编辑内核参数:

Linux系统启动流程_第6张图片


  常用参数:

single:单用户模式启动;


  5)、grub保护机制:

1、生成密码:
  #grub-md5-crypt
2、保护编辑功能,则需要title之外的添加:
  #password--md5 密码串
3、保护使用某内核,则需要内核对应的title之下添加:
  #password--md5 密码串


  6)、安装grub的方式:

使用grub-install命令:
  #grub-install [--root-directory=/path/to/somewhere] DEVICE
    --root-directory=/path/to/somewhere

  /path/to/somewhere:内核及initrd文件所在的分区的挂载点的父目录,且此挂载点必须叫boot;

例如:/dev/sdb1:/mnt/boot
  #grub-install --root-directory=/mnt /dev/sdb

 

四、kernel+ramdisk

  根据grub设定的内核映像所在路径,系统读取内核文件,并进行解压缩操作;系统将解压缩后的内核放在内存中,完成内核自身初始化;探测所能识别的硬件设备,并加载驱动程序,完成核心环境建立;

Linux系统启动流程_第7张图片


  要读取内核文件必须访问根文件系统要加载根文件系统所在的设备,而此时根文件系统没有挂载,要挂载根文件系统需要根文件系统所在设备的驱动程序。为解决这个问题,grub在加载内核同时,也把ramdisk加载到内存中并运行;


  展开ramdisk镜像文件:

Linux系统启动流程_第8张图片


  ramdisk在内存中表现为一个虚拟根文件系统initfs,里面有如同Linux根目录下的binsbindevetclibprocusrvartmp等目录;initfs将内核与真实根建立联系,内核通过initfs加载驱动程序,然后进行根切换,挂载真实根目录;至此内核加载完成;


1、kernel:

  内核的功能:进程管理、文件系统、硬件驱动(在内核模式下运行)、内存管理、安全功能(SELinux)、网络子系统;


  1)、内核设计流派:

单内核体系结构:
  linux:支持模块化,模块可以动态装卸载
  linux内核:核心+外围模块
    核心:/boot/vmlinux-VERSION-release
    模块:/lib/modules/VERSION-release
      .ko:kernel object
    ramdisk:/boot/initramfs-VERSION-release.img
      在内核启动过程中装载根文件系统时有用;模块间有可能存在依赖关系;
微内核体系结构:
  windows、solaris


  2)、内核的某些功能:

编译进内核本体 [*]
编译成内核模块 [M]
不选择使用     [ ]

 

  3)、内核模块管理:

#lsmod:显示内核已装载模块
 
动态装卸载模块:
  #modprobe -rMOD_NAME:卸载;
  #modprobe MOD_NAME:装载;

  #insmod/path/to/module_file:装载;
  #rmmod MOD_NAME:卸载;

查看某模块的详细信息:
  #modinfo MOD_NAME
                                    
检查并生成模块间依赖关系的命令:
  #depmod


2ramdisk

CentOS 5:SysV,init;/etc/inittab--> /etc/rc.d/rc.sysinit;
CentOS 6:upstart,init;/etc/init/*.conf(/etc/inittab) --> /etc/rc.d/rc.sysinit
  #chkconfig

CentOS 7:systemd, init;/usr/lib/systemd/system/;借鉴MAC OS X;
  #systemctl

 

五、/sbin/init

  内核加载完成之后,第一个运行的程序就是/sbin/init,该文件会先读取/etc/init/rcS.conf文件:

Linux系统启动流程_第9张图片


设定系统运行级别:

0-6:7个运行级别:
  0:关机;
  1:single usermode,single,s,S,不启动网络功能,不启动用户认证,单用户模式(维护模式);
  2:multi usermode,不支持NFS功能;
  3:完全多用户模式,文本接口,不启动图形界面;
  4:未使用;预留级别;
  5:完全多用户模式,图形接口;
  6:重启;

#init:切换运行级别;

 


 

六、/etc/rc.d/rc.sysinit:系统初始化脚本

查看/etc/rc.d/rc.sysinit文件部分内容:

Linux系统启动流程_第10张图片


初始化设置流程:

设定主机名:读取/etc/sysconfig/network文件中的HOSTNAME参数,并以之设定主机名;
打印文本欢迎信息:
激活SELinux和udev;
挂载/etc/fstab文件中定义的其他文件系统;
激活swap;
检测根文件系统,并以读写方式重新挂载;
设置系统时钟;
根据/etc/sysctl.conf设置内核参数;
激活LVM和RAID设备;
加载额外设备的驱动程序;
清理操作;


七、启动内核模块:

  依据/etc/modprobe.d/*.conf文件装载内核模块:

Linux系统启动流程_第11张图片


八、执行指定运行级别的脚本程序:

  /etc/rc.d/rc#.d/:启动指定的默认级别的默认为启动的服务,停止指定的级别下默认为关闭的服务;


  查看/etc/rc.d/rc3.d/目录:

Linux系统启动流程_第12张图片


1、目录中为链接文件指向服务脚本:

S##:默认启动的服务;
K##:默认停止的服务;
##:01-99,数字越小,越优先启动或关闭;
  先启动的后关闭(自动解决依赖关系);


2、chkconfig:创建或改变连接文件;

#chkconfig --add SRV_SCRIPT:创建;
#chkconfig --del SRV_SCRIPT:删除;
#chkconfig SRV_SCRIPT {on|off}:开机自动{启动|关闭};
  默认为2345级别;
  --level######

脚本如果期望能够被chkconfig命令使用,要在脚本中添加如下行:
  #chkconfig:- 85 15
    -:当此脚本由chkconfig控制时,默认哪些级别就是开启的;
    85:启动优先级;
    15:关闭优先级;


 

九、/etc/rc.d/rc.local

  是一个脚本,通常为系统启动完成的最后运行一个脚本;

    定义一些组合键的功能:通常是Ctrl+Alt+Delete

    初始化字符终端;

    如果有需要,启动图形终端;


十、/bin/logon

  登陆程序:显示登陆提示符,等待用户输入usernamepasswd

Linux系统启动流程_第13张图片


本文出自 “小马的学习记录” 博客,请务必保留此出处http://masachencer.blog.51cto.com/8683770/1672797

你可能感兴趣的:(linux,启动流程)