设为首页 收藏本站
查看: 647|回复: 0

[经验分享] Linux系统启动流程

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-13 09:47:15 | 显示全部楼层 |阅读模式
POST(加电自检)-->bootsequence(引导次序,BIOS)-->Boot Loader(MBR)-->Kernel+ramdisk(临时根,initrd,initramfs)-->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、内存、设备启动序列、硬盘等信息;然后对系统启动关键硬件设备进行检测,如果出现严重故障则停机;如果是一般故障,会发出报警提示,等待故障清楚;如果没有故障,加电自检完成。

  BIOS(Basic Input Output System)是保存于主板CMOS芯片中的程序代码;

  CMOS(ComplementaryMetal Oxide Semiconductor):是主板上的ROM芯片;


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

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


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

    PXE实现系统引导:DHCP,tftp(kernel+ramdisk)


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

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

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





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

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




2、GRUB:GRand Unified Bootloader
  1)、grub程序由两段组成:

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




   grub目录和配置文件位置:
wKiom1WfH4Cy6YqqAAJPruj1nrY055.jpg

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





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

wKioL1WfIdHiRLnnAAFH7y1zIgo730.jpg

    按e键进入编辑菜单可以看到kernel和initrd:

wKiom1WfICzjKvw6AAG4ZL07FKM001.jpg

  3)、grub命令行接口:
1
2
3
4
5
6
7
8
9
10
11
>root(DEVICE):指定哪个分区为接下来要启动的系统或内核文件所在的分区;
  所有硬盘都识别为hd;
不同的硬盘基于数字标识:如hd0,hd1等;
同一个硬盘上的不同分区,也使用数字标识,如hd0,0 hd1,5;

>find(DEVICE)/path/to/file:查找文件

>kernel:指定要运行的内核文件;
>initrd:为要运行的内核指定其可用的ramdisk文件;

>boot:启动此前配置好的内核或系统;





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

wKiom1WfIoTxyDEbAADuSzLzmh0026.jpg

  4)、配置文件grub.conf:

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

wKiom1WfI3OyvdmoAAHR4c64MQ4017.jpg

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




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

wKiom1WfI4vwkPSYAAEa1CfEBGs632.jpg


  常用参数:

1
single:单用户模式启动;




  5)、grub保护机制:

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




  6)、安装grub的方式:

1
2
3
4
5
6
7
8
使用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设定的内核映像所在路径,系统读取内核文件,并进行解压缩操作;系统将解压缩后的内核放在内存中,完成内核自身初始化;探测所能识别的硬件设备,并加载驱动程序,完成核心环境建立;

wKiom1WfKDbQKv4SAAG4EB3TkJ8162.jpg

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


  展开ramdisk镜像文件:
wKioL1WfKjSTA0KWAARnfXosX-U106.jpg

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


1、kernel:

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


  1)、内核设计流派:

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




  2)、内核的某些功能:

1
2
3
编译进内核本体

  • 编译成内核模块 [M]
    不选择使用     [ ]




  •   3)、内核模块管理:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #lsmod:显示内核已装载模块

    动态装卸载模块:
      #modprobe -rMOD_NAME:卸载;
      #modprobe MOD_NAME:装载;

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

    查看某模块的详细信息:
      #modinfo MOD_NAME

    检查并生成模块间依赖关系的命令:
      #depmod




    2、ramdisk:

    1
    2
    3
    4
    5
    6
    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文件:

    wKiom1WfLSqCPmfMAAKX3qwHuKM313.jpg

    设定系统运行级别:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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文件部分内容:

    wKiom1WfLouylOqzAAHW0Zz0d6c569.jpg

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




    七、启动内核模块:

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

    wKioL1WfMQGT1vtqAAEIIPQ4jZ0612.jpg

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

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


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

    wKioL1WfMU7wYnIgAARprZcH5zg810.jpg

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

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




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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #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:

      登陆程序:显示登陆提示符,等待用户输入username和passwd;

    wKioL1WfMuTSEIwnAAB2dRT-_Y0654.jpg



    运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-86149-1-1.html 上篇帖子: CentOS 7中iptables服务暂停启动和保存备份 下篇帖子: CNETOS6.4无人值守安装 Linux
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表