📄 0510osloader.htm
字号:
7. <a href="#FAQ">本章习题练习</a><br>
<span class=text_h2>
8. <a href="http://phorum.vbird.org/viewtopic.php?t=23891"
target="_blank">针对本文的建议∶http://phorum.vbird.org/viewtopic.php?t=23891</a>
</span>
</span>
</div>
<!-- 本文的正式部分 -->
<hr><a NAME="startup"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">开机流程简介</span><br>
<div class=block1>
开机不是只要按一下电源钮而关机只要关掉电源钮就可以了吗?有何大学问?话是这样没错啦,但是由于
Linux 是一套多人多工的作业系统,你难保你在关机时没有人在线上,如果你关机的时候碰巧一大群人在线上工作,
那会让当时在线上工作的人马上断线的!那不是害死人了!一些资料可是无价之宝哩!<br><br>
另外,与 DOS 环境不同的是, Linux 在执行的时候,虽然你在画面上只会看到黑压压的一片,完全没有任何画面,
但其实他是有很多的程式在背景底下执行的,例如登录档管控程式、前面两章提到的例行性命令,
当然还有一大堆网路服务,如邮件伺服器、WWW伺服器等等。你如果随便关机的话,
是很容易伤害硬碟及资料传输的动作的!所以在 Linux 下关机可是一门大学问喔。<br><br>
既然开机是很严肃的一件事,呵呵,那我们来了解一下整个开机的过程吧!
好让大家比较容易发现开机过程里面发生错误的地方,与解决之道!不过,由于开机的过程中,那个开机管理程式
( Boot Loader ) 使用的软体可能不一样,例如目前各大 Linux distributions 的主流为 grub,
但早期 Linux 预设是使用 LILO ,台湾地区则很多朋友喜欢使用 <a href="0140spfdisk.php">spfdisk</a> 。
但无论如何,我们总是得要了解整个 boot loader 的工作情况,才能了解为何进行多重开机的设定时,
为何老是听人家讲要先安装 Windows 再安装 Linux 的原因~<br><br>
我们先来想一想, Linux 整个开机的程序是怎样呢?还记得我们提过,开机时要载入核心,
让核心来驱动整个硬体,这样才能算是一个最阳春、最基础的作业系统吧?然后才能够执行各种程式的运作。
同样的,开机的流程也是需要先载入核心的。不过,载入核心前,却需要一些前置作业,才能够正确无误的载入核心嘛!
所以,整个开机的程序是这样的∶
<ol><span class=text_import2>
<li>载入 BIOS 的硬体资讯,并取得第一个开机装置的代号;
<li>读取第一个开机装置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的开机资讯;
<li>载入 Kernel 作业系统核心资讯, Kernel 开始解压缩,并且尝试驱动所有硬体装置;
<li>Kernel 执行 init 程式并取得 run-level 资讯;
<li>init 执行 /etc/rc.d/rc.sysinit 档案;
<li>启动核心的外挂模组 (/etc/modprobe.conf);
<li>init 执行 run-level 的各个批次档( Scripts );
<li>init 执行 /etc/rc.d/rc.local 档案;
<li>执行 /bin/login 程式,并等待使用者登入;
<li>登入之后开始以 Shell 控管主机。
</ol></span>
大概的流程就是上面写的那个样子啦,而每一个程序的内容主要是在干嘛呢?底下就分别来谈一谈吧!<br><br>
<hr><a name="startup_loader"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>boot loader 与 kernel 载入</span><br>
<div class=block2>
由第一篇里面谈到的一些基础的主机硬体概念当中,我们知道整个主机在开机的时候,第一个被读取的地方,
就是 BIOS ( Basic Input Output System ) 啦,这个 BIOS 里面记录了主机板的晶片组与相关的设定,
例如 CPU 与周边设备的沟通时脉啊、开机装置的搜寻顺序啊、硬碟的大小与类型啊、
系统时间啊、各周边汇流排的是否启动 Plug and Play (PnP, 随插即用装置) 啊、
各周边设备的 I/O 位址啊、以及与 CPU 沟通的 IRQ 岔断等等的资讯都记录在此,
所以棉,系统要顺利的开机,首先就是要去读取 BIOS 的相关设定值了。<br><br>
读取了 BIOS 设定值之后,系统会根据 BIOS 的资料,进行开机自我测试 (power on self test, POST),
然后开始执行硬体侦测的初始化,并设定 PnP 装置,之后再定义出可开机的装置,
之后就会开始进行开机装置的资料读取了 (MBR 相关的任务开始)。<br><br>
读完了 BIOS 并且了解了主要的主机硬体相关资讯后,主机便会开始尝试由储存媒体载入作业系统了。
我们刚刚提到 BIOS 会记录『可用来开机的装置搜寻顺序』对吧!所以,系统会开始去第一个开机装置上面进行开机程序。
我们在第二篇的 <a href="0230filesystem.php">磁碟档案系统(filesystem)</a> 当中提到过整个储存装置的特性,
如果以硬碟来看,那么开机流程读到硬碟的过程中,第一个要读取的就是该硬碟的主要开机磁区 (Master Boot
Record, MBR) 了,而系统可以由主要开机区所安装的开机管理程式 (boot loader) 开始执行核心辨识的工作。<br>
<div style="padding: 10 0 10 0 ;" align="right"><table width="90%"><tr><td><b>Tips:</b><br /><span style="font-style: italic; color : darkgreen"> 我们知道每颗硬碟的第一个磁区称为 MBR ,那么如果我的主机上面有两颗硬碟的话,
系统会去哪颗硬碟的 MBR 读取资料呢?这个就得要看 BIOS 的设定了。
基本上,我们常常讲的『系统的 MBR』其实指的是 <b>第一个开机装置的 MBR</b> 才对!
所以,改天如果您要将开机管理程式安装到某颗硬碟的 MBR 时,
要特别注意当时系统的『第一个开机装置』是那个,否则会安装到错误的硬碟上面喔!重要重要!
</span></td><td><img src="../images/vbird_face.gif" /></td></tr></table></div>
那么为什么要在 MBR 安装 boot loader 呢?而这个 boot loader 有什么功能呢?
还记得我们在第二篇提到的 <a href="0230filesystem.php">磁碟档案系统</a> 吧?
我们的作业系统核心必须要认识磁碟档案系统才能读取里面的资料啊,
但是整个系统才刚刚到开机起头的地方而已,要如何认识磁碟档案格式呢?
那就得要藉由 boot loader 来辅助啦!所以棉,当然必须要有 boot loader 才有办法载入 Linux 的核心
(kernel) 啊!由于 boot loader 的特殊功能,因此,想要载入 Linux 核心时,
当然得使用支援 Linux filesystem 的 boot loader 了,目前主流的 grub 这套开机管理程式,
不但可以支援 Linux ,同时也支援 Windows 相关的核心系统呢!<br><br>
好了,先再来回忆一下,如果你是以 grub 程式开机的话,那么在开机的时候会显示什么资料呢?呵呵!
会显示蛮多的开机选单,没错~就是『选单』,然后选择了你的选择项目之后,
系统就会跑到该磁区去读取该作业系统的核心棉!呵呵!所以一个好的
boot loader 会具有两个功能,就是∶
<ul><span class=text_import2>
<li>选单功能 (menu)</li>
<li>指向功能 (pointer)</ul></span>
再来强调一下,因为 Windows 与 Linux 的档案格式不一样?!
为了载入系统核心,所以必须要安装认识我们作业系统的 loader,
而 Linux 的 loader ( lilo
或 grub ) 是可以认识 windows 的核心档案的,但是 Windows 的 loader 却不认识
Linux 的核心档案,因此,作为一个多重开机的设定 loader ,就无法使用 Windows
所提供的 loader 棉!由于需要让系统认识你的 kernel ,因此,就需要 boot
loader 啦!这样想就对啦!<br><br>
好了,当我们藉由 boot loader 的管理而开始读取核心档案后,接下来, Linux 就会将核心解压缩到主记忆体当中,
并且利用核心的功能,开始测试与驱动各个周边装置,包括储存装置、CPU、网路卡、音效卡等等。
那么核心档案在哪里啊?一般来说,他会被放置到 /boot 里面,
并且取名为 /boot/vmlinuz 才对!<br><br>
在载入核心的过程当中,我们必须要知道的是,系统只会『挂载根目录』而已,而且是以唯读的方式挂载的。
此外,有时为了让某些功能可以用档案的方式来读取,因此,有的系统在开机的时候,
会制作所谓的虚拟硬碟 (RAM Disk) 来辅助的,那就是 initrd 以及 linuxrc 的功用了。
利用 boot loader 的功能,可以在载入核心的时候,一起载入 initrd 的映象档 (/boot/initrd-xxxx.img),
Linux 系统会主动的以 initrd (man 4 initrd) 来进行虚拟硬碟的建置,
并且利用 linuxrc (包含在 initrd 的映象档内) 这个程式的功能来进行载入模组的动作。
linuxrc 主要的特性是∶
<ul><li>必须是 linuxrc 这个档名;
<li>必须放置在 initrd 所建立的虚拟磁碟的最顶层目录;
<li>必须要可以被核心所执行。</ul>
在核心驱动周边硬体的工作完成之后, initrd 所建立的虚拟磁碟就会被移除了!
不过您要注意的是, initrd 并非必要的,是可有可无的,要看您当初建立该核心的时候,
整个编译的角度与过程。一般来说,各大 Linux distributions 在建立核心时,
都会一起建立出这个 initrd 的映象档,辅助开机的顺利进行。<br><br>
总之,在这个过程当中, boot loader 可以找到 Linux 的核心档案并且将他载入到主记忆体当中,
同时可能可以藉由 initrd 建立起虚拟硬碟 (RAM Disk) 辅助开机的进行,
最后,将读自 BIOS 的主机硬体资料交由 Linux 核心来进行侦测并且载入适当的驱动程式 (driver)
,就让整个主机硬体准备系统的要求了。整个流程有点像这样∶<br><br>
<center><img src="0510osloader/0510osloader-flow.jpg"
title="BIOS 与 boot loader 及核心载入流程示意图"
alt="BIOS 与 boot loader 及核心载入流程示意图"><br>
图一、BIOS 与 boot loader 及核心载入流程示意图</center><br>
在核心完整的载入后,您的主机应该就开始正确的运作了,接下来,就是要开始执行系统的第一支程式∶ init。<br><br>
</div>
<hr><a name="startup_init"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>第一支程式 init 及设定档
/etc/inittab 与 runlevel</span><br>
<div class=block2>
在核心载入完毕之后,此时系统应该就已经准备妥当,等待程式的执行了。而整个 Linux
系统当中第一支被执行的程式就是『 /sbin/init 』棉~这也是我们在前一章使用 ps aux |more 时,
看到第一行所显示的程序内容 (PID 为 1 的那行啦) ! init 这支程式所做的工作相当的多,
他除了利用设定档『 <span class=text_import2>/etc/inittab</span> 』来取得开机的等级
( Run level ) 之外,还会经由这个 run level 的设定值来进行不同的开机服务项目的启动。<br><br>
那么什么是 run level 呢?他有什么功用啊?其实很简单啦, Linux 就是藉由设定 run level
来规定系统使用不同的服务来启动,让 Linux 的使用环境不同。基本上,依据有无网路与有无 X Window
而将 run level 分为六个等级,分别是∶<ul><span class=text_import2>
<li>0 - halt (系统直接关机)
<li>1 - single user mode (单人维护模式,用在系统出问题时的维护)
<li>2 - Multi-user, without NFS (类似底下的 runlevel 3,但无 NFS 服务)
<li>3 - Full multi-user mode (完整的含有网路功能的纯文字模式)
<li>4 - unused (系统保留功能)
<li>5 - X11 (与 runlevel 3 类似,但使用 X Window)
<li>6 - reboot (重新开机)
</span></ul>
由于 run level 0, 4, 6 不是关机、重新开机就是系统保留的,所以∶『
<span class=text_import2>您当然不能将预设的 run level 设定为这三个值</span> 』,
否则系统就会不断的自动关机或自动重新开机....<br><br>
好了,那么我们开机时,到底是如何取得系统的 run level 的?呵呵!当然是 /etc/inittab 所设定的棉!
那么 /etc/inittab 到底有什么资讯呢?我们先来看看这个档案的内容好了∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi /etc/inittab</span>
<span class=term_say># 设定系统开机预设的 run level 设定项目∶</span>
id:3:initdefault:
<span class=term_say># 开始进行 run level 的服务启动前,使用来侦测与初始化系统环境的设定档∶</span>
si::sysinit:/etc/rc.d/rc.sysinit
<span class=term_say># 7 个不同 run level 的,需要启动的服务的 scripts 放置路径∶</span>
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
<span class=term_say># 是否允许按下 [ctrl]+[alt]+[del] 就重新开机的设定项目∶</span>
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
<span class=term_say># 本机端终端机启动的个数∶</span>
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
<span class=term_say># 在 X Window (run level 5) 环境下的启动 script 设定项目∶</span>
x:5:once:/etc/X11/prefdm -nodaemon
</pre></td></tr></table>
这个档案的语法是这样的∶<br>
<table class="term"><tr><td class="term"><pre>
[设定项目]:[run level]:[init 的动作行为]:[指令项目]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -