全部博文(842)
分类: LINUX
2012-03-18 00:41:47
linux启动流程
部分转:http://www.cnblogs.com/scnutiger/archive/2009/09/30/1576795.html 改
Note:ubuntu系统和以下启动流程不太一致,而且ubuntu的部分文件命名和位置也不一样
linux的基础启动流程
1. 加载BIOS的硬件信息,并获取第一个启动设备的代号。
2. 读取第一个启动设备的MBR的引导加载程序(即lilo、grub、spfdisk等)的启动信息。
3. 加载操作系统的核心信息,核心开始解压,并尝试驱动所有的硬件设备。
4. 核心执行init程序并获得运行信息。
5. init执行/etc/rc.d/rc.sysinit文件。
6. 启动核心的外挂模块(/etc/modprobe.conf)。
7. init执行运行的各个批处理文件(Script)
8. init执行/etc/rc.d/rc.local文件。
9. 执行/bin/login程序,等待用户登录。
10. 登录之后开始以shell控制主机。
1. linux核心的引导
操作系统的核心是放在文件系统中的,要想正确加载核心就必须提前识别文件系统。系统刚启动的时候,就需要通过引导加载程序(即lilo、grub、spfdisk等)来识别文件系统,引导核心。要想加载linux的核心就必须能识别linux的文件系统,要加载windows核心就必须能识别windows文件系统。而grub是同时支持linux和windows的。但windows的加载程序并不支持linux文件系统,所以在多重启动设置的时候,总是要先装windows而后装Linux。
核心文件在哪里呢?一般来说,它会放在/boot里,并且取名为/boot/vmlinuz。
在加载核心的过程中,必须知道,系统只会“载入根目录”,并且是以只读方式载入的。有时为了让某些功能可以用文件的方法来读取,有的系统在启动的时,会建立虚拟盘(ramdisk),这就需要使用initrd以及linuxrc了。在加载核心的时候,一起加载initrd的映像文件(boot/initrd-xxxx.img),并利用linuxrc(在initrd的映像文件内)程序来加载模块。在核心驱动外部硬件的工作完成之后,initrd所建立的虚拟盘就会被删除。
2. 第一个程序init的加载和runlevel设置
在核心加载完成之后,系统就准备好了,等待程序的执行。整个linux系统中,第一个执行的程序就是“/sbin/init”。init程序做的工作相当多,除了利用设置文件“/etc/inittab”(ubuntu默认不建立该文件,如果用户自行建立也可以运行)来获取运行等级之外,还会通过运行等级的设置值启动不同的服务项目。运行等级是指linux通过设置不同等级来规定系统用不同的服务来启动,让linux的使用环境不同,基本上,依據有無網路與有無 X Window 而將 run level 分為 7 個等級,分別是:
"/etc/inittab"中有这么一句"si::sysinit:/etc/rc.d/rc.sysinit",表明系统需要主动使用"rc.sysinit"这个shell脚本来设置系统环境。但这个文件的文件名在各个版本中是不一样的,需要自行查看确认。
1 [root@linux ~]#vi /etc/inittab
2 # 设置系统启动默认的运行等级设置项目
3 id:3:initdefault:
4
5 # 开始启动运行等级的服务前,使用检测与初始化系统环境的设置文件:
6 si::sysinit:/etc/rc.d/rc.sysinit
7
8 # 7个不同运行等级需要启动的服务的脚本放置位置路径:
9 10:0:wait:/etc/rc.d/rc 0
10 11:1:wait:/etc/rc.d/rc 1
11 12:2:wait:/etc/rc.d/rc 2
12 13:3:wait:/etc/rc.d/rc 3
13 14:4:wait:/etc/rc.d/rc 4
14 15:5:wait:/etc/rc.d/rc 5
15 16:6:wait:/etc/rc.d/rc 6
16
17 # 是否运行按下[ctrl]+[alt]+[del]就重新启动的设置项目:
18 ca::ctrlatdel:/sbin/shutdown -t3 -r now
19
20 # 本机终端启动的个数:
21 1:2345:respawn:/sbin/mingetty tty1
22 2:2345:respawn:/sbin/mingetty tty2
23 3:2345:respawn:/sbin/mingetty tty3
24 4:2345:respawn:/sbin/mingetty tty4
25 5:2345:respawn:/sbin/mingetty tty5
26 6:2345:respawn:/sbin/mingetty tty6
27
28 # 在X Window(运行级别5)环境下启动脚本设置项目
29 x:5:once:/etc/X11/prefdm -nodaemon
30
3. init处理系统的初始化流程(/etc/rc.d/rc.sysinit)
(1)获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。
(2)测试与载入内存设备/proc及usb设备/sys。除了/proc外,系统会主动检测是否有usb设备,并主动加载usb驱动,尝试载入usb文件系统。
(3)决定是否启动SELinux。
(4)接口设备的检测与即插即用(pnp)参数的测试。
(5)用户自定义模块的加载。用户可以再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。
(6)加载核心的相关设置。又一个文件"/etc/sysctl.conf",按这个文件的设置值配置功能。
(7)设置系统时间(clock)。
(8)设置终端的控制台的字形。
(9)设置raid及LVM等硬盘功能。
(10)以方式查看检验磁盘文件系统。
(11)进行磁盘配额quota的转换。
(12)重新以读取模式载入系统磁盘。
(13)启动quota功能。
(14)启动系统随机数设备(产生随机数功能)。
(15)清楚启动过程中的临时文件。
(16)将启动信息加载到"/var/log/dmesg"文件中。
如果想知道启动过程中发生了什么事可以查看dmesg文件。
4. 启动系统服务"/etc/rc.d/rc*.d"与启动设置文件"/etc/sysconfig"
之前结束了inittab中的rc.sysinit之后,系统可以顺利工作了,只是还需要启动系统所需要的各种服务,这样主机才可以提供相关的网络和主机功能。因此根据之前设置的运行等级,会启动不同的服务项目。如果当时我们在inittab中选择了等级3,系统则会在"/etc/rc.d/rc3.d"目录中运行相应的服务内容,选择等级5,就在"/etc/rc.d/rc5.d"目录内。
该目录下的内容全部都是以 S 或 K 开头的链接文件,都链接到"/etc/rc.d/init.d"目录下的各种shell脚本。S表示的是启动时需要start的服务内容,K表示关机时需要关闭的服务内容。如果我们需要自己增加启动的内容,可以再init.d目录中增加相关的shell脚本,然后在rc*.d目录中建立链接文件指向该shell脚本。这些shell脚本的启动或结束顺序是由S或K字母后面的数字决定,例如S01sysstat表示第一个执行sysstat脚本,S99local表示排在第99位执行rc.local脚本。
5. 用户自定义引导程序(/etc/rc.d/rc.local)
-系统级,ubuntu下位置/etc/rc.local
一般来说,自定义的程序不需要执行上面所说的繁琐的建立shell增加链接文件的步骤,只需要将命令放在rc.local里面就可以了,这个shell脚本就是保留给用户自定义启动内容的。
6. 启动终端和X-Window界面
完成了系统所有的启动任务后,linux会启动终端或X-Window来等待用户登录。
tty1,tty2,tty3...这表示在运行等级1,2,3,4的时候,都会执行"/sbin/mingetty",而且执行了6个,所以linux会有6个纯文本终端,mingetty就是启动终端的命令。
除了这6个之外还会执行"/etc/X11/prefdm -nodaemon"这个主要启动X-Window
7. 用户登录后的shell配置
一般用于设置开机自启动-用户级
1. /etc/profile:首先,系统会检查这个文件,以定义如下这些变量:PATH、USER、LOGNAME、MAIL、HOSTNAME、HISTSIZE、INPUTRC。还指定了 umask 和 ulimit的设定,ulimit是用来限制一个 shell 能建立的进程数量,以避免系统资源被无限制的消耗。最后,它还会检查并执行 /etc/profile.d/*.sh 那些 script,有兴趣的话可以追踪看看。
2. ~/.bash_profile:定义 USERNAME、BASH_ENV、PATH。其中的 PATH 除了现有的 $PATH 之外,还会再加入使用者相关的路径,你会发现 root 和普通帐号的路径是不一样的;而 BASH_ENV 呢,仔细点看,是下一个要检查的文档:
3. ~/.bashrc: 首先是alias (别名)设定。然后有一行:. /etc/bashrc 。在 shell script中,用一个小数点后跟一个空格再指向另外一个 script,意思是同时执行那个 script 并采用那里的变数设定。
4. /etc/bashrc:基本上,这里的设定,是所有使用者在获得 shell 的时候都会采用的。这里指定了一些 terminal 设定,以及 shell 提示字符等等。
5. ~/.bash_login:如果 ~/.bash_profile 不存在,则使用这个文档。
6. ~/.profile:如果 ~/.bash_profile 和 ~/.bash_login 都不存在,则使用这个文档。
7. ~/.bash_logout:这个文档通常只有一个命令:clear,也就是把屏幕显示的内容清掉。如果要在登出 shell 的时候,执行一些动作,例如:清空临时文档(假如你使用了临时文档)、还原某些设定、或是执行某些备份之类的。
你可以通过修改上面这些文件,来调整你进入shell后的变数值。一般使用者可以修改其家目录( ~/ )中的文件,以进行个人化的设定;而作为 root,你可以修改 /etc/下面的文件,设定大家共用的变数值。至於 bash 的变数值如何设定?有哪些变数?各变数的功能如何?你可以执行 man bash 参考手册资料。
Tips:一旦修改了 /etc/profile 或 ~/.bash_profile 文件,其新设定要在下次登录的时候才生效。如果你不想退出,又想使用新设定,那可以用 source 命令来抓取:
source ~/.bash_profile
8. 有关变换运行等级
当linux已经登录之后,有时候还希望更换运行等级,一种方法是改变"/etc/inittab"内的设置内容,将"id:3:initdefault:"中的数字改成相应等级,然后重启即可。
如果只是想暂时地改变运行等级,下次启动还是按原等级登录,可以直接使用init [0-6]命令来改变运行等级。一般来说,运行等级的不同只是相关的启动服务内容的不同而已,因此使用命令改变等级会比较两个改变等级之间的服务内容,关闭一些新等级中不需要的服务项目,启动新等级需要的服务,而保量新等级和原等级中共有的服务内容。查询目前等级的命令也很简单,只需要输入runlevel即可。如:[root@linux ~]# runlevel 结果显示:N 3