互联网服务Linux

Linux启动流程

从用户打开电源到用户可以登录的这短短的一段时间内,Red Hat Enterprise Linux到底都作了哪些事情,只有知道了这些事情,用户在以后的使用过程中,如果出现了一些问题,我们可以借助这些过程来为我们排除一些故障。

Red Hat Enterprise Linux在电脑的启动阶段,一共经历以下两个阶段,如图1:

650) this.width=650;" src="http://img.blog.163.com/photo/Sx4yEONhc54tspHPkJpF_A==/4837710424726897928.jpg" __1373781412921__="ev_2024060066" />


BIOS自检
当电脑开机的时候,电脑会进入BIOS,BIOS的工作主要是侦测电脑的周边配套设备是否工作正常,如CPU的类型、速度、缓存等
主板类型
内存的速度,容量
硬盘的大小,类型和工作模式
风扇速度等
主要是为了检查这些设备在开机的时候是否能通过检测,如果能通过检测,说明电脑可以正常的工作。

------------------------------
载入启动程序

BIOS自检完成后,BIOS会根据用户设置的启动顺序来由那个设备来启动电脑的操作系统,这个设备一般是硬盘。

也就是进入到硬盘的MBR区域,这个区域中的有512个字节的大小,其中前446个字节中保存的程序是选择启动分区,也就是电脑由那个硬盘分区来载入开机的程序。那么在这个446个字节的空间中保存的就是启动程序,然后由这个小程序来加载存储在其他位置的操作系统,也就是启动grub程序。如图02所示:

650) this.width=650;" src="http://img.blog.163.com/photo/Utd0x_FoocJ4r3Z5NZgJcQ==/5641884433188694389.jpg" __1373781412921__="ev_7277861935" />


grub程序的这个配置文件是保存在:/boot/grun/grub.conf这个文件中,如果修改完这个文件后,设置会立刻生效。现在来看看这个文件的内容以及语法:如图03所示:

650) this.width=650;" src="http://img.blog.163.com/photo/0yKPT5XmBFGiYLlhRjlf9w==/4515421576393059859.jpg" __1373781412921__="ev_2664548387" />

  使用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映像文件加载到内存。这个文件里面存放的都是驱动程序。


--------------------------------------
加载内核

正确的启动了启动程序之后,接下来的工作就是就会载入操作系统的内核(Kernel)。内核主要作用是
取得BIOS所检测到的硬件设备的信息,然后将这些硬件设备自己来管理,这样才能够提供给Linux系统使用。接手了硬件设备后,然后就要加载这些设备的驱动程序。以便于控制电脑上的设备如何正确的工作。

加载完硬件的驱动程序后,接下来就股灾文件系统了,也就是加载开机所需要的库文件,程序等,所以/etc /bin /sbin /dev /lib这些目录的根目录必须是同一个分区,否则会造成Linux的开机失败。

上面在grub中有“ro root=LABEL=/”这样的信息,是以只读的方式来加载所需要的文件,程序,这是为什么呢?

是因为Linux的内核在启动的过程中,不知道将会发生什么故障,可能不是很稳定,如果以可读可写的方式来加载,那么启动的过过程组中如果出现异常或者是断电,那么就有可能破坏,为了避免这些问题的发生,就采取只读的方式来挂载文件系统。

-----------------------------------------
启动init服务

加载完成内核之后,Kernel会启动init这个程序,也是Linux内核启动后的第一个动作,如图04所示:

650) this.width=650;" src="http://img.blog.163.com/photo/3Y6pJxt0g55WyM95pNXWDA==/1167839678372927883.jpg" __1373781412921__="ev_1617061367" />


所以这个程序的PID是永远是1,也是Red Hat Enterprise Linux中执行的第一个程序,这个程序会根据Run Level来执行一些相关的程序程序。

启动init服务的目的就是为了用来初始化Linux的环境。也就代表了Linux已经顺利的加载了内核,这个时候的系统启动就进入了另外的一个阶段:系统初始化阶段


-------------------------------
系统初始化系统环境


init程序其实是去读取/etc/inittab配置文件的配置,根据配置来决定作什么工作

可以使用cat /etc/inittab指令,就可以看到这个文件的内容,里面设置了init需要作那些工作。如图05所示:


1、决定要使用那个run level
   run level可以从0到6分成7种,一般是为了执行不同的程序或环境而设置的

run level 0:是作关机,所以不能设置initdefault中,也就是id:5:initdefaule的设置。否者一开机就会作关机的动作。
run level 1:是Single user mode模式,只允许root账号登录,主要是作一些系统维护的工作。

run level 2:可以使所有的用户登录,但不会启用NFS working,也就是没有网络功能

run level 3:可以使所有用户登录,并拥有完整的功能。包含run level 2没有的功能,但是开机后是用文本模式

run level 4 :使用者自己定义,但是默认情况下和run level 3完全相同,

run level 5:和run level 3几乎一样,唯一的不同是开机后是图形界面,

run level 6:重启。所以run level 6也不会设置在initdefault中,否者开机后立刻重启

一般情况下我们使用最多的是1,3,5这三个run level,那么这三个有什么不同的呢,主要差别在执行程序的数量不同。

可以使用init指令来定义使用那个run level,只要在命名提示符号的后面输入"init 3"就进入文本界面,如果输入"init 6"那么电脑就会重启,如果是"init 0",那就关机。

可以在以下的地方来定义电脑启动后进行那个run level,如图05中的所示:

650) this.width=650;" src="http://img.blog.163.com/photo/UsZAU_UKUG2k2Q8fgiAD-Q==/2837830715197278381.jpg" __1373781412921__="ev_1666976778" />

   id:5:initdefault:默认是run level 5,是图形界面。

2、执行初始操作系统的程序
   如图06所示:

650) this.width=650;" src="http://img.blog.163.com/photo/3374M7O75X3D4P_Wgd34Dw==/1451847929874310950.jpg" __1373781412921__="ev_7554547960" />

   设定执行/etc/rc.d/rc.sysinit这个程序,来初始化操作系统。如图07所示:

650) this.width=650;" src="http://img.blog.163.com/photo/u1OMTHSDYhZwC1BIhywUWg==/1451847929874310965.jpg" __1373781412921__="ev_9997365826" />

   这个程序的作用主要是用来:

   1、设定电脑的名称,hostname在/etc/sysconfig/network文件中
   2、设定系统的时间
   3、定义键盘
   4、启用swap分区
   5、检查根目录(/)有没有问题。并且挂载成可读可写的状态。
   6、设定系统的时间
   7、加载一些其他的设备,如RAID和LVM

   具体的内容大家可以自己去研究这个文件的其他的功能,但是主要是用来来初始化操作系统的。


3、执行run level对应目录中的程序。

   用来决定启用那些服务,也就是执行rc程序,如图08所示:

650) this.width=650;" src="http://img.blog.163.com/photo/000cZXz3xA4RM2eWFIBVnQ==/1451847929874310988.jpg" __1373781412921__="ev_5060388455" />

   本例中是run level是5,那么就会把5的参数传递给/etc/rc.d/rc这个程序,后面的黑色的5,就是把5这个参数传递个rc这个程序执行的意思。rc 5所执行的结果就会是执行/etc/rc.d/rc5.d/这个目录下的所有程序。

   如输入ls -l /etc/rc.d这个指令,就可以看到所有的run level所对应的目录。如图09所示:

650) this.width=650;" src="http://img.blog.163.com/photo/zKXDfVUl3z-_u9lVMv5BaQ==/1451847929874310997.jpg" __1373781412921__="ev_8891134189" />


在这些目录当中,都是内置一些要执行的一些程序。也就是要启动那些服务。本例的run level是5,就会执行rc5.d这个目录中的程序。那么就会启动这个目录中的服务。如图10,查看这个目录中有哪些内容:

650) this.width=650;" src="http://img.blog.163.com/photo/Ydu1rqh6hPuxUeLTJk9AHg==/1984961535764335505.jpg" __1373781412921__="ev_9373201533" />


可以发现,这个文件夹中的都是一些链接文件,这些链接就是来呼叫/init.d目录中程序,并带有一个启动或停止服务的参数。

分析一下这些名称链接的格式:如图10中所示,这些文件可以分为主要的三个小段:

    1、以K或S开头。K=Kill表示停用,S=Start表示启用服务,并且K先执行,然后执行S。
    2、是两位的数字,代表执行的先后顺序,数字越小,越先执行。
    3、是程序名称。

系统会按照以上的这个目录中的程序,先关闭某些程序,然后启动某些需要的服务。


4、再设定某个组合键
   如图11所示:

650) this.width=650;" src="http://img.blog.163.com/photo/jHcLosffUj1PuzOenjryWw==/2281354686240333994.jpg" __1373781412921__="ev_2388895015" />


   当启动的过程中按下crtl+alt+del键会执行shutdown -t3 -r now这个指令。


5、定义UPS不间断电源系统
  如图12所示:


650) this.width=650;" src="http://img.blog.163.com/photo/xTKUcc3bonAFyOIzrawcaA==/2281354686240334027.jpg" __1373781412921__="ev_9349333841" />


   如果你的服务器有UPS,当电源发生问题或电源恢复的时候,执行这些程序,
   当电源发生问题时,执行shutdown -f -h +2

   当电源恢复工作时,执行shutdown -c 表示在关机前取消关机的操作,这个时候必须取消关机操作。
   由于UPS可以短暂的为linux服务器提供电力服务,但是UPS不会一直提供电力,到UPS电力用完,可能会造成Linux不正常关机,而是UPS会通知电脑,电源发生问题,要求linux正常的关机,避免内存的资料没有保存到硬盘上。以上的功能必须是UPS支持以上的功能的是够才会发生这些动作,如果UPS不支持这些功能,这两条语句没有任何的作用。


6、产生6个虚拟控制台。也就是tty1到tty6,

   是使用mingetty指令分别产生tty1到tty6这6个虚拟控制台。如图13所示:

650) this.width=650;" src="http://img.blog.163.com/photo/VgDWeFWvPskeS5hDGZBOuQ==/2821223691571471973.jpg" __1373781412921__="ev_6264758567" />


7、如果启用的是run level 5,就会初始化X Windows环境。
   如图14所示:

650) this.width=650;" src="http://img.blog.163.com/photo/_zun14-AzFKnmyv3idopyA==/4278982595955784926.jpg" __1373781412921__="ev_5559483969" />


   /etc/X11/prefdm -nodemon:就是初始化X Windows环境

------------------------------------------

/etc/rc.d/rc.local程序

如图15所示:

650) this.width=650;" src="http://img.blog.163.com/photo/aWUM5ZXCsxh-q59zuCBe6A==/4278982595955784955.jpg" __1373781412921__="ev_1371146547" />

    执行Run Level目录中相对的程序链接后,都会最后执行rc.local程序。
    S后面的99表示最后执行的意思。
    所以平时我们可以修改这个文件,可以将需要将开机执行的程序或者是指令写入这个文件中。

------------------------------

这样,系统就启动完成了,这就是Linux的整个的详细的一个启动过程,了解了这个过程以后,我们就可以在以后的使用中根据这些来对系统作一些简单的故障排除。如到润level 0中更改root用户的密码等,为grub加密等。


========================================================================================


一、BIOS 加电自检
当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的.
BIOS 的工作
1.检测连接硬件,比如显卡,内存,磁盘等等,检测的目的是以后把这些设备信息提供给操作系统
2.寻找启动磁盘,每一种BIOS都会有开机启动菜单,可以在菜单里设置以哪个设备启动系统
比如:光驱,硬盘,网络等等,这个菜单可以设置多个选项,依照设置次序在设备上寻找启动信息
3.找到了启动硬盘,接着BIOS就会在磁盘上找启动扇区,找到内核启动系统.
1)先试着寻找第一个扇区,也就是主引导记录MBR(Master Boot Record)
2)如果第一个扇区上没有没有存在操作系统,再去寻找标记为BOOT的分区.
不论是MBR还是BOOT分区,存储操作系统的空间都只有446字节;
如果没有在上面提到的位置找到操作系统的内核,那么BIOS就无法继续启动工作.
而我们的内核往往会大于446个字节,存放在磁盘的其他位置上,既然446装不下内核,又为了能顺利的找到放在其他位置上的内核,
人们想出了一个办法就在446字节里写了一个小程序,当BIOS试着启动操作系统时就会执行这个小程序,然后再由小程序来载入其他位置的内核.这个小程序就是启动载入器(boot loader)
二、BOOT Loader
linux的boot loader(上文提到的小程序) 常见的有两种:lilo grub
因为lilo存在着一个1024柱面的限制,并且更改了磁盘上的启动信息文件后需要重新启动系统才能同步446字节的内容,因为lilo的缺陷,已经被grub所取代.现在的绝大多数类linux系统都采用grub做boot loader;
grub则没有了lilo各种限制,而且方便到能修改系统文件的启动内容就可以立刻与446内容同步.
那么我们就看看grub的内容 它存在于 /boot/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:包含一些附加的驱动程序

三、内核启动
内核启动后会向bios查询电脑的所有硬件信息,然后自己接手下来管理这些设备,以便提供给linux使用
内核会试着驱动这些设备,这些设备的驱动一部分包含在内核中,叫做静态驱动,一部分以模块的方式(动态)存放文件系统中,由
于此时还未挂载任何文件系统,因此还不能使用文件系统中的模块,这里只能驱动在内核中存在的硬件驱动程序的对应设备.想驱动内核中未包含的硬件驱动就需要加载文件系统.
内核会尝试挂载根文件系统,根文件系统至少包含 /etc /bin /sbin /lib /dev 这5大目录
他们5个缺一不可.都会导致系统无法启动
根文件系统挂载是以只读方式挂载的,因为这时linux还在启动阶段,并不稳定,避免破坏系统资料
四、启动INIT服务
顺利的挂载了根文件系统后,就会启动init服务
内核会按 /sbin/init /etc/init /bin/init 顺序寻找init程序,
如果找不到则内核报错 这里存在一个参数 init=/bin/sh 如果启动时指定了则最后执行/bin/sh
而不会产生内核报错.也被称为快速启动,因为它忽略了很多启动初始化工作.
启动init的目的就是为了初始化系统环境,启动了init就证明了内核已经顺利启动,接下来就由init服务来建立linux使用环境
init做了什么?它会读取 /etc/inittab 文件,根据这个文件的信息来进行初始化工作.
会执行三个脚本 /etc/rc.d/rc.sysinit /etc/rc.d/rc /etc/rc.d/rc.local
rc.sysinit 主要的功能用来建立系统的基本环境
启动udev selinux子系统
udev负责产生 /dev中的文件,selinux负责增强系统的安全性
设定核心参数 sysctl -p 加载 /etc/sysctl.conf
设定系统时间 将硬件时间设定为系统时间
加载键盘和交换分区 swapon -a -e
设置主机名,挂载文件系统,并将根重新挂载为可读写的.
加载动态驱动模块
USB设备与RAID & LVM
卸载 /initrd/ 目录

rc 脚本设置启动级别 linux中有许多不同的启动级别,不同的启动级别会制定不同的服务
根据指定rc的参数会对应执行 /etc/rc.d/rc[0-6].d/ 中的连接脚本文件 以S开头的则启动
rc.local 前两个脚本都是系统至关重要的脚本,如果我们想在启动过程中放置一些其他程序
应该使用rc.local脚本中 因为S99local存在于rc[2-5].d中
三个RC脚本执行完毕后,就会建立虚拟主控制台 执行 /bin/login 就提供了用户登陆界面了
如果是图形 L5级别的话,会启动X window登录界面
所有的启动就都已经完毕
用户环境初始化
输入用户名和密码系统验证,然后会执行
/etc/profile
/etc/profile.d/*.sh $HOME/.bash_profile
/etc/bashrc
$HOME/.bashrc

启动级别
0 关机
1 单用户
2 多用户模式但带网络但不能远程登录
3 不受限多用户模式 TUI
4 保留
5 图形模式
6 重新启动
查看启动级别
# runlevel
N 3
N是上次的级别,3是当前级别 也就是说机器开机就是3级别
切换级别
init 5

挂载文件系统
/etc/fstab
第一项 是要mount的存储装置的实体位置或者用卷标
第二项 要挂到哪个目录位置
第三项 指定要挂载的系统格式
第四项 mount时要设定的状态,只读或defauls
第五项 提供DUMP功能,在系统DUMP时需要BACKUP的标志位,其内定位置是 0
第六项 设定开机时文件系统是否要check
除了root的文件系统其必要的check为1 其他视需要而定 默认是0
LABEL=/boot /boot ext3 defaults 1 2

参与3

1同行回答

匿名用户匿名用户
从最基础的启动开始,显示全部

从最基础的启动开始,

收起
系统集成 · 2021-03-16
浏览340

提问者

kkmmll
软件开发工程师kkmmll
擅长领域: 服务器大数据虚拟化

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2013-08-14
  • 关注会员:2 人
  • 问题浏览:1353
  • 最近回答:2021-03-16
  • X社区推广