Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1799655
  • 博文数量: 787
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5015
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-22 15:17
文章分类

全部博文(787)

文章存档

2008年(787)

我的朋友

分类:

2008-10-09 10:24:18

參考網址:

【1】硬件和固件以及讀入MBR

BIOS 或其他固件系统读取硬盘或者其他引导设备(例如,光盘、软盘、网络引导等等)上的
主引导记录。

計算機在接通電源之後,首先由 BIOS 進行自檢,即進行所謂的POST(Power On Self Test),
然依據BIOS內設置的引導順序從硬盤、軟盤或CDROM中讀入“引導塊”。 例如,通常BIOS中設置
的引導順序為第一個IDE硬盤的C分區在最前面,那就是說,電腦開機啟動時會把C盤的第0柱面,
第0頭的第1個扇區讀入內存,然跳到那裡開始執行。這個扇區有一個大家很熟悉的名字,它就
是: MBR(Main Boot Record)。換句話說,MBR裡面存放的是一小段程序以及分區表的數據。
在使用 WIN9X和DOS 時, 這裡面存放的代碼就會把分區表裡標記為 Active 的分區的第一個
扇區(一般存放著操作系統的引導代碼)讀入內存並跳轉到那裡開始執行.


【2】引导装载程序运行

x86 系统上的 Linux 系统通常使用 LILO 或者 GRUB。某些老式系统可能使用 loadlin 通过
一个中间 DOS 分区进行引导。在 Power PC® 系统上,这可能是BootX或者 yaboot。 一般来
说,引导装载程序是一种简单的程序,它知道到哪里寻找 Linux 内核,可能在几个版本之间
进行选择,甚至可以选择同一计算机上的其他操作系统。

在用 LILO 來引導 LINUX 時,有兩種選擇:

(a) BIOS->LILO(直接安裝在MBR中)->KERNEL
    把LILO直接安裝在MBR,這時就由BIOS直接把LILO代碼調入內存,然跳轉執行LILO即可.

(b) BIOS->MBR->LILO(安裝在活動分區的第一個扇區)->KERNEL
    把LILO安裝在LINUX分區,必須把LINUX分區設為Active. 這時BIOS調入的是WIN9X/DOS
    下的MBR代碼,然由這段代碼來調入LILO的代碼(位于活動分區的第一個扇區).

在过去,对于能够設置可引导分区的最高柱面,最大硬盘大小, 在大硬盘上主分区的位置等等
有许多限制。 因為在讀入及執行 MBR 時,操作系統還沒有起來, 所以只能用 BIOS 提供的
INT13 來進行磁盤操作,而 INT13 只能讀寫硬盤 1024 柱面之前的數據,由此可知任何操作
系統的引導代碼都必須在 1024 柱面之前。 對于LINUX的引導裝載程序來說,不管你是使用
方式(a)還是方式(b)來啟動,都要保証KERNEL放在1024柱面之前。 但因為LINUX不使用INT13
來進行硬盤操作, 所以在KERNEL啟動以后, 就有讀寫 1024 柱面以後數據的能力了。

不過, 現在几乎所有硬件系统的 BIOS 都得到了改进, 能够处理实际上无限大的硬盘, 因此
现代的引导装载程序(至少是Linux的引导装载程序),对于分区大小或位置已经没什么限制了.


【3】内核装载并進入保護模式

當啟動電源之際,電腦的 BIOS 就會找尋有無系統開機磁片,有可能使用軟碟、硬碟或者是
隨身碟開機,BIOS會將boot loader載入RAM中,接者 boot Loader 會載入 Linux Kernel,
而 Kernel 一旦起動後,第一件事就是切入保護模式 (protected mode),此時,所有的硬體
交由 Kernel 來控制,也意味掙脫 BIOS 的羈絆。


【4】初始化硬體并安装根文件系统

當 Kernel 載入完畢後,便開始初始化系統所有硬體設備。 而當所有的硬體初始化的動作也
告完成之際,系統將嘗試掛載 root partition(根分區). 所謂 Root partition 也就是將被
掛上後當作"/"的根目錄,如果無法正確掛載 root partition, 系統將無法運作。

在某些情况下,可能需要先装载一个临时 ramdisk 映像, 以便載入启用真实根文件系统所需
的特殊驱动程序或模块, 例如SCSI驅動模塊, 然后再安装真正的根文件系统。 安装好根文件
系统之后,就可以开始系統初始化了。


【5】启动进程init來初始化Linux系統

當 root file system 成功的掛載後,就會去執行init這個程式。 init會檢查/etc/inittab
文檔, 找出該文檔中標明 sysinit 的這一行, 並執行該行指定的 script. 在 Redhat Linux
系統上此腳本名為 /etc/rc.d/rc.sysinit,它是一個比較復雜和冗長的Shell腳本(有幾百行),
也就是說 rc.sysinit 將開始肩負接下來的系統初始化大任;  而在 Debian 系統上此腳本則
名為 /etc/init.d/rcS, 它其實是只包含一行調用命令的腳本(exec /etc/init.d/rc S);

在內核起來之後所生成第一個進程init(/sbin/init),是所有其他Linux進程的父进程(PID為1).
它(init)的工作就是根據/etc/inittab配置文檔來執行相應的腳本進行系統初始化,例如設置
鍵盤,字體,裝載模塊,設置網絡等等(下面6,7,8步驟都是相關的詳細介紹).


【6】读取 /etc/inittab 的内容,对余下的引导步骤进行配置

此步驟中特别重要的內容是: 如何利用 /etc/inittab 中的命令行控制語法, 來将系统引导到
指定的运行级别, 从而决定初始化期间还要执行哪些步骤. 实际上此后的所有引导过程, 完全
是由文件 /etc/inittab 的内容來控制的.具体来说,脚本和工具一般是按照某些约定來运行的,
這些所謂約定, 其實就是定義了幾個運行級別, 并指定各個運行級別所需要運行的腳本, 因此
在理论上完全可以通过修改 /etc/inittab 来运行不同的脚本.


【7】与运行级别无关的系统初始化(sysinit)

一般情况下,无论运行级别如何,都要执行某些系統初始化操作。指定運行系統初始化腳本的
步驟在 /etc/inittab 中用下面这样的命令行表示:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit        #適用于RedHat系統;
si::sysinit:/etc/init.d/rcS                #適用于Debian系統;

此行通常設置為開頭第二項配置, 其中Red Hat系統的 /etc/rc.d/rc.sysinit 是一個很长的
脚本(超過800行),用于执行所有初始化过程; 而在Debian系統的 /etc/init.d/rcS 則是一个
非常簡單的脚本, 只包括一行調用命令, 即是帶參數 S 調用另一個腳本/etc/init.d/rc文檔
(exec /etc/init.d/rc S),實際上它只是运行每个匹配 /etc/rcS.d/[Ss]??* 的脚本;

在Redhat系統中/etc/rc.d/rc.sysinit主要做在各個運行模式中相同的初始化工作,包括:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
. 呼叫 /sbin/initlog 紀錄系統初始化過程
. 設定 path、主機名(hostname)和NIS域名 等資訊
. banner 畫面:一般我們看到 "Welcome to RedHat Linux" 的訊息
. 系統會執行 mount -t proc /proc /proc 命令﹐為核心掛載一個特殊的檔案系統
. 執行 /sbin/setsysfont 來設定系統使用的字型
. Configure kernel parameters
. 裝載聲卡模塊
. 設定好系統時鐘(system clock)
. 載入 keymap﹐按照您安裝時指定的鍵盤資訊來確定您的鍵盤類型
. 啟動swapping
. 啟動系統的置換(swap)空間
. Remount the root filesystem read-write、清空 mtab﹐
. 載入一系列的核心模組
. 對檔案系統進行檢查(fsck)
. 打開quota
. 關於 rc.sysinit 在啟動過程中所顯示的所有信息﹐都會存放到 /var/log/dmesg 裡面去
...等等...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

系統初始化腳本(sysinit)的一個最重要的任務, 是檢查所有的本地文件系統, 如果發現問題,
此腳本會跳到一個 shell的sulogin 登錄界面,以便讓管理者干涉和修正問題. 而若遇到某些
文件系統的問題,則可能?**貑?機器. 如果使用和設置了配額, 那么rc.sysinit腳本也將會
負責啟用配額. 另外在RedHat系統中, 通常還有一個/etc/rc.d/rc.local腳本文檔,它一般是
用來啟動本地進程的腳本.


【8】特定的运行级别的系统初始化

在/etc/inittab文檔內容中有一行特定设置特别关键, 此行通常設置在接近文件顶部,也即是
在rc.sysinit之前的第一項設置,它就是设置預設运行级别(default runlevel):

# The default runlevel.
id:3:initdefault:        #這是RedHat系統的預設啟動級別;
id:2:initdefault:        #這是Debian系統的預設啟動級別;

這個預設運行級別將控制 /etc/inittab 腳本的其余部分中所要采取的相應操作, 這些操作
主要是: 处理/etc/inittab脚本时將會发生什么? 具体来说就是在这个过程中將要涉及哪些
文件和目录. 這個操作選擇過程則按下述方法來實現:

當rc.sysinit執行完畢後,控制權立即移轉回init手中, 然後再根據之前已經從/etc/inittab
中讀出的此項設置行來選擇預設的run level, 以便決定要執行哪些服務程式. 实际上可以把
任意数量的操作与运行级别联系起来, 而且一個操作也可以與一個或者多個運行級別相關聯,
這個關聯的設置命令則包含在 /etc/inittab 后面的代码中,內容如下:

#Red Hat系統中的設置:
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

#Debian系統中的設置:
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

可以看出,上述設置定義了同所有運行級別相關聯的脚本運行方式, 也就是以運行級別的數值
為參數來調用 rc 腳本. 例如在Red Hat系統中, 執行 /etc/rc.d/rc X 命令将調用所有路徑
匹配 /etc/rcX.d/[KkSs][0-9][0-9]* 模式的腳本文件. 例如, 在以运行级别5启动的系统上,
会依次运行以下文件:

ls -l /etc/rc5.d/;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/etc/rc5.d/K15postgresql
/etc/rc5.d/S01switchprofile
/etc/rc5.d/S05harddrake
... 略 ...
/etc/rc5.d/S99linuxconf
/etc/rc5.d/S99local
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

請注意: 以“K”或“k”开头的文件是杀死脚本(以stop為參數來調用), 它们结束进程或者清除
进程的操作.以“S”或“s”开头的文件是启动脚本,以start為參數來調用,它们一般启动新进程
或者使系统准备在此运行级别上运行. 这些文件都是链接到/etc/init.d/中的shell脚本.

這也就是說,系統真正要執行的程式,可按照/etc/rc.d/rcX.d/(X代表不同的runlevel號碼)
目錄裡面的script內容來決定. 例如:

id:3:initdefault:         #指定的runlevel為3,會執行/etc/rc.d/rc3.d/目錄下的腳本;
id:5:initdefault:         #指定的runlevel為5,會執行/etc/rc.d/rc5.d/目錄下的腳本;


【9】在提示符下登录

在大多数情况下,当 Linux 系统在一个运行级别上运行之后,您希望作为用户登录进系统。
为此,运行一个称为 getty 的程序来处理登录过程。 发行版创建者们使用基本 getty 的
许多变体,比如 agetty、mgetty 和 mingetty。这些程序基本上都做同样的工作。

/etc/inittab 常常在一个或多个虚拟终端中启动 getty 程序,并且为几个不同运行级别这样
做。这是用下面这样的代码配置的:

#Red Hat系統中的設置:
# Run gettys in standard runlevels
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

#Debian系統中的設置:
# /sbin/getty invocations for the runlevels.
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

上述設置的第一个字段的数字是运行 getty 的虚拟终端,后面的第二组字段的数字是采用此
操作的几个运行级别(例如,在运行级别 2、3、4 和 5 上都启动 mingetty)。

[ 本帖最后由 chengkinhung 于 2007-8-25 12:17 编辑 ]

--------------------next---------------------

阅读(747) | 评论(0) | 转发(0) |
0

上一篇:学用Linux的反思_part_3

下一篇:幸福有多少?

给主人留下些什么吧!~~