最详细最易理解的linux启动流程解读及相关问题,万字高能无废话

linux启动流程

linux的启动流程是运维所必须非常理解的东西,因为它将会是我们在发生服务器开不起机等情况的主要排错手段,充分理解了liunx的启动流程能够助力我们对此类故障的快速定位和处理。
废话少说,全是干货。

首先直接将linux启动的几个重点步骤给大家列出来方便大家记忆,然后再逐一详细分析。
liunx启动流程分为以下几个步骤
BIOS加电自检—MBR引导—加载grub界面—加载liunx内核参数及文件系统—运行init进程—系统初始化—用户登录系统
其中前四个步骤都属于引导内核。

一、BIOS加点自检详解

1. BIOS是什么?

它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序系统设置信息开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

相关介绍可以参考另一位博主写的文档bios详细解读
重点要知道BIOS是主板上的一个rom芯片上的程序,以及他的作用。

2. BIOS在启动流程中的作用?

上面简单的提到了BIOS的作用,是最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。
BIOS 的工作

  1. 检测连接硬件检测的目的是以后把这些设备信息提供给操作系统。
    微机接通电源后,系统将有一个对内部各个设备进行检查的过程,这是由一个通常称之为POST(Power On Self Test,上电自检)的程序来完成的。这也是BIOS的一个功能。完整的POST自检将包括CPU、640K基本内存、1M以上的扩展内存、ROM、主板、 CMOS存贮器、串并口、显示卡、软硬盘子系统及键盘测试。
    POST自检测过程大致为:加电-CPU-ROM-BIOS-System Clock-DMA-64KB RAM-IRQ-显卡等,也就是CPU–内存–显卡–硬盘自检中若发现问题,系统将给出提示信息或鸣笛警告
  2. 寻找启动磁盘,每一种BIOS都会有开机启动菜单,可以在菜单里设置以哪个设备启动系统,比如:光驱,硬盘,网络等等,这个菜单可以设置多个选项,依照设置次序在设备上寻找启动信息
    在完成POST自检后,ROM BIOS将按照系统CMOS设置中的启动顺序搜寻软硬盘驱动器及CDROM、网络服务器等有效的启动驱动器 ,读入操作系统引导记录,然后将系统控制权交给引导记录,由引导记录完成系统的启动

1)先试着寻找第一个扇区,也就是主引导记录MBR(Master Boot Record)
2)如果第一个扇区上没有没有存在操作系统,再去寻找标记为BOOT的分区.
不论是MBR还是BOOT分区,存储操作系统的空间都只有446字节;
如果没有在上面提到的位置找到操作系统的内核,那么BIOS就无法继续启动工作.

而我们的内核往往会大于446个字节,存放在磁盘的其他位置上,既然446装不下内核,又为了能顺利的找到放在其他位置上的内核,人们想出了一个办法就在446字节里写了一个小程序,当BIOS试着启动操作系统时就会执行这个小程序,然后再由小程序来载入其他位置的内核.这个小程序就是启动载入器(boot loader) grub
linux的boot loader(上文提到的小程序) 常见的有两种:lilo grub
因为lilo存在着一个1024柱面的限制,并且更改了磁盘上的启动信息文件后需要重新启动系统才能同步446字节的内容,因为lilo的缺陷,已经被grub所取代.现在的绝大多数类linux系统都采用grub做boot loader;
grub则没有了lilo各种限制,而且方便到能修改系统文件的启动内容就可以立刻与446内容同步.

3.BIOS常见问题

1.)无法进入BIOS

一、原因分析

1、用户在安装的时候没有弄清楚自己的主板品牌,把启动键按错了。
2、开机时内存检测很长时间。

二、解决方案

1、安装系统之前最主要的是先要弄清楚主板的是什么品牌的,因为不同品牌,进入BIOS界面的启动键不一样。
2、U盘启动时,不同品牌的电脑主板BIOS启动的快捷方法也有很多不同的。(比如华硕主板就是F8)
3、内存检测是电脑启动的必须过程。
如果在BIOS设置中没有把“Quick Power On Self Test”项设置成“Enabled”,那么内存就会自检3次,故要将这个选项设置为“Enabled”后按F10保存即可。[3]

bios恢复出厂设置步骤
1、开机不停按Delete键(笔记本一般是F2键)进入BIOS设置界面。
2、选择“Exit”菜单下面的“Load Setup Defaults”并按回车,选择“Yes”之后,再次回车。
3、按“F10”键,选择“Yes”之后回车,此时系统会重启,BIOS主板成功恢复出厂设置。

2.) 开机时BIOS不能设置了怎么办?

BIOS只有在开机时才能设置故障现象:电脑开机后进入BIOS设置程序,除了可以设置“用户口令”、“保存修 改退出”和“不保存退出”3项外,其他都不能进入。
解决方法:通常出现这种情况是因为CMOS被破坏了,执行放电处理试试。如果CMOS放电后故障依然存在,还可以尝试升级BIOS的方法,如果故障还是无法解决,那可能是CMOS存储器有问题,只要更换一下存储器就可以了。

3.)BIOS升级后不能用U盘装系统的解决方法

1、将BIOS恢复为默认状况:进入BIOS设置界面,在“EXIT”栏目下选择“Load Setup Defaults”。
2、在“Main”栏目下,找到并修改“F12 Boot Menu”为“Enable”,按F10键保存。
3、重新启动系统,按F12选择U盘启动,一般就能正常使用U盘安装系统了。
4、如果问题仍旧,那可能是由于U盘启动制作工具的问题了,可尝试更换一个制作工具试试。

4.)bios密码设置:

1、首先我们要启动电脑,接着要按下“Del”的键进到BIOS设置的主界面。
2、接着要在BIOS主菜单中,有两样设置密码的选项,它们就是“Set Supervisor Password”(设置超级用户的密码)和“Set User Password”(设置用户的密码)。
3、按照需求选中其中的一个,接着要按下回车键,就能够出现Enter Password的对话框,键入密码。要是你是首次进行这项的设定,键入口令别超过8个字符,在键入的时候,屏幕不能够显示键入的口令,注意这个密码是有大小写的区别的,键入好了之后要按下回车键。
4、然后就能够出现Confirm Password的对话框进行密码的校验,再一次键入一样的密码(提醒下:要是两次键入的密码是不一样的,那么就要求你重新键入)。
5、最后要在BIOS主菜单中,选中“Advanced BIOS Features”(高级BIOS功能的设置)的项,使用光标键选中“Security Option”的项之后,使用键盘上的“Page Up或Page Down”的键将选项改成System。

BIOS小结

BIOS的主要作用是检测连接硬件提供给操作系统和寻找启动(设备)硬盘并找到主引导记录MBR移交控制权使其完成接下来的加载grub界面以此来找到并加载内核…

这里提到了MBR和grub正是接下来要详解的步骤

二、MBR与GPT详解

上文对MBR已经有了简单的介绍,MBR是主引导记录,其引导代码储存在第一块磁盘的第一个扇区中,容量为512字节。它负责磁盘操作系统(DOS)对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由磁盘操作系统(DOS)在对硬盘进行初始化时产生的。BIOS在启动检测读入操作系统引导记录,然后将系统控制权交给了主引导记录也就是MBR

那么MBR详细来说是什么呢?GPT又是什么呢?

1. MBR与GPT详解

在Linux中对磁盘分区有两个方案,分别就是MBR与GPT。
对于Legacy BIOS+MBRUEFI BIOS+GPT这俩种技术而言,后者虽然使用人群不大,但是更先进,GPT是一个正逐渐取代MBR的新标准。

1.)MBR分区

MBR的意思是“主引导记录”,是IBM公司早年间提出的。它是存在于磁盘驱动器开始部分的一个特殊的启动扇区。**这个扇区包含了已安装的操作系统系统信息,并用一小段代码来启动系统。
**如果你安装了Windows,其启动信息就放在这一段代码中——如果MBR的信息损坏或误删就不能正常启动Windows,这时候你就需要找一个引导修复软件工具来修复它就可以了。Linux系统中MBR通常会是GRUB加载器

2.)GPT分区

GPT的意思是GUID Partition Table,即“全局唯一标识磁盘分区表”。它是另外一种更加先进新颖的磁盘组织方式,一种使用UEFI启动的磁盘组织方式。最开始是为了更好的兼容性,后来因为其更大的支持内存(mbr分区最多支持2T的磁盘,GPT支持2T以上的),更多的兼容而被广泛使用,特别是苹果的MAC系统全部使用gpt分区。gtp不再有分区的概念,所有CDEF盘都在一段信息中存储。可以简单的理解为更先进但是使用不够广泛的技术。因为兼容问题,gpt其实在引导的最开始部分也有一段mbr引导,也叫做“保护引导”,为了防止设备不支持UEFI

3.)MBR分区方案特点:

1、最多支持四个主分区,后续为拓展分区。
2、在Linux上使用扩展分区和逻辑分区最多可以创建15个分区,
3、由于分区中的数据以32位存储,使用MBR分区是最大支持2T空间。
4、fdisk管理工具只能创建MBR分区
5、MBR有自己启动代码,一旦启动代码被破坏,系统就没法启动,只有通过修复才能启动系统。
6、在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中。

4.)GPT分区方案特点

1、是UEFI标准的一部分,主板必须要支持UEFI标准
2、GPT分区列表支持最大18EB(1EB=1024PB)
3、GPT分区表类型的硬盘不受分区个数的限制。
4、没有主分区,扩展分区和逻辑分区的概念,所有分区都能格式化
5、gdisk管理工具可以创建GPT分区
6、GPT减少了分区表损坏的风险,GPT在硬盘最后保存了一份分区表的副本。
7、在GPT硬盘中,分区表的位置信息储存在GPT头中。

5.)选择方案

如果你的硬盘超过2T,那么你必须选择GPT+UEFI,2t以下就无所谓了;
如果你对电脑不太懂,那么我建议你使用MBR,因为大多数电脑默认都是MBR bios启动,如果你选择了gpt那么你必须在bios下设置启动项,对于一个新人来说比较复杂,每家电脑的主板还有不同无疑增加了难度。
如果你比较精通,建议gpt。毕竟gpt代表了未来,可以预见早晚uefi会会替代掉bios。
从系统多方面来说,win7用户建议mbr简单易操作,8和10的用户还是花点力气学习一下gpt吧毕竟是一种趋势。苹果用户就不用说了,gpt没得选。

2.MBR在启动流程中的作用

mbr是主引导记录的主要作用就是存储启动引导程序。启动引导程序最主要的作用就是加载操作系统的内核简单来说就是由MBR加载grub然后找到liunx内核

  1. 加载操作系统的内核。这是启动引导程序最主要的功能。
  2. 拥有一个可以让用户选择的菜单,来选择到底启动哪个系统。 大家如果在服务器上安装过双 Windows 系统,就应该见过类似的选择菜单,不过这个选择菜单是由 Windows 的启动引导程序提供的,而不是 GRUB。
  3. 可以调用其他的启动引导程序,这是多系统启动的关键。(grub) 不过需要注意的是,Windows 的启动引导程序不能调用 Linux 的启动引导程序,所以我们一般建议先安装 Windows,后安装 Linux,是为了将 Linux 的启动引导程序安装到 MBR 中,覆盖 Windows 的启动引导程序。

3. MBR常见问题

1.)MBR扇区故障

MBR引导扇区记录位于物理硬盘的第一个扇区(512B),该扇区又称为主引导扇区,除了包含系统引导程序的部分数据以外,还包含了整个硬盘的分区记录。主引导扇区发生故障时,将可能无法进入引导菜单,或者因无法找到正确的分区位置而无法加载系统,通过该硬盘引导主机时很可能进入黑屏状态。

故障原因
病毒、木马等造成的破坏
不正确的分区操作、磁盘读写误操作

故障现象
找不到引导程序,启动中断
无法加载操作系统,开机后黑屏

解决思路
提前做好备份文件
以安装光盘引导进入急救模式
从备份文件中恢复

MBR小结

MBR是主引导扇区,是物理磁盘的第一个扇区。主要作用就是存储启动引导程序。启动引导程序最主要的作用就是加载操作系统的内核简单来说就是由MBR加载grub然后一起引导启动liunx内核

三、GRUB详解

GRUB2 全称是 GRand Unified BootLoader,Version 2(第二版大一统引导装载程序)。它是目前流行的大部分 Linux 发行版本的主要引导加载程序。GRUB2 是一个用于计算机寻找操作系统内核并加载其到内存的智能程序。
​ GRUB通过/boot/grub/grub.conf进行配置。而/boot/grub2/grub.cfg配置GRUB2
两个GRUB的最主要作用都是把内核加载到内存运行,基本工作方式也一致,主要阶段也保持相同,都可分为三个阶段
GRUB有几个重要的文件,STAGE1、STAGE1.5、STAGE2
STAGE1: 它只有512字节,通常放在MBR中,它的作用很简单,就是在系统启动时用于装载STAGE2并将控制权交给它。
STAGE2: GRUB的核心,所有的功能都是由它实现。
STAGE1.5: 介于STAGE1和STAGE2之间,是它们的桥梁,因为STAGE2较大,通常都是放在一个文件系统当中的,但是STAGE1并不能识别文件系统格式,
所以才需要STAGE1.5来引导位于某个文件系统当中的STAGE2。根据文件系统格式的不同,STAGE1.5也需要相应的文件,如:e2fs_stage1_5,fat_stage1_5,分别用于识别ext和fat的文件系统格式。它存放于1-63的柱面之间.
引导顺序如下:STAGE1->;STAGE1.5->;STAGE2,
主要的配置文件时 grub.conf
里面选项含义:
title:一个操作系统引动的标头,可以使多个
root :指明所需文件存在于哪个磁盘哪个分区上 (hd0,0)表示第一个硬盘,第一个分区,可参考/boot/grub/device.map
kernel:内核文件的名字,并且会有一些加载内核时的参数 or代表以只读方式加载
initrd:包含一些附加的驱动程序

阶段1

​ 如上文 POST(上电自检)阶段提到的,在 POST 阶段结束时,BIOS 将查找在接入的磁盘中查找引导记录,其通常位于 MBR(主引导记录Master Boot Record),它加载它找到的第一个引导记录中到内存中,并开始执行此代码。引导代码(及阶段 1 代码)必须非常小,因为它必须连同分区表放到硬盘的第一个 512 字节的扇区中。 在传统的常规 MBR 中,引导代码实际所占用的空间大小为 446 字节。这个阶段 1 的 446 字节的文件通常被叫做引导镜像(boot.img),其中不包含设备的分区信息,分区是一般单独添加到引导记录中。

​ ·由于引导记录必须非常的小,它不可能非常智能,且不能理解文件系统结构。因此阶段 1 的唯一功能就是定位并加载阶段 1.5 的代码。为了完成此任务,阶段 1.5 的代码必须位于引导记录与设备第一个分区之间的位置。在加载阶段 1.5 代码进入内存后,控制权将由阶段 1 转移到阶段 1.5。

阶段1.5

​ 如上所述,阶段 1.5 的代码必须位于引导记录与设备第一个分区之间的位置。该空间由于历史上的技术原因而空闲。第一个分区的开始位置在扇区 63 和 MBR(扇区 0)之间遗留下 62 个 512 字节的扇区(共 31744 字节),该区域用于存储阶段 1.5 的代码镜像 core.img 文件。该文件大小为 25389 字节,故此区域有足够大小的空间用来存储 core.img。

​ 因为有更大的存储空间用于阶段 1.5,且该空间足够容纳一些通用的文件系统驱动程序,如标准的 EXT 和其它的 Linux 文件系统,如 FAT 和 NTFS 等。GRUB2 的 core.img 远比更老的 GRUB1 阶段 1.5 更复杂且更强大。这意味着 GRUB2 的阶段 2 能够放在标准的 EXT 文件系统内,但是不能放在逻辑卷内。故阶段 2 的文件可以存放于 /boot 文件系统中,一般在 /boot/grub2 目录下。

​ 注意 /boot 目录必须放在一个 GRUB 所支持的文件系统(并不是所有的文件系统均可)。阶段 1.5 的功能是开始执行存放阶段 2 文件的 /boot 文件系统的驱动程序,并加载相关的驱动程序。

阶段2

​ GRUB 阶段 2 所有的文件都已存放于 /boot/grub2 目录及其几个子目录之下。该阶段没有一个类似于阶段 1 与阶段 1.5 的镜像文件。相应地,该阶段主要需要从 /boot/grub2/i386-pc 目录下加载一些内核运行时模块。

​ GRUB 阶段 2 的**主要功能是定位和加载 Linux 内核到内存中,并转移控制权到内核。**内核的相关文件位于 /boot 目录下,这些内核文件可以通过其文件名进行识别,其文件名均带有前缀 vmlinuz。你可以列出 /boot 目录中的内容来查看操作系统中当前已经安装的内核。

​ GRUB2 跟 GRUB1 类似,支持从 Linux 内核选择之一引导启动。Red Hat 包管理器(DNF)支持保留多个内核版本,以防最新版本内核发生问题而无法启动时,可以恢复老版本的内核。默认情况下,GRUB 提供了一个已安装内核的预引导菜单,其中包括问题诊断菜单(recuse)以及恢复菜单(如果配置已经设置恢复镜像)。

阶段 2 加载选定的内核到内存中,并转移控制权到内核代码。

grub常见问题

grub常见问题
这个博主写的问题很全,可以多参考参考

grub的安装与修复

grub的安装有两种方式,分别适应两钟不同的情况。

1、 mbr损坏,但是/boot/grub下所有文件都正常,我们只需要修复mbr。
进入救援模式之后,启动grub shell

grub> root (hd0,0)   //根据个人启动分区的不同进行设置。
root(hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)         
setup(hd0)
 Checking if "/boot/grub/stage1"exists... no
 Checking if "/grub/stage1" exists...yes
 Checking if "/grub/stage2" exists...yes
 Checking if "/grub/e2fs_stage1_5"exists... yes
 Running "embed /grub/e2fs_stage1_5(hd0)"...  27 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0)(hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.

2、 替换引导。比如,linux在安装时就没有安装引导,或者以前用的是lilo,而现在想用grub。

使用grub-install命令即可。
grub-install /dev/sda    //选定你要安装bootloader的磁盘或者分区。

这个命令会自动创建/boot/grub目录,并自动生成stage1 stage1.5和stage2,然后将stage1写入mbr。

grub小结

grub作为启动引导程序,是多系统启动的关键。由MBR加载出来之后去寻找放在磁盘其他位置上的内核文件,找到后将控制权移交给内核。

四、内核及加载文件系统

读入 /boot 目录下的内核文件
内核启动后会向bios查询电脑的所有硬件信息,然后自己接手下来管理这些设备,以便提供给linux使用
内核会试着驱动这些设备,这些设备的驱动一部分包含在内核中,叫做静态驱动,一部分以模块的方式(动态)存放文件系统中,由于此时还未挂载任何文件系统,因此还不能使用文件系统中的模块,这里只能驱动在内核中存在的硬件驱动程序的对应设备.想驱动内核中未包含的硬件驱动就需要加载文件系统.

加载文件系统
内核会尝试挂载根文件系统,根文件系统至少包含 /etc /bin /sbin /lib /dev 这5大目录
他们5个缺一不可.都会导致系统无法启动

根文件系统挂载是以只读方式挂载的,因为这时linux还在启动阶段,并不稳定,避免破坏系统资料。

五、运行init进行系统初始化

init是什么?

init是Linux系统操作中不可缺少的程序之一,所谓的init进程,它是一个由内核启动的用户级进程,Linux使用了init进程来对组成Linux的服务和应用程序进行初始化。
挂载了根文件系统后,就会启动init服务
内核会按 /sbin/init /etc/init /bin/init 顺序寻找init程序,
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。

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

启动init的目的就是为了初始化系统环境,启动了init就证明了内核已经顺利启动,接下来就由init服务来建立linux使用环境

系统初始化

init 程序首先是需要读取配置文件 /etc/inittab(配置文件),,根据这个文件的信息来进行初始化工作.。

运行级别

在 init 加载 /etc/inittab 之后,就会将系统切换到 initdefault 操作所定义的运行级别。

  • 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
  • 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
  • 运行级别2:多用户状态(没有NFS)
  • 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
  • 运行级别4:系统未使用,保留
  • 运行级别5:X11控制台,登陆后进入图形GUI模式
  • 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
init运行全流程流程
init进程是由内核启动的第一个也是惟一的一个用户进程,它是后续所有进程的发起者,比如init进程启动/bin/sh程序后,才能够在控制台上输入各种命令。
**init执行的基本流程如下:**

(1)解析/etc/inittab执行sysinit命令指定的进程,以前通常是/etc/init.d/rcS,在新版本的init程序中则通常是/etc/rc.d/rc.sysinit脚本。
(2)执行/etc/rc.d/rc.sysinit:这是由init执行的第一个脚本,此步进行的工作包括配置网络、配置内核参数、挂载root文件系统、检查文件系统、设置系统时钟、配置机器、开启交换空间等。
(3)执行/etc/rc.d/rcX.d/[K…][S…]:根据定义的initdefault运行级别,执行对应wait命令指定的程序,这会运行对应目录下的各个程序,并等待它们运行完。
(4)执行/etc/rc.d/rc.local:Redhat中运行模式2,3,5都把/etc/rc.d/rc.local作为初始化脚本中的最后一个文件,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登陆之前执行的命令
(5)执行getty程序:为每个联机终端使用fork()创建一个子进程,并在子进程中运行getty程序,init进程则调用wait(),进入等待子进程结束状态。getty程序设置终端类型、属性、速度和线路规程等。对于字符界面的运行级别(如级别2和3),它会打开并初始化一个tty端口,显示提示信息。通常,若/etc/issue文本文件存在,则getty会首先显示其中的文本信息,然后显示登录提示信息(例如“plinux login:” ),出现字符登录界面,并等待用户键入用户名和口令。可以在inittab文件中配置使用哪一种getty程序(在“id:runlevels:action:process”的process部分指定,并可以传递相应的getty参数),如agetty, getty, mgetty, uugetty, mingetty,fbgetty等。getty程序只能由超级用户执行。
注意如果第1步中的inittab文件指定的默认运行级别是图形用户界面形式(如级别5),则init程序会转向去执行/etc/X11/prefdm脚本,它会执行/usr/sbin/gdm,启动图形登录界面。GDM管理的不只是X的启动,还有登录,注销,挂起等一系列操作。
启动登录界面(图形或字符界面),并输入完用户名后,getty会调用login程序。
(6)执行login程序getty调用exec()执行login程序,以核对输入的用户名和口令。由于调用了exec(而不是fork),login的执行环境会覆盖getty的执行环境login进程会读取/etc/passwd,以用户名和口令。login根据用户输入的用户名,从口令文件passwd中取得对应用户的登录项,然后调用getpass()以显示”password:”提示信息,读取用户键入的密码,然后使用加密算法对键入的密码进行加密处理,并与口令文件中该用户项中pw_passwd字段作比较。如果用户几次键入的密码均无效,则login程序会以出错码1退出执行,表示此次登录过程失败。此时父进程(进程init)的wait()会返回该退出进程的pid,因此会根据记录下来的信息再次创建一个子进程,并在该子进程中针对该终端设备再次执行getty程序,重复上述过程。
如果用户键入的密码正确,则login就会把当前工作目录(Currend Work Directory)修改成口令文件中指定的起始工作目录。并把对该终端设备的访问权限修改成用户读/写和组写,设置进程的组ID。然后利用所得到的信息初始化环境变量信息,例如起始目录(HOME=)、使用的shell程序(SHELL=)、用户名(USER=和LOGNAME=)和系统执行程序的默认路径序列(PATH=)。接着显示/etc/motd文件(message-of-the-day)中的文本信息,并检查并显示该用户是否有邮件的信息。最后login程序改变成登录用户的用户ID,并执行口令文件中该用户项中指定的shell程序,如/bin/bash或/bin/csh等。有关login程序的一些执行选项和特殊访问限制的说明,可参见Linux系统中的在线手册页(man -8 login)。
(7)执行shell程序或x-windows如果用户名和口令正确,login调用exec执行shell命令行解释程序(当然,也可以执行X-windows的图形界面,如果用户设置了的话)。登录shell会首先从/etc/profile文件以及 H O M E / . b a s h p r o f i l e 文 件 ( 或 . b a s h r c 文 件 , 若 存 在 的 话 ) 读 取 命 令 并 执 行 。 因 此 用 户 可 以 把 每 次 登 录 时 都 要 执 行 的 命 令 放 在 . b a s h p r o f i l e 文 件 中 。 如 果 在 进 入 s h e l l 时 设 置 了 E N V 环 境 变 量 ( 或 者 在 . b a s h p r o f i l e 文 件 中 设 置 了 该 变 量 ) , 则 s h e l l 还 会 从 HOME/.bash_profile文件(或.bashrc文件,若存在的话)读取命令并执行。因此用户可以把每次登录时都要执行的命令放在.bash_profile文件中。如果在进入shell时设置了ENV环境变量(或者在.bash_profile文件中设置了该变量),则shell还会从 HOME/.bashprofile.bashrc.bashprofileshellENV.bashprofileshellENV指定的文件中读去命令并执行。因此我们也可以把每次运行shell都要执行的命令放在ENV变量指定的文件中。设置ENV环境变量的方法是把下列语句放在你起始目录的.bash_profile文件中: ENV=$HOME/.anyfilename; export ENV。
运行shell时,原来的getty进程最终被替换成了bash进程,对应的getty,login,bash这三个程序也就具有相同的进程ID。在成功登录到Linux系统后,你会发现(使用”top”或”ps –ax”命令)自己终端原来的getty进程已经找不到了。因为getty进程执行了login程序,被替换成了login进程,并且最后被替换成你的登录shell进程。对于图形用户界面,login程序最后会被替换成图形界面进程(如gnome-session程序)。
(8)Linux运行时:init进程会负责收取孤儿进程。如果某个进程创建子进程之后,在子进程终止之前终止,则子进程成为孤儿进程。在Linux中所有的进程必须属于单棵进程树,所以孤立进程必须被收取。一旦进程成为孤儿,它会立即成为init进程的子进程。这是为了保持进程树的完整性。
(9)用户注销:当某个终端或虚拟控制台上的用户注销之后,该终端上的所有进程都会被终止(killed),包括bash。然后,init进程就会调用fork为该终端或虚拟控制台重新创建一个getty进程,以便能够让其他用户登录。这是为什么呢?你应该发现,当用户登录时,“getty”用的是“exec”而不是“fork”系统调用来执行“login”,这样,“login”在执行的时候会覆盖“getty”的执行环境(同理,用户注册成功后,“login”的执行环境也会被shell占用)。所以,如果想再次使用同一终端,必须再启动一个“getty”。对于图形界面,用户注销后会回到图形登录界面。
(10)系统关闭:init负责杀死所有其它的进程,卸载所有的文件系统并停止处理器的工作,以及任何其它被配置成要做的工作。
以Fedora 14桌面系统中为例(它使用新的upstart init程序,不过它兼容sysvinit),/etc/inittab文件内容如下:

六、liunx启动流程总结

BIOS加电自检—MBR引导—加载grub界面—加载liunx内核参数及文件系统—运行init进程—系统初始化—用户登录系统

  1. BIOS的主要作用是检测连接硬件提供给操作系统和寻找启动(设备)硬盘并找到主引导记录MBR移交控制权。

  2. MBR作为主引导记录负责加载grub并一起定位和加载 Linux 内核到内存中,grub转移控制权到内核。

  3. 内核启动后会向bios查询电脑的所有硬件信息,内核会试着驱动这些设备。

  4. 内核会尝试挂载根文件系统,根文件系统至少包含 /etc /bin /sbin /lib /dev 这5大目录

  5. 挂载了根文件系统后,就会启动init服务。

  6. init 程序首先是需要读取配置文件 /etc/inittab(配置文件),根据这个文件的信息来进行初始化工作.。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值