12开机关机流程与 Loader.docx

上传人:b****5 文档编号:5842328 上传时间:2023-01-01 格式:DOCX 页数:47 大小:526.25KB
下载 相关 举报
12开机关机流程与 Loader.docx_第1页
第1页 / 共47页
12开机关机流程与 Loader.docx_第2页
第2页 / 共47页
12开机关机流程与 Loader.docx_第3页
第3页 / 共47页
12开机关机流程与 Loader.docx_第4页
第4页 / 共47页
12开机关机流程与 Loader.docx_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

12开机关机流程与 Loader.docx

《12开机关机流程与 Loader.docx》由会员分享,可在线阅读,更多相关《12开机关机流程与 Loader.docx(47页珍藏版)》请在冰豆网上搜索。

12开机关机流程与 Loader.docx

12开机关机流程与Loader

开机关机流程与Loader1

开机流程简介1

bootloader与kernel加载2

第一支程序init及设定文件/etc/inittab与runlevel4

init处理系统初始化流程(/etc/rc.d/rc.sysinit)7

启动系统服务与相关启动设定档(/etc/rc.d/rc.n&/etc/sysconfig)8

使用者自订开机启动程序(/etc/rc.d/rc.local)10

根据/etc/inittab之设定,加载终端机或X-Window接口。

11

其它开机相关事项:

11

关于模块:

/etc/modprobe.conf11

/etc/sysconfig/*12

Runlevel之变换:

14

核心与核心模块15

核心模块与相依性15

核心模块的观察:

lsmod,modinfo16

核心模块的加载与移除:

insmod,modprobe,rmmod18

核心模块的额外参数设定:

/etc/modprobe.conf19

BootLoader:

Grub20

bootloader的功能与意义20

grub的设定文件/boot/grub/menu.lst与安装型态22

与硬盘的关系:

22

/boot/grub/menu.lst设定档:

23

1.直接指定核心开机24

2.利用chainloader的方式:

25

initrd的重要性26

测试与安装grub28

开机前的额外功能修改32

关于核心功能当中的vga设定:

34

关于大硬盘的问题34

BootLoader:

LILO35

LILO的设定文件/etc/lilo.conf:

36

测试与安装LILO开机管理程序:

38

一些问题的解决之道:

40

开机过程的问题解决:

41

忘记root密码的解决之道:

41

因设定错误而无法开机:

42

利用chroot切换到另一颗硬盘工作43

参考数据44

本章习题练习44

开机关机流程与Loader

在这个章节当中,我们特别要来看一看整个开机的流程设定,看看能不能在开机的时候就主动的帮我们将所需要的信息都填进去!

此外,还想要知道一下,我们要如何来设定多重开机呢?

设定多重开机的原理是什么?

最重要的是那个『什么是开机管理程序(bootloader)呢?

』这些东西对于家里只有一部计算机,却又要安装多个操作系统的朋友来说,是相当重要而有趣的项目呢!

鸟哥底下会介绍Linux下的两套相当棒的bootloader系统,分别是lilo及grub。

开机流程简介

开机不是只要按一下电源钮而关机只要关掉电源钮就可以了吗?

有何大学问?

话是这样没错啦,但是由于Linux是一套多人多任务的操作系统,你难保你在关机时没有人在在线,如果你关机的时候碰巧一大群人在在线工作,那会让当时在在线工作的人马上断线的!

那不是害死人了!

一些数据可是无价之宝哩!

另外,与DOS环境不同的是,Linux在执行的时候,虽然你在画面上只会看到黑压压的一片,完全没有任何画面,但其实他是有很多的程序在背景底下执行的,例如登录文件管控程序、前面两章提到的例行性命令,当然还有一大堆网络服务,如邮件服务器、WWW服务器等等。

你如果随便关机的话,是很容易伤害硬盘及数据传输的动作的!

所以在Linux下关机可是一门大学问喔。

既然开机是很严肃的一件事,呵呵,那我们来了解一下整个开机的过程吧!

好让大家比较容易发现开机过程里面发生错误的地方,与解决之道!

不过,由于开机的过程中,那个开机管理程序(BootLoader)使用的软件可能不一样,例如目前各大Linuxdistributions的主流为grub,但早期Linux预设是使用LILO,台湾地区则很多朋友喜欢使用spfdisk。

但无论如何,我们总是得要了解整个bootloader的工作情况,才能了解为何进行多重开机的设定时,为何老是听人家讲要先安装Windows再安装Linux的原因~

我们先来想一想,Linux整个开机的程序是怎样呢?

还记得我们提过,开机时要加载核心,让核心来驱动整个硬件,这样才能算是一个最阳春、最基础的操作系统吧?

然后才能够执行各种程序的运作。

同样的,开机的流程也是需要先加载核心的。

不过,加载核心前,却需要一些前置作业,才能够正确无误的加载核心嘛!

所以,整个开机的程序是这样的:

1.加载BIOS的硬件信息,并取得第一个开机装置的代号;

2.读取第一个开机装置的MBR的bootLoader(亦即是lilo,grub,spfdisk等等)的开机信息;

3.加载Kernel操作系统核心信息,Kernel开始解压缩,并且尝试驱动所有硬件装置;

4.Kernel执行init程序并取得run-level信息;

5.init执行/etc/rc.d/rc.sysinit档案;

6.启动核心的外挂模块(/etc/modprobe.conf);

7.init执行run-level的各个批次档(Scripts);

8.init执行/etc/rc.d/rc.local档案;

9.执行/bin/login程序,并等待使用者登入;

10.登入之后开始以Shell控管主机。

大概的流程就是上面写的那个样子啦,而每一个程序的内容主要是在干嘛呢?

底下就分别来谈一谈吧!

bootloader与kernel加载

由第一篇里面谈到的一些基础的主机硬件概念当中,我们知道整个主机在开机的时候,第一个被读取的地方,就是BIOS(BasicInputOutputSystem)啦,这个BIOS里面记录了主机板的芯片组与相关的设定,例如CPU与接口设备的沟通频率啊、开机装置的搜寻顺序啊、硬盘的大小与类型啊、系统时间啊、各周边总线的是否启动PlugandPlay(PnP,随插即用装置)啊、各接口设备的I/O地址啊、以及与CPU沟通的IRQ岔断等等的信息都记录在此,所以啰,系统要顺利的开机,首先就是要去读取BIOS的相关设定值了。

读取了BIOS设定值之后,系统会根据BIOS的数据,进行开机自我测试(poweronselftest,POST),然后开始执行硬件侦测的初始化,并设定PnP装置,之后再定义出可开机的装置,之后就会开始进行开机装置的数据读取了(MBR相关的任务开始)。

读完了BIOS并且了解了主要的主机硬件相关信息后,主机便会开始尝试由储存媒体加载操作系统了。

我们刚刚提到BIOS会记录『可用来开机的装置搜寻顺序』对吧!

所以,系统会开始去第一个开机装置上面进行开机程序。

我们在第二篇的磁盘档案系统(filesystem)当中提到过整个储存装置的特性,如果以硬盘来看,那么开机流程读到硬盘的过程中,第一个要读取的就是该硬盘的主要开机扇区(MasterBootRecord,MBR)了,而系统可以由主要开机区所安装的开机管理程序(bootloader)开始执行核心辨识的工作。

Tips:

我们知道每颗硬盘的第一个扇区称为MBR,那么如果我的主机上面有两颗硬盘的话,系统会去哪颗硬盘的MBR读取数据呢?

这个就得要看BIOS的设定了。

基本上,我们常常讲的『系统的MBR』其实指的是第一个开机装置的MBR才对!

所以,改天如果您要将开机管理程序安装到某颗硬盘的MBR时,要特别注意当时系统的『第一个开机装置』是那个,否则会安装到错误的硬盘上面喔!

重要重要!

那么为什么要在MBR安装bootloader呢?

而这个bootloader有什么功能呢?

还记得我们在第二篇提到的磁盘档案系统吧?

我们的操作系统核心必须要认识磁盘档案系统才能读取里面的数据啊,但是整个系统才刚刚到开机起头的地方而已,要如何认识磁盘档案格式呢?

那就得要藉由bootloader来辅助啦!

所以啰,当然必须要有bootloader才有办法加载Linux的核心(kernel)啊!

由于bootloader的特殊功能,因此,想要加载Linux核心时,当然得使用支持Linuxfilesystem的bootloader了,目前主流的grub这套开机管理程序,不但可以支持Linux,同时也支持Windows相关的核心系统呢!

好了,先再来回忆一下,如果你是以grub程序开机的话,那么在开机的时候会显示什么数据呢?

呵呵!

会显示蛮多的开机选单,没错~就是『选单』,然后选择了你的选择项目之后,系统就会跑到该扇区去读取该操作系统的核心啰!

呵呵!

所以一个好的bootloader会具有两个功能,就是:

*选单功能(menu)

*指向功能(pointer)

再来强调一下,因为Windows与Linux的档案格式不一样?

为了加载系统核心,所以必须要安装认识我们操作系统的loader,而Linux的loader(lilo或grub)是可以认识windows的核心档案的,但是Windows的loader却不认识Linux的核心档案,因此,作为一个多重开机的设定loader,就无法使用Windows所提供的loader啰!

由于需要让系统认识你的kernel,因此,就需要bootloader啦!

这样想就对啦!

好了,当我们藉由bootloader的管理而开始读取核心档案后,接下来,Linux就会将核心解压缩到主存储器当中,并且利用核心的功能,开始测试与驱动各个周边装置,包括储存装置、CPU、网络卡、声卡等等。

那么核心档案在哪里啊?

一般来说,他会被放置到/boot里面,并且取名为/boot/vmlinuz才对!

在加载核心的过程当中,我们必须要知道的是,系统只会『挂载根目录』而已,而且是以只读的方式挂载的。

此外,有时为了让某些功能可以用档案的方式来读取,因此,有的系统在开机的时候,会制作所谓的虚拟硬盘(RAMDisk)来辅助的,那就是initrd以及linuxrc的功用了。

利用bootloader的功能,可以在加载核心的时候,一起加载initrd的映象檔(/boot/initrd-xxxx.img),Linux系统会主动的以initrd(man4initrd)来进行虚拟硬盘的建置,并且利用linuxrc(包含在initrd的映象档内)这个程序的功能来进行加载模块的动作。

linuxrc主要的特性是:

*必须是linuxrc这个档名;

*必须放置在initrd所建立的虚拟磁盘的最顶层目录;

*必须要可以被核心所执行。

在核心驱动周边硬件的工作完成之后,initrd所建立的虚拟磁盘就会被移除了!

不过您要注意的是,initrd并非必要的,是可有可无的,要看您当初建立该核心的时候,整个编译的角度与过程。

一般来说,各大Linuxdistributions在建立核心时,都会一起建立出这个initrd的映象档,辅助开机的顺利进行。

总之,在这个过程当中,bootloader可以找到Linux的核心档案并且将他加载到主存储器当中,同时可能可以藉由initrd建立起虚拟硬盘(RAMDisk)辅助开机的进行,最后,将读自BIOS的主机硬件数据交由Linux核心来进行侦测并且加载适当的驱动程序(driver),就让整个主机硬件准备系统的要求了。

整个流程有点像这样:

图一、BIOS与bootloader及核心加载流程示意图

在核心完整的加载后,您的主机应该就开始正确的运作了,接下来,就是要开始执行系统的第一支程序:

init。

第一支程序init及设定文件/etc/inittab与runlevel

在核心加载完毕之后,此时系统应该就已经准备妥当,等待程序的执行了。

而整个Linux系统当中第一支被执行的程序就是『/sbin/init』啰~这也是我们在前一章使用psaux|more时,看到第一行所显示的程序内容(PID为1的那行啦)!

init这支程序所做的工作相当的多,他除了利用设定档『/etc/inittab』来取得开机的等级(Runlevel)之外,还会经由这个runlevel的设定值来进行不同的开机服务项目的启动。

那么什么是runlevel呢?

他有什么功用啊?

其实很简单啦,Linux就是藉由设定runlevel来规定系统使用不同的服务来启动,让Linux的使用环境不同。

基本上,依据有无网络与有无XWindow而将runlevel分为六个等级,分别是:

*0-halt(系统直接关机)

*1-singleusermode(单人维护模式,用在系统出问题时的维护)

*2-Multi-user,withoutNFS(类似底下的runlevel3,但无NFS服务)

*3-Fullmulti-usermode(完整的含有网络功能的纯文字模式)

*4-unused(系统保留功能)

*5-X11(与runlevel3类似,但使用XWindow)

*6-reboot(重新开机)

由于runlevel0,4,6不是关机、重新开机就是系统保留的,所以:

『您当然不能将预设的runlevel设定为这三个值』,否则系统就会不断的自动关机或自动重新开机....

好了,那么我们开机时,到底是如何取得系统的runlevel的?

呵呵!

当然是/etc/inittab所设定的啰!

那么/etc/inittab到底有什么信息呢?

我们先来看看这个档案的内容好了:

[root@linux~]#vi/etc/inittab

#设定系统开机预设的runlevel设定项目:

id:

3:

initdefault:

#开始进行runlevel的服务启动前,使用来侦测与初始化系统环境的设定文件:

si:

:

sysinit:

/etc/rc.d/rc.sysinit

#7个不同runlevel的,需要启动的服务的scripts放置路径:

l0:

0:

wait:

/etc/rc.d/rc0

l1:

1:

wait:

/etc/rc.d/rc1

l2:

2:

wait:

/etc/rc.d/rc2

l3:

3:

wait:

/etc/rc.d/rc3

l4:

4:

wait:

/etc/rc.d/rc4

l5:

5:

wait:

/etc/rc.d/rc5

l6:

6:

wait:

/etc/rc.d/rc6

#是否允许按下[ctrl]+[alt]+[del]就重新开机的设定项目:

ca:

:

ctrlaltdel:

/sbin/shutdown-t3-rnow

#本机端终端机启动的个数:

1:

2345:

respawn:

/sbin/mingettytty1

2:

2345:

respawn:

/sbin/mingettytty2

3:

2345:

respawn:

/sbin/mingettytty3

4:

2345:

respawn:

/sbin/mingettytty4

5:

2345:

respawn:

/sbin/mingettytty5

6:

2345:

respawn:

/sbin/mingettytty6

#在XWindow(runlevel5)环境下的启动script设定项目:

x:

5:

once:

/etc/X11/prefdm-nodaemon

这个档案的语法是这样的:

[设定项目]:

[runlevel]:

[init的动作行为]:

[指令项目]

1.设定项目:

最多四个字符,代表init的主要工作项目,只是一个简单的代表说明。

2.runlevel:

该项目在哪些runlevel底下进行的意思。

如果是35则代表runlevel3与

5都会执行。

3.init的动作项目:

主要可以进行的动作项目意义有:

initdefault:

代表预设的runlevel设定值;

sysinit:

代表系统初始化的动作项目;

ctrlaltdel:

代表[ctrl]+[alt]+[del]三个按键是否可以重新开机的设定;

wait:

代表后面接的指令项目必须要执行完毕才能继续后面的动作;

respawn:

代表后面接的,init仍会主动的『重新』启动。

更多的设定项目请参考maninittab的说明。

4.指令项目:

亦即应该可以进行的指令,通常是一些script啰。

所以我们可以得到这样的结论:

*如果不想让使用者利用[crtl]+[alt]+[del]来重新启动系统,可以将底下这一行批注掉:

ca:

:

ctrlaltdel:

/sbin/shutdown-t3-rnow

*规定开机的预设runlevel是纯文字(3)或者是具有图形接口(XWindow,5),可经由『id:

3:

initdefault:

』那个数字来决定!

以鸟哥自己这个档案为例,我是使用纯文字喔!

所以说,你现在会自行修改登入时的预设runlevel设定值了吗?

够简单的吧?

一般来说,我们预设都是3或者是5来作为预设的runlevel的。

但有时后可能需要进入runlevel1,也就是单人维护模式的环境当中。

这个runlevel1有点像是Windows系统当中的『安全模式』啦,专门用来处理当系统有问题时的操作环境。

此外,当系统发现有问题时,举例来说,不正常关机造成filesystem的不一致现象时,系统会主动的进入单人维护模式呢!

好了,init在取得runlevel之后,接下来要干嘛?

上面/etc/inittab档案内容不是有提到sysinit吗?

嘿嘿!

准备初始化系统了吧!

init处理系统初始化流程(/etc/rc.d/rc.sysinit)

还记得上面提到/etc/inittab里头有这一句『si:

:

sysinit:

/etc/rc.d/rc.sysinit』吧?

这表示:

『我开始加载各项系统服务之前,得先做好整个系统环境,我主要利用/etc/rc.d/rc.sysinit这个shellscript来设定好我的系统环境的。

』够清楚了吧?

所以,我想要知道到底FC4开机的过程当中帮我进行了什么动作,就得要仔细的分析/etc/rc.d/rc.sysinit啰。

Tips:

老实说,这个档案的档名在各不同的distributions当中都不相同,例如SuSEserver9就使用/etc/init.d/boot与/etc/init.d/rc来进行的。

所以,你最好还是自行到该档案去察看一下系统的工作喔!

^_^

/etc/rc.d/rc.sysinit主要的工作大抵有这几项:

1.取得网络环境与主机类型:

首先读取网络设定文件/etc/sysconfig/network,取得主机名称与预设通讯闸(gateway)等网络环境。

2.测试与挂载内存装置/proc及USB装置/sys:

除挂载内存装置/proc之外,还会主动侦测系统上是否具有usb的装置,若有则会主动加载usb的驱动程序,并且尝试挂载usb的档案系统。

3.决定是否启动SELinux:

近期以来,很多distributions都加入了美国国家安全局发展的SecurityEnhanceLinux套件,这个SELinux可以更加强化Linux操作环境的安全性,不过,由于安全挂帅,对于新手来说,不是很容易上手。

因此,我们才会建议大家先不要启动啊。

无论如何,在这个阶段我们可以分析SELinux是否要启动。

4.接口设备的侦测与PlugandPlay(PnP)参数的测试:

根据核心在开机时侦测的结果(/proc/sys/kernel/modprobe)开始进行ide/scsi/网络/音效等接口设备的侦测,以及利用以加载的核心模块进行PnP装置的参数测试。

5.使用者自订模块的加载

使用者可以在/etc/sysconfig/modules/*.modules加入自订的模块,则此时会被加载到系统当中喔!

6.加载核心的相关设定:

系统会主动去读取/etc/sysctl.conf这个档案的设定值,使核心功能成为我们想要的样子。

7.设定系统时间(clock):

8.设定终端机(console)字形:

9.设定RAID与LVM等硬盘功能:

10.以fsck检验磁盘档案系统:

11.进行磁盘配额quota的转换(非必要):

12.重新以可读取模式挂载系统磁盘:

13.启动quota功能:

14.启动系统随机数装置(产生随机数功能):

15.清除开机过程当中的临时文件:

16.将开机相关信息加载/var/log/dmesg档案中。

如此一来,在/etc/rc.d/rc.sysinit就已经将基本的系统设定数据都写好了,也将系统的数据设定完整!

而如果你想要知道到底开机的过程中发生了什么事情呢?

那么就使用dmesg就可以知道啰。

另外,基本上,在这个档案当中所进行的很多工作的预设设定档,其实都在/etc/sysconfig当中呢!

所以,请记得将/etc/sysconfig内的档案好好的瞧一瞧喔!

^_^

在这个过程当中,比较值得注意的是自订模块的加载!

在FC4当中,如果我们想要加载核心模块的话,可以将整个模块写入到/etc/sysconfig/modules/*.modules当中,在该目录下,只要记得档名最后是以.modules结尾即可。

这个过程是非必要的,因为我们目前的预设模块实在已经很够用了,除非是您的主机硬件实在太新了,非要自己加载新的模块不可,否则,在经过/etc/rc.d/rc.sysinit的处理后,你的主机系统应该是已经跑得很顺畅了啦!

就等着你将系统相关的服务与网络服务启动啰!

启动系统服务与相关启动设定档(/etc/rc.d/rc.n&/etc/sysconfig)

加载核心让整个系统准备接受指令来工作,然后再经过/etc/rc.d/rc.sysinit的系统模块与相关硬件信息的初始化后,你的FC4系统应该已经顺利工作了。

只是,我们还得要启动系统所需要的各项『服务』啊!

这样主机才能提供我们相关的网络或者是主机功能嘛!

这个时候,依据我们在/etc/inittab里面提到的runlevel设定值,就可以来决定启动的服务项目了。

举例来说,使用runle

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1