Linux操作系统启动过程详解
- 格式:doc
- 大小:207.50 KB
- 文档页数:9
Linuxreboot全过程⼀、版本说明嵌⼊式Linux 下⾯的reboot命令看似简单,但出问题时定位起来发现别有洞天。
下⾯就按在shell下执⾏reboot命令之后程序的执⾏过程进⾏解析。
Busybox:1.23.2 ——制作跟⽂件系统,/sbin/reboot程序的由来Libc:2.6.1 ——标准C库Linux kernel:2.6.35 ——内核版本⼆、流程简介如图所⽰是reboot的简要流程图。
普通的reboot是通过busybox为⼊⼝,进⼊halt_main函数,然后给init进程发送SIGTERM信号,init进程接收到信号后给其他进程发送终⽌信号,最后调⽤C库函数reboot,reboot通过系统调⽤sys_reboot进⼊内核,内核将整个系统重启。
其中在shell中执⾏reboot –f则通过halt_main直接调⽤C函数reboot,不经过init进程。
三、代码详解1.reboot命令端执⾏reboot命令,busybox检查当前命令为reboot,进⼊函数halt_main,reboot,halt和poweroff都会进⼊这个函数,不同的命令发送的信号和执⾏的操作不同。
现只分析reboot的情况。
代码如下1.int halt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;2.int halt_main(int argc UNUSED_PARAM, char **argv)3.{4.static const int magic[] = {RB_HALT_SYSTEM,6.RB_POWER_OFF,7.RB_AUTOBOOT8.};9.static const smallint signals[] = { SIGUSR1, SIGUSR2, SIGTERM };10.11.int delay = 0;12.int which, flags, rc;13.14./* Figure out which applet we're running */15.for (which = 0; "hpr"[which] != applet_name[0]; which++)16.continue;17.18./* Parse and handle arguments */19.opt_complementary = "d+"; /* -d N */20./* We support -w even if !ENABLE_FEATURE_WTMP,21.* in order to not break scripts.22.* -i (shut down network interfaces) is ignored.23.*/24.flags = getopt32(argv, "d:nfwi", &delay);25.26.sleep(delay);27.28.write_wtmp();29.30.if (flags & 8) /* -w */31.return EXIT_SUCCESS;32.33.if (!(flags & 2)) /* no -n */34.sync();35.36./* Perform action. */37.rc = 1;38.if (!(flags & 4)) { /* no -f *///TODO: I tend to think that signalling linuxrc is wrong 40.// pity original author didn't comment on it...41.if (ENABLE_FEATURE_INITRD) {42./* talk to linuxrc */43./* bbox init/linuxrc assumed */44.pid_t *pidlist = find_pid_by_name("linuxrc");45.if (pidlist[0] > 0)46.rc = kill(pidlist[0], signals[which]);47.if (ENABLE_FEATURE_CLEAN_UP)48.free(pidlist);49.}50.if (rc) {51./* talk to init */52.if (!ENABLE_FEATURE_CALL_TELINIT) {53./* bbox init assumed */54.rc = kill(1, signals[which]);55.} else {56./* SysV style init assumed */57./* runlevels:58.* 0 == shutdown59.* 6 == reboot */60.execlp(CONFIG_TELINIT_PATH,61.CONFIG_TELINIT_PATH,62.which == 2 ? "6" : "0",63.(char *)NULL64.);65.bb_perror_msg_and_die("can't execute '%s'",66.CONFIG_TELINIT_PATH);67.}68.}69.} else {70.rc = reboot(magic[which]);71.}72.if (rc)74.bb_perror_nomsg_and_die();75.return rc;76.}该函数判断reboot是否带了 -f 参数,如果带了,直接调⽤reboot调⽤C函数库如果没带,则通过kill(1, signals[which]);给init进程发送SIGTERM信号。
嵌入式linux系统的启动流程
嵌入式Linux系统的启动流程一般包括以下几个步骤:
1.硬件初始化:首先会对硬件进行初始化,例如设置时钟、中
断控制等。
这一步骤通常是由硬件自身进行初始化,也受到系统的BIOS或Bootloader的控制。
2.Bootloader引导:接下来,系统会从存储介质(如闪存、SD
卡等)的Bootloader区域读取引导程序。
Bootloader是一段程序,可以从存储介质中加载内核镜像和根文件系统,它负责进行硬件初始化、进行引导选项的选择,以及加载内核到内存中。
3.Linux内核加载:Bootloader会将内核镜像从存储介质中加载到系统内存中。
内核镜像是包含操作系统核心的一个二进制文件,它由开发者编译并与设备硬件特定的驱动程序进行连接。
4.内核初始化:一旦内核被加载到内存中,系统会进入内核初
始化阶段。
在这个阶段,内核会初始化设备驱动程序、文件系统、网络协议栈等系统核心。
5.启动用户空间:在内核初始化完毕后,系统将启动第一个用
户空间进程(init进程)。
init进程会读取并解析配置文件(如
/etc/inittab)来决定如何启动其他系统服务和应用程序。
6.启动其他系统服务和应用程序:在用户空间启动后,init进
程会根据配置文件启动其他系统服务和应用程序。
这些服务和应用程序通常运行在用户空间,提供各种功能和服务。
以上是嵌入式Linux系统的基本启动流程,不同的嵌入式系统可能会有一些差异。
同时,一些特定的系统也可以添加其他的启动流程步骤,如初始化设备树、加载设备固件文件等。
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. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
linux操作系统(第二版)课后习题答案Linux操作系统(第二版)课后习题答案在学习Linux操作系统的过程中,课后习题是非常重要的一部分。
通过做课后习题,我们可以更好地巩固所学的知识,加深对Linux操作系统的理解。
下面我将为大家总结一些常见的课后习题答案,希望对大家的学习有所帮助。
1. 什么是Linux操作系统?它有哪些特点?答:Linux操作系统是一种开源的Unix-like操作系统,具有多用户、多任务和多线程的特点。
它具有稳定性高、安全性好、性能优越等特点。
2. 请简要介绍Linux文件系统的组成结构。
答:Linux文件系统的组成结构包括根目录、用户目录、系统目录、设备文件、普通文件等。
其中根目录是整个文件系统的起点,用户目录是每个用户的个人目录,系统目录包括系统文件和程序文件,设备文件用于访问设备,普通文件包括文本文件、二进制文件等。
3. 请简要介绍Linux系统的启动过程。
答:Linux系统的启动过程包括硬件初始化、引导加载程序启动、内核初始化、用户空间初始化等步骤。
其中硬件初始化是指计算机硬件的自检和初始化,引导加载程序启动是指引导加载程序加载内核,内核初始化是指内核加载并初始化各种设备和服务,用户空间初始化是指启动系统的用户空间进程。
4. 请简要介绍Linux系统的文件权限管理。
答:Linux系统的文件权限管理包括文件所有者、文件所属组、文件权限等。
文件所有者是指文件的所有者,文件所属组是指文件所属的组,文件权限包括读、写、执行权限等。
5. 请简要介绍Linux系统的进程管理。
答:Linux系统的进程管理包括进程的创建、销毁、调度等。
进程的创建是指创建新的进程,进程的销毁是指销毁已有的进程,进程的调度是指对进程进行调度和管理。
通过以上课后习题的答案总结,我们可以更好地了解Linux操作系统的基本知识和常见操作。
希望大家在学习过程中多做课后习题,加深对Linux操作系统的理解,提高自己的操作技能。
Linux操作系统的配置流程和步骤如下:1. 打开终端,输入命令cd /opt,使用tar命令解压文件(tar -zxvf VMwareTools-10.0.0-2977863.tar.gz)。
2. 进入解压的目录(cd vmware-tools-distrib),安装vmware-install.pl文件(./vmware-install.pl)。
执行命令之后,一系列设置全部回车即可(安装需要一定的时间)。
3. 创建共享文件目录,比如在虚拟机中创建一个名为myshare 的文件夹。
右键虚拟机,点击设置:选择选项:点击添加:点击下一步,选择目标文件目录。
点击下一步:点击完成。
4. 在windows系统中的myshare目录下面创建文件hello.txt,并在文件里面输入hello。
5. 设置CPU和内存,CPU设置不能超过真机的一半,内存设置不要超过真机内存的一半1G-2G即可。
6. 设置网络类型,选择桥接。
7. 设置IO控制器和磁盘类型,选择默认推荐。
8. 创建虚拟机磁盘,设置磁盘大小,默认20G够用。
9. 点击CD/DVD,以ISO映像文件安装,点击浏览,选择系统镜像文件,点击确定。
10. 开启此虚拟机。
11. 点击第一行install,进行系统安装。
12. 选择语言,中文,完成后继续。
13. 软件选择带GUI的服务器。
14. KDUMP不启用。
15. 进入安装目标位置,下拉,选择我要配置分区,点击完成。
16. 进入磁盘分区界面,点击+号开始分区。
以上是Linux操作系统的配置流程和步骤,希望对解决您的问题有所帮助。
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”。
Slackware Linux操作系统启动过程详解Joe Brockme IE r 研究了Slackware Linux init 进程。
他讨论了系统如何初始化服务、各种运行级别是什么,以及如何从缺省安装中添加或除去服务来定制系统。
我们的示例使用x86 平台上的Slackware Linux 发行版(请参阅本文后面的参考资料)。
大多数信息可用于其它Linux 发行版,但在细节处会略有不同。
尤其是,与其说Slackware 的init 结构类似于System V 结构,还不如说它更类似于BSD Unix结构,尽管Slackware 的最新发行版中的程序做了一些让步,它们要将服务添加到启动,但期望这些服务是System V 目录结构。
(请参阅侧栏,“BSD 和系统V init 脚本之间的差异”。
)所有进程的父代当Linux 机器引导时,究竟会发生什么?在计算机的BIOS 完成其任务后,系统会读取硬盘(或软盘,或CD-ROM,或Zip 驱动器……Linux 是非常灵活的)的第一位,并会遇到引导装入程序。
虽然GRUB 和其它装入程序也逐渐变得流行,但通常这就是Linux 装入程序(LInux LOader),一般称作LILO。
然后LILO 将Linux 内核装入内存,并开始展示它的魔力。
Linux 内核初始化了诸如SCSI 卡之类的设备,以及其它内核中内置的硬件设备。
然后内核运行init,它是除内核之外在系统运行的第一个进程。
如果执行ps ax | grep 1 ,就会看到init 的进程ID (PID) 是1。
装入init 之后,它会读取inittab 以查看下一步做什么。
inittab 告诉init 要进入什么运行级别,以及在哪里可以找到该运行级别的配置文件。
运行级别运行级别是由系统上的所有服务在某个给定时间定义的(基本上是操作方式)。
Linux 可以有几种操作方式:单用户方式、单用户联网方式、多用户方式、始于X 窗口的多用户方式,等等。
操作系统的启动过程操作系统(Operating System,简称OS)是计算机系统中最基本的软件之一,它负责管理和控制计算机的硬件和软件资源,为用户和应用程序提供丰富的功能和良好的用户体验。
在计算机启动时,操作系统也需要经历一系列的启动过程,以确保系统能够正常运行。
下面将详细介绍操作系统的启动过程。
一、引导阶段(Bootstrapping Stage)在计算机加电启动后,首先会由计算机的固化ROM(Read-Only Memory)中的引导程序开始执行。
这个引导程序位于计算机的主板上,负责启动操作系统。
引导程序首先会检测计算机中是否有可引导的设备,比如硬盘、光盘、USB等。
一旦发现可引导设备,引导程序就会将该设备中特定的引导扇区(Boot Sector)加载到计算机的内存中。
二、引导扇区的执行当引导扇区被加载到内存后,计算机的控制权交给了引导扇区中的代码。
引导扇区中的代码被称为引导加载程序(Boot Loader),它是一段特殊的机器指令,负责进一步加载操作系统的核心部分。
三、操作系统核心加载引导加载程序会根据预先设定的规则和算法,搜索计算机硬件设备,找到存放操作系统的特定分区或文件。
然后,它将操作系统的核心部分一次性地加载到计算机的内存中。
操作系统核心通常被保存为一个或多个可执行文件,也被称为内核(Kernel)。
四、内核初始化当操作系统核心被加载到内存后,内核开始执行,并进入初始化阶段。
在这个阶段,内核会对计算机的硬件进行自检和初始化,包括对处理器、内存、设备等的初始化操作。
内核还会为各个子系统和模块分配和初始化资源,准备操作系统运行时所需要的环境。
五、用户空间初始化在内核初始化完成后,操作系统会创建一个或多个用户空间(User Space)。
用户空间是操作系统为应用程序和用户提供的执行环境。
操作系统会根据系统配置和用户需求,初始化用户空间中的各个组件,比如图形界面、网络服务、文件系统等。
linux启动顺序讲解⼀、简单介绍RHEL开机时的先后顺序BIOS —> MBR —> Kernel —> init1、当电脑⼀打开电源时电脑就会进⼊BIOS(BIOS的⼯作主要是检测⼀些硬件设备);2、检测完后会进⼊MBR也就是boot loader(MBR位于硬盘的第⼀个扇区总共512bytes,其中前446bytes⾥⾯的编码是在选择引导分区也就是决定要由哪个分区来引导);3、载⼊系统的Kernel(核⼼),在Kernel⾥主要是载⼊电脑设备的驱动程序,以便可以控制电脑上的设备,并且以只读⽅式来挂载根⽬录,也就是⼀开始只能读取到根⽬录所对应的那个分区,所以/etc、/bin、/sbin、/dev、/lib这五个⽬录必须同根⽬录在⼀个分区中;4、最后启动init这个程序,所以init这个程序的进程编号为1,是Linux中第⼀个执⾏的程序;init这个程序会根据Run level来执⾏以下这些程序:·/etc/rc.d/rc.sysinit;·/etc/rc.d/rc 和etc/rc.d/rc?.d/·/etc/rc.d/rc.local·如果有适当的图形界⾯管理程序⼆、BIOS初始化时主要的三个任务BIOS(B asic I nput/O utput S ystem)1、电脑周边设备的检测,加电⾃检POST (Power on self test);2、BIOS会选择要由哪⼀个设备来开机,例如:软盘启动、光盘启动、⽹络启动、最常见的从硬盘启动;3、选择好由哪个设备开机后,就开始读取这个设备的MBR 引导扇区;三、介绍Boot Loader中的主要⼯作1、Boot Loader可以安装在两个地⽅:·安装在硬盘的MBR中;·当有时候MBR中被其他开机管理程序占⽤就可以将Boot Loader 安装在硬盘中的其中⼀个分区的引导扇区上,;2、Boot Loader的程序码分为两个阶段:(1)Boot Loader第⼀阶段的程序码⾮常⼩,只有446bytes,可以存⼊在MBR或是某⼀个分区的引导扇区⾥,(2)Boot Loader第⼀阶段的程序码是从boot 分区来载⼊的,就是说Boot Loader 第⼆阶段程序码存放在/boot 这个分区中;3、下⾯来看三个Boot Loader 的开机流程范例,如在⼀块硬盘中安装了两个系统分别为:windows 2003 和Red hat linux当电脑开机后,会先载⼊MBR通过第⼀阶段程序码来载⼊第⼆阶段程序码,进⼊GRUB开机菜单这⾥选择哪个系统就会载⼊相应的核⼼;四、介绍GRUB和grub.conf 这个配置⽂件的内容其实从MBR载⼊Boot Loader开始,载⼊Kernel,载⼊init这些程序之间都是由GRUB这个多重开机管理程序所负责的。
计算机及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系统中,终端命令是进行各种操作的重要方式之一。
在日常使用中,系统重启和关机是常见的操作之一,本文将介绍几个优雅地进行系统重启和关机的终端命令技巧。
1. 查看当前系统状态在进行重启和关机之前,我们首先需要查看当前系统的状态,确保没有正在进行的重要操作或需要保存的文件。
可以使用以下命令查看系统的负载情况和运行的进程:```bashtop```命令执行后,会实时展示系统的CPU使用率、内存使用情况以及各个进程的运行情况。
通过观察这些信息,可以判断系统是否稳定,是否可以进行重启或关机操作。
2. 优雅重启系统在进行系统重启之前,我们首先要确保将所有的数据保存并关闭正在运行的程序。
使用以下命令可以优雅地重启系统:```bashsudo shutdown -r now```执行该命令后,系统将会立即进入重启过程。
参数`-r`表示重启,`now`表示立即执行。
在执行该命令后,系统会发送一个通知,告诉所有登录用户系统将要重启,并显示一个倒计时计时器。
用户可以根据需要选择终止重启操作或者继续等待系统重启。
3. 优雅关机系统在进行系统关机之前,同样需要确保将所有的数据保存并关闭正在运行的程序。
使用以下命令可以优雅地关机系统:```bashsudo shutdown -h now```执行该命令后,系统会立即进入关机过程。
参数`-h`表示关机,`now`表示立即执行。
同样,在执行该命令后,系统会发送一个通知,告诉所有登录用户系统将要关机,并显示一个倒计时计时器。
用户可以根据需要选择终止关机操作或者继续等待系统关机。
4. 延迟执行重启或关机操作有时候,我们可能需要延迟执行重启或关机操作,例如在一段时间后进行操作或在系统闲置时执行。
使用以下命令可以延迟执行重启或关机操作:```bashsudo shutdown -r +5sudo shutdown -h +10```上述命令中的`+5`和`+10`表示分别延迟5分钟和10分钟执行重启和关机操作。
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系统的启动过程接触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 reboot调用流程一、引言在使用Linux操作系统过程中,重启系统是一个常见的操作。
本文将介绍Linux中reboot命令的调用流程,包括该命令的功能、使用方法以及内部实现原理。
二、reboot命令的功能和使用方法reboot命令是Linux系统提供的一个用于重启系统的命令。
通过执行reboot命令,可以将系统重新启动,使之进入重启流程。
使用reboot命令的方法非常简单,只需要在终端中输入"reboot"即可。
在执行命令之前,用户需要拥有足够的权限,通常需要是root用户或具有sudo权限的用户。
在输入命令后,系统会进行一系列的操作,最终实现系统的重启。
三、reboot命令的调用流程1. 用户输入reboot命令。
2. 系统解析命令,确定命令为reboot。
3. 系统检查当前用户的权限,如果权限不足,则提示用户需要提升权限。
4. 系统发送信号给init进程。
5. init进程接收到信号后,判断信号类型为重启信号。
6. init进程向所有其他进程发送SIGTERM信号,要求它们进行退出操作。
7. 其他进程接收到SIGTERM信号后,进行清理工作,并向init进程发送SIGCONT信号,表示清理完成。
8. init进程等待一段时间,以确保其他进程完成清理工作。
9. init进程向内核发送重启命令。
10. 内核收到重启命令后,关闭所有系统设备和文件系统。
11. 内核重新初始化系统硬件。
12. 内核加载引导程序,并将控制权交给引导程序。
13. 引导程序加载操作系统内核。
14. 操作系统内核启动,并进行初始化操作。
15. 操作系统内核加载系统服务和驱动。
16. 操作系统初始化完成后,系统进入用户空间。
17. 用户空间加载用户配置和应用程序。
18. 用户可以重新登录系统。
四、reboot命令的内部实现原理reboot命令的内部实现原理涉及到操作系统内核和相关的系统进程。
当用户输入reboot命令后,系统会首先通过解析命令确定其为reboot命令,并检查用户的权限。
Linux操作系统启动过程详解TUNA 发表于2012-09-12分类: IT运维376 次阅读4 条评论如果你对Linux操作系统有一定的了解,想对其更深层次的东西做进一步探究。
这当中就包括系统的启动流程、文件系统的组成结构、基于动态库和静态库的程序在执行时的异同、协议栈的架构和原理、驱动程序的机制等等。
其中Linux操作系统启动过程肯定是大家最有兴趣了解的,这里在综合了现有网上大家智慧的基础上,基于2.6.32的内核的CentOS 6.0系统,对Linux的启动流程做了些分析,希望对大家有所帮助。
OK,我们言归正传。
对于一台安装了Linux系统的主机来说,当用户按下开机按钮时,一共要经历以下几个过程,如图:其中,每个过程都执行了自己该做的初始化部分的事情,有些过程又可分为好几个子过程。
接下来,我们就对每个阶段做一个详细分析和讲解。
一、BIOS自检稍有计算机基础的人都应该听过BIOS(Basic Input / Output System),又称基本输入输出系统,可以视为是一个永久地记录在ROM中的一个软件,是操作系统输入输出管理系统的一部分。
早期的BIOS芯片确实是”只读”的,里面的内容是用一种烧录器写入的,一旦写入就不能更改,除非更换芯片。
现在的主机板都使用一种叫Flash EPROM的芯片来存储系统BIOS,里面的内容可通过使用主板厂商提供的擦写程序擦除后重新写入,这样就给用户升级BIOS提供了极大的方便。
BIOS的功能由两部分组成,分别是POST码和Runtime服务。
POST阶段完成后它将从存储器中被清除,而Runtime服务会被一直保留,用于目标操作系统的启动。
BIOS两个阶段所做的详细工作如下:步骤1:上电自检POST(Power-on self test),主要负责检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常。
例如,最常见的是内存松动的情况,BIOS自检阶段会报错,系统就无法启动起来;步骤2:步骤1成功后,便会执行一段小程序用来枚举本地设备并对其初始化。
这一步主要是根据我们在BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器,如硬盘、光盘、U盘、软盘和网络等。
我们以硬盘启动为例,BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。
实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行。
至此,BIOS的任务就完成了,此后将系统启动的控制权移交到MBR部分的代码。
PS: 在个人电脑中,Linux的启动是从0xFFFF0地址开始的。
二、系统引导我们首先来了解一下MBR,它是Master Boot Record的缩写。
硬盘的0柱面、0磁头、1扇区称为主引导扇区。
它由三个部分组成,主引导程序(Bootloader)、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA),其结构图如下所示:磁盘分区表包含以下三部分:1. Partition ID (5:延申82:Swap 83:Linux 8e:LVM fd:RAID)2. Partition起始磁柱3. Partition的磁柱数量通常情况下,诸如lilo、grub这些常见的引导程序都直接安装在MBR中。
我们以grub为例来分析这个引导过程。
grub引导也分为两个阶段stage1阶段和stage2阶段(有些较新的grub又定义了stage1.5阶段)。
1. stage1:stage1是直接被写入到MBR中去的,这样机器一启动检测完硬件后,就将控制权交给了GRUB的代码。
也就是上图所看到的前446个字节空间中存放的是stage1的代码。
BIOS将stage1载入内存中0x7c00处并跳转执行。
stage1(/stage1/start.S)的任务非常单纯,仅仅是将硬盘0头0道2扇区读入内存。
而0头0道2扇区内容是源代码中的/stage2/start.S,编译后512字节,它是stage2或者stage1_5的入口。
而此时,stage1是没有识别文件系统的能力的。
如果感觉脑子有些晕了,那么下面的过程就直接跳过,去看stage2吧!【外传】定位硬盘的0头0道2扇区的过程:BIOS将stage1载入内存0x7c00处并执行,然后调用BIOS INIT13中断,将硬盘0头0道2扇区内容载入内存0×7000处,然后调用copy_buffer将其转移到内存0×8000处。
在定位0头0道2扇区时通常有两种寻址方式:LBA和CHS。
如果你是刨根问底儿型的爱好者,那么此时去找谷哥打听打听这两种方式的来龙去脉吧。
2. stage2:严格来说这里还应该再区分个stage1.5的,就一并把stage1.5放在这里一起介绍了,免得大家看得心里乱哄哄的。
好的,我们继续说0头0到2扇区的/stage2/start.S文件,当它的内容被读入到内存之后,它的主要作用就是负责将stage2或stage1.5从硬盘读到内存中。
如果是stage2,它将被载入到0×820处;如果是stage1.5,它将被载入到0×2200处。
这里的stage2或者stage1_5不是/boot分区/boot/grub目录下的文件,因为这个时候grub还没有能力识别任何文件系统。
Ø如果start.S加载stage1.5:stage1.5它存放在硬盘0头0道3扇区向后的位置,stage1_5作为stage1和stage2中间的桥梁,stage1_5有识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的stage2文件,将stage2载入内存并执行。
Ø如果start.S加载stage2:同样,这个stage2也不是/boot分区/boot/grub目录下的stage2,这个时候start.S读取的是存放在/boot分区Boot Sector的stage2。
这种情况下就有一个限制:因为start.S通过BIOS中断方式直接对硬盘寻址(而非通过访问具体的文件系统),其寻址范围有限,限制在8GB以内。
因此这种情况需要将/boot分区分在硬盘8GB寻址空间之前。
假如是情形2,我们将/boot/grub目录下的内容清空,依然能成功启动grub;假如是情形1,将/boot/grub目录下stage2删除后,则系统启动过程中grub会启动失败。
三、启动内核当stage2被载入内存执行时,它首先会去解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核。
而内核会立即初始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等。
关于Linux的设备驱动程序的加载,有一部分驱动程序直接被编译进内核镜像中,另一部分驱动程序则是以模块的形式放在initrd(ramdisk)中。
Linux内核需要适应多种不同的硬件架构,但是将所有的硬件驱动编入内核又是不实际的,而且内核也不可能每新出一种硬件结构,就将该硬件的设备驱动写入内核。
实际上Linux的内核镜像仅是包含了基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入initrd 。
这样在以后启动系统时,一部分设备驱动就放在initrd中来加载。
这里有必要给大家再多介绍一下initrd这个东东:initrd 的英文含义是bootloader initialized RAM disk,就是由boot loader 初始化的内存盘。
在linu2.6内核启动前,boot loader 会将存储介质中的initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的initrd 文件系统。
在boot loader 配置了initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行initrd 文件系统中的init,完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的/sbin/init 进程。
另外一个概念:initramfsinitramfs 是在kernel 2.5中引入的技术,实际上它的含义就是:在内核镜像中附加一个cpio包,这个cpio包中包含了一个小型的文件系统,当内核启动时,内核将这个cpio包解开,并且将其中包含的文件系统释放到rootfs中,内核中的一部分初始化代码会放到这个文件系统中,作为用户层进程来执行。
这样带来的明显的好处是精简了内核的初始化代码,而且使得内核的初始化过程更容易定制。
疑惑的是:我的内核是2.6.32-71.el6.i686版本,但在我的/boot分区下面却存在的是/boot/initramfs-2.6.32-71.el6.i686.img类型的文件,没搞明白,还望高人解惑。
我只知道在2.6内核中支持两种格式的initrd,一种是2.4内核的文件系统镜像image-initrd,一种是cpio格式。
接下来我们就来探究一下initramfs-2.6.32-71.el6.i686.img里到底放了那些东西。
在tmp文件夹中解压initrd.img里的内容:如果initrd.img文件的格式显示为“initrd.img:ISO 9660 CD-ROM filesystem data”,则可直接输入命令“mount -o loop initrd.img /mnt/test”进行挂载。
通过上的分析和我们的验证,我们确实得到了这样的结论:grub的stage2将initrd加载到内存里,让后将其中的内容释放到内容中,内核便去执行initrd中的init脚本,这时内核将控制权交给了init文件处理。
我们简单浏览一下init脚本的内容,发现它也主要是加载各种存储介质相关的设备驱动程序。
当所需的驱动程序加载完后,会创建一个根设备,然后将根文件系统rootfs 以只读的方式挂载。
这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,执行系统的1号进程。
此后系统的控制权就全权交给/sbin/init进程了。
四、初始化系统经过千辛万苦的跋涉,我们终于接近黎明的曙光了。
接下来就是最后一步了:初始化系统。
/sbin/init进程是系统其他所有进程的父进程,当它接管了系统的控制权先之后,它首先会去读取/etc/inittab文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等。
主要包括以下工作:1. 执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统算是基本运行起来了,后面需要进行运行级别的确定及相应服务的启动。