您的位置:首页 > 运维架构 > Linux

Linux启动引导过程

2013-09-16 15:29 232 查看
这篇文章,虽然说是原创,但是还是看了好多别人的文章,吸收了别人的经验,才写出来的。谢谢你们。但是我知道自己的理解还非常不到位。因为有些引导过程我还是解释不出来,没理解透。但是还是先整理出来吧。免得过两天就忘光了。

一、引导过程可以大致分为这几个阶段

1、开机自检(BIOS)

2、加载引导程序(GRUB)

3、加载内核(kernel)

4、运行init进程--读取/etc/inittab文件,执行/etc/rc.d/rc.sysinit,执行/etc/rc.d/rc,执行/sbin/mingetty

二、具体说明

1、开机自检

(1)系统检测,BIOS对计算机进行整体检查,确保核心组件,例如cpu,内存可以正常运行

(2)设备初始化,BIOS为键盘,鼠标等设备初始化并分配合适的系统资源--这个我不是太明白,有待继续研究

(3)引导设备选择,BIOS会查找合适的引导设备(比如是从硬盘加载还是光盘加载)

2、加载引导程序

BIOS自检完成后,BIOS会根据用户设置的启动顺序来由哪个设备启动电脑的操作系统(引导设备可以是软盘,CD-ROM,硬盘上的某个分区,网络上的某个设备,甚至是USB闪存),对于linux这个设备一般是硬盘.也就是进入硬盘的MBR区域,(master boot record,位于磁盘上的第一个扇区中,0道0柱面1扇区),这个区域中有512个字节的大小,其中前446个字节中保存的就是启动程序,(446个字节包含可执行代码和错误消息文本,接下来的64个字节是分区表,其中4个分区的记录,每个记录的大小是16个字节。当MBR被加载到RAM中之后,BIOS就会将控制权交给MBR),然后由这个小程序来加载存储在其他位置的操作系统,也就是启动grub程序.(grub不像lilo一样使用裸扇区,而是可以从ext2或ext3文件系统中加载LINUX内核).

要看MBR的内容,请使用下面的命令

 #从/dev/sda上读取前512个字节的内容,并将其写入mbr.bin文件中

 [root@localhost ~]# dd if=/dev/sda of=mbr.bin bs=512 count=1

#以十六进制和ASCII码格式打印这个二进制文件的内容

 [root@localhost pam.d]# od -xa mbr.bin

grub程序的这个配置文件是保存在:/boot/grub/grub.conf这个文件中,如果修改这个文件后,设置会立刻生效.

使用cat /boot/grub/grub.conf,就会出现这个文件的内容,最前面是注释。

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS (2.6.18-164.el5)

        root (hd0,0)

        kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb rhgb

        initrd /initrd-2.6.18-164.el5.img

第一个部分中的defaule=0,是指第一组操作系统开机。如果有两组操作系统的开机设定,而defaule=1,那么预设使用第二组操作系统开机。

所谓第一组和第二组程序就是指的是title开始的部分,这里是区分操作系统的部分。如何知道要使用那一个系统呢,可以看到在title开始的部分的下一行有:

root (hd0,0)

hd0,表示第一个硬盘,0:指的是硬盘的第一个分区,

timeout=5是指进入GRUB的画面后,会有5秒的时间让使用者选择使用那个操作系统开机。如果在这个时间没有作出选择那么,那么就使用defaule的设定
splashimage=是开机使用的背景图案。hd0,表示第一个硬盘, 0:指的是硬盘的第一个分区,和上面的一样,/grub/splash.xpm.gz就是开机使用的背景图案的文件名称
hiddenmenu指令是隐藏开机的选单,即不在启动时显示GRUB菜单
title:开机选单的标题名称。

root (hd0,0):0表示下面要介绍的档案位于那个目录中。(hd0,0)同样是指/boot目录--不是太理解

kernel:存放内核的位置,由于(hd0,0)指的是/boot目录,所以这个文件在boot目录中。ro root=LABEL=/就是设根目录的位置,root表示根分区,这里使用‘LABEL=/’表示根分区在硬盘中一个卷标为'/'的分区中。ro表示read only,Linux的内核在启动的过程中,不知道将会发生什么故障,可能不是很稳定,如果以可读可写的方式来加载,那么启动的过过程组中如果出现异常或者是断电,那么就有可能破坏,为了避免这些问题的发生,就采取只读的方式来挂载文件系统

rhgb:red hat图形界面启动,取代以前的文本界面。如果要使用文本界面的形式启动,只要将rhgb删除即可。

quite:在开机过程中不要显示错误的信息。如果要显示错误信息,只要删除quite即可。

initrd:将initrd映像文件加载到内存。这个文件里面存放的都是驱动程序。
3、加载内核(kernel)
在通过GRUB读入Linux的内核并执行,内核会做两件事:驱动硬件、启动/sbin/init进程。init进程是所有进程的起点,也是Linux内核启动后的第一个动作,所以这个程序的PID永远是1

4、运行init进程

在unix系统中,init是第一个可以存在的进程,它的PID恒为1,但它也必须向一个更高级的功能负责:PID为0的内核调度器(Kernel scheduler)。即init的父进程id是0.正常父进程死啦,那么子进程也必须死;有一种可能:父进程死啦,子进程未死,这称作孤儿进程,在Linux系统中不允许存在孤儿进程;若存在孤儿进程,那么Linux系统会把它的父进程指向到init;另一种情况:子进程死啦,但是父进程不知道,这称作僵尸进程,在Linux系统中也是不允许存在的。

init启动后读取inittab文件,执行缺省运行级别,从而继续引导过程。/etc/inittab文件内容如下

id:3:initdefault:   

si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0

l1:1:wait:/etc/rc.d/rc 1

l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

l4:4:wait:/etc/rc.d/rc 4

l5:5:wait:/etc/rc.d/rc 5

l6:6:wait:/etc/rc.d/rc 6

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

1:2345:respawn:/sbin/mingetty tty1

2:2345:respawn:/sbin/mingetty tty2

3:2345:respawn:/sbin/mingetty tty3

4:2345:respawn:/sbin/mingetty tty4

5:2345:respawn:/sbin/mingetty tty5

6:2345:respawn:/sbin/mingetty tty6

x:5:respawn:/etc/X11/prefdm -nodaemon

第一行:linux默认的运行级别。修改linux的运行级别就是修改这行的数字

第二行:rc.sysinit是由init执行的第一个脚本,它主要完成一些系统初始化的工作。第一个字段没有实际意思,第二个字段表示与本行相关的的运行级别的列表。这里为空就表示所有级别。第三个字段是一个预定义的动作,表示init如何执行第四个字段中的脚本。rc.sysinit是每一个运行级别都要首先运行的重要脚本。/etc/rc.d/rc.sysinit主要完成各个运行模式中相同的初始化工作,包括:

激活udev和selinux

在/etc/sysctl.conf中设定内核参数

讲proc文件系统挂在到/proc

设定系统时钟

装载按键设置

启动交换分区

通过/etc/sysconfig/network确定主机名

检查并重新挂在根文件系统

激活raid和lvm设备

启用磁盘配额

挂在/etc/fstab文件中定义的分区

清理过时的锁和PID文件

第3-第9行:对应哪个运行级别,init执行那一行。系统在任何运行级别都会执行/etc/rc.d/rc中的内容。第一个字段没有实际意义,第二个字段表示在哪个运行级别时被执行,第三个字段wait表示在要等第四个字段制定的命令运行完成后才能做其他工作。rc x其实就是指rcx.d/。x还是传给了rc这个脚本,从脚本中有这样的内容可以看出for i in /etc/rc$runlevel.d/S* 。执行rc这脚本时,会执行对应的/etc/rc.d/rcx.d/中的脚本。每个rcx.d/中都有一些符号链接指向/etc/rc.d/init.d/目录中的System
V服务启动脚本,用于在进入对应的级别时启动指定的服务。以S开头的标示要启动这个服务,以K开头的标示要停用这个服务。两位数字的大小标示执行级别,越小越先执行。而且K比S先执行,这是因为要先将所有服务停用归零的意思,然后再启用服务。每个rcx.d/中都有一个S99local -> ../rc.local。所以我们可以在/etc/rc.d/rc.local中写入我们想找指定的内容,它会在开机时自动执行。
常见的System V服务有:

amd:自动安装NFS守护进程。

apmd:高级电源管理守护进程。

arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对应的数据库。

autofs:自动安装管理进程automount,与NFS相关,依赖于NIS。

crond:Linux系统下计划任务的守护进程。

named:DNS服务器。

netfs:安装NFS、Samba和NetWare网络文件系统。

network:激活已配置网络接口的脚本程序。

nfs:打开NFS服务。

portmap:RPC portmap管理器,它管理基于RPC服务的连接。

sendmail:邮件服务器sendmail。

smb:Samba文件共享/打印服务。

syslog:一个让系统引导时启动syslog和klogd系统日志守候进程的脚本。

xfs:X Window字型服务器,为本地和远程X服务器提供字型集。

Xinetd:支持多种网络服务的核心守护进程,可以管理wuftp、sshd、telnet等     服务。

这些守护进程启动完毕,rc程序也就执行完了,然后又将返回init继续下一步。

第10行:用户在控制台按下crtl+alt+del键会执行shutdown -t3 -r now这个指令(重启系统)

第11行:如果你的服务器有UPS,当收到UPS电池快没电的消息后,2分钟后发出"Power Failure; System Shutting Down"消息并关机。
第12行:如果12345中任何一个级别发现UPS电池又有点时,发出"Power Restored; Shutdown Cancelled"消息并取消关机。

第13-18行:使用mingetty指令分别产生tty1到tty6这6个虚拟控制台。(如果进程退出则再次运行mingetty程序(respawn)--我也不是很清楚了)
第19行:在运行级别为5时执行“/etc/X11/prefdm”脚本,允许用户使用图形界面登陆。(并在退出时重新执行(respawn))

用户登陆时,执行/bin/login程序

login程序会提示使用者输入账号及密码,接着编码并确认密码的正确性,如果账号与密码相符,则为使用者初始化环境,并将控制权交给shell,即等待用户登录。

login会接收mingetty传来的用户名作为用户名参数,然后login会对用户名进行分析。如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来在系统维护时防止非root用户登录。只有在/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其他信息,比如:主目录是什么、使用何种shell。如果没有指定主目录,则将主目录默认设置为根目录;如果没有指定shell,则将shell类型默认设置为/bin/bash。

login程序成功后,会向对应的终端再输出最近一次登录的信息(在/var/log/lastlog中有记录),并检查用户是否有新邮件(在/usr/spool/mail/的对应用户名目录下),然后开始设置各种环境变量。对于bash来说,系统首先寻找/etc/profile脚本文件并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其他配置文件,所有的配置文件执行后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,至此整个启动过程就结束了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息