Linux系统启动过程分析慕小潮

合集下载

linux内核启动流程总结#精选.

linux内核启动流程总结#精选.

X86体系结构内核启动分析一、硬件检测当机器加电后它首先执行BIOS(基本输入输出系统)中的代码,BIOS首先执行加电自检程序(POST),当自检通过程便完成了硬件的启动。

当自检完成后BIOS按照系统COMS中设置的启动顺序搜寻有效的启动驱动器(这里我们以硬盘为例),并读入系统引导扇区,并将系统控制权交给引导程序。

二、加载和执行引导程序系统引导程序主要是把系统内核装载到内存,启动盘必须在第一个逻辑磁道上包含引导记录。

这512个字节的扇区又被称作是引导扇区,在系统完成加电自检后,BIOS从启动盘中将引导扇区读入到内存中。

一旦引导记录加载完毕,BIOS就交出系统的执行控制权,跳转到引导程序的头部执行。

有关linux pc的引导程序lilo和grub,lilo和grub可以引导多个系统,嵌入式系统上,最常见的bootloader是UBOOT,如果机器上要装多系统的话一般都会用到它们,这一引导程序也储存在引导扇区中或者存放在主引导记录中(MBR),lilo和grub都许允用户自己配置,它们在系统安装时建立了关于系统内核占用磁盘数据块的位置对照表。

比如,grub程序就非常强大。

Gurb运行后,将初始化设置内核运行所需的环境。

然后加载内核镜像。

grub磁盘引导全过程:stage1: grub读取磁盘第一个512字节(硬盘的0道0面1扇区,被称为MBR(主引导记录),也称为bootsect)。

MBR由一部分bootloader的引导代码、分区表和魔数三部分组成。

stage1_5: 识别各种不同的文件系统格式。

这使得grub识别到文件系统。

stage2: 加载系统引导菜单(/boot/grub/menu.lst或grub.lst 根据grub版本不同文件位置会有所不同),加载内核vmlinuz和RAM磁盘initrd。

有时候基本引导装载程序(stage1)不能识别stage2所在的文件系统分区,那么这时候就需要stage1.5来连接stage1和stage2了假设有如下grub配置代码root (hd0,0)//grub分区kernel /vmlinuz‐2.6.35.10‐74.fc14.i686 ro root=/dev/ram0 //linux分区initrd /initramfs‐2.6.35.10‐74.fc14.i686.img要搞清楚上面两个root的关系,root (hd0,0)中的root是grub命令,它用来指定boot所在的分区作为grub的根目录.而root=/dev/ram0是kernel的参数,它告诉操作系统内核加载完毕之后,真实的文件系统所在的设备.要注意grub的根目录和文件系统的根目录的区别。

linux系统启动的具体流程

linux系统启动的具体流程

Linux系统的启动过程可以分为以下五个阶段:
内核引导:当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。

操作系统接管硬件以后,首先读入/boot目录下的内核文件。

运行init:init进程是系统所有进程的起点,可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。

init程序首先需要读取配置文件/etc/inittab。

系统初始化:在init的配置文件中有这么一行:si::sysinit:/etc/rc.d/rc.sysinit,它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

建立终端:rc执行完毕后,返回init。

这时基本系统环境已经设置好了,各种守护进程也已经启动了。

init接下来会打开6个终端,以便用户登录系统。

用户登录系统:命令行登录、ssh登录、图形界面登录3种方式。

3、linux系统启动过程分析(下)

3、linux系统启动过程分析(下)

例子的解释
上面两个汇编程序采用的语法虽然完全不同, 但功能却都是调用 Linux 内核提供的 sys_write 来显示一个字符串,然后再调用 sys_exit 退出 程序。 Linux系统有效的系统调用列表安装在: /usr/man/man2/unistd.h /usr/include/sys/syscall.h. /usr/include/asm/unistd.h ,可以找到所有系统 调用的定义
操作系统引导流程
0.01版内核,以软盘启动为例:
1 开机 2 BIOS 加电自检 ( Power On Self Test,POST ),内存地址为 0ffff:0000 3 将软盘第一个扇区 (0头0道1扇区, 也就是Boot Sector)读入内存地址 0000:7c00 处。 4 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于则转去尝试其他启动 介质, 如果没有其他启动介质则显示"No ROM BASIC" 然后死机。 5 跳转到 0000:7c00 处执行 MBR 中的程序。 6 MBR将自己移动到9000:0000 7 将内核模块从软盘读入到1000:0000 8 将内核模块移动到0000:0000 9 进入保护模式 10 读取COMS信息,设置有关表格,然后调用操作系统初始化程序MAIN.C 1-5完全由BIOS完成,6-10由 BOOT\BOOT.S HEAD.S完成 其中BOOT.S的目标代码就是MBR(主引导记录Master Boot Record)中的程序
计算机加电过程


当机算机的电源键被按下时,同这个键相联的电信号线就会送出 一个电信号给主板,主板将此电信号传给供电系统,供电系统开 始工作,为整个系统供电,并送出一个电信号给BIOS,通知 BIOS 供电系统已经准备完毕。随后BIOS 启动一个程序,进行主 机自检,主机自检的主要工作是确保系统的每一个部分都得到了 电源支持,内存储器、主板上的其它芯片、键盘、鼠标、磁盘控 制器及一些I/O 端口正常可用,此后,自检程序将控制权还给 BIOS。 接下来BIOS 读取BIOS 设置,得到引导驱动器的顺序,然后依次 检查,直到找到可以用来引导的驱动器(或说可以用来引导的磁 盘,包括软盘、硬盘、光盘等),然后调用这个驱动器上磁盘的 引导扇区进行引导。

流程管理-linux启动流程分析

流程管理-linux启动流程分析

linux启动流程分析linux启动流程分析(1)---bootloader启动内核过程我分析的是2.4.19的内核版本,是xscale的平台,参考了网上很多有价值的帖子,也加入了自己的一些看法,陆续总结成文字,今天是第一篇:内核一般是由bootloader来引导的,通过bootloader启动内核一般要传递三个参数,第一个参数放在寄存器0中,一般都为0,r0 = 0;第二个参数放在寄存器1中,是机器类型id,r1 = Machine Type Number;第三个参数放在寄存器2中,是启动参数标记列表在ram中的起始基地址;bootloader首先要将ramdisk(如果有)和内核拷贝到ram当中,然后可以通过c语言的模式启动内核:void (*startkernel)(int zero, int arch, unsigned int params_addr) = (void(*)(int, int, unsigned int))KERNEL_RAM_BASE;startkernel(0, ARCH_NUMBER, (unsigned int)kernel_params_start);其中KERNEL_RAM_BASE为内核在ram中启动的地址,ARCH_NUMBER是Machine Type Number,kernel_params_start是参数在ram的偏移地址。

这时候就将全力交给了内核。

linux启动流程分析(2)---内核启动地址的确定内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds,但是该文件是由vmlinux-armv.lds.in生成的,根据编译选项的不同源文件还可以是vmlinux-armo.lds.in,vmlinux-armv-xip.lds.in。

vmlinux-armv.lds的生成过程在kernel/arch/arm/Makefile中LDSCRIPT = arch/arm/vmlinux-armv.lds.inarch/arm/vmlinux.lds: arch/arm/Makefile $(LDSCRIPT) \$(wildcard include/config/cpu/32.h) \$(wildcard include/config/cpu/26.h) \$(wildcard include/config/arch/*.h)@echo ' Generating $@'@sed 's/TEXTADDR/$(TEXTADDR)/;s/DATAADDR/$(DATAADDR)/' $(LDSCRIPT) >$@vmlinux-armv.lds.in文件的内容:OUTPUT_ARCH(arm)ENTRY(stext)SECTIONS{. = TEXTADDR;.init : { /* Init code and data */_stext = .;__init_begin = .;*(.text.init)__proc_info_begin = .;*()__proc_info_end = .;__arch_info_begin = .;*()__arch_info_end = .;__tagtable_begin = .;*(.taglist)__tagtable_end = .;*(.data.init). = ALIGN(16);__setup_start = .;*(.setup.init)__setup_end = .;__initcall_start = .;*(.initcall.init)__initcall_end = .;. = ALIGN(4096);__init_end = .;}其中TEXTADDR就是内核启动的虚拟地址,定义在kernel/arch/arm/Makefile 中:ifeq ($(CONFIG_CPU_32),y)PROCESSOR = armvTEXTADDR = 0xC0008000LDSCRIPT = arch/arm/vmlinux-armv.lds.inendif需要注意的是这里是虚拟地址而不是物理地址。

计算机及Linux操作系统开机启动过程详解

计算机及Linux操作系统开机启动过程详解

计算机及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启动过程详解

Linux启动过程详解Linux 启动全过程 (2)(1)从BIOS到内核 (2)(2)启动GRUB/LILO (2)(3)加载内核 (3)(4)执行init进程 (4)(5)通过/etc/inittab文件进行初始化 (4)RedHat9.0启动过程 (7)第一部分:内核的引导(核内引导) (7)第二部分:运行init (8)第三部分:系统初始化 (12)第四部分:启动对应运行级别的守护进程 (12)第五部分:建立终端 (13)第六部分:登录系统,启动完成 (14)随着Linux的应用日益广泛,特别是在网络应用方面,有大量的网络服务器使用Linux 操作系统。

由于Linux的桌面应用和Windows相比还有一定的差距,所以在企业应用中往往是Linux和Windows操作系统共存形成异构网络。

在服务器端大多使用Linux和Unix的,目前Linux的擅长应用领域是单一应用的基础服务器应用,譬如DNS和DHCP服务器、Web服务器、目录服务器、防火墙、文件和打印服务器、Intranet代理服务器。

启动 Linux 系统的过程包括很多阶段。

不管您是引导一个标准的 x86 处理器,还是PowerPC 机器,很多流程都惊人地相似。

本文将描述了从开机到登录的 Linux 启动全过程。

Linux 启动全过程(1)从BIOS到内核BIOS自检计算机在接通电源之后首先由BIOS进行自检,即进行所谓的POST(Power On Self Test),然后依据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入“引导块”。

在 PC 中,引导 Linux 是从 BIOS 中的地址 0xFFFF0 处开始的。

BIOS 的第一个步骤是加电自检(POST)。

POST 的工作是对硬件进行检测。

BIOS 的第二个步骤是进行本地设备的枚举和初始化。

给定 BIOS 功能的不同用法之后,BIOS 由两部分组成:POST 代码和运行时服务。

简要分析linux系统的启动过程

简要分析linux系统的启动过程

简要分析linux系统的启动过程接触linux系统运维已经好⼏年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:⼀般来说,所有的操作系统的启动流程基本就是:总的来说,linux系统启动流程可以简单总结为以下⼏步:1)开机BIOS⾃检,加载硬盘。

2)读取MBR,进⾏MBR引导。

3)grub引导菜单(Boot Loader)。

4)加载内核kernel。

5)启动init进程,依据inittab⽂件设定运⾏级别6)init进程,执⾏rc.sysinit⽂件。

7)启动内核模块,执⾏不同级别的脚本程序。

8)执⾏/etc/rc.d/rc.local9)启动mingetty,进⼊系统登陆界⾯。

linux系统安装时,如果要想设置开启启动项,可以:开机到BIOS提醒界⾯,按键F11(Dell服务器的做法)进⼊BIOS设置BOOT MENU,继⽽设置启动项:硬盘HD启动,光盘CD/DVD启动,还是U盘USB启动。

下⾯就linux操作系统的启动过程做⼀详细解析记录:加载内核操作系统接管硬件以后,⾸先读⼊ /boot ⽬录下的内核⽂件。

[root@bastion-IDC ~]# ll /boot/total 21668-rw-r--r--. 1 root root 105195 Nov 22 2013 config-2.6.32-431.el6.x86_64drwxr-xr-x. 3 root root 1024 Aug 22 16:31 efidrwxr-xr-x. 2 root root 1024 Aug 22 16:32 grub-rw-------. 1 root root 15217153 Aug 22 16:32 initramfs-2.6.32-431.el6.x86_64.imgdrwx------. 2 root root 12288 Aug 22 16:24 lost+found-rw-r--r--. 1 root root 193758 Nov 22 2013 symvers-2.6.32-431.el6.x86_64.gz-rw-r--r--. 1 root root 2518236 Nov 22 2013 System.map-2.6.32-431.el6.x86_64-rwxr-xr-x. 1 root root 4128368 Nov 22 2013 vmlinuz-2.6.32-431.el6.x86_64启动初始化进程内核⽂件加载以后,就开始运⾏第⼀个程序 /sbin/init,它的作⽤是初始化系统环境。

Linux系统启动的详细过程和步骤

Linux系统启动的详细过程和步骤

Linux系统启动的详细过程和步骤Linux系统启动的详细过程和步骤 Linux操作系统借助于Internet⽹络,并通过全世界各地计算机爱好者的共同努⼒,已成为今天世界上使⽤最多的⼀种UNIX 类操作系统,并且使⽤⼈数还在迅猛增长。

下⾯⼩编准备了关于Linux系统启动的详细过程和步骤,提供给⼤家参考! 第⼀阶段: 系统上电开机后,主板BIOS(Basic Input / Output System)运⾏POST(Power on self test)代码,检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘⿏标等)。

硬件配置信息及⼀些⽤户配置参数存储在主板的CMOS( Complementary Metal Oxide Semiconductor)上(⼀般64字节),实际上就是主板上⼀块可读写的RAM芯⽚,由主板上的电池供电,系统掉电后,信息不会丢失。

执⾏POST代码对系统外围关键设备检测通过后,系统启动⾃举程序,根据我们在BIOS中设置的启动顺序搜索启动驱动器(⽐如的硬盘、光驱、⽹络服务器等)。

选择合适的启动器,⽐如通常情况下的硬盘设备,BIOS会读取硬盘设备的第⼀个扇区(MBR,512字节),并执⾏其中的代码。

实际上这⾥BIOS并不关⼼启动设备第⼀个扇区中是什么内容,它只是负责读取该扇区内容、并执⾏,BIOS的任务就完成了。

此后将系统启动的控制权移交到MBR部分的代码。

注:在我们的现⾏系统中,⼤多关键设备都是连在主板上的。

因此主板BIOS提供了⼀个操作系统(软件)和系统外围关键设备(硬件)最底级别的接⼝,在这个阶段,检测系统外围关键设备是否“准备好”,以供操作系统使⽤。

第⼆阶段: BIOS通过下⾯两种⽅法之⼀来传递引导记录: 第⼀,将控制权传递给initial program loader(IPL),该程序安装在磁盘主引导记录(MBR)中 第⼆,将控制权传递给initial program loader(IPL),该程序安装在磁盘分区的启动引导扇区中 ⽆论上⾯的哪种情况中,IPL都是MBR的⼀部分并应该存储于⼀个不⼤于446字节的磁盘空间中,因为MBR是⼀个不⼤于512字节的空间。

7linux_启动过程分析汇总

7linux_启动过程分析汇总

title Windows 2003 rootnoverify (hd0,5) chainloader +1 lock 设置win2003系统位置 读取扇区 锁定菜单
3.启动菜单
热键
↑↓ 回车 e a c d p 启动当前的菜单项
作用说明
使用上下箭头键,在启动菜单间进行移动
编辑当前的启动菜单项
添加内核的启动参数 进入GRUB的命令行界面 删除当前行 输入密码,解锁菜单
搜索可引导设备-从可引导设备上的MBR中加载引导程序
2.调用GRUB程序,通过读取grub.conf文件来引导操作系统 3.加载系统内核 4.执行init进程,它是系统内核启动的第一个用户级进程,是所有进
程的发起者和控制者,进程ID为1。通过inittab文件来执行相应的脚 本进行系统的初始化。(系统运行级别、系统服务、用户自定义脚本 等)
1) 单纯对GRUB界面加密,而不对被引导的系统加密 在timeout一行下面加一行: password --md5 PASSWORD 2) 对GRUB界面加密,同时对被引导的系统加密 在title行上面加: password --md5 PASSWORD title行下面加: lock
操作案例:
恢复GRUB密码
提供交互式界面
2.配置文件grub.conf
位置:
/boot/grub/grub.conf /etc/grub.conf(链接文件)
内容: 下面以win2003和linux双系统的情况介绍
default=0 //设置默认菜单 timeout=10 //菜单等待时间,为-1时一直等待 splashimage=(hd0,0)/grub/splash.xpm.gz //设定开机菜单画面

第2单元-Linux系统启动流程

第2单元-Linux系统启动流程
kernel-<version>.<arch>.rpm
编译核心及模块
kernel-source-<version>.<arch>.rpm
核心源代码,需要人工编译出核心并安装
kernel-<version>.src.rpm
上发布的原始核心源代码包,需要build出 arch包再使用
3.3、GRUB引导工具 3.3、GRUB引导工具 如果硬盘上的MBR被更动过,可以用 如果硬盘上的MBR被更动过,可以用 /sbin/grub/sbin/grub-install /dev/[hda | sda]来重安装grub sda]来重安装grub 。 Grub配置文件(/boot/grub/grub.conf) Grub配置文件(/boot/grub/grub.conf)
第二单元
Linux系统启动流程 Linux系统启动流程
学习大纲 Linux系启动流程 Linux系启动流程 BIOS初始化 BIOS初始化 启动引导工具 Linux内核 Linux内核 初始化内存镜像盘(initrd) 初始化内存镜像盘(initrd) 核心初始化 系统初始化文件(inittab) 系统初始化文件(inittab) 系统运行级别(runlevel) 系统运行级别(runlevel) 系统初始化脚本(rc.sysinit) 系统初始化脚本(rc.sysinit) 运行级别服务目录 用户自定义启动脚本文件
结束
Th
模块型内核则允许计算机在使用到某一项功能的时候自动 加载,防止了核心臃肿,是大部分情况下的标准构建。
4.2、内核安装包 4.2、内核安装包 核心版本命名规则
主版本号、次版本号、补丁级数 Red Hat附加参数:发布号 显示当前系统的内核信息(#uname –r)

剖析Linux系统启动过程

剖析Linux系统启动过程

剖析Linux系统启动过程本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。

并且介绍了启动中涉及到的各种文件。

 阅读Linux源代码,无疑是深入学习Linux的最好方法。

在本文对Linux 启动过程的介绍中,我们也尝试从源代码的视角来更深入的剖析Linux 的启动过程,所以其中也简单涉及到部分相关的Linux源代码,Linux启动这部分的源码主要使用的是C语言,也涉及到了少量的汇编。

而启动过程中也执行了大量的shell(主要是bash shell)所写脚本。

为了方便读者阅读,笔者将整个Linux启动过程分成以下几个部分逐一介绍,大家可以参考下图:当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux,Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc当完成系统初始化和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。

下面就将逐一介绍其中几个关键的部分: 第一部分:内核的引导(核内引导) RedHat9.0可以使用lilo或grub等引导程序开始引导Linux系统,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权,然后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。

这里使用了几个汇编程序来引导Linux,这一步泛及到Linux源代码树中的“arch/i386/boot”下的这几个文件:bootsect.S、setup.S、video.S等。

其中bootsect.S是生成引导扇区的汇编源码,它完成加载动作后直接跳转到setup.S的程序入口。

第5章--Linux系统启动过程只是课件

第5章--Linux系统启动过程只是课件

5.5.2 init进程的引导过程
当init进程获得控制权后,它首先会执行 /etc/rc.d/rc.sysinit脚本,根据脚本中的代码配置环境变量、 配置网络、启用Swap、检查并挂载文件系统、执行其他系 统初始化所必须的步骤等。
5.5.3 配置自动运行服务
配置自动运行服务涉及的文件较多,如果完全由用户手 工配置,其过程比较繁琐,所以在Red Hat Enterprise Linux 5.2中提供有一个图形配置工具,可以有效地简化配 置过程。用户首先要创建服务对应的启动关闭脚本,脚本的 格式一般为:
shutdown [-t sec] [-arkhncfFHP] time [warningmessage]
5.6.2 halt命令:关闭系统
halt是关闭系统的快捷命令。执行halt命令其实是相当 于执行带“-h”选项的shutdown命令。halt命令的格式如下 所示。
halt [-n] [-w] [-d] [-f] [-i] [-p] [-h]
5.5.1 init进程简介
内核映像在完成引导后,便会启动init进程。init进程对 应的执行文件为/sbin/init,它是系统中所有进程的发起者和 控制者,所有的进程都是由它所衍生。如果init进程出现问题 ,系统中的其他进程也会随之而受影响。
1.作为所有进程的父进程参照对象 2.运行不同级别的程序
init [ -a ] [ -s ] [ -b ] [ -z xxx ] [ 0123456Ss ]
5.6.5 通过图形界面关闭系统
要注销当前用户,可以在系统面板上选择【系统】|【 注销】命令,打开如图5.12所示的对话框。单击【注销】按 钮,系统将注销当前的登录用户,并退出到用户登录界面。 如果要关闭该对话框并返回桌面,可单击【取消】按钮。如 果用户不单击任何按钮,系统将会在60秒后自动注销当前的 登录用户。

Linux系统启动过程详解

Linux系统启动过程详解

Linux系统启动过程详解Linux系统启动过程详解启动第⼀步--加载BIOS当你打开计算机电源,计算机会⾸先加载BIOS信息,BIOS信息是如此的重要,以⾄于计算机必须在最开始就找到它。

这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。

在此之后,计算机⼼⾥就有谱了,知道应该去读取哪个硬件设备了。

启动第⼆步--读取MBR众所周知,硬盘上第0磁道第⼀个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的⼤⼩是512字节,别看地⽅不⼤,可⾥⾯却存放了预启动信息、分区表信息。

系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。

其实被复制到物理内存的内容就是Boot Loader,⽽具体到你的电脑,那就是lilo或者grub了。

启动第三步--Boot LoaderBoot Loader 就是在操作系统内核运⾏之前运⾏的⼀段⼩程序。

通过这段⼩程序,我们可以初始化硬件设备、建⽴内存空间的映射图,从⽽将系统的软硬件环境带到⼀个合适的状态,以便为最终调⽤操作系统内核做好⼀切准备。

Boot Loader有若⼲种,其中Grub、Lilo和spfdisk是常见的Loader。

我们以Grub为例来讲解吧,毕竟⽤lilo和spfdisk的⼈并不多。

系统读取内存中的grub配置信息(⼀般为menu.lst或grub.lst),并依照此配置信息来启动不同的操作系统。

启动第四步--加载内核根据grub设定的内核映像所在路径,系统读取内存映像,并进⾏解压缩操作。

此时,屏幕⼀般会输出“Uncompressing Linux”的提⽰。

当解压缩内核完成后,屏幕输出“OK, booting the kernel”。

系统将解压后的内核放置在内存之中,并调⽤start_kernel()函数来启动⼀系列的初始化函数并初始化各种设备,完成Linux核⼼环境的建⽴。

Linux操作系统的启动过程详解

Linux操作系统的启动过程详解

Linux操作系统的启动过程详解对于刚学习Linux或者刚上手的新手来说,了解Linux操作系统的启动流程是最基本的内容。

下面由小编为大家整理了Linux操作系统的启动过程详解的相关知识,希望对大家有帮助!linux启动时我们会看到许多启动信息。

Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段:Linux操作系统的启动过程详解1、内核的引导2、运行init。

3、系统初始化。

4、建立终端。

5、用户登录系统。

init程序的类型:SysV: init, CentOS 5之前, 配置文件:/etc/inittab。

Upstart: init,CentOS 6, 配置文件:/etc/inittab, /etc/init/*.conf。

Systemd:systemd, CentOS 7,配置文件:/usr/lib/systemd/system、/etc/systemd/system。

Linux操作系统的启动过程详解1、内核引导当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。

操作系统接管硬件以后,首先读入/boot 目录下的内核文件。

Linux操作系统的启动过程详解2、运行initinit 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。

init 程序首先是需要读取配置文件/etc/inittab。

运行级别许多程序需要开机启动。

它们在Windows叫做&quot;服务&quot;(service),在Linux就叫做&quot;守护进程&quot;(daemon)。

init进程的一大任务,就是去运行这些开机启动的程序。

但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。

Linux允许为不同的场合,分配不同的开机启动程序,这就叫做&quot;运行级别&quot;(runlevel)。

Linux系统的启动过程研究

Linux系统的启动过程研究

Linux系统的启动过程研究摘要Linux操作系统是日益流行起来的具有多用户、多任务、支持多线程和多CPU的操作系统。

在linux操作系统的启动过程中,经历了BIOS自检,GRUB引导,加载Linux 内核,执行/sbin/init,执行脚本等过程。

本文主要研究Linux启动过程中的每个步骤,揭示Linux的启动过程。

关键词GRUB;Linux;引导;操作系统0 引言Linux操作系统是免费使用和自由传播的操作系统,是具有多用户、多任务、支持多线程和多CPU等特点的操作系统。

在Linux操作系统启动过程中,我们能看到大量的检测语句和检测结果。

这些检测过程使我们对Linux操作系统的启动充满了好奇。

Linux操作系统的启动经历了BIOS自检、GRUB引导、加载Linux 内核、执行/sbin/init和执行脚本等一系列过程。

在这个过程的第一个步骤BIOS 自检是任何一个操作系统启动必须经历的过程,也是机器启动时必要的自我检查的过程。

下面我们来详细研究一下每个步骤。

1 BIOS检测当启动电源时,计算机会从CMOS(互补金属氧化物半导体,保存了计算机运行最基本的程序和参数)加载BIOS(基本输入输出程序,完成机器自检等步骤后将主控权交给引导程序),开始检测基本的硬件信息。

1.1 post系统检查BIOS首先要对系统进行全面检查,确保每个核心组件,例如:cpu、内存等存在,并且正常运行。

这一检测经常被称为post或power on selftest(加电自检)。

1.2 设备初始化系统的BIOS初始化串行端口、视频设备、键盘等核心设备驱动程序,分配合适的系统资源,例如IRQ和I/O端口。

目前的BIOS也执行即插即用协议(检测并驱动即插即用设备的协议),此协议用来探测PCI设备所支持的设备资源设置,并且为每一个PCI设备分配一个不同与其他设备冲突的配置。

1.3 引导设备选择BIOS完成设备初始化工作之后,会搜索机器中合适的引导设备,这个过程可能因为机器本身的情况而有所不同,这些参数也可以在CMOS中修改。

详细讲解Linux启动流程及启动用到的配置文件及脚本

详细讲解Linux启动流程及启动用到的配置文件及脚本

详细讲解Linux启动流程及启动用到的配置文件及脚本《一》:详解Linux启动流程及需要使用到的配置文件POST加电自检-->BIOS(Boot Sequence)->MBR(bootloader)->Kernel->initrd->r ootfs(/sbin/init)下面对每个启动流程做详细解释:POST(加电自检)计算机本身不执行任何程序,所以系统必须要完成自举的过程,在CPU的控制下,将RAM芯片中的某个程序映射到ROM地址空间,并执其中的指令完成系统硬件健康状况检查,例如存储设备、网卡、CPU、声卡等其他硬件设备是否完好。

当检查完成后,所有硬件或基本硬件、核心硬件没有问题,则下一个启动流程->BIOSBIOS(Boot Sequence)按照BIOS所设定的系统启动流程,根据引导次序(Boot Sequence)自上而下的寻找对应存储设备上操作系统的MBR,如果MBR存在,则会读取MBR中的bootloaderMBR(bootloader)会根据MBR所指引的活动分区上寻找系统分区中的bootloader,bootloader称为是一段程序,占据446字节。

在bootloader当中配置了所要引导操作系统的内核所在的位置,因此BIOS被载入内存以后,当它实现将控制权限转交给bootloader以后,bootloader接收整个系统的控制权限,而后根据用户的选择去读取相应操作系统中的内核,并将内核装载入内存的某个空间位置,解压缩,这时kernel就可以在内存中活动,并根据kernel本身功能在内存当中探索硬件并加载硬件驱动程序并完成内核初始化,bootloader会将控制权限转交给内核。

Kernel(初始化)我们知道kernel是完成探索硬件及加载硬件驱动程序,并以读写的方式挂载根文件系统。

那么这里就出现一个比较诡异的问题,是什么问题呢?我们又知道,要想访问真正的根文件系统(rootfs)的话,就必须加载根文件系统中的设备,这时根文件系统又没有挂载,要挂载根文件系统又得加载根文件系统中的驱动程序,哪怎么办呢?这是就用到了initrd文件了。

Linux系统启动流程分析-电脑资料

Linux系统启动流程分析-电脑资料

Linux系统启动流程分析-电脑资料一系统上电和启动ROMNOR Flash作为启动ROM的系统启动过程NOR Flash开头处存放启动代码,程序从NOR Flash开始处启动,。

配置EMI寄存器,设置好各存储器的地址和存取规则。

配置电源管理模块,各模块上电。

启动代码将位于NOR Flash中的正式执行代码复制到内存中,以提高执行效率。

设置PC指针,指向NOR Flash中固定地址。

设置地址映射,用0地址映射到内存RAM空间。

设置PC指针,指向RAM中初始化代码,开始执行代码。

NAND Flash作为启动ROM的系统启动流程上电初始,DMA默认设置将存储在NAND Flash中第一页的数据搬运到内部RAM中,然后设置PC到内部RAM开始处的地址,开始执行代码,电脑资料《Linux系统启动流程分析》(https://www.)。

在启动代码中设置中断向量和硬件配置等。

将执行代码搬运到外部SDRAM或DDR=RAM,留出启动代码的位置。

将启动代码搬运到SDRAM或DDR-RAM中首址。

设置Remap,将0地址重新映射到SDRAM或DDR-RAM首地址。

设置PC指针,开始执行正式的执行代码。

二 Bootloader引导三 Linux内核引导非压缩内核:Image压缩内核:zImage内核初始化设备初始化启动内核挂载文件系统启动用户空间进程四 init初始化系统服务初始化log系统解析/init.rc和/init.%hardware%.rc文件,执行early-init,并执行解析出的init动作、early-boot动作、boot动作和execute property动作。

进行设备初始化,属性服务器初始化并开启属性服务。

进入无线循环以等待属性设置或子进程退出事件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux系统启动过程分析慕小潮主要内容:1. 启动过程几个主要文件简介2. 开机过程详细说明3. 开机过程详图启动过程中的几个主要文件及其作用:文件名称(按照加载次序列出)作用/etc/inittab定义在进入或切换各个级别时系统需要执行的动作init在初始化系统时需要读取其中配置/etc/rc.d/rc.sysinit 由init进程调用执行完成下面的初始化工作:1. 获取网络环境及主机类型2. 测试与载入内存设备/proc及USB设备/sys3. 决定是否启动SELinux4. 接口设备的检测与即插即用(PNP)参数的测试5. 用户自定义模块的加载6. 加载核心的相关设置7. 设置系统时间8. 设置中断控制台(console)的字形9. 设置RAID与LVM等硬盘功能10. 以fsak检验磁盘文件系统11. 进行磁盘配额quota的转换(非必要)12. 重新以可读取模式载入系统磁盘13. 启动quota的功能14. 启动随机数设备15. 清除启动过程中生成的临时文件16. 将启动相关信息加载到/var/log/message文件中/ettc/rc.d/rc由init进程调用执行根据制定的运行级别,加载或终止相应的系统服务/etc/rc.local由rc脚本调用执行保存用户定义的徐开机后自动执行的命令inittab文件说明:格式:id:runlevels:action :processid 用于在inittab文件中唯一标识一条记录,没有特别的意义runlevels 用于指定记录能在哪些级别下运行(可以有多个,表示在相应的运行级均需要运行;也可以为空,为空时表示0~6都要运行)action 用于指定记录将执行的动作类型process 用于设置启动进程所执行的动作命令(字段中进程可以是任意的守候进程、可执行脚本或程序)inittab文件中每一记录都从新的一行开始,所以每个记录项最多可有512个字符;运行级(runlevels)就是操作系统当前正在运行的功能级别。

这个级别从1到6;当运行级别改变,并且正在运行的程序并没有在新的运行级别中指定需要运行,那么init会先发送一个SIGTERM 信号终止,然后是SIGKILL. 运行级别发生变化时,init就会从/etc/inittab运行相应的命令文件中有效的action值:有效的ac ti o n 值respawn:如果process字段指定的进程不存在,则启动该进程,init不等待处理结束,而是继续扫描inittab文件中的后续进程,当这样的进程终止时,init会重新启动它,如果这样的进程已存在则什么也不做。

wait:启动process字段指定的进程,必须等到执行结束才去处理inittab中的下一记录项。

once: 启动process字段指定的进程,不等待处理结束就去处理下一记录项。

当这样的进程终止时也不再重新启动它,在进入新的运行级别时,如果这样的进程仍在运行,init也不重新启动它。

boot:只有在系统启动时,init才处理这样的记录项,启动相应进程,并不等待处理结束就去处理下一个记录项。

当这样的进程终止时,系统也不重启它。

bootwait:系统启动后,当第一次从单用户模式进入多用户模式时处理这样的记录项,init启动这样的进程,并且等待它的处理结束,然后再进行下一个记录项的处理,当这样的进程终止时,系统也不重启它off:如果指定的进程正在运行,init就给它发SIGTERM警告信号,在向它发出信号SIGKILL其结束之前等待5秒,如果这样的进程不存在,则忽略这一项。

powerfail:当init接到断电的信号(SIGPWR)时,处理指定的进程。

当然前提是有U P S和监视并通知init电源已被切断的软件。

RHlinux默认没有列出该选项。

powerwait当init接到断电的信号(SIGPWR)时,处理指定的进程,但init不会等待正在运行的进程结束,并且等到处理结束才去检查其他的记录项。

sysinit:指定的进程在访问控制台之前执行,这样的记录项仅用于对某些设备的初始化,目的是为了使init在这样的设备上向用户提问有关运行级别的问题,init需要等待进程运行结束后才继续。

initdefault: 指定一个默认的运行级别,只有当init一开始被调用时才扫描这一项,如果runlevel字段指定了多个运行级别,其中最大的数字是默认的运行级别,如果runlevel字段是空的,认为字段是0123456,于是进入级别6,这样便陷入了一个循环,如果inittab文件中没有包含initdefault的记录项,则在系统启动时请求用户为它指定一个初始运行级别ctrlaltdel:允许init在用户于控制台键盘上按下Ctrl+Alt+Del组合键时,重新启动系统。

注意,如果该系统放在一个公共场所,系统管理员可将Ctrl+Alt+Del组合键配置为别的行为,比如忽略等我是设置成打印一句警告的话了(防止其他人恶意重启系统):监视到特定的键盘组合键被按下时采取的动作,现在还不完善。

示意图:过程说明:1. BIOS:系统首先由POST(PowerOnSelfTest,上电自检)程序来对内部各个设备进行检查;自检后,就首先按照系统CMOS设置中保存的启动顺序搜寻软硬盘驱动器及CD—ROM、网络服务器等有效地启动驱动器,读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的顺利启动。

注:硬盘主引导记录MBR(Master Boot Record):位于硬盘0磁道0柱面1扇区,该扇区共512bytes,其中MBR占446bytes ;MBR所做的唯一的事情就是装载第二引导装载程序。

分区表DPT(Disk Partition Table)占64bytes;硬盘有效标志(Magic Number)占2bytes;2. 引导扇区的前446字节,其中定义如何启动本硬盘上的系统(根据分区表找到对应分区上的内核);而对于Linux,一般多用Grub引导,由于grub相对较大,所以分为两段式的进行引导,第一段存储于硬盘MBR中,第二段放置于操作系统内核所在的分区上。

Grub根据MBR中第一段找到第二段,继续引导,第二段中放置的有GRUB菜单等信息,可以让用户选择需要继续引导启动的系统;并且菜单中指定的有内核及RamDisk信息;3.根据用户选择将对应的内核读到内存,解压展开;然后内核开始初始化;初始化完成后需要读取根分区(根是一切的起点),这时候如果系统不是普通磁盘,是scsi或是raid形式时,就需要先加载相关的文件系统驱动来驱动该磁盘设备,从而读取根分区(鸡和蛋问题);这时候给内核提供了一个minilinux,即initrd,其中含有内核所需的一些基本模块驱动,该linux只在内存中运行。

内核启动时展开该initrd来加载相应的驱动,在该驱动的补充之下从而挂载上根分区;4. 然后运行根分区脚本/sbin/init 来初始化系统;这个客户自行程序运行会读取初始化配置文件inittab:在其中顺序定义并运行的有1.默认的运行级别 2.默认的系统服务初始化脚本sysinit位置 3.各种运行级别;系统会根据默认的运行级别,来对应执行相应级别下的脚本,该处脚本是链接文件,链接到init.d中相对应的文件,真正运行的是init.d里的脚本)。

注:rc N;表示用rc脚本去运行rc N.d目录下的脚本;rc脚本就是去执行所需级别脚本的功能脚本;目录下的文件均为脚本链接文件,指向/etc/rc.d/rcN.d/目录,并且命名时以S或K 开头,后面跟上0-99的数字;S代表启动时执行;K代表关闭时执行;01-99代表启动或关闭的级别(数字越小越优先)5.初始化结束前执行最后一个文件:/etc/rc.d/rc.local,系统会读取该脚本中的所有命令并执行一遍;但是该脚本只在启动时执行一次,系统关闭时不能执行,所以不要为了实现开机启动而将某些服务写入这个脚本,那样会造成服务关机时的非正常关闭;注:内核:模块化设计,大部分设备模块是在需要时加载驱动,并且大部分模块的驱动放置于根分区上。

Linux 的启动流程作者:阮一峰第一步、加载内核操作系统接管硬件以后,首先读入/boot 目录下的内核文件。

以我的电脑为例,/boot 目录下面大概是这样一些文件:$ ls /bootconfig-3.2.0-3-amd64config-3.2.0-4-amd64grubinitrd.img-3.2.0-3-amd64initrd.img-3.2.0-4-amd64System.map-3.2.0-3-amd64System.map-3.2.0-4-amd64vmlinuz-3.2.0-3-amd64vmlinuz-3.2.0-4-amd64第二步、启动初始化进程内核文件加载以后,就开始运行第一个程序/sbin/init,它的作用是初始化系统环境。

由于init是第一个运行的程序,它的进程编号(pid)就是1。

其他所有进程都从它衍生,都是它的子进程。

第三步、确定运行级别许多程序需要开机启动。

它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。

init进程的一大任务,就是去运行这些开机启动的程序。

但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。

Linux 允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。

也就是说,启动时根据"运行级别",确定要运行哪些程序。

Linux预置七种运行级别(0-6)。

一般来说,0是关机,1是单用户模式(也就是维护模式),6是重启。

运行级别2-5,各个发行版不太一样,对于Debian来说,都是同样的多用户模式(也就是正常模式)。

init进程首先读取文件/etc/inittab,它是运行级别的设置文件。

如果你打开它,可以看到第一行是这样的:id:2:initdefault:initdefault的值是2,表明系统启动时的运行级别为2。

如果需要指定其他级别,可以手动修改这个值。

那么,运行级别2有些什么程序呢,系统怎么知道每个级别应该加载哪些程序呢?......回答是每个运行级别在/etc目录下面,都有一个对应的子目录,指定要加载的程序。

/etc/rc0.d/etc/rc1.d/etc/rc2.d/etc/rc3.d/etc/rc4.d/etc/rc5.d/etc/rc6.d上面目录名中的"rc",表示run command(运行程序),最后的d表示directory(目录)。

相关文档
最新文档