Linux系统一个很重要且强大的特征就是,它是一个开放的系统,用户可以自己配置如何启动这个系统。用户可以自由配置系统启动过程的各个方面,包括在启动时定制启动那些应用程序,同样,关机时也可以自由配置如何去关闭各个程序,不过定制关机处理过程正常情况下是及少用到的。
理解如何启动及关闭一个程序的工作过程不仅仅就是为了定制个性化的Linux系统,而且非常有助于你去解决一些启动及关闭系统时产生的相关问题。
1.1启动过程概览
下面列出了X86平台下系统启动的主要起个步骤:
1.BIOS进行系统自检,并且运行在主硬盘MBR上的第一阶段Boot Loader。
2.第一阶段的Boot Loader把自身载入内存运行,然后从/boot/分区启动第二阶段的Boot Loader。
3.第二阶段的Boot Loader把内核装载入内存运行,然后内核会顺序载入所有必须的模块,并且以只读的方式挂载/boot/分区。
4.内核把启动过程的控制权转给/sbin/init程序。
5./sbin/init程序启动所有的服务及一些用户实用工具,并挂载所有的/etc/fstab文件列出的分区。
6.最后这刚启动的系统会提示用户登录。
较之于定制关机过程,配置系统启动的过程更加的常用。本章的剩余部分将详细讨论启动的工作过程以及怎么去定制这个过程以迎合各种各样的需求。
1.2启动过程的详细说明
启动过程开始阶段会因使用的硬件平台不同而不同。然而,一旦内核被找到并被Boot Loader装载到内存,默认的启动过程就都是一样的了,本章以X86体系为例子进行说明。
1.2.1BIOS
当一个X86电脑启动,处理器会在系统内存的最末端去查找BIOS程序并运行它。BIOS不仅仅控制第一阶段的启动过程,并且为外接设备提供了一些底层接口,因此它被写到只读的可永久保存的存储器上,并且随时可被使用。
其它平台使用不同的程序去执行这些跟BIOS在X86系统上相似作用的底层任务。比如,Itanium-based 电脑使用Extensible Firmware Interface(EFI) Shell,而 Alpha 系统使用SRM 来控制。
一旦BIOS被载入到内存,BIOS会检查整个系统,查找并检查外设,并且查找一个可以去启动系统的设备。通常,它会先检查磁盘设备和CD-ROM,如果没有找到才会去查找系统的硬盘。通常情况下,这个查找顺序我们可以通过BIOS去设定,让BIOS去主IDE总线上主IDE设备上去查找。然后BIOS会把在第一个可用设备的第一个扇区(MBR)的里的内容载入到内存里去,它只管把MBR载入内存,并不管里面实际是什么东西。MBR一般都只有512字节大小,它包含一些启动这台机器的指令码,我们称之为Boot Loader ,另外还包括了硬盘的分区信息。一旦BIOS找到并把Boot Loader载入了内存,它就把控制权交给Boot Loader去处理后续的事情。
1.2.2Boot Loader
这一节针对X86平台讲解一下Boot Loader。在不同的系统架构下面,启动过程会有一些小小的不同,请查阅 1.2.2.1 其它体系下面的Boot Loader那里会有一个关于非X86平台的Boot Loader的简短概述。,
一般Linux系统会提供两种Boot Loader: GRUB和LOLO。其中GRUB是大多数Linux系统的默认Boot Loader,而LILO则是为迎合一些特殊需求或个人喜好而准备的。关于如何配置和使用这两种Boot Loader,请查阅第二章Boot Loader。
这两种Boot Loader在X86平台下都至少被分成了两个阶段。第一个阶段是,在MBR上的机器微指令负责把定位第二阶段的Boot Loader,并把它装载入内存。
GRUB比LILO更新,并且可以读EXT2和EXT3格式的分区,并且可以在启动时读取它本身的配置文件——/boot/grub/grub.conf。关于怎样去编辑这个文件请查阅2.7节Grub菜单配置文件。
LILO,在第二阶段使用在MBR上的信息决定提供给用户的启动选项。这就意味于任何时候,只要配置发生了改变或是内核进行了手动升级,必须执行/sbin/lilo –v –v命令把合适的信息定到MBR里去。更多的相关信息请查阅2.8节LILO。
提示:如果使用Red Hat Update Agent升级内核,Boot Loader的配置文件会自动更新。
一旦第二阶段的Boot Loader被载入到内存里,它显示一个图形界面给用户,这个界面里包含了不同的操作系统或内核的选项。用户可以通过上下键去选择不同的操作系统,然后按Enter去启动选择的操作系统。如果在一段固定的时间内没有按任何键,Boot Loader会启动一个默认的操作系统。
注意:GRUB以会把EXT3格式的分区当做EXT2来读,更多的EXT3文件系统的细节请查阅 Red Hat Customization Guide中的The Ext3 file system 一章。
一旦第二阶段的Boot Loader决定了启动哪个内核,它就会在/boot/目录下去定位相应的内核二进制文件,内核的二进制文件以如下格式命名:/boot/vmlinuz-<kernel-version>,这里的kernel-version对应Boat Loader里配置的kernel version.
关于怎么使Boot Loader提供命令行可以发送指令到内核请查阅第二章 Boot Loader关于在GRUB或LILO出现提示时怎么改变运行级别,请查阅2.10节在启动时改变运行级别。,
然后,Boot Loader会把initrd载入内存,内核通过initrd载入所在必须的驱动程序以启动系统。当有SCSI驱动或是使用了EXT3文件系统时这个过程尤其重要。
警告:不要因为任何原因把/initrd/目录从文件系统中移走,移走这个目录将导致系统启动时莫名其妙的内核错误提示信息。
一旦,内核和initrd镜像被载入到了内存,Boot Loader就会把系统启动的控制权移交给Linux 内核。
从第二章BootLoader可以获得更多有关GRUB和LILO的细节信息。
1.2.2.1其它体系下的Boot Loader
一旦Linux载入了内核并把启动过程移交到init程序,无任哪种体系,后面所有发生的事情及顺序就都是一样的了。所以各种不同体系下系统启动的不同就是发现和装载内核的不同。
比如,Alpha使用about Boot Loader,而Itanium使用ELILO Boot Loader.
这些平台下如何去配置相应的Boot Loader请参考《Red Hat Installation Guide.》
1.2.3Kernel
当Kernel被装载到内存后,它会马上初始化和配置电脑的内存,并配置各种不同的连接到这台电脑的硬件设备,包括所有的处理器,I/O子系统,以及存储设备。然后Kernel在预定的地方找到initrd镜像的压缩包,对它进行解压和挂载,并载入所有必须的驱动。下一步,在删除initrd镜像挂载和回收所有被它占用的内存之前,它将会初始化文件系统相应的虚拟设备比如LVM或软件RAID。
然后,Kernel会创建root设备,以只读方式挂载root分区,并释放所有没有被使用的内存。
这时候,Kernel已经被装载到内存里运行起来了。但是,因为没有用户应用程序充许输入有意义的指令给系统,所以仍然不能为你做什么事情。
为了建立用户使用环境,内核接下来会执行/sbin/init程序。
1.2.4/sbin/init程序
/sbin/init程序(或干脆简称为init)负责处理启动过程的其余部分,并用为用户配置一个使用环境。
当init程序启动后,它就成了所有linux系统自动启动的进程的父进程或是祖父进程。首先,它会执行/etc/rc.d/rc.sysinit文件的脚本,这里会设置环境路径,启动交换分区,检查文件系统,并检查所有在系统启动阶段需要做好的事情。比如,许多系统使用时钟,所以在rc.sysinit里读取/etc/sysconfig/clock配置文件去初始化硬件时钟。再一个例子,假如有特殊的串口进程必须被初始化,rc.sysinit会执行/etc/rc.serial文件。
然后init程序开始执行/etc/inittab脚本文件,在这个文件里描述了每一个Sys V风格的系统的初始运行级别。此外,/etc/inittab设置了默认的运行级别,并在任何运行级别下都运行/sbin/update程序。
接下来,init 程序为系统设置基本功能库,/etc/rc.d/init.d/functions。通过它可以启动或是杀掉一个程序,以及决定一个进程的PID。
然后Init程序开始启动所有的后台进程,具体哪些后台进程需要启动由相应的/etc/rc.d/rcN.d目录决定,这个N就是在/etc/inittab里定义的当前系统的运行级别, 比如/etc/rc.d/rc3.d/这个目录就供运行级别为3的系统使用的。
当系统的动行级别为3,int程序就会通过查找/etc/rc.d/rc3.d/目录来决定哪些程序需要启动或是停止。
/etc/rc.d/rc3.d目录下包含是类似下面的内容:
lrwxrwxrwx 1 root root 17 2008-01-16 12:23 S05vbesave -> ../init.d/vbesave
lrwxrwxrwx 1 root root 15 2008-01-16 12:23 S10acpid -> ../init.d/acpid
lrwxrwxrwx 1 root root 18 2008-01-16 12:23 S10sysklogd -> ../init.d/sysklogd
lrwxrwxrwx 1 root root 15 2008-01-16 12:23 S11klogd -> ../init.d/klogd
lrwxrwxrwx 1 root root 14 2008-01-16 12:23 S12dbus -> ../init.d/dbus
lrwxrwxrwx 1 root root 13 2008-01-16 12:23 S12hal -> ../init.d/hal
lrwxrwxrwx 1 root root 13 2008-01-16 12:52 S16ssh -> ../init.d/ssh
从目录下的内容可以看出,/etc/rc.d/rc3.d/目录下并没有放置任何真正的启动或停止服务的脚本,它全是一些被链到/etc/rc.d/init.d/目录下的脚本文件的符号链接。符号链接的方式在所有的rc目录下都被使用了,因此,通过创建、修改、删除这些符号链接,我们可以很容易的配置某个运行级别下需启动或停止的服务,但却并不需要去真正修改任何相应服务的脚步文件.
每个符号链接的名称不是以K开就是以S开头,所有以K开头的符号链接意味着这个运行级别下这个服务在关闭,而以S开头的则刚好相反,在当前级别下这个服务要启动。
Init程序首先会通过/etc/rc.d/init.d/<commond> stop命令关闭所有以K开头的符号链接对应的服务,然后通过/etc/rc.d/init.d/<commond> start命令启动所有以S开头的符号链接对应的服务。
提示:当系统完成启动后,你同样可以用root用户登录系统,通过执行同样的脚本来开始或结束某项服务,而不管当前运行级别是什么。比如:命令/etc/rc.d/init.d/httpd stop 将会关闭Apache Web服务。
观察每个符号链接名,会发现名称里都编进了一个号码,init程序就是根据这个号码来决定启动或关闭服务的顺序的,越小的号码会预示着这个服务会被越早启动或关闭,如果号码相同则由按字母排序来决定启动顺序。
注意:Init程序最后要做的一件事情是执行/etc/rc.d/rc.local文件,这个文件是用于系统定制的,1.3节在启动时运行额外的程序提体供了更多有关这个文件的细节信息。
当处理完运行级别对应的rc目录后,/etc/inittab脚本会为分配的每一个虚拟控制台创建一个/sbin/mingetty进程,级别为2到5时可以一共有6个控制台,级别出1只有一个,而级别0和6根本就没有。/sbin/mingetty进程打开一个到tty设备的通信通道,设置通信模式,提示用户登录,取得用户名以及为用户启动一个相应的进程。
如果运行级别是5, /etc/inittab执行一个名为/etc/X11/prefdm的脚本。这个脚本会提示图像界面给用户,具体如何提示取决于/etc/sysconfig/desktop文件。
1.3在启动时运行额外的程序
当系统启动时或是改变运行级别时init程序都会去执行/etc/rc.d/rc.local文件里的脚本。在这个脚本文件里写一些脚本是让系统做一些额外动作的好方法,这样你就不需要去/etc/rc.d/init.d里去写这些复杂的脚本,并对一些相应级别的RC目录里去修改那些符号链接了。
当启动时需要设置串口就需要用到/etc/rc.serial脚本文件,在这个脚本文件里会使用setserial命令去配置系统的串口,如想了解有关setserial命令的更详细信息请参考相应的手册。
1.4Sys V风格的初始运行级别
Sys V风格的运行级别系统,为系统在某个运行级别下需要启动或停止某个服务提供了一个标准,Sys V风格的初始化机制之所以被Linux选取是因为较之于传统的BSD风格的初始化过程,Sys V风络的初始化机制更加的灵活。
Sys V风格的配置文件都被放置到/etc/rc.d/目录下面。这个目录里面包含rc, rc.local, rc.syscinit以及如下的一些目录:
Init.d/
Rc0.d/
Rc1.d/
Rc2.d/
Rc3.d/
Rc4.d/
Rc5.d/
Rc6.d/
/sbin/init程序控制服务运行时使用的脚本都放在Init.d/目录下。每个编号的Rc目录则提供了相应级别下所有系统服务的配置关系。
1.4.1运行级别
运行级别理解为一种状态或一种模式,由通过定制/etc/rc.d/rc<x>.d/目录来定义这种运行级别,这里的x就是对应的运行级别。
Sys V的初始运行级别就是为了迎合我们不同的系统很可能会以不同的方式来使用它的事实。比如,一台服务器可能为了运行得更加快速有效而不想被X window系统占用大量系统资源所拖累。又比如,一个系统管理员为了诊断一些问题可能想在一个很低级别下去操作这个系统,这样其它用户就不可能登录这个系统了。
运行级别可以让init决定哪些服务需要启动或是关闭。比如,级别为1时(单人模式)会停止任何的网络服务,而级别3则会开启这些服务。通过定制每个运行级别上的服务启动与否,init程序可以很快的改变机器的运行模式也不需要用户手动的去启动或停止那些服务。
下面是一些Red Hat Linux系统默认的运行级别:
l 0 停止
l 1 单人文本模式
l 2 未被使用(供用户自由定制)
l 3 多用户文本模式
l 4 未被使用(供用户自由定制)
l 5 多用户图形模式
l 6 重启
通常,用户在级别3或5上操作Linux,因为级别2和4没有被使用,所以用户可以自己自由定制这两个级别以迎合一些特殊需求。比如很多人把级别2 定义成可供多用户使用的不带网络功能的系统。
系统启动的默认运行级别在/etc/inittab文件里设定,类似于下面这行:
Id:5:initdefault:
上面个运行级别就是5,你可能通过修改这个值来改变系统启动后的默认运行级别,当然只有root用户才有权限更改这个文件。
警告:修改这个文件里必须特别的小心,一个非常轻微的输入错误可能导致系统不能启动。如果碰到这种情况,可以使用启动盘进入单人模式或是进入修复模式来启动电脑然后修复这个文件。
这个启动的默认级别也可以在启动时通过修改BootLoader传给Kernel的参数来改变,更多有关在启动时改变运行级别的信息请查阅2.10节启动时改变运行级别。
1.4.2一些有关运行级别的实用工具
使用一些脚本工具去配置运行级别是一个很好的方法,这些工具可以大大简化维护Sys V Init目录层次下的各个文件工作,并大大减轻系统管理员直接操纵/etc/rc.d/.目录下那些符号链接的工作。
Red Hat提供了三个这样的工具:
l /sbin/chkconfig 这是一个针对/etc/rc.d/init.d/目录层次的简单命令行工具
l /sbin/ntsysv 这个工具提供了基于文本的交互式接口,看上去比chkconfig更易使用
l Services Configuration Tool 这个工具是一个很方便的基于GTK2配置运行级别的工具,你可以使用redhat-config-services来启动这个程序。
想要了解更多的有关这些工具的信息请查阅《Red Hat Linux Customization Guide》一书中的Control Access to services这一章。
1.5关机
要想正确关闭我们的Linux系统,必须学会使用/sbin/shutdown命令,shutdown命令的帮助手册列出了所有的选项,这里列出最常用的两个:
/sbin/shutdown –h now
/sbin/shutdown –r now
当所有东西都关掉之后,-h选项会给电脑断电,-r选项会让电脑重新启动。
对于Red Hat Linux在任何运行级别下,非root用户都不能使用reboot和halt去关闭电脑。请注意,其它发行版不一定支持这个特性。
如果电脑没有自己关闭电源,务必要等到电脑提示一条消息指示系统已经停止了。如果没有等到这条提示消息则意味着并不是所有硬盘分区都卸载了,如果强行关机可能导致Linux的文件系统蹦溃。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/guosha/archive/2008/04/24/2324403.aspx