Chinaunix首页 | 论坛 | 博客
  • 博客访问: 291681
  • 博文数量: 134
  • 博客积分: 667
  • 博客等级: 上士
  • 技术积分: 770
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-08 15:19
文章分类

全部博文(134)

文章存档

2012年(134)

分类:

2012-04-08 16:02:58

原文地址:linux启动流程 作者:yulianliu1218

linux启动流程

 

部分转:http://www.cnblogs.com/scnutiger/archive/2009/09/30/1576795.html 

 

Noteubuntu系统和以下启动流程不太一致,而且ubuntu的部分文件命名和位置也不一样

linux的基础启动流程
1. 加载BIOS的硬件信息,并获取第一个启动设备的代号。
2. 读取第一个启动设备的MBR的引导加载程序(即lilogrubspfdisk等)的启动信息。
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核心的引导
操作系统的核心是放在文件系统中的,要想正确加载核心就必须提前识别文件系统。系统刚启动的时候,就需要通过引导加载程序(即lilogrubspfdisk等)来识别文件系统,引导核心。要想加载linux的核心就必须能识别linux的文件系统,要加载windows核心就必须能识别windows文件系统。而grub是同时支持linuxwindows的。但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 個等級,分別是:

  • 0 - halt (系統直接關機)
  • 1 - single user mode (單人維護模式,用在系統出問題時的維護)
  • 2 - Multi-user, without NFS (類似底下的 runlevel 3,但無 NFS 服務)
  • 3 - Full multi-user mode (完整含有網路功能的純文字模式)
  • 4 - unused (系統保留功能)
  • 5 - X11 ( runlevel 3 類似,但加載使用 X Window)
  • 6 - reboot (重新開機)


"/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)测试与载入内存设备/procusb设备/sys。除了/proc外,系统会主动检测是否有usb设备,并主动加载usb驱动,尝试载入usb文件系统。
3)决定是否启动SELinux
4)接口设备的检测与即插即用(pnp)参数的测试。
5)用户自定义模块的加载。用户可以再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。
6)加载核心的相关设置。又一个文件"/etc/sysctl.conf",按这个文件的设置值配置功能。
7)设置系统时间(clock)。
8)设置终端的控制台的字形。
9)设置raidLVM等硬盘功能。
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脚本的启动或结束顺序是由SK字母后面的数字决定,例如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...
这表示在运行等级1234的时候,都会执行"/sbin/mingetty",而且执行了6个,所以linux会有6个纯文本终端,mingetty就是启动终端的命令。
除了这6个之外还会执行"/etc/X11/prefdm -nodaemon"这个主要启动X-Window


 

7. 用户登录后的shell配置

一般用于设置开机自启动-用户级

1. /etc/profile:首先,系统会检查这个文件,以定义如下这些变量:PATHUSERLOGNAMEMAILHOSTNAMEHISTSIZEINPUTRC。还指定了 umask  ulimit的设定,ulimit是用来限制一个 shell 能建立的进程数量,以避免系统资源被无限制的消耗。最后,它还会检查并执行 /etc/profile.d/*.sh 那些 script,有兴趣的话可以追踪看看。

2. ~/.bash_profile:定义 USERNAMEBASH_ENVPATH。其中的 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

阅读(524) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~