系统启动流程(CentOS6)

Post加电自检:

开机检查cpu、内存、磁盘等是否存在

Boot Sequence:

BIOS:Basic Input and Output System

按照BIOS设定的次序检查找到各引导设备,第一个有引导程序的设备即为本次需要启动的设备。

bootloader:引导加载器

windows:ntloader

Linux:Linux loader和grub

Grub:  Grand Uniform Bootloader       统一引导加载器

Centos6:Grub 0.X   Grub Legacy     传统版本

Centos7:Grub 1.X   Grub 2             完成重写

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

1、提供菜单、并提供交互式接口

e:编辑模式,用于编辑菜单

c:命令模式、交互式接口

2、加载用户选择的内核或操作系统

允许传递参数给内核

可隐藏此菜单

3、为菜单提供了保护机制

为编辑菜单进程认知

为启动内核或操作系统进行认证

菜单的配置文件存放在:/boot/grub/grub.conf

Grub分为三部分:第一部分放在bootloader上,第二、三部分放在磁盘分区上。

1、stage1:放在MBR上的bootloader(可以当成是一个小的系统)

MBR:Master Boot Record (硬盘的主引导记录)  512bytes  放在0磁道0柱面1扇区

446bytes:bootloader

64bytes:记录分区表

2bytes: 魔术,55AA,检验MBR是否有效

2、stage1.5:文件系统接口,具有常见文件系统的识别能力,使得grub可以从不同的文件系统中读取并加载内核。

主要是让stage1能识别stage2所在的分区上的文件系统。

3、stage2:磁盘分区 (/boot/grub/),加载内核。

grub引导程序:

磁盘开始读取0磁道0柱面1扇区(MBR),MBR的bootloader程序被Grub中的stage1所写入,stage1并不能直接引导内核,因为内核和stage2是存放在磁盘分区上,而stage1并不能识别存放在磁盘上的stage2,所以需要引导stage1.5,通过stage1.5来识别stage2的文件系统格式,从而加载stage2并放入内存中,stage2存放在磁盘上,所以大小可以超过512bytes,所以是不能把grub放到MBR中去,所以只能把grub的stage1放入到MBR的bootloader中。stage2因为有足够大,所以可以提供菜单,背景图片等.

因为磁盘只有格式化成文件系统才能被系统读取,所以stage1必须通过stage1.5来识别stage2,然后去读取stage2上的menu.ist

(grub.conf的软链接)文件来显示系统引导菜单,识别不同的菜单选项(指令),从而去完成vmlinuz 和 initrd 的加载,这就是整个grub引导程序。

内核(vmlinuz):       存放在磁盘分区上(/boot)

运行中的系统环境可分为两层:

1、用户空间:(线程和进程)

2、内核空间:(内核代码)

特点:单内核设计,支持模块化,模块化运行时可动态装载或卸载

组成部分:

kernel:内核核心,一般为bzp_w_picpath,通常位于/boot目录,名称为vmlinuz-VERSION-release

kernel object:内核模块,一般放置于/lib/modules/VERSION-release

内核的功能:进程管理、网络管理(tcp/ip)、驱动程序(内核模块构成)、安全管理、内存管理、文件系统管理

内核的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问         ramdisk

ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备,是一个简装版的根文件系统;

根文件系统表示为:bin,sbin,lib,lib64,usr/bin,.............(前面没有/,是因为真正的/还在磁盘上)

ramdisk怎么生成的:在操作系统安装时动态创建的。

centos5:initrd (initialized ram disk)    初始化RAM磁盘

文件生成工具: mkinitrd

centos6/7:initramfs

文件生成工具:dracut,mkinitrd

在grub去完成内核的加载之前,会先把initramfs先装入内存,该文件的作用是生成一个RAM磁盘,并在其上面形成一个根文件系统,内核在访问真正的磁盘上的根文件系统前会访问这个RAM上的根文件系统,因为RAM上的文件系统/lib/modules有硬件驱动程序,所以内核可以去读取磁盘上的根文件系统,并把磁盘上真正的根(/)挂载上去,initramfs会执行swtichroot来切换根文件系统到真实的文件系统中去

。intitramfs执行完后返回到内核,然后内核自身初始化,完了内核就去条用真正文件系统上的init。

grub在用户选定内核后把内核装载到内存的特定空间,解压,然后把控制权交给内核后,内核会完成自身的初始化:                                             1、探测可识别到的所有硬件设备:

2、加载硬件驱动程序;(有的驱动不受控制,有可能会借助于ramdisk加载驱动)

3、以只读方式挂载根文件系统:readonly(避免内核有BUG)

4、运行用户空间的第一个应用程序:/sbin/init

为什么会使用initramfs,主要是作用是使引导过程更为灵活,为了在各种硬件平台上启动,将所有的硬件驱动都放在内核当中显然是不现实的,initramfs的作用就是加载硬件驱动模块,使得内核只包含最基本的硬件驱动即可,将加载不同的硬件驱动的任务交给initramfs。

/sbin/init:

[root@localhost boot]# pstree
init─┬─auditd───{auditd}               //父进程就是init├─crond├─dhclient├─master─┬─pickup│        └─qmgr├─6*[mingetty]├─rsyslogd───3*[{rsyslogd}]├─sshd───sshd───bash───pstree└─udevd───2*[udevd]

由内核启动的第一个用户级进程。

init程序的类型:

Centos5以下:SysVinit    /sbin/init

配置文件:/etc/inittab

Centos6       : Upstart    依然为/sbin/init

配置文件:/etc/init/*.conf,/etc/inittab(仅用于定义级别)

Centos7       : Systemd   /sbin/systemd

配置文件:/usr/lib/systemd/system/*,/etc/systemd/systemd/*

系统初始化:    /etc/rc.d/rc.sysinit

/sbin/init通过调用/etc/init/rcS.conf脚本来传递信息给/etc/rc.d/rc.sysinit脚本执行系统初始化。

/etc/rc.d/rc.sysinit执行了哪些功能:

1、设置主机名

2、设置欢迎信息

3、激活udev和selinux

4、挂载/etc/fstab文件中定义的所有文件系统

5、检测文件系统,并已读写方式重新挂载根文件系统    //内核只是已只读方式挂载根文件系统

6、设置系统时钟

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

8、激活lvm及软raid设备

9、激活swap设备

10、加载额外设备的驱动程序

11、清理操作

[root@localhost init]# cat rcS.conf
# rcS - runlevel compatibility
#
# This task runs the old sysv-rc startup scripts.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file rcS.override and put your changes there.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 scriptfor t in $(cat /proc/cmdline); docase $t inemergency)start rcS-emergencybreak;;esacdone
end script
exec /etc/rc.d/rc.sysinit    //执行初始化脚本

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

/sbin/init通过调用/etc/inittab脚本来获取默认运行级别,并把参数传给/etc/init/rc.conf脚本

[root@localhost ~]# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
[root@localhost init]# cat rc.conf
# rc - System V runlevel compatibility
#
# This task runs the old sysv-rc runlevel scripts.  It
# is usually started by the telinit compatibility wrapper.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file rc.override and put your changes there.start on runlevel [0123456]stop on runlevel [!$RUNLEVEL]taskexport RUNLEVEL
console output
exec /etc/rc.d/rc $RUNLEVEL    //把运行级别传递给/etc/rc.d/rc 脚本

0:关机,shutdown

1:单用户模式,root

2:多用户模式,会启动网络功能,但不会启动NFS

3:多用户模式,完成功能模式,文本界面

4:预留级别,无其他功能,和3一同使用

5:多用户模式,完成功能模式,图形界面

6:重启,reboot

各个级别之间可以切换,init #

查看级别: who -r /runlevel

            [root@localhost boot]# init 5[root@localhost boot]# who -rrun-level 5  2016-03-26 15:53                   last=3

开启和关闭各对应运行级别下的服务: /etc/rc.d/rcX.d

/etc/init/rc.conf脚本传递运行级别参数给/etc/rc.d/rc脚本,让rc脚本执行运行级别下的各个服务,开启或关闭。

id : runlevels : action : process

id:一个任务的表示符

runlevel :在哪些级别下启动此任务:#,####,也可以为空,表示所有级别

action:在什么条件下执行此任务

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

respawn:一旦任务终止时,就自动重新启动之

initdefault:设定默认级别,此时,process省略

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

process:任务

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

传递一个参数给rc脚本,一旦切换至此运行级别,就去停止或者启动/etc/rc.d/rc0.d目录下的服务器所控制的服务。

此目录下都是软链接文件,源文件存放在/etc/init.d/*。

K*:要停止的服务,K10,10表示优先级,越小越先关闭,依赖的服务先关闭,被依赖的服务后关闭

S*:要启动的服务,K10,10表示优先级,越小越先开启,被依赖的服务先开启,依赖的服务后开启。

启动最后一个脚本: /etc/rc.d/rc.local

[root@localhost rc.d]# cat rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.touch /var/lock/subsys/local

可以把需要开机启动或关闭程序或者执行事务加入到此脚本中,该命令自动执行。

登录界面 : 输入账号密码

到这CentOS6的启动流程就结束了。

转载于:https://blog.51cto.com/lanxianting/1757161

linux系统启动流程详解相关推荐

  1. linux系统启动过程详解-开机加电后发生了什么 --linux内核剖析(零)

    本文参考了如下文章 深入理解linux启动过程 mbr (主引导记录(Master Boot Record)) 电脑从开机加电到操作系统main函数之前执行的过程 详解linux系统的启动过程及系统初 ...

  2. Linux启动流程详解

    Linux组成 Linux: kernel+rootfs     kernel: 进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能     rootfs:程序和glibc     库:函数集 ...

  3. Linux系统启动过程详解

    目录 linux系统启动详细过程 内核引导 启动init程序进入初始化阶段 init程序的类型 系统初始化 建立终端 用户登录 关机 linux系统启动详细过程 通电 bios初始化 grub2磁盘引 ...

  4. linux 服务器进bios设置密码,linux系统启动过程详解及root密码找回

    系统启动流程 BIOS---->MBR:Boot Code---->执行引导程序GRUB(操作系统引导程序)---->加载内核---->执行init--->runleve ...

  5. CentOS 6系统启动流程详解

    第一步:POST 加电自检(Powered On Self-Test) 通过主板上集成RAM中的BIOS程序实现POST 主板上的ROM:CMOS:主板上的一块可读写的并行或串行FLASH芯片,是用来 ...

  6. linux 服务 init3,Linux系统启动过程详解之UpStart init(三)

    RHEL6.0 init(UpStart) 1)SysV init的优缺点 SysV init是最早的解决方案,依靠划分不同的运行级别,启动不同的服务集,服务依靠脚本控制,并且是顺序执行的. SysV ...

  7. 引导linux为什么要用实模式,Linux引导过程与故障排除|第1章:Linux启动流程详解...

    1. BIOS 当你按下电源键的那一刻起,计算机的的启动就开始了.Intel x86 系列的 CPU 可以分别在 16 位 实模式(Real mode) 和 32 位 保护模式(Protected m ...

  8. 【正点原子Linux连载】第三十二章 U-Boot启动流程详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  9. linux中流设备_[快速上手Linux设备驱动]之块设备驱动流程详解一

    [快速上手Linux设备驱动]之块设备驱动流程详解一 walfred已经在[快速上手Linux设备驱动]之我看字符设备驱动一 文中详细讲解了linux下字符设备驱动,并紧接着用四篇文章描述了Linux ...

最新文章

  1. NAT双出口的热备份
  2. 前端全面讲解性能优化实战
  3. activity切换效果
  4. VC++ 串行化编程实例
  5. Oracle11gR2在9x8hk..Windows18669144449 命名进入Oracle
  6. vasp 5.2编译方法
  7. 2名数学家或发现史上最快超大乘法运算法,欲破解困扰人类近半个世纪的问题...
  8. python count函数用法 comm_Python学习第六天课后练习案例 (主要针对的内容是python函数的定义和使用)...
  9. 遍历 in java_[Java教程]JavaScript中遍历数组 最好不要使用 for in 遍历
  10. 由浅入深CIL系列:4.抛砖引玉:使用CIL来分析string类型在.NET运算中的性能和避免装箱...
  11. 每周荐书:Kotlin、分布式、Keras(评论送书)
  12. 家庭上网用路由器和ADSL的连接
  13. spring boot介绍及使用详解
  14. 大型网站技术架构(五)--网站高可用架构
  15. MFC使用ODBC连接SQL Server 2008数据库编程
  16. 任务驱动在中职计算机课中的应用,论任务驱动教学法在中职计算机基础课上的应用...
  17. 灯饰展厅装修设计需要注意什么问题
  18. ruoyi前端启动报错./src/main.js Module build failed (from ./node_modules/eslint-loader/index.js):
  19. 真方位角计算文献汇总:球面三角形两点之间的方位
  20. 成功应聘Intel的真实经历

热门文章

  1. python as_matrix()
  2. jieba分词中cut和lcut的区别
  3. Flink从Kafka 0.8中读取多个Topic时的问题
  4. C++ 实现高精度的计算
  5. .NET CORE迁移踩坑
  6. java富文本编辑器KindEditor
  7. POJ 3259 Wormholes(负权环路)
  8. VisualStudio2008+水晶报表的使用
  9. 基于android的设备故障诊断终端
  10. 关于从页面中获取用户控件中的其它控件(如DropDownList)事件的方法