linux系统启动流程详解
系统启动流程(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系统启动流程详解相关推荐
- linux系统启动过程详解-开机加电后发生了什么 --linux内核剖析(零)
本文参考了如下文章 深入理解linux启动过程 mbr (主引导记录(Master Boot Record)) 电脑从开机加电到操作系统main函数之前执行的过程 详解linux系统的启动过程及系统初 ...
- Linux启动流程详解
Linux组成 Linux: kernel+rootfs kernel: 进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能 rootfs:程序和glibc 库:函数集 ...
- Linux系统启动过程详解
目录 linux系统启动详细过程 内核引导 启动init程序进入初始化阶段 init程序的类型 系统初始化 建立终端 用户登录 关机 linux系统启动详细过程 通电 bios初始化 grub2磁盘引 ...
- linux 服务器进bios设置密码,linux系统启动过程详解及root密码找回
系统启动流程 BIOS---->MBR:Boot Code---->执行引导程序GRUB(操作系统引导程序)---->加载内核---->执行init--->runleve ...
- CentOS 6系统启动流程详解
第一步:POST 加电自检(Powered On Self-Test) 通过主板上集成RAM中的BIOS程序实现POST 主板上的ROM:CMOS:主板上的一块可读写的并行或串行FLASH芯片,是用来 ...
- linux 服务 init3,Linux系统启动过程详解之UpStart init(三)
RHEL6.0 init(UpStart) 1)SysV init的优缺点 SysV init是最早的解决方案,依靠划分不同的运行级别,启动不同的服务集,服务依靠脚本控制,并且是顺序执行的. SysV ...
- 引导linux为什么要用实模式,Linux引导过程与故障排除|第1章:Linux启动流程详解...
1. BIOS 当你按下电源键的那一刻起,计算机的的启动就开始了.Intel x86 系列的 CPU 可以分别在 16 位 实模式(Real mode) 和 32 位 保护模式(Protected m ...
- 【正点原子Linux连载】第三十二章 U-Boot启动流程详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- linux中流设备_[快速上手Linux设备驱动]之块设备驱动流程详解一
[快速上手Linux设备驱动]之块设备驱动流程详解一 walfred已经在[快速上手Linux设备驱动]之我看字符设备驱动一 文中详细讲解了linux下字符设备驱动,并紧接着用四篇文章描述了Linux ...
最新文章
- NAT双出口的热备份
- 前端全面讲解性能优化实战
- activity切换效果
- VC++ 串行化编程实例
- Oracle11gR2在9x8hk..Windows18669144449 命名进入Oracle
- vasp 5.2编译方法
- 2名数学家或发现史上最快超大乘法运算法,欲破解困扰人类近半个世纪的问题...
- python count函数用法 comm_Python学习第六天课后练习案例 (主要针对的内容是python函数的定义和使用)...
- 遍历 in java_[Java教程]JavaScript中遍历数组 最好不要使用 for in 遍历
- 由浅入深CIL系列:4.抛砖引玉:使用CIL来分析string类型在.NET运算中的性能和避免装箱...
- 每周荐书:Kotlin、分布式、Keras(评论送书)
- 家庭上网用路由器和ADSL的连接
- spring boot介绍及使用详解
- 大型网站技术架构(五)--网站高可用架构
- MFC使用ODBC连接SQL Server 2008数据库编程
- 任务驱动在中职计算机课中的应用,论任务驱动教学法在中职计算机基础课上的应用...
- 灯饰展厅装修设计需要注意什么问题
- ruoyi前端启动报错./src/main.js Module build failed (from ./node_modules/eslint-loader/index.js):
- 真方位角计算文献汇总:球面三角形两点之间的方位
- 成功应聘Intel的真实经历