基础知识
在LINUX系统中有一个名为/etc/passwd的文件,该文件存放了系统用户的信息,每个授权用户在文件中占有一个记录项。
在大部分LINUX系统中使用了/etc/shadow文件进行用户的口令管理,格式和帐户文件大致类似
LINUX系统中,共有7个运行级别,含义如下(缺省运行级别为5):
- 0 停机。不要把系统的默认级别设置为0,否则系统不能正常启动。
- 1 单用户模式。用于root用户对系统进行维护,不允许其他用户使用主机。
- 2 多用户模式。在该模式下不能使用NFS。
- 3 完全多用户模式。主机作为服务器时通常在该模式下。
- 4 未分配使用。
- 5 图形登陆的多用户模式。用户在该模式下可以进行图形界面的登陆。
- 6 重新启动。不要把系统的默认级别设置为6,否则不能正常启动。
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这个内存地址存放的是解压后的内核
- 当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()函数结束,内核的引导部分也到此结束了。
第二部分:运行init
init的进程号是1,从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序。init程序需要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成。
第三部分:系统初始化
在init的配置文件中有这么一行:
si::sysinit:/etc/rc.d/rc.sysinit
它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。
第四部分:启动对应运行级别的守护进程
在rc.sysinit执行后,将返回init继续其它的动作,通常接下来会执行到/etc/rc.d/rc程序。以运行级别5为例,init将执行配置文件inittab中的以下这行:
l5:5:wait:/etc/rc.d/rc 5
这一行表示以5为参数运行/etc/rc.d/rc5.d,/ /etc/rc.d/rc5.d是一个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改变运行级别时,所有相关的守护进程都将重启。