Bootstrap

Linux启动流程

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

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


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

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

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

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


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

  使用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所示:

 

所以这个程序的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中的所示:

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

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

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

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

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

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


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

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

   本例中是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所示:


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


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

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

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

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

 

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


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


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

 


   如果你的服务器有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所示:


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


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

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

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

如图15所示:

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

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

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

;