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 startup

stop on runlevel

task

# 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); do
case $t in
emergency)
start rcS-emergency
break
;;
esac
done
end script
exec /etc/rc.d/rc.sysinit #中间会执行这个脚本
post-stop script #upstat特有的格式,会定义什么时候执行
#停止后脚本
if [ "$UPSTART_EVENTS" = "startup" ]; then
if [ "$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); do
case $t in
-s|single|S|s) runlevel="S" ;;
[1-9]) runlevel="$t" ;;
esac
done
exec telinit $runlevel
fi
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,)
# kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=
timeout=
splashimage=(hd0,)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.-.el6.x86_64)
root (hd0,)
kernel /vmlinuz-2.6.-.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root nomodeset rd_NO_LUKS LANG=en_US.UTF- 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
initrd /initramfs-2.6.-.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,)/grub/splash.xpm.gz #显示启动时背景图片
hiddenmenu       #隐藏菜单 默认隐藏,只显示倒计时。去掉就直接显示选择的那个os
password --md5 $$PFbU5/$/h/7uhL5LISHvrPyVTBiz0
#password centos
title CentOS (2.6.-.el6.x86_64)
root (hd0,) #hd0 磁盘, 0分区
               #磁盘表示方式:在grub中,都已hd开头,并紧跟一个数字做各磁盘设备的标记,第几块硬盘
               #分区:0-3 主分区,逻辑分区从5开始,一般boot在磁盘的最外道的分区上
                    
kernel /vmlinuz-2.6.-.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-
          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.-.el6.x86_64.img
#通常为cpio归档,并使用gzip压缩,通常以img作为后缀,因为这个是个磁盘映像文件。
      
password --md5 $$PFbU5/$/h/7uhL5LISHvrPyVTBiz0
~

linux启动流程及自定义gurb的更多相关文章

  1. Linux启动流程CentOS6和7的区别

    目 录 Linux启动流程    I 第1章 CentOS6启动流程    1 1.1 BIOS    1 1.2 MBR    1 1.3 GRUB    1 1.4 kernel(加载内核)    ...

  2. 浅析Linux启动流程

    Linux系统启动流程 Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程.了解 Linux 的启动过程,有助于了解 Linux 系统的结构,也对系统的排错有很大的帮助 ...

  3. Linux启动流程和服务管理(init和systemd)

    目录 一:Linux启动流程 init和Systemd的区别 二:Linux服务管理(service,systemctl) 一:Linux启动流程 Rhel6启动过程: Rhel7启动过程: GRUB ...

  4. linux启动流程

    看了深入理解linux内核一书的最后对linux启动流程的介绍,下面就把我能理解的写一下吧: bios(硬件加电自检POST,寻找第一个启动设备) the boot loader(可以从硬盘启动也可以 ...

  5. Linux启动流程详解

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  6. Linux启动流程详解【转载】

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  7. 记录Linux启动流程的工具bootchart

    /*********************************************************************  * Author  : Samson  * Date   ...

  8. Linux课程---8、Linux启动流程

    Linux课程---8.Linux启动流程 一.总结 一句话总结: grub启动引导界面(比如装了多系统,选择系统),找到linux内核 启动init程序,加载各种驱动 1.进入grub界面选择相应的 ...

  9. 20、linux启动流程和救援模式

    1.Linux启动流程 2.Linux运行级别 1.什么是运行级别,运行级别就是操作系统当前正在运行的功能级别 System V init运行级别 systemd目标名称 作用 0 runlevel0 ...

随机推荐

  1. Python中的浅拷贝 深拷贝

    浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种: 1. copy 从下面的例子可以看出对象c从a拷贝,当对象a增加一个列表元素之后,c对象没有改变, 而当对象a中的子列表改变时,对象c的子列 ...

  2. c/c++ qsort 函数 结构体简单使用(1)

    #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct student ...

  3. hduoj 1455 && uva 243 E - Sticks

    http://acm.hdu.edu.cn/showproblem.php?pid=1455 http://uva.onlinejudge.org/index.php?option=com_onlin ...

  4. 找出数组中从未出现的最小正整数java实现

    /** * 找出未出现的最小正整数 * @param A * @param n * @date 2016-10-7 * @author shaobn */ public static int find ...

  5. Buge's Fibonacci Number Problem

    Buge's Fibonacci Number Problem Description snowingsea is having Buge’s discrete mathematics lesson, ...

  6. 论文阅读(Weilin Huang——【AAAI2016】Reading Scene Text in Deep Convolutional Sequences)

    Weilin Huang--[AAAI2016]Reading Scene Text in Deep Convolutional Sequences 目录 作者和相关链接 方法概括 创新点和贡献 方法 ...

  7. windows下利用virtual 安装 flask

    出处: https://segmentfault.com/a/1190000002450878 本文介绍Windows下如何从零开始搭建Python + Flask开发环境. 安装Python 2.7 ...

  8. HttpEntity转换Inputstream(红色)加XmlPull解析

    package com.bawei.xml; import java.io.IOException; import java.io.InputStream; import java.util.Arra ...

  9. python函数基础 与文件操作

    函数的定义 函数是通过赋值传递的,参数通过赋值传递给函数.def语句将创建一个函数对象并将其赋值给一个变量名,def语句的一般格式如下: def function_name(arg1,arg2[,.. ...

  10. 用js写的极简的导航菜单,带下拉列表

    太简单了,不多说,但是自己还是写了一会,因为总会出现这样那样小的错误,毕境最近在复习和学习一些前台,欢迎看到的各位能给点改进意见或者其它的,Thank you! 首先是发图,只用CSS写了结构,几乎没 ...