【Linux导论】Linux引导流程(The Boot Process)

原文

LFS101x.2 Introduction to Linux (Linux Foundation)

Chapter 03: Linux Structure and Installation - Section 2: The Boot Process


引导流程 - (The Boot Process)

你是否想过,在你按下电源开关直至Linux登陆提示出现时,后台到底发生了哪些事?

Linux的引导过程是系统初始化的过程。它包含了第一次打开计算机直至用户界面完全运作之间的一切。

一旦你开始使用Linux,你会发现,深入理解系统的引导流程,可以帮助你快速诊断故障,同时也可以帮助你调整计算机性能以满足你的要求。

1.BIOS - The First Step

启动一台基于x86的Linux系统包含很多步骤。当计算机开机后,基本输入输出系统(Basic Input/Output System,BIOS)会初始化硬件,例如显示屏、键盘等等,并且测试主存储器。这个步骤被称为上电自检(Power On Self Test,POST)。

BIOS软件被存储在主板的一块ROM芯片中。在这个步骤之后,剩余的引导流程将会交给操作系统完成。

2.Master Boot Records (MBR) and Boot Loader

一旦完成上电自检(POST),系统的控制权由BIOS转给引导加载程序(boot loader)。引导加载程序通常存储在系统的其中一个硬盘中,要么在启动扇区(boot sector,对于传统的BIOS/MBR系统)中,要么在EFI分区(EFI partition,对于最近标准的可扩展固件接口,或称为EFI/UEFI系统)中。到这个阶段,机器还不能访问任何大规模存储设备。然后,日期、时间等信息,以及重要的外围设备从CMOS(一项基于电池供电的存储技术,保证系统掉电后仍可以记录日期和时间)中加载至系统。

有许多种适用于Linux的引导加载程序;最常见的是GRUB(用于统一引导加载程序)和ISOLINUX(用于从移动设备中启动)。大多数的Linux引导程序可以提供一个用户界面,用于选择Linux的可选引导项,甚至可以选择其他已安装的操作系统。当引导Linux之时,引导加载程序负责加载内核镜像(kernel image)以及初始RAM磁盘(initial RAM disk,包含一些关键文件和启动系统所需的驱动程序)到内存中。


3.Boot Loader in Action

引导加载程序包含两个不同的阶段:

The First Stage

对于使用BIOS/MBR方式的系统,引导加载程序存放在硬盘的第一个扇区,也被成为主引导记录(Master Boot Record,MBR)。MBR的大小仅仅512字节。在这个阶段,引导加载程序检查分区表,并找到一个可引导分区。一旦它找到了可引导分区,它将搜索第二阶段的引导加载程序,例如GRUB,并且将它加载到随机存储器(Random Access Memory,RAM)中。

对于使用EFI/UEFI方式的系统,UEFI固件读取引导管理器(Boot Manager)数据,以决定哪个UEFI应用启动且从哪启动(从哪个磁盘和分区可以找到EFI分区)。然后这个固件启动这个UEFI应用,例如GRUB,这个UEFI应用被定义为固件引导管理器的引导入口。这个过程更为复杂,但是比以往MBR方式更为灵活。

The Second Stage

第二阶段的引导加载程序位于 /boot 目录下。一个显示画面会出现,让我们选择引导哪个操作系统(Operating System,OS)。在选择完OS之后,引导加载程序加载选定操作系统的内核到RAM,然后将控制权交给它。

引导程序加载了选定的内核镜像(如果是Linux)并将控制权给它之后。内核几乎总是被压缩的,所以它的第一件事就是解压内核文件。然后,它会检查并分析系统硬件,并初始化内核中存在的所有硬件设备驱动。


4.Linux Kernel

引导程序将内核和一个基于RAM的初始文件系统(initramfs)加载到内存,使得initramfs可以被内核直接使用。

当内核在RAM中加载完毕,它会立刻初始化并配置计算机内存,同时也配置所有的系统硬件。这包括所有的处理器、I/O子系统、存储设备等等。内核同时也加载一些必要的用户空间程序。

5.初始RAM磁盘

initramfs文件系统镜像包含程序文件和二进制文件,这些文件可以完成挂载root文件系统所需的所有操作。比如,给所需的文件系统提供内核功能,给大容量存储控制器提供设备驱动udev(为用户设备),这些驱动负责找出哪些设备可用,定位这些设备正常工作所需的驱动,并且加载它们。当找到root文件系统之后,检测是否有错,并挂载文件系统。

挂载(mount)程序会指示操作系统,文件系统已经可用,并将文件系统全局层次的一个特定点与之关联,这个点称为挂载点(themount point)。如果操作成功,initramfs将会从RAM中清除,然后root文件系统下(/sbin/init)的init程序将会执行。

init程序处理挂载和跳转到最终实际的root文件系统。如果在大容量存储器可以访问之前,需要一些特殊的硬件驱动,这些驱动必须包含在initramfs镜像中。


6./sbin/init 和服务

一旦内核设置完所有的硬件并挂载root文件系统,内核执行 /sbin/init程序。然后,这变成了初始化进程,然后开始其他进程以使得系统运转。大多数系统上的进程,追其来源,都来自与init;例外的是内核进程,内核进程直接由内核启动,管理操作系统的内部细节。

传统上,这个进程启动所使用的约定,可以追溯到System V UNIX时期,系统运行是通过一系列的运行等级(runlevel)和一系列启动/停止服务的脚本来完成的。每个运行等级支持运行系统的不同模式。在每个运行等级,个人服务可以设置开始运行,或者停止运行。更新的发行版本抛弃了System V约定,但是通常为了兼容性仍支持System V约定。

除了启动系统,init还要负责保持系统运行或完全关闭系统。它扮演了所有非内核进程“最终管理者”的角色。当必要时会在进程结束后清理它们,当用户需要登陆/登出时会重启用户登录服务。


7.Text-Mode Login

在引导进程接近结束之时,init启动了一系列文本模式登陆提示(通过一个叫做getty的程序)。这使得你能够输入自己的用户名,密码,并最终进入命令shell界面。

通常,这个命令shell叫做bash(the GNUBourne Again Shell),但是也存在很多其他高级的命令shell可用。shell会打印出一个文本提示,表明已经准备好接受命令;当用户输入命令并敲击Enter键之后,命令会被执行,然后另一个文本提示会在命令执行后显示。

就如你在Command Line Operations章节所学到的那样,运行命令shell的终端可以通过ALT加功能键(functionkey)访问。大多数发行版本从F1或者F2开始,开启6个文本终端和一个图形终端。如果图形终端也启动了,那么切换至文本终端需要按CTRL+ALT再加上相应的功能键(F1或者F7是GUI)。如你接下来将简要看到的,如果你在一个纯文本模式,想要打开或重启图形桌面,需要运行startx命令。


8.X Window System

通常,在Linux桌面系统中,加载X Window System是引导进程的最后一步。

一个叫做显示管理器(display manager)的服务会被提供,用于保持显示追踪,并加载X Server(之所以这么叫它,是因为它给应用程序提供图形服务,有时也称为X clients)。这个显示管理器也负责图形登陆,在用户登录后打开特定的桌面环境。

9.More About the X Window System

一个桌面环境包括会话管理器(session manager,启动并保持图形会话组件),窗口管理器(the window manager,控制窗口、窗口标题栏、控制栏的放置和移动)。

尽管可以被混合,通常一系列工具、会话管理器和窗口管理器是作为一个整体使用,一起提供一个无缝的桌面环境。

如果显示管理器并不是以默认的运行等级启动,你可以以一种不同的方式启动X:在登陆进入文本模式终端后,通过在命令行运行startx命令开启X



转载于:https://www.cnblogs.com/lixuebin/p/10814880.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/458859.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/458859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

String类 写出类的成员函数实现

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com *************************************************** 已知String类定义如下: class String { public: String(const char *str …

android 管理类,android 线程管理类

1. 延时任务以及取消延时的应用场景:实时搜索,文字内容变化时候不发送请求,当停止变化指定时间后再发送请求2. 使用方法:// 回到主线程MainThreadHelper.runOnUIthread(new Runnable() {Overridepublic void run() {// pushActivi…

计算一行文本的高度

计算一行文本的高度 说明 有时候我们需要知道指定的几行文本的高度,此工具用于解决此种问题。 源码 // // NSStringLabelWidthAndHeight.h // ZiPeiYi // // Created by YouXianMing on 15/12/9. // Copyright © 2015年 YouXianMing. All rights reserved.…

python笔记-python编程优化:常用原则和技术介绍

本人翻译自《Exper Python Programming》 Premature optimization is the root of all evil in programming -Donald Knuth 优化的三原则 让它跑起来先一个非常常见的错误就是在编写代码之初我们就开始对代码进行优化。让人伤心的是这通常做的都是无用功,很多软…

C++成员函数重载、覆盖和隐藏的区别

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** C成员函数重载、覆盖和隐藏的区别class Base{public:void Walk(int x){ cout <<…

用fputc()函数以字符串形式写入字符到磁盘文件

2019独角兽企业重金招聘Python工程师标准>>> #include <stdio.h> #include <stdlib.h>int main(){FILE *fp;char ch;if((fpfopen("testfile", "a")) NULL){fprintf(stderr, "Error opening file.\n",fp);exit(1);}print…

android 浮动文字提示,Android实现自由拖动并显示文字的悬浮框

项目中需要实现一个状态显示的悬浮框&#xff0c;要求可以设置两种模式&#xff1a;拖动模式和不可拖动模式。实现效果图如下&#xff1a;实现步骤&#xff1a;1.首先要设置该悬浮框的基本属性&#xff1a;/*** 显示弹出框** param context*/SuppressWarnings("WrongConst…

Android4.2.2的Stagefright维护编解码器的数据流

这里是他们自己的源代码阅读点滴总结属性&#xff0c;转请注明出处&#xff0c;谢谢。欢迎和大家分享。qq:1037701636 email:gzzaigcn2012gmail.comAndroid源代码版本号Version&#xff1a;4.2.2; 硬件平台 全志A31前沿&#xff1a;在前面的博文中&#xff0c;基本提到的是stag…

PHP的安装

PHP的环境也是诸多服务器软件的必要因素之一&#xff0c;它是一个HTML内嵌式语言&#xff0c;在服务器端执行。由于PHP的开源高效化平台&#xff0c;所以搭建一个php环境是一个运维工程师必备的能力。现在lamp也有类似lnmp.org那种一键安装包&#xff0c;地址是http://yumlamp.…

android 横向铺满,Android开发全程记录(八)——设置ImageView显示的图片铺满全屏(适应魅族等不常见屏幕比例)...

为适应不同屏幕的手机&#xff0c;ImageView显示的图片可能不铺满屏幕&#xff0c;如果定高的话&#xff0c;两边可能会出现空白。魅族手机就会有这种情况&#xff0c;在其他手机里显示正常&#xff0c;在魅族手机里显示&#xff0c;图片左右两边会出现空白&#xff0c;为解决这…

tihs 关键字

//this关键词/*调用类中的属性 调用类中的方法或构造方法 调用当前对象&#xff0c;调用自己的方法&#xff0c;可以省略。 */ //http://blog.sina.com.cn/s/blog_71f6c1980100wtj4.html//this指当前对象自己public class Google{String s"hello";public Google(Stri…

良好的编程习惯

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 良好的编程习惯良好的习惯对于人的成长是非常重要的&#xff0c;良好的编程习惯对于我…

ntfs for mac使用注意事项有哪些?

2019独角兽企业重金招聘Python工程师标准>>> mac的用户有很多&#xff0c;一些用户朋友会发现自己的电脑是无法读写ntfs驱动器的。而ntfs驱动器又是一种常用的驱动器。面对这种情况我们可以选择用NTFS for Mac软件来帮助我们&#xff0c;它可以读写ntfs驱动器&#…

android音乐播放器文章,Android复习09【内容提供者、音乐播放器】

目 录PersonCpPersonCp.javainsert()ContentObserver音乐播放器1、添加读写权限1.1、动态权限授予(调用封装好的方法)2、获取音乐文件(MainActivity.java)2、Music.java(实体类)申请访问SD卡的权限设置适配器下拉刷新PersonCpPersonCp.javapackage cn.wangzg.personcp;import a…

程序员的业余项目

程序员的业余项目&#xff0c;我们也叫它 side project。 前几天&#xff0c;100offer 发起了一场活动叫 <寻找实干和坚持的技术力量>&#xff0c;他们是这么说的&#xff1a; 世界在被代码改变着&#xff0c;而我们在创造着代码。 仅仅是因为好玩&#xff0c;他开发了…

C语言的数组名和对数组名取地址

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 相信不少的C语言初学者都知道&#xff0c;数组名相当于指针&#xff0c;指向数组的首地…

小米 android 8,小米华为们谁最良心?10大手机厂商安卓8.0升级情况盘点

3月8日&#xff0c;谷歌放出了首个安卓9.0开发者预览版的固件包&#xff0c;不出意外的话&#xff0c;它的正式版会在今年正式亮相。但对广大安卓用户来说&#xff0c;想要立刻用上最新系统并非易事。目前来说&#xff0c;安卓碎片化问题依然严重&#xff0c;我们不妨现实点&am…

窥探Swift之数组安全索引与数组切片

在Swift中的数组和字典中下标是非常常见的&#xff0c;数组可以通过索引下标进行元素的查询&#xff0c;字典可以通过键下标来获取相应的值。在使用数组时&#xff0c;一个常见的致命错误就是数组越界。如果在你的应用程序中数组越界了&#xff0c;那么对不起&#xff0c;如果由…

大小端模式的快速判断方法

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 大小端的问题剖析&#xff1a; 嵌 入式系统开发者应该对Little-endian和Big-endian模…

【RAC】How to Proceed from Failed 11gR2 CRS Installation

Applies to: [ID 942166.1] Oracle Server – Enterprise Edition – Version: 11.2.0.1 to 11.2.0.2 – Release: 11.2 to 11.2 Generic UNIX Generic Linux Goal This goal of this note is to provide steps to proceed from failed 11gR2 Grid Infrastructure installat…