Linux的启动似乎和windows的启动过程很类似,不过windows我们是难以见到启动信息的,而linux启动时我们会看见许多启动信息,比如某个服务是否启动。
Linux的启动过程大体上可分为五部份:内核的引导;运行init;系统初始化;构建终端;用户登入系统。
A内核引导
当计算机打开电源后,首先是BIOS开机自检,根据BIOS中设置的启动设备(一般是硬碟)来启动。紧接着由启动设备上的grub程序开始引导linux,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权,之后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。也就是所谓的内核引导开始了,在内核引导过程中也许是很复杂的,我们就当它是一个黑匣子,总之是linux内核做了一些列工作,最后内核调用加载了init程序,至此内核引导的工作就完成了。交给了下一个主角init。
B运行init
init进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。init程序首先是须要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成。具体内容如下:(你可以在你的linux上执行cat/etc/inittab这样获得)
代码如下:
#inittabThisfiledescribeshowtheINITprocessshouldsetup
#thesysteminacertainrun-level.
#
#Author:MiquelvanSmoorenburg,
#ModifiedforRHSLinuxbyMarcEwingandDonnieBarnes
#
#Defaultrunlevel.TherunlevelsusedbyRHSare:
#0–halt(DoNOTsetinitdefaulttothis)
#1–Singleusermode
#2–Multiuser,withoutNFS(Thesameas3,ifyoudonothavenetworking)
#3–Fullmultiusermode
#4–unused
#5–X11
#6–reboot(DoNOTsetinitdefaulttothis)
#
###表示当前缺省运行级别为5(initdefault);
id:5:initdefault:
###启动时手动执行/etc/rc.d/rc.sysinit(sysinit)
#Systeminitialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc0
l1:1:wait:/etc/rc.d/rc1
l2:2:wait:/etc/rc.d/rc2
l3:3:wait:/etc/rc.d/rc3
l4:4:wait:/etc/rc.d/rc4
###当运行级别为5时,以5为参数运行/etc/rc.d/rc,init将等待其返回(wait)
l5:5:wait:/etc/rc.d/rc5
l6:6:wait:/etc/rc.d/rc6
###在启动过程中容许按CTRL-ALT-DELETE重启系统
#TrapCTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown-t3-rnow
#WhenourUPStellsuspowerhasfailed,assumewehaveafewminutes
#ofpowerleft.Scheduleashutdownfor2minutesfromnow.
#Thisdoes,ofcourse,assumeyouhavepowerdinstalledandyour
#UPSconnectedandworkingcorrectly.
pf::powerfail:/sbin/shutdown-f-h+2“PowerFailure;SystemShuttingDown”
#Ifpowerwasrestoredbeforetheshutdownkickedin,cancelit.
pr:12345:powerokwait:/sbin/shutdown-c“PowerRestored;ShutdownCancelled”
###在2、3、4、5级别上以ttyX为参数执行/sbin/mingetty程序,打开ttyX终端用于用户登入,
###假如进程退出则再度运行mingetty程序(respawn)
#Rungettysinstandardrunlevels
1:2345:respawn:/sbin/mingettytty1
2:2345:respawn:/sbin/mingettytty2
3:2345:respawn:/sbin/mingettytty3
4:2345:respawn:/sbin/mingettytty4
5:2345:respawn:/sbin/mingettytty5
6:2345:respawn:/sbin/mingettytty6
###在5级别上运行xdm程序,提供xdm图形形式登陆界面,并在退出时重新执行(respawn)
#Runxdminrunlevel5
x:5:respawn:/etc/X11/prefdm-nodaemon
以里面的inittab文件为例,来说明一下inittab的格式。其中以#开始的行是注释行,不仅注释行之外,每一行都有以下格式:
代码如下:
id:runlevel:action:process
对前面各项的详尽解释如下:
1.id
id是指入口标示符,它是一个字符串linux数据恢复,对于getty或mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。
2.Runlevel
runlevel是init所处于的运行级别的标示,通常使用0-6以及S或s。0、1、6运行级别被系统保留:其中0作为shutdown动作,1作为重启至单用户模式,6为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因而也不在inittab中出现,实际上,步入单用户模式时,init直接在控制台(/dev/console)上运行/sbin/sulogin。在通常的系统实现中,都使用了2、3、4、5几个级别,在CentOS系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示XDM图形登入形式。7-9级别也是可以使用的,传统的Unix系统没有定义这几个级别。runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才能执行。
3.action
action是描述其后的process的运行方法的。action可取的值包括:initdefault、sysinit、boot、bootwait等:initdefault是一个特殊的action值,用于标示缺省的启动级别;当init由核心激活之后,它将读取inittab中的initdefault项,取得其中的runlevel,并作为当前的运行级别。若果没有inittab文件,或则其中没有initdefault项,init将在控制台上恳求输入runlevel。sysinit、boot、bootwait等action将在系统启动时无条件运行,而忽视其中的runlevel。其余的action(不含initdefault)都与某个runlevel相关。各个action的定义在inittab的man指南中有详尽的描述。
4.process
process为具体的执行程序。程序前面可以带参数。
Tips:假如你看不懂这个文件,没有关系,随着你对linux的深入了解,你再回过头看这个文件你才会恍然活泼的。并且你如今必需要明白runlevel的各个级别的含意。
C系统初始化
在init的配置文件中有如此一行:si::sysinit:/etc/rc.d/rc.sysinit它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分区,检测c盘,加载硬件模块以及其它一些须要优先执行任务。
rc.sysinit约有850多行,并且每位单一的功能还是比较简单,并且带有注释,建议有兴趣的用户可以自行阅读自己机器上的该文件,以了解系统初始化所详尽情况。因为此文件较长,所以不在本文中列下来,也不做具体的介绍。当rc.sysinit程序执行完毕后,将返回init继续下一步。一般接出来会执行到/etc/rc.d/rc程序。以运行级别3为例,init将执行配置文件inittab中的以下这行:
l5:5:wait:/etc/rc.d/rc5
这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的那些启动脚本实际上都是一些联接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是置于/etc/rc.d/init.d/目录下。而这种rc启动脚本有着类似的用法,它们通常能接受start、stop、restart、status等参数。
/etc/rc.d/rc5.d/中的rc启动脚本一般是K或S开头的联接文件,对于以以S开头的启动脚本,将以start参数来运行。而假如发觉存在相应的脚本也存在K打头的联接,并且早已处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这种早已启动了的守护进程,之后再重新运行。这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。
至于在每位运行级上将运行什么守护进程,用户可以通过chkconfig或setup中的"SystemServices"来自行设定。
D构建终端
rc执行完毕后,返回init。这时基本系统环境已然设置好了,各类守护进程也早已启动了。init接出来会打开6个终端,便于用户登入系统。在inittab中的以下6行就是定义了6个终端:
代码如下:
1:2345:respawn:/sbin/mingettytty1
2:2345:respawn:/sbin/mingettytty2
3:2345:respawn:/sbin/mingettytty3
4:2345:respawn:/sbin/mingettytty4
5:2345:respawn:/sbin/mingettytty5
6:2345:respawn:/sbin/mingettytty6
从里面可以看出在2、3、4、5的运行级别中都将以respawn形式运行mingetty程序,mingetty程序能打开终端、设置模式。同时它会显示一个文本登入界面linux开机启动,这个界面就是我们常常见到的登入界面,在这个登陆界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验
证用户的身分。
E用户登入系统
对于运行级别为5的图形形式用户来说,她们的登陆是通过一个图形化的登陆界面。登陆成功后可以直接步入KDE、Gnome等窗口管理器。而本文主要讲的还是文本形式登陆的情况:当我们听到mingetty的登陆界面时,我们就可以输入用户名和密码来登入系统了。
Linux的帐号验证程序是login,login会接收mingetty传来的用户名作为用户名参数。之后login会对用户名进行剖析:假如用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,之后退出。这一般拿来系统维护时避免非root用户登入。只有/etc/securetty中登记了的终端才准许root用户登入,倘若不存在这个文件,则root可以在任何终端上登陆。/etc/usertty文件用于对用户做出附加访问限制,假若不存在这个文件linux开机启动,则没有其他限制。
在剖析完用户名后linux定时关机,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置帐户的其它信息,例如:主目录是哪些、使用何种shell。若果没有指定主目录,将默认为根目录;若果没有指定shell,将默认为/bin/bash。
login程序成功后,会向对应的终端在输出近来一次登陆的信息(在/var/log/lastlog中有记录),并检测用户是否有新短信(在/usr/spool/mail/的对应用户名目录下)。之后开始设置各类环境变量:对于bash来说,系统首先找寻/etc/profile脚本文件,并执行它;之后假如用户的主目录中存在.bash_profile文件,就执行它,在那些文件中又可能调用了其它配置文件,所有的配置文件执行后后,各类环境变量也设好了,这时会出现你们熟悉的行提示符,到此整个启动过程就结束了。
本文原创地址://q13zd.cn/lkjqdgylnhyd.html编辑:刘遄,审核员:暂无