linux系统引导过程
- 格式:pdf
- 大小:140.95 KB
- 文档页数:12
启动流程启动时要加载核心,让核心来驱动整个硬件。
整个启动过程:1.加载BIOS的硬件信息,并获得第一个启动设备的代号(CMOS中设定的启动项)。
2.读取第一个启动设备的MBR的引导加载程序(lilo、grub、spfdisk)3.加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有硬件设备。
4.核心执行init程序并获取运行信息。
5.Init执行/etc/rc.d/rc.sysinit文件6.启动核心的外挂模块(/etc/modprobe.conf)7.Init 执行各个批处理文件(根据运行级别)。
8.Init 执行/etc/rc.d/rc.local文件9.执行/bin/login程序,等待用户登录。
10.登录之后开始以shell控制主机。
引导加载程序与核心的载入主机读取BIOS,并且了解主要的主机硬件信息后,主机便开始尝试加载操作系统。
主机首先读取的就是硬盘的主引导记录(MBR),在MBR中装有引导加载程序(比如说grub)。
主机刚启动时是不认识磁盘文件系统的,这就需要引导加载程序帮忙。
但我们知道MBR是整个硬盘的第一个扇区,整个大小为一个扇区的大小(512KB),而我们的加载程序却远远大于这个容量。
怎么办?引导加载程序分成两个阶段来执行:1,执行引导加载程序的主程序,这个主程序放在MBR或超级块中。
2,载入引导加载程序的所有设置文件与相关的环境参数文件。
一般来说,设置文件都放在/boot目录下。
引导加载程序必须能做到:●引导加载程序可以直接指定并取用核心文件,并加载到主存储器中。
●也可以将加载程序的控制权移交给下一个加载程序(超级块中的引导加载程序)。
grub是如何被载入的呢?grub有几个重要文档,stage1,stage2,以及stage1.5,这些文档都在/boot/grub下,grub被载入时有以下几个步骤。
Stage1阶段装载基本的引导程式(stage1),这也是安装在MBR中的内容,大小为512字节,但这并不意味着占用的空间为512字节,这还要看块的大小以及inode控制的块数。
Linux引导及配置文件加载过程解读文章分类:操作系统??本文包括3部分内容1、 Linux的引导过程2、 Linux 的运行级别3、 /etc/inittab与/etc/rc.d/ 与/etc/rc.d/init.d的关系关键词:Linux引导过程、运行级别、inittab与 init.d 与 rc.d一、 Linux的引导过程系统加电之后,首先进行的硬件自检,然后是bootloader对系统的初始化,加载内核。
内核被加载到内存中之后,就开始执行我们的系统设置了。
一旦内核启动运行,对硬件的检测就会决定需要对哪些设备驱动程序进行初始化。
从这里开始,内核就能够挂装根文件系统(这个过程类似于Windows识别并存取C盘的过程)。
内核挂装了根文件系统,并已初始化所有的设备驱动程序和数据结构等之后,就通过启动一个叫init的用户级程序,完成引导进程。
二、运行级别(run level)Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。
init 进程上来首先做的事是去读取/etc/目录下 inittab文件中initdefault id值,这个值称为运行级别(run-level)。
它决定了系统启动之后运行于什么级别。
运行级别决定了系统启动的绝大部分行为和目的。
这个级别从0到 6 ,具有不同的功能。
不同的运行级定义如下:# 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)# 1 - 单用户模式# 2 - 多用户,没有 NFS# 3 - 完全多用户模式(标准的运行级)# 4 –系统保留的# 5 - X11 (x window)# 6 - 重新启动(千万不要把initdefault 设置为6,否则将一直在重启)三、 /etc/rc.d/与/etc/rc.d/init.d的关系先解释一下init.d。
这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。
LINUX引导过程LINUX引导过程首先说明一下,这里讲的是LINUX引导经过的步骤,而不涉及KERNEL引导过程的内部细节。
希望本文能对初学LINUX的朋友有所帮助。
一、从BIOS到KERNEL计算机在接通电源之后首先由BIOS进行自检,即进行所谓的POST(Power On Self Test),然后依据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入“引导块”。
如通常BIOS中设的引导顺序为C在最前面,那么就把C盘(第一个IDE硬盘)的第0柱面,第0头的第1个扇区读入内存,然后跳到那里开始执行。
这个扇区有一个大家熟悉的名字——MBR(Main Boot Record)。
换句话说,MBR里面存放的是一小段程序以及分区表的数据。
在使用WIN9X和DOS时,这里面放的代码就把分区表里标记为Active的分区的第一个扇区(一般存放着操作系统的引导代码)读入内存并跳转到那里开始执行。
而在用LILO引导LINUX时,有两种选择:(1) 把LILO安装在MBR。
这时就由BIOS直接把LILO代码调入内存,然后跳转执行LILO。
即BIOS——>LILO(在MBR中)——>KERNEL(2) 把LILO安装在LINUX分区,并把LINUX分区设为Active。
这时,BIOS调入的是WIN9X/DOS下的MBR代码,然后由这段代码来调入LILO的代码(位于活动分区的第一个扇区)。
即BIOS——>MBR——>LILO(在活动分区的第一个扇区)——>KERNEL因为在读入及执行MBR时,操作系统还没有起来,所以只能用BIOS提供的INT13来进行磁盘操作,而INT13只能读写硬盘1024柱面之前的数据,由此可知任何操作系统的引导代码必须在1024柱面之前。
对于LINUX来说,不管你使用方式(1)还是方式(2)启动,都要保证KERNEL放在1024柱面之前。
只有在KERNEL起来以后,才有读/写1024柱面以后数据的能力。
arm版本linux系统的启动流程ARM架构是一种常见的处理器架构,被广泛应用于嵌入式设备和移动设备中。
在ARM版本的Linux系统中,启动流程是非常重要的,它决定了系统如何从开机到正常运行。
本文将详细介绍ARM版本Linux系统的启动流程。
一、引导加载程序(Bootloader)引导加载程序是系统启动的第一阶段,它位于系统的固化存储器中,比如ROM或Flash。
在ARM版本的Linux系统中,常用的引导加载程序有U-Boot和GRUB等。
引导加载程序的主要功能是加载内核镜像到内存中,并将控制权转交给内核。
二、内核初始化引导加载程序将内核镜像加载到内存后,控制权被转交给内核。
内核初始化是系统启动的第二阶段,它主要完成以下几个步骤:1. 设置异常向量表:ARM架构中,异常是指硬件产生的中断或故障,比如系统调用、中断请求等。
内核需要设置异常向量表,以便正确处理异常。
2. 初始化处理器:内核对处理器进行初始化,包括设置页表、启用缓存、初始化中断控制器等。
3. 启动第一个进程:内核创建第一个用户进程(一般是init进程),并将控制权转交给它。
init进程是系统中所有其他进程的父进程,负责系统的初始化工作。
三、设备树(Device Tree)设备树是ARM版本Linux系统中的一种机制,用于描述硬件设备的相关信息。
在内核初始化过程中,内核会解析设备树,并建立设备树对象,以便后续的设备驱动程序使用。
设备树描述了硬件设备的类型、地址、中断等信息,以及设备之间的连接关系。
它使得内核能够在运行时自动识别和配置硬件设备,大大提高了系统的可移植性和灵活性。
四、启动初始化(Init)启动初始化是系统启动的第三阶段,它是用户空间的第一个进程(init进程)接管系统控制权后的操作。
启动初始化主要完成以下几个任务:1. 挂载根文件系统:启动初始化会挂载根文件系统,使得用户可以访问文件系统中的文件和目录。
2. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
MBR和GRUB概述Linux 的启动流程目前比较流行的方式主要是以下步骤:1、引导器(例如 GRUB)启动;2、内核启动;3、系统进程启动与配置。
本文以 GRUB 为研究对象,对 GRUB 启动与内核启动两个部分进行描述,关于系统进程的进一步启动与配置将用另一篇文章来说明。
常见的目录结构(以 CentOS 5.3 为例):/boot|-- System.map-2.6.18-128.el5|-- System.map-2.6.18-128.el5xen|-- config-2.6.18-128.el5|-- config-2.6.18-128.el5xen|-- initrd-2.6.18-128.el5.img|-- initrd-2.6.18-128.el5xen.img|-- lost+found|-- memtest86+-1.65|-- message|-- symvers-2.6.18-128.el5.gz|-- symvers-2.6.18-128.el5xen.gz|-- vmlinuz-2.6.18-128.el5|-- vmlinuz-2.6.18-128.el5xen|-- xen-syms-2.6.18-128.el5|-- xen.gz-2.6.18-128.el5`-- grub|-- device.map|-- e2fs_stage1_5|-- fat_stage1_5|-- ffs_stage1_5|-- grub.conf|-- iso9660_stage1_5|-- jfs_stage1_5|-- menu.lst -> ./grub.conf|-- minix_stage1_5|-- reiserfs_stage1_5|-- splash.xpm.gz|-- stage1|-- stage2|-- ufs2_stage1_5|-- vstafs_stage1_5`-- xfs_stage1_5图一: CentOS 5.3 的 /boot 目录目录分作两大部分,一个是 /boot 目录下除 grub 目录以外的所有文件,这些是 Linux 的内核以及内核启动相关的一些文件;另一个就是 grub 下的所有文件, GRUB 引导器启动所需要的所有文件都在 grub 目录下。
linux系统救援模式解决开机引导失败问题问题:linux开机后进⼊grub命令⾏且grub命令⾏输⼊命令报错推测:因之前系统装好以后改变过分区,⽽导致不能读取到grub主开机引导程序在解决这个问题之前我们先来了解linux开机启动过程。
linux系统开机启动有以下过程:1.开机加载BIOS2.进⼊MBR(master boot record)主引导记录:MBR中主要是安装加载引导程序,如主流的grub(既⽀持win也⽀持linux)。
它是可引导设备的第⼀个扇区(⼀般情况下是硬盘中的第⼀扇区)中的主引导分区3.读取运⾏grub主引导程序:grub主要是识别磁盘格式,⽤于载⼊并启动操作系统核⼼(Kernel)。
多操作系统时可以通过配置grub⽽引导系统启动。
4.启动init进程完成系统启动;据我所知有两种⽅式init⽅式。
System V initialization⽅式和Upstart⽅式。
(具体⽅式的运⾏模式⾃⾏百度) linux开机引导过程⼤致分为以上⼏步。
知道了开机启动⼤致过程,我们针对遇到的问题可以判断问题出在grub主引导程序上。
下⾯我们将使⽤系统盘进⼊linux救援模式修复grub引导程序。
1.放⼊linux装机光盘并选择以光盘启动2.选择Rescue installed system 救援模式进⼊3.语⾔选择默认英语,键盘选择us4.根据需要选择是否联⽹,这⾥不需要联⽹5.进⼊到Rescue界⾯,如果选择Continue按钮并回车则救援模式程序会⾃动查找系统中已有的⽂件系统,并把他们挂载到/mnt/sysimage⽬录下;如果选择Read-Only并回车,则会以只读的⽅式挂载已有的⽂件系统,如果需要⼿动挂载则选Skip6.之后有三种模式选择我们选择进⼊shell模式并根据之前提⽰输⼊chroot /mnt/sysimage命令(fakd为诊断模式)7.输⼊grub进⼊grub命令⾏8.在grub命令⾏中输⼊:root(hdx,y) 其中x为安装linux根分区所在的盘,⽐如只有⼀个硬盘那x就是0,linux根分区在第⼆个硬盘上x就为1. 其中y为安装linux系统所在的根分区 我这⾥输⼊的是root(hd0,0)9.输⼊setup(hd0)setup(hd0)就是把grub写⼊到硬盘的MBR上,显⽰succeeded就说明写⼊修复成功。
图解制作U盘引导安装系统的方法此方法可以安装linux,windows等多种操作系统(这里我们以GhostXPSP3.iso和ESX-4.1.0-update01-348481.iso镜像为例),制作简单,绝对实用,注意在使用时候一定要先备份好自己U盘的资料,因制作前先要格式化自己的u盘为“Fat32”格式,格式化后可以进行USB引导的制作了一、利用bootice工具制作对U盘写入主引导记录方法:1.打开bootice程序2.选择目标磁盘(这里我们选择要做引导的U盘,)点击“主引导记录M”如下图:3.如下图选择黄色标记那个选项,选择好后点击“安装/配置”4.接下来直接点击“写入磁盘”,如下图5.系统会提示你“Grub4dos引导程序配置修改成功”,点击“确定”,整个引导制作过程完成,如下图:二、拷贝和编辑一些主要文件1.拷贝grub.exe,grldr,文件到U盘根目录下(必须放在根目录下)如下图2.在u盘根目录下新建menu.lst文件(这个是启动菜单,你可以放好几种系统镜像,安装时候,再去菜单选择要安装的系统,这里因是用GhostXPSP3.iso和ESX-4.1.0-update01-348481.iso镜像为例故只做这两个的菜单),menu.lst文件里写入如下内容如下:timeout 10default /defaulttitle GhostXPSP3 为菜单选择的标题(名字可以随便取)map (hd0,0)/winpe/GhostXPSP3.iso (hd32) 镜像存放的位置map --hookchainloader (hd32)title ESX4.1map (hd0,0)/ESX4.1/ESX-4.1.0-update01-348481.iso (hd32)map --hookchainloader (hd32)3.去U盘根目录下建立两个文件夹“winpe”,“ESX4.1”这两个分别是镜像的位置如下图:4.将“GhostXPSP3.iso”和“ESX-4.1.0-update01-348481.iso”两个镜像跟别考入“winpe”,“ESX4.1”两个文件夹下,到此整个制作过程结束三、安装方法1.把要安装系统的电脑启动项更改为从USB启动2.系统会自动载入安装菜单,在菜单中选择要安装的系统即可如下图:。
Linux系统引导过程及排除启动故障⼀、Linux操作系统引导过程⼆、系统初始化进程1、init进程2、Systemd3、Systemd单元类型三、排除启动类故障【1】、修复MBR扇区故障(含实验过程)【2】、修复GRUB引导故障●⽅法⼆:进⼊急救模式,恢复GRUB引导程序(与MBR 引导扇区类似)●⽅法三:引导界⾯进⼊急救模式,重建GRUB菜单配置⽂件⽅案三实验四、遗忘root⽤户的密码实验过程⼀、Linux操作系统引导过程1.开机⾃检服务器主机开机以后,将根据主板BIOS中的设置对CPU、内存、显卡、键盘等设备进⾏初步检测,检测成功后根据预设的启动顺序移交系统控制权,⼤多时候会移交给本机硬盘。
总结:检测出第⼀个能够引导系统的设备,⽐如硬盘或者光驱2.MBR 引导当从本机硬盘中启动系统时,⾸先根据硬盘第⼀个扇区中MBR(主引导记录)的设置,将系统控制权传递给包含操作系统引导⽂件的分区;或者直接根据MBR 记录中的引导信息调⽤启动菜单(如 GRUB)。
总结:运⾏放在MBR扇区⾥的启动GRUB引导程序3.GRUB 菜单对于Linux操作系统来说,GRUB(统⼀启动加载器)是使⽤最为⼴泛的多系统引导器程序。
系统控制权传递给GRUB以后,将会显⽰启动菜单给⽤户选择,并根据所选项(或采⽤默认值)加载Linux内核⽂件,然后将系统控制权转交给内核。
CentOS 7 采⽤的是 GRUB2 启动引导器。
总结:GRUB引导程序通过读取GRUB配置⽂件/boot/grub2/grub.cfg,来获取内核和镜像⽂件系统的设置和路径位置4.加载 Linux 内核Linux内核是⼀个预先编译好的特殊⼆进制⽂件,介于各种硬件资源与系统程序之间,负责资源分配与调度。
内核接过系统控制权以后,将完全掌控整个Linux操作系统的运⾏过程。
CentOS 7系统中,默认的内核⽂件位于“/boot/vmlinuz-3.10.0-514.el7.x86_64”。
linux引导之grub2先了解下什么是Bootloader以下是百度百科释意在嵌⼊式操作系统中,BootLoader是在内核运⾏之前运⾏。
可以初始化硬件设备、建⽴内存空间映射图,从⽽将系统的软硬件环境带到⼀个合适状态,以便为最终调⽤准备好正确的环境。
在中,通常并没有像BIOS那样的程序(注,有的嵌⼊式CPU也会内嵌⼀段短⼩的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
在⼀个基于ARM7TDMI core的中,系统在上电或复位时通常都从地址0x00000000处开始执⾏,⽽在这个地址处安排的通常就是系统的BootLoader程序Bootloader不属于操作系统,⼀般采⽤汇编语⾔和C语⾔开发。
需要针对特定的硬件平台编写。
在移植过程时,⾸先为开发板移植Bootloader。
Bootloader不但依赖于CPU的体系架构,⽽且依赖于嵌⼊式系统板级设备的配置。
3.Bootloader的操作模式⾃启动模式:在这种模式下,Bootloader从⽬标机上的某个固态存储设备上将操作系统加载到RAM中运⾏,整个过程并没有⽤户的介⼊。
交互模式:在这种模式下,⽬标机上的Bootloader将通过串⼝或⽹络等通信⼿段从开发板上下载内核映射和根⽂件系统映像等待RAM中。
可以被Bootloader写到⽬标机上的固态存储媒介质中,或者直接进⼊系统的引导。
也可以通过串⼝接收⽤户的指令。
⼆、Bootloader的基本功能初始化相关硬件把Bootloader⾃搬移到内存中执⾏⽤户指令加载并执⾏内核⼀个嵌⼊式系统从软件的⾓度看通常可以分为三个层次: 1、引导加载程序。
包括固化在固件(firmware)中的Booter代码(可选),和Loader两⼤部分。
2、操作系统。
特定于嵌⼊式板⼦的定制内核以及内核的启动参数;以及在内核和应⽤程序之间可能还会包括⼀个嵌⼊式图形⽤户界⾯,常⽤的嵌⼊式GUI有:MicroWindows和MiniGUI等。
linux systemd service 的执行流程systemd是Linux系统中的一个初始化系统和服务管理器,它负责启动系统的各个组件和服务。
systemd通过使用单一进程和配置文件来替代传统的SysV init脚本,提供了更为先进和灵活的管理方式。
下面是systemd服务的执行流程,详细描述了服务的启动、运行和停止的过程。
1.系统引导:当计算机启动时,系统会加载内核并触发init进程,init进程会负责初始化系统。
在现代Linux系统中,init进程通常是systemd。
systemd的启动是由initramfs(初始内存文件系统)引导的,initramfs负责加载关键的驱动程序和文件系统,然后启动systemd。
2.systemd进程启动:一旦initramfs引导完成,systemd进程将被启动。
systemd会读取其配置文件,主要是/etc/systemd/system.conf和/etc/systemd/user.conf,以确定系统和用户级别的默认配置。
3.Target的激活:systemd使用”target”的概念,一个target是一组相关的服务的集合。
例如,graphical.target表示启动图形用户界面,multi-user.target表示启动多用户模式。
systemd会根据默认目标(通常是multi-user.target)启动相应的服务。
4.服务单元的激活:每个服务在systemd中都由一个单元文件(unit file)定义,这些文件通常存储在/etc/systemd/system/目录中。
systemd会读取目标关联的服务单元,并按需激活这些服务。
服务单元包括服务的配置信息、依赖关系、执行路径等。
5.依赖关系解析:systemd会解析服务单元之间的依赖关系,并按照正确的顺序启动这些服务。
依赖关系可以指定服务之间的启动顺序,确保在需要的时候正确地启动和停止服务。
计算机及Linux操作系统开机启动过程详解从按下开机键开始的计算机启动过程:(主要包括从主板加载BIOS并执⾏、从磁盘加载启动区并执⾏、从磁盘加载操作系统并执⾏三步,是依次递进的,详情参阅)加载BIOS:按下开机键,主板ROM的BIOS被(被谁?)加载到到内存0xffff0处,CPU 将 PC 寄存器的值强制初始化为 0xffff0(⼀跳)。
执⾏BIOS代码:阶段1(0xffff0 处的内容):该⼊⼝地址处存的是⼀个跳转指令,跳转的⽬的地是内存0xfe05b位置,该位置存了BIOS的真正内容。
执⾏该跳转(⼆跳)。
阶段2(0xfe05b 处的内容):执⾏硬件检测、硬件初始化、建⽴中断向量表等⼯作后,找到磁盘上的启动区(或称引导区)加载到内存0x7c00位置,并跳转到该位置(三跳)。
执⾏启动区代码(0x7c00 处的内容):从磁盘加载OS内核到内存,与上⾯不同这⾥内存位置不是固定的了,并跳转到OS内核代码处(四跳)。
执⾏OS内核代码:包括开启分段机制、进⼊保护模式、开启中断机制等,执⾏完后系统由OS接⼿管理。
具体过程见下⽂“操作系统启动过程”部分。
整体过程概要:补充:BIOS位于主板ROM,启动时被加载到内存;启动区、OS位于磁盘,被先后加载到内存。
BIOS、启动区在内存的位置是固定的(为啥是这三个值?早期定死的);⽽OS在内存位置不是固定的。
启动区:若⼀个磁盘上0盘0道1扇区的内容(512B)的末两个字节为0x55、0xaa,则这该扇区会被BIOS识别为启动区,该磁盘会被当做可启动盘。
往⼀个磁盘烧录OS后之所以可以当做启动盘就是因为往该位置写⼊了这些特殊数据。
若装了多系统,则启动时会列出并让⽤户选择要启动的系统,这些系统就是根据上述条件被识别得到。
可见,⼀个程序只要其虚拟内存以0x7c00作为段地址,且按上述条件烧录到磁盘,则就可以被BIOS识别为启动区加载到内存执⾏。
因此,如果该程序逻辑中不是去加载OS⽽是直接输出数据,则该程序⾃⾝就是⼀个简洁的"操作系统"。
linux中系统引导过程各类问题的修复方法Linux中系统引导过程中可能出现各种问题,例如系统无法引导、GRUB引导错误、内核崩溃等问题。
下面将介绍一些常见问题的修复方法。
1.系统无法引导:-检查硬盘是否正常连接,并确认引导设备顺序是否正确。
-使用Linux安装光盘或U盘启动,进入系统恢复模式修复或重新安装引导器。
-检查引导分区是否被删除或损坏,使用修复工具如Boot-Repair 修复引导。
2. GRUB引导错误:-如果无法进入GRUB引导菜单,可以尝试按下Shift或Esc键来强制显示菜单。
-如果GRUB遇到错误,可以编辑引导菜单,在GRUB启动界面按下‘e’进入编辑模式,修改GRUB配置文件。
-如果需要重新安装GRUB,可以使用Live CD或USB启动,在终端中使用chroot命令登录并重新安装GRUB。
3.内核崩溃:-内核崩溃可能是硬件驱动或内核模块问题导致的,可以尝试在GRUB引导菜单中选择不同的内核版本启动。
-如果内核崩溃导致系统无法启动,可以使用Live CD或USB启动,进入恢复模式,使用命令行工具修复或重新安装内核。
-使用系统日志工具如dmesg、journalctl查看详细的错误信息,并尝试解决相关问题。
4.文件系统损坏:-使用fsck命令检查和修复文件系统错误。
例如,使用“sudofsck /dev/sda1”检查/dev/sda1分区。
-如果文件系统无法修复,可以尝试使用备份的superblock进行修复,例如使用“sudo fsck -b superblock /dev/sda1”命令。
-如果文件系统损坏较为严重,可以考虑使用Live CD或USB启动,使用工具如TestDisk进行文件系统恢复。
5.引导设备更改:-如果更换硬盘或更改分区表,可能需要更新引导设备。
-可以使用Live CD或USB启动,在终端中使用chroot命令登录并更新引导设备配置。
-使用“sudo grub-install /dev/sda”命令重新安装GRUB到新的硬盘。
Linux操作系统启动流程图⽂详解理解Linux操作系统启动流程,能有助于后期在企业中更好的维护Linux服务器,能快速定位系统问题,进⽽解决问题。
上图为Linux操作系统启动流程1.加载BIOS计算机电源加电质检,⾸先加载基本输⼊输出系统(Basic Input Output System,BIOS),BIOS中包含硬件CPU、内存、硬盘等相关信息,包含设备启动顺序信息、硬盘信息、内存信息、时钟信息、即插即⽤(Plug-and-Play,PNP)特性等。
加载完BIOS信息,计算机将根据顺序进⾏启动。
2.读取MBR读取完BIOS信息,计算机将会查找BIOS所指定的硬盘MBR引导扇区,将其内容复制到0x7c00地址所在的物理内存中。
被复制到物理内存的内容是Boot Loader,然后进⾏引导。
3.GRUB引导GRUB启动引导器是计算机启动过程中运⾏的第⼀个软件程序,当计算机读取内存中的GRUB配置信息后,会根据其配置信息来启动硬盘中不同的操作系统。
4.加载Kernel计算机读取内存映像,并进⾏解压缩操作,屏幕⼀般会输出“Uncompressing Linux”的提⽰,当解压缩内核完成后,屏幕输出“OK, booting the kernel”。
系统将解压后的内核放置在内存之中,并调⽤start_kernel()函数来启动⼀系列的初始化函数并初始化各种设备,完成Linux核⼼环境的建⽴。
5.设定Inittab运⾏等级内核加载完毕,会启动Linux操作系统第⼀个守护进程init,然后通过该进程读取/etc/inittab⽂件,/etc/inittab⽂件的作⽤是设定Linux的运⾏等级,Linux常见运⾏级别如下:•0:关机模式•1:单⽤户模式•2:⽆⽹络⽀持的多⽤户模式•3:字符界⾯多⽤户模式•4:保留,未使⽤模式•5:图像界⾯多⽤户模式•6:重新引导系统,重启模式6.加载rc.sysinit读取完运⾏级别,Linux系统执⾏的第⼀个⽤户层⽂件/etc/rc.d/rc.sysinit,该⽂件功能包括:设定PATH运⾏变量、设定⽹络配置、启动swap分区、设定/proc、系统函数、配置Selinux等。
linux系统引导过程简介首先,主板的BIOS会读取硬盘的主引导记录(MBR),MBR中存放的是一段很小的程序,他的功能是从硬盘读取操作系统核心文件并运行,因为这个小程序太小了,因此通常这个小程序不具备直接引导系统内核的能力,他先去引导另一个稍微大一点的小程序,再由这个大一点的小程序去引导系统内核.在linux系统中这样的小程序有LILO和GRUB.在这个项目中,我决定用LILO来做系统引导程序.在软盘上启动linux系统的过程和在硬盘上启动的过程相似.Linux系统内核被引导程序装入内核并运行后,linux内核会检测系统中的各种硬件.并做好各种硬件的初始化工作,使他们在系统正式运行后能正常工作.之后内核做的最后一个工作是运行/sbin下的init程序,init是英文单词initialization(初始化)的简称,init程序的工作是读取/etc/inittab 文件中描述的指令,对系统的各种软硬件环境做最初化设定.最后运行mingetty等待用户输入用户名登录系统.所有的工作就这么简单,虽然linux启动的时候有很多内容,看上去十分高深,但是都不过是对这个过程的扩充.明白了这个道理,你可以写一些脚本程序让他在系统启动的特定时间运行完成任务.事实上系统内核并不关心/sbin下的init是不是真的init,只要是放在/sbin下名叫init 的可执行程序他都可以执行.Red Hat Enterprise Linux在电脑的启动阶段,一共经历以下两个阶段:1.启动内核。
在这个阶段,内核装入内存并在初始化每个设备驱动器时打印信息。
2.执行程序init.(系统初始化).装入内核并初始化设备后,运行init程序。
init程序处理所有程序的启动,包括重要系统精灵程序和其它指定在启动时装入的软件。
开机---BIOS自检---载入启动程序---加载内核---启动init服务---加载/etc/inittab---Run level---rc.sysinit---rc--- mingetty---rc.local一.BIOS自检当电脑开机的时候,电脑会进入BIOS,在PC机中引导LINUX是从BIOS中的地址0xFFFF0处开始的.BIOS的第一个步骤是加电自检,即所谓的POST(Power On Self Test),BIOS的第二个步骤是进行本地设备的枚举和初始化,侦测电脑周边配套设备是否工作正常,如cpu的类型,速度,缓存等;主板类型,内存的速度,容量,硬盘的大小,类型和工作模式,风扇速度等,主要是为了检查这些设备在开机的时候是否能通过检测,说明电脑可以正常的工作.BIOS由两部分组成:POST代码和运行时的服务.当POST完成之后,它被从内存中清理了出来,但是,BOIS 运行时服务依然保留在内存中,目标操作系统可以使用这些服务二.载入启动程序BIOS自检完成后,BIOS会根据用户设置的启动顺序来由哪个设备启动电脑的操作系统,设备需是处于活动状态并且可以引导的,(引导设备可以是软盘,CD-ROM,硬盘上的某个分区,网络上的某个设备,甚至是USB闪存),对于linux这个设备一般是硬盘.也就是进入硬盘的MBR区域,(master boot record,位于磁盘上的第一个扇区中,0道0柱面1扇区),这个区域中有512个字节的大小,其中前446个字节中保存的就是启动程序,(446个字节包含可执行代码和错误消息文本,接下来的64个字节是分区表,其中4个分区的记录,每个记录的大小是16个字节,MBR以两个特殊数字的字节0xAA55结束,这个数字用来进行MBR的有效性检查,当MBR被加载到RAM中之后,BIOS就会将控制权交给MBR),然后由这个小程序来加载存储在其他位置的操作系统,也就是启动grub程序.(grub不像lilo一样使用裸扇区,而是可以从ext2或ext3文件系统中加载LINUX内核).要看MBR的内容,请使用下面的命令#从/dev/sda上读取前512个字节的内容,并将其写入mbr.bin文件中[root@localhost ~]# dd if=/dev/sda of=mbr.bin bs=512 count=1#以十六进制和ASCII码格式打印这个二进制文件的内容[root@localhost pam.d]# od -xa mbr.bingrub程序的这个配置文件是保存在:/boot/grub/grub.conf这个文件中,如果修改这个文件后,设置会立刻生效.使用cat /boot/grub/grub.conf,就会出现这个文件的内容,最前面是注释。
可以将这个文件逻辑上分为两个部分,第一个部分是基本设定,第二个部分是区分开多个操作系统的设定。
第一个部分中的defaule=0,是指第一组操作系统开机。
如果有两组操作系统的开机设定,而defaule=1,那么预设使用第二组操作系统开机。
所谓第一组和第二组程序就是指的是title开始的部分,这里是区分操作系统的部分。
如何知道要使用那一个系统呢,可以看到在title开始的部分的下一行有:root (hd0,0)hd0,表示第一个硬盘0:指的是硬盘的第一个分区,在括号中的那个0和defaule=0是一一对应的。
这就可以知道是启动的是那一个操作系统。
timeout=5是指进入GRUB的画面后,会有5秒的时间让使用者选择使用那个操作系统开机。
如果在这个时间没有作出选择那么,那么就使用defaule的设定splashimage=是开机使用的背景图案。
hd0,表示第一个硬盘0:指的是硬盘的第一个分区,和上面的一样,/grub/splash.xpm.gz就是开机使用的背景图案的文件名称hiddenmenu指令是隐藏开机的选单。
title:开机选单的标题名称。
root (hd0,0):0表示下面要介绍的档案位于那个目录中。
(hd0,0)同样是指/boot目录kernel:存放内核的位置,由于(hd0,0)指的是/boot目录,所以这个文件在boot目录中。
ro root=LABEL=/就是设根目录的位置,ro表示read only,所以有这行的设定,才能读取根目录。
rhgb:red hat图形界面启动,取代以前的文本界面。
如果要使用文本界面的形式启动,只要将rhgb删除即可。
quite:在开机过程中不要显示错误的信息。
如果要显示错误信息,只要删除quite即可。
initrd:将initrd映像文件加载到内存。
这个文件里面存放的都是驱动程序。
三.加载内核正确的启动了启动程序之后,接下来的工作就是载入操作系统的内核.内核主要作用是取得BIOS所检测到的硬件设备的信息,然后将这些硬件设备自己来管理,这样才能够提供给Linux系统使用。
接手了硬件设备后,然后就要加载这些设备的驱动程序。
以便于控制电脑上的设备如何正确的工作。
加载完硬件的驱动程序后,接下来就加载文件系统了,也就是加载开机所需要的库文件,程序等,所以/etc /bin /sbin /dev /lib这些目录的根目录必须是同一个分区,否则会造成Linux 的开机失败。
上面在grub中有“ro root=LABEL=/”这样的信息,是以只读的方式来加载所需要的文件,程序,这是为什么呢?是因为Linux的内核在启动的过程中,不知道将会发生什么故障,可能不是很稳定,如果以可读可写的方式来加载,那么启动的过过程组中如果出现异常或者是断电,那么就有可能破坏,为了避免这些问题的发生,就采取只读的方式来挂载文件系统。
LINUX内核一般是压缩保存的,因此,它首先要进行自身的解压缩。
内核映象前面的一些代码完成解压缩。
内核映像并不是一个可执行的内核,而是一个压缩过的内核映像,它通常是一个zlmage(压缩映像,小于512kb)或一个bzlmage(大于512kb),它是提前使用zlib进行压缩过的.在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中,如果有初始RAM磁盘映像,就会将它移动到内存中,并标明以后使用,然后此例程会调用内核,并开始启动内核引导的过程当bzlmage被调用时,(以i386为例),我们从./arch/i386/boot/head.S的start汇编例程开始执行,这个例程会执行一些基本的硬件设置,并调用./arch/i386/boot/compressed/headS中的startup_32例程,此例程会设置一个基本的环境(堆栈等),并清楚Block Started bySymbol(BSS),然后调用一个叫做decompress_kernel的C函数(在./arch/i386/boot/compressed/misc.c中)来解压内核.当内核被解压到内存中之后,就可以调用它了.这是另外一个startup_32函数,但是这个函数在./arch/i386/kernel/head.S中.在这个新的startup_32函数(也称为清楚程序或进程0)中,会对页表进行初始化,并起用内存分页功能.然后会为任何可选的浮点单元(FPU)检测CPU的类型,并将其存储起来供以后使用,然后调用start_kernel函数(在init/main.c中),它会将您带入与体系结构无关的Linux内核部分.实际上,这就是Linux内核的main函数.通过调用start_kernel,会调用一系列初始化函数来设置中断,执行进一步的内存配置,并加载初始RAM磁盘.最后,要调用kernel_thread(在arch/i386/kernel/process.c中)来启动init函数,这是第一个用户空间进程(user-space process).最后,启动空任务,现在调度器就可以接管控制权了(在调用cpu_idle之后).通过起用中断,抢占式的调用器就可以周期性地接管控制权,从而提供多任务处理能力.在内核引导过程中,初始RAM磁盘(initrd)是由阶段2引导加载程序加载到内存中的,它会被复制到RAM 中并挂载到系统上.这个initrd会作为RAM中的临时根文件系统使用,并允许内核在没有挂载任何物理磁盘的情况下完整地实现引导.由于与外围设备进行交互所需要的模块可能是initrd的一部分,因此内核可以非常小,但是仍然需要支持大量可能的硬件配置.在内核引导之后,就可以正式装备根文件系统了(通过pivot_root),此时会将initrd根文件系统卸载掉,并挂载真正的根文件系统,initrd函数让我们可以创建一个小型的linux内核,其中包括作为可加载模块编译的启动程序,这些可加载的模块作为内核提供了访问磁盘和磁盘上的方法,并为其他硬件提供了驱动程序,由于根文件系统是磁盘上的一个文件系统,因此initrd函数会提供一种启动方法来获得对磁盘的访问,并挂载真正的根文件系统.在一个没有硬盘的嵌入式环境中,initrd可以是最终的根文件系统,也可以通过网络文件系统(NFS)来挂载最终的根文件系统.在GRUB命令中,我们可以使用initrd映像引导一个特定的内核,方法如下:grub> kernel /bzImage-2.6.14.2[Linux-bzImage, setup=0x1400, size=0x29672e]grub>initrd /initrd-2.6.14.2.img[Linux-initrd @ 0x5f13000, 0xcc199 bytes]grub> bootUncompressing Linux... Ok, booting the kernel.如果不知道要引导的内核的名称,只需使用/然后按下Tab键,就会显示内核和initrd映像列表对grub命令行进行加密a)使用命令/sbin/grub-md5-crypt来产生grub使用的密码[root@localhost pam.d]# /sbin/grub-md5-cryptPassword:Retype password:$1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1b)修改/etc/grub.conf加入password --md5 $1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1 一定要放在title之前这样重启系统时在grub的启动grub菜单时,想再按e命令进行编辑时,必须先按p键后输入密码才成.四.启动init服务加载完成内核之后,Kernel会启动init这个程序,init进程是所有进程的起点,也是Linux 内核启动后的第一个动作,所以这个程序的PID是永远是1,也是Red Hat Enterprise Linux 中执行的第一个程序,这个程序会根据Run Level来执行一些相关的程序程序。