系统启动与控制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

系统启动与控制

Linux系统是如何启动的?如果出现故障,应该在什么模式下修复?Linux启动时会会启动哪些服务?要回到这一系列的问题,就应该阅读本章的内容。

Linux系统是一个可订制的系统,它非常灵活。要深入理解Linux系统,我们必须要理解它的启动过程以及相关脚本。

本章目标:

学习完本章你将能够

¾理解Linux的运行级别

¾熟悉Linux的启动过程

¾配置在不同的运行级别下启动的

服务

¾GRUB引导器的配置

1.Linux系统的启动过程

图9-1显示了Linux系统的启动过程。

图9-1

具体的步骤为:

1、开机自检

2、从硬盘的MBR中读取引导程序LILO或GRUB

3、引导程序根据配置文件显示引导菜单

4、如果选择进入Linux系统,此时引导程序加载Linux内核文件。以RedHat Enterprise Linux AS4为例,GRUB程序将装载/boot/vmlinuz-2.6.9-22.EL文件到内存中。

5、当内核全部载入内存后,GRUB的任务完成,此时全部控制权限交给Linux,CPU开始执行Linux内核代码(初始化任务调度、分配内存、加载驱动等)。

6、内核代码执行完后,开始执行Linux系统的第一个进程init进程(如果在各个Linux 发行版本中查看Linux进程,将会发现init 进程的进程号都是1)。

7、init进程根据系统初始化配置文件/etc/inittab文件,执行相应的系统初始化脚本(一般都是/etc/rc.d/rc.sysinit)。

8、根据/etc/inittab文件的配置,进入不同的运行级别。

9、启动或停止相应运行级别下的服务。

10、建立终端。

11、引导login进程,进入登录界面。

内核启动的参考(作为补充材料阅读):

当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权,然后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。这里使用了几个汇编程序来引导Linux,这一步泛及到Linux源代码树中的“arch/i386/boot”下的这几个文件:bootsect.S、setup.S、video.S等。

其中bootsect.S是生成引导扇区的汇编源码,它完成加载动作后直接跳转到setup.S的程序入口。setup.S的主要功能就是将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到特别内存中,以便以后这些参数被保护模式下的代码来读取。此外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最后,setup.S将系统转换到保护模式,并跳转到 0x100000。

那么0x100000这个内存地址中存放的是什么代码?而这些代码又是从何而来的呢?

0x100000这个内存地址存放的是解压后的内核,因为Red Hat提供的内核包含了众多驱动和功能而显得比较大,所以在内核编译中使用了“makebzImage”方式,从而生成压缩过的内核,在RedHat中内核常常被命名为vmlinuz,在Linux的最初引导过程中,是通过"arch/i386/boot/compressed/"中的head.S利用misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0x100000的。

当CPU跳到0x100000时,将执行"arch/i386/kernel/head.S"中的startup_32,它也是vmlinux的入口,然后就跳转到start_kernel()中去了。start_kernel()是"init/main.c"中的定义的函数,start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。start_kernel()函数中,做了大量的工作来建立基本的Linux核心环境。如果顺利执行完start_kernel(),则基本的Linux核心环境已经建立起来了。

在start_kernel()的最后,通过调用init()函数,系统创建第一个核心线程,启动了init过程。而核心线程init()主要是来进行一些外设初始化的工作的,包括调用do_basic_setup()完成外设及其驱动程序的加载和初始化。并完成文件系统初始化和root文件系统的安装。

当do_basic_setup()函数返回init(),init()又打开了/dev/console设备,重定向三个标准的输入输出文件stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行

init程序。到此init()函数结束,内核的引导部分也到此结束了。

2.理解运行级别

在前面的系统启动中,有一个运行级的概念,那么什么是Linux系统的运行级别呢?Linux系统共有7个运行级别,分别用数字0-6来代表,各运行级别的定义如下(可以参考RedHat Linux的/etc/inittab文件中的定义):

# 0 - 停机(千万不要把initdefault设置为0 )

# 1 - 单用户模式

# 2 - 多用户,但是没有NFS

# 3 - 完全多用户模式

# 4 - 没有用到

# 5 - X11 (图形界面)

# 6 - 重新启动(千万不要把initdefault设置为6 )

标准的Linux运行级为3或者5,如果是3的话,系统就在多用户状态。如果是5的话,则是运行着X Window 系统。

要查看当前用户所处的运行级别可以使用runlevel命令:

[root@vfast ~]# runlevel

N 3

其中N代表上次所处的运行级别,3代表当前系统正运行在运行级别3(由于系统开机就进入运行级别3,因此上一次的运行级别没有,用N表示)。

要切换到其它运行级别,使用init命令,例如现在运行在级别3(多用户文本登录界面),要想进入图形登录界面,则执行:

[root@vfast ~]# init 5 #切换到运行级别5

要想重新启动系统,可以执行init 6。

3.初始化配置脚本/etc/inittab的解析

文件中以“#”开头的行都是注释,我们从有效的配置开始。

id:5:initdefault:

定义了系统启动时缺省进入哪个运行级别。安装完系统后,默认是5,如果想开机就进入文本登录界面(不用启动图形登录,节省启动时间),将5改为3即可。

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

相关文档
最新文档