linux 启动流程

POST BIOS(boot sequence) 所选择的启动设备次序的MBR中是否有引导程序, ----> MBR(bootloader) 提供内核列表 ------->加载选定的Kernel,initrd(内存模拟的磁盘设备需要缓存),initramfs(缓存)  ---->获取到根文件系统并挂载,运行init

bootloadler开始以后的挂载流程

1、当系统读取bootloader,挂载内核分区的时候,不识别更高级的磁盘分区上,只能放在基本磁盘分区,而且只支持read1,所以内核和根不在同一个磁盘分区上,我们通常把内核所在的基本磁盘分区挂载到boot分区上。

2、最终bootloader在启动的时候是在临时挂载的 / 下找 vminuz

3、为了节约磁盘空间vmlinuz是被压缩的,节约空间和保证IO速度。在使用的时候内核需要解压,此时vmlinuz被分为2段,一段是没有压缩(解压算法),另一端是压缩的。

解压后 bootloader读取initramfs,的控制权完全交给kernel,内核完成自身初始化,加载磁盘完成后启动init

问题1:/lib/modules在跟文件系统中,kernel如何挂载?不挂载又怎么能找到这个硬盘的驱动程序?

/lib/modules/中是linux所需要的所有模块存放位置,但是kernel现在不知道我们的设备硬件是什么,kernel不可能将所有的模块都放在内核中,因为硬件设备以及功能模块太多了。所以就放到了/lib/modules。但是/lib/modules又是在跟文件系统中。那此时kernel如何能找到硬盘的驱动模块完成并加载呢?因为此时的模块就是在根文件系统上,我们需要先挂载他才能找到所有的模块。这个情况就是为什么要在boot分区中还要放置一个initrd文件的原因了。这个就是启动时加载Kernel后挂载的临时根文件系统。

问题2:又是谁探测到了你的硬盘的型号,并把对应的驱动模块放置在initramfs文件中提供给bootloader呢?

是安装操作系统时,安装程序在安装操作系统时可以探测到你的硬盘是什么设备,需要什么启动程序,做成initramfs文件放到了 bootloader可以读取到的根文件系统中,这样kernel就可以通过这个文件加载根文件系统,而后就可以读取/lib/modules/ 加载所有的其他需要的模块了

就是这个文件,所以有可能都安装了同样的操作系统,但是硬盘的驱动不同。导致了硬盘互换也不能启动的原因。

initrd是个文件系统,帮助kernel完成初始化。内核要将其挂载,以这个为根,挂载后在这里加载真正根文件系统的驱动模块,加载后initrd中有个程序运行后可以替换跟文件系统,将真正的根文件系统替换initrd,替换完以后这个应用程序由谁终止,自身终止就是系统启动的第0个进程。之后就是要访问/sbin/init

/sbin/init: 功能

  /etc/inittab

    /etc/rc.d/rc.sysinit脚本

      操作:

      设置主机名

      打印文本欢迎信息

      激活selinux 与 udev探测额外的硬件设备并为其装在模块

      激活swap

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

      实现检测根文件系统,并对其以读写方式重新挂在

      设置系统时钟,从硬件读取时钟,维护系统软时钟

      装在键盘映射

      根据 etc/sysctl.conf 设置内核参数

      激活软raid与lvm设备

      清理var等等目录的操作

    设定默认运行级别

    启动各种服务    

 init特性:

  id 操作的id

  runlevels 在那些级别下运行次操作

  action   动作

    initdefault 默认执行

  process 操作

  Centos 5 init: SystemV格式:启动顺序是串行化,初始化程序一个一个执行

  Centos 6 init: Upstart:程序依然有依赖,但是不用等待所依赖的程序完成初始化完成(启动初始化程序通过dbus相互通信),和System V兼容性不太好。

  Centos 7 :   SystemD,和SysV兼容。并且参考OS X 中并行初始化的过程

    启动应用程序:将应用程序定义到启动级别中

        0:关机

          1:单用户模式

      2:多用户模式,不支持NFS文进系统    

      3:完全多用户模式

      4:预留级别

      5:完全多用户模式:图形模式

      6:重启

  /etc/init/rcS.conf   upstart 支持的脚本   

  

start on startupstop on runleveltask# Note: there can be no previous runlevel here, if we have one it's bad
# information (we enter rc1 not rcS for maintenance).  Run /etc/rc.d/rc
# without information so that it defaults to previous=N runlevel=S.
console output
pre-start script #启动前脚本for t in $(cat /proc/cmdline); docase $t inemergency)start rcS-emergencybreak;;esacdone
end script
exec /etc/rc.d/rc.sysinit   #中间会执行这个脚本
post-stop script  #upstat特有的格式,会定义什么时候执行#停止后脚本if [ "$UPSTART_EVENTS" = "startup" ]; thenif [ "$UPSTART_EVENTS" = "startup" ]; then[ -f /etc/inittab ] && runlevel=$(/bin/awk -F ':' '$3 == "initdefault" && $1 !~ "^#" { print $2 }' /etc/inittab)[ -z "$runlevel" ] && runlevel="3"for t in $(cat /proc/cmdline); docase $t in-s|single|S|s) runlevel="S" ;;[1-9])       runlevel="$t" ;;esacdoneexec telinit $runlevelfi
end script

直到最后打印登录界面

/proc/cmdline  启动内核时传递给内核的参数  or /proc/process/cmdline 启动程序时的启动命令。

MBR:

  bootloader:引导加载器,装操作系统时又不同的操作系统设定安装的。

  引导程序:

    win:ntloder

    linux:LILO:

        LInux LOader,不能引导位于1024柱面(Cylinder以后的分区)的操作系统

       GRUB: GRand Unified Bootloader

          把系统引导过程划分了3端:

               1st stage:位于 MBR bootloader--为了引导snd stage

               1.5 stage:位于boot分区上,为识别内核文件所在的文件系统,系统文件系统扩展(为什么linux可以识别更多的文件系统)

               2ndstage:位于boot分区上,GRUB引导程序

               

[root@vm2 keepalived]# ls /boot/grub/
device.map     ffs_stage1_5      jfs_stage1_5    reiserfs_stage1_5  stage2           xfs_stage1_5
e2fs_stage1_5  grub.conf         menu.lst        splash.xpm.gz      ufs2_stage1_5
fat_stage1_5   iso9660_stage1_5(docker)   minix_stage1_5  stage1             vstafs_stage1_5

 menu.lst -> ./grub.conf 这个就是grob主配置文件,stage2 读取这个配置文件

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-358.el6.x86_64)root (hd0,0)kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root nomodeset rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quietinitrd /initramfs-2.6.32-358.el6.x86_64.img

grob 功能;

  1,选择启动的内核或系统

    内核:linux

    系统,win or linux

    隐藏

  2.提供交互式接口

    e:可以编辑修改grob.conf 中的内容

        1:单用户模式,给予密码的保护(1,启用内核,2,传递参数及进入编辑模式)

    

grub.conf 中title 就是现实在启动界面的字符

root(hd0,0) 设定内核所在分区为grub的根

kernel 制定内核文件的路径。后面可以传递给内核的启动参数

initrd : 指定为内核提供额外驱动功能的ramdisk(因为kernel认为这是磁盘,所以需要做一个磁盘转换为内存的缓存,所以速度慢)  ,单 ramfs(因为是文件系统,不需要再次缓存,所以快)

> c

进入修改模式

help root 获取root命令的帮助

查找vmlinuz内核在哪个磁盘上,如果有可以tab补全

然后就可以输入 grub> root (hd0,0)     回车

grub> kernel /vmlinz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root 这个root值必须要写最好备份一份root的位置。因为这个是找不到的

grub> initrd  /initramfs-2.6.32-642.el6.x86_64.img #这个文件版本必须和kernel版本对应      

boot  启动

>e

进入编辑模式

>e 针对某一行进行修改

修改grub 的根分区

修改添加kernel参数

添加 : 1 单用户模式:几乎不会启动任何服务,且不要登录,但是会执行/etc/rc.d/rc.sysinit

       如果不上执行rc.sysinit  传递 emergency

       如果想让用户不能随意进入单用户模式,两种方式

    位置不同输入密码的时间就不同

    

    设置加密密码:

    

        

   重启

    

     需要敲e建输入密码 ,这是需要p进入密码输入

     启动输入密码:

    

grub.conf 位置文件其他的含义  

default=0 .  #定义默认启动那个title
timeout=5   #启动倒计时
splashimage=(hd0,0)/grub/splash.xpm.gz   #显示启动时背景图片
hiddenmenu            #隐藏菜单  默认隐藏,只显示倒计时。去掉就直接显示选择的那个os
password --md5 $1$PFbU5/$/h/7uhL5LISHvrPyVTBiz0
#password centos
title CentOS 6 (2.6.32-642.el6.x86_64)root (hd0,0)    #hd0 磁盘, 0分区               #磁盘表示方式:在grub中,都已hd开头,并紧跟一个数字做各磁盘设备的标记,第几块硬盘               #分区:0-3 主分区,逻辑分区从5开始,一般boot在磁盘的最外道的分区上                    kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8           rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet# 制定内核文件,及传递给内核的参数               #ro root=/path/to/DEVICE 以只读方式挂载真正的根分区位置,而后在sysinit中还要重新rw挂在一边               #quiet 内核初始化信息模式:静默,不输初始化信息      initrd /initramfs-2.6.32-642.el6.x86_64.img        #通常为cpio归档,并使用gzip压缩,通常以img作为后缀,因为这个是个磁盘映像文件。      password --md5 $1$PFbU5/$/h/7uhL5LISHvrPyVTBiz0
~

转载于:https://www.cnblogs.com/python-way/p/6189260.html

linux启动流程及自定义gurb相关推荐

  1. Linux 启动流程学习

    Linux 启动流程学习 开机自检(加载BIOS) 无论什么机器,在开机后都要进行通电自检(硬件),如果硬件有问题,则无法继续下去. (例如当内存条松动时或者损坏,就会发出嘀嘀嘀警报声).接着开始加载 ...

  2. Linux 进内核,arm linux 启动流程之 进入内核

    原标题:arm linux 启动流程之 进入内核 还是从编译链接生成vm 的过程来看吧,由一大堆.o文件链接而成,第一个就是 kernel/arch//kernel/head-armv.o ,而且我们 ...

  3. RISC-V Linux 启动流程分析

    " Author:  通天塔 985400330@qq.com Date:    2022/05/15 Revisor: lzufalcon falcon@tinylab.org Proje ...

  4. 嵌入式linux内核启动过程,嵌入式Linux:ARM Linux启动流程

    ARM Linux启动流程大致为:bootloader---->kernel---->root filesystem.bootloader 是一上电就拿到cpu 的控制权的,而bootlo ...

  5. 全志linux关机键,全志平台linux启动流程分析

    转载:全志平台linux启动流程分析 一.BROM阶段 机器上电之后会执行固化在BROM里面的一段引导程序,这个程序会依次遍历所有支持的启动介质,直到找到第一个支持的.目前支持的启动介质是sd/mmc ...

  6. 【树莓派不吃灰】命令篇⑥ 了解树莓派Boot分区,学习Linux启动流程

    目录 1. Linux启动过程 1.1 内核引导 1.2 运行init初始化进程 -- 初始化系统环境 1.3 运行级别 -- runlevel 1.4 系统初始化 -- 加载开机启动程序 1.5 用 ...

  7. 最详细最易理解的linux启动流程解读及相关问题,万字高能无废话

    linux启动流程 linux的启动流程是运维所必须非常理解的东西,因为它将会是我们在发生服务器开不起机等情况的主要排错手段,充分理解了liunx的启动流程能够助力我们对此类故障的快速定位和处理. 废 ...

  8. 嵌入式 Linux 启动流程和 bootloader 介绍

    目录 嵌入式 Linux 启动流程 简介 启动流程 Bootloader 简介 市面上可见的 bootloader 入式 Linux 启动流程 简介 对于一个 SoC 芯片而言,bootloader ...

  9. 1.7 LINUX启动流程

    1.流程 加电--BIOS--MBR(1.bootloader,(grub)446byte; 2.分区表64byte; 3.校验位55AA2byte)--stage1(在bootloader中)--s ...

最新文章

  1. python类直接调用不实例化_未实例化类的python调用方法
  2. 入围51CTO 2009年度“最受读者欢迎的IT图书作者”评选
  3. DSP6455的EMIFA口
  4. PAT甲级1116 Come on! Let‘s C:[C++题解]哈希表、素数
  5. 用fgets替代gets
  6. 产线数字化软件源码_数字化工厂规划的十大核心要素
  7. linux操作系统下C语言编程入门小结
  8. python属性访问权限_python 面向对象-访问权限修饰符
  9. 没想到你是这样的npm install
  10. kubernetes1.9管中窥豹-CRD概念、使用场景及实例
  11. 牛!阿里云位居中国金融云市场第一
  12. [Android]解决Fragment无法使用android:onClick属性
  13. truncate 、delete与drop三者的异同
  14. 5 分钟商学院精细笔记 000~185
  15. scala (2) while 和变量
  16. 在CentOS6.0 上安装LAMP
  17. [小甲鱼]汇编语言笔记 基础知识
  18. HTML5 Input 日期选择器
  19. 爬虫数据储存—CSV文件
  20. 利用Maven的War Overlays实现War包资源共享

热门文章

  1. 51nod1326 遥远的旅途(spfa+dp)
  2. 【四二学堂】WeGame导致电脑蓝屏!!刚开始怀疑是他搞的鬼,现在发现出现问题的不止我一个....
  3. 计算机专业博士毕业月薪多少一般,博士毕业月薪多少一般 好找工作吗
  4. 梯形断面临界水深莫洛图
  5. 高一被清华姚班录取,高三委拒谷歌 offer,一个重度网瘾少年到理论计算机科学家的蜕变!......
  6. qq 4 android,Android QQ HD v5.5.4 正式版发布
  7. 虚拟跑步刷步软件下载_小米穿戴2.0最新版下载-小米穿戴2.0新虚拟形象版v2.0.0 安卓版...
  8. 介绍一下什么是大数据
  9. public,nbsp;private,nbsp;prote…
  10. mysql子查询:查出本网站goods_id最大的一条商品和每个栏目下id号最大的一条商品.