鸟哥的Linux私房菜(基础篇)- 第二十章、启动流程、模块管理与 Loader
最近升級(jí)日期:2009/09/14
| 系統(tǒng)啟動(dòng)其實(shí)是一項(xiàng)非常復(fù)雜的程序,因?yàn)楹诵牡靡獋蓽y(cè)硬件并加載適當(dāng)?shù)尿?qū)動(dòng)程序后,接下來(lái)則必須要呼叫程序來(lái)準(zhǔn)備好系統(tǒng)運(yùn)行的環(huán)境,以讓使用者能夠順利的操作整部主機(jī)系統(tǒng)。如果你能夠理解啟動(dòng)的原理,那么將有助於你在系統(tǒng)出問(wèn)題時(shí)能夠很快速的修復(fù)系統(tǒng)喔!而且還能夠順利的配置多重操作系統(tǒng)的多重啟動(dòng)問(wèn)題。為了多重啟動(dòng)的問(wèn)題,你就不能不學(xué)學(xué)grub 這個(gè) Linux 底下優(yōu)秀的啟動(dòng)管理程序 (boot loader)。而在系統(tǒng)運(yùn)行期間,你也得要學(xué)會(huì)管理核心模塊呢! |
1. Linux 的啟動(dòng)流程分析
1.1 啟動(dòng)流程一覽
1.2 BIOS, boot loader 與 kernel 加載
1.3 第一支程序 init 及配置檔 /etc/inittab 與 runlevel
1.4 init 處理系統(tǒng)初始化流程 (/etc/rc.d/rc.sysinit)
1.5 啟動(dòng)系統(tǒng)服務(wù)與相關(guān)啟動(dòng)配置檔 (/etc/rc.d/rc N & /etc/sysconfig)
1.6 使用者自訂啟動(dòng)啟動(dòng)程序 (/etc/rc.d/rc.local)
1.7 根據(jù) /etc/inittab 之配置,加載終端機(jī)或 X-Window 介面
1.8 啟動(dòng)過(guò)程會(huì)用到的主要配置檔:/etc/modprobe.conf, /etc/sysconfig/*
1.9 Run level 的切換: runlevel,init
2. 核心與核心模塊
2.1 核心模塊與相依性: depmod
2.2 核心模塊的觀察: lsmod, modinfo
2.3 核心模塊的加載與移除:insmod, modprobe, rmmod
2.4 核心模塊的額外參數(shù)配置:/etc/modprobe.conf
3. Boot loader: Grub
3.1 boot loader 的兩個(gè) stage
3.2 grub 的配置檔 /boot/grub/menu.lst 與菜單類型: 磁碟代號(hào), menu.lst
3.3 initrd 的重要性與創(chuàng)建新 initrd 文件: mkinitrd
3.4 測(cè)試與安裝 grub: grub-install, grub shell
3.5 啟動(dòng)前的額外功能修改
3.6 關(guān)於核心功能當(dāng)中的 vga 配置
3.7 BIOS 無(wú)法讀取大硬盤(pán)的問(wèn)題
3.8 為個(gè)別菜單加上口令: grub-md5-crypt
4. 啟動(dòng)過(guò)程的問(wèn)題解決
4.1 忘記 root 口令的解決之道
4.2 init 配置檔錯(cuò)誤
4.3 BIOS 磁碟對(duì)應(yīng)的問(wèn)題 (device.map)
4.4 因文件系統(tǒng)錯(cuò)誤而無(wú)法啟動(dòng)
4.5 利用 chroot 切換到另一顆硬盤(pán)工作
5. 重點(diǎn)回顧
6. 本章習(xí)題
7. 參考數(shù)據(jù)與延伸閱讀
8. 針對(duì)本文的建議:http://phorum.vbird.org/viewtopic.php?t=23891
Linux 的啟動(dòng)流程分析
啟動(dòng)不是只要按一下電源鈕而關(guān)機(jī)只要關(guān)掉電源鈕就可以了嗎?有何大學(xué)問(wèn)?話是這樣沒(méi)錯(cuò)啦,但是由於Linux 是一套多人多工的操作系統(tǒng),你難保你在關(guān)機(jī)時(shí)沒(méi)有人在線上,如果你關(guān)機(jī)的時(shí)候碰巧一大群人在線上工作,那會(huì)讓當(dāng)時(shí)在線上工作的人馬上斷線的!那不是害死人了!一些數(shù)據(jù)可是無(wú)價(jià)之寶哩!
另外 Linux 在運(yùn)行的時(shí)候,雖然你在畫(huà)面上只會(huì)看到黑壓壓的一片,完全沒(méi)有任何畫(huà)面,但其實(shí)他是有很多的程序在背景底下運(yùn)行的,例如登錄檔管控程序、前面提到的例行性工作排程等,當(dāng)然還有一大堆網(wǎng)絡(luò)服務(wù),如郵件服務(wù)器、WWW 服務(wù)器等等。你如果隨便關(guān)機(jī)的話,是很容易傷害硬盤(pán)及數(shù)據(jù)傳輸?shù)膭?dòng)作的!所以在 Linux 下關(guān)機(jī)可是一門(mén)大學(xué)問(wèn)喔。
啟動(dòng)流程一覽
既然啟動(dòng)是很嚴(yán)肅的一件事,那我們就來(lái)了解一下整個(gè)啟動(dòng)的過(guò)程吧!好讓大家比較容易發(fā)現(xiàn)啟動(dòng)過(guò)程里面可能會(huì)發(fā)生問(wèn)題的地方,以及出現(xiàn)問(wèn)題后的解決之道!不過(guò),由於啟動(dòng)的過(guò)程中,那個(gè)啟動(dòng)管理程序 (Boot Loader) 使用的軟件可能不一樣,例如目前各大 Linux distributions 的主流為 grub,但早期 Linux 默認(rèn)是使用 LILO ,臺(tái)灣地區(qū)則很多朋友喜歡使用 spfdisk 。但無(wú)論如何,我們總是得要了解整個(gè) boot loader 的工作情況,才能了解為何進(jìn)行多重啟動(dòng)的配置時(shí),老是聽(tīng)人家講要先安裝 Windows 再安裝 Linux 的原因~
假設(shè)以個(gè)人計(jì)算機(jī)架設(shè)的 Linux 主機(jī)為例 (先回到第零章計(jì)算機(jī)概論看看相關(guān)的硬件常識(shí)喔),當(dāng)你按下電源按鍵后計(jì)算機(jī)硬件會(huì)主動(dòng)的讀取 BIOS 來(lái)加載硬件資訊及進(jìn)行硬件系統(tǒng)的自我測(cè)試,之后系統(tǒng)會(huì)主動(dòng)的去讀取第一個(gè)可啟動(dòng)的裝置 (由 BIOS 配置的) ,此時(shí)就可以讀入啟動(dòng)管理程序了。
啟動(dòng)管理程序可以指定使用哪個(gè)核心文件來(lái)啟動(dòng),并實(shí)際加載核心到內(nèi)存當(dāng)中解壓縮與運(yùn)行,此時(shí)核心就能夠開(kāi)始在內(nèi)存內(nèi)活動(dòng),并偵測(cè)所有硬件資訊與加載適當(dāng)?shù)尿?qū)動(dòng)程序來(lái)使整部主機(jī)開(kāi)始運(yùn)行,等到核心偵測(cè)硬件與加載驅(qū)動(dòng)程序完畢后,一個(gè)最陽(yáng)春的操作系統(tǒng)就開(kāi)始在你的 PC 上面跑了。
主機(jī)系統(tǒng)開(kāi)始運(yùn)行后,此時(shí) Linux 才會(huì)呼叫外部程序開(kāi)始準(zhǔn)備軟件運(yùn)行的環(huán)境,并且實(shí)際的加載所有系統(tǒng)運(yùn)行所需要的軟件程序哩!最后系統(tǒng)就會(huì)開(kāi)始等待你的登陸與操作啦!簡(jiǎn)單來(lái)說(shuō),系統(tǒng)啟動(dòng)的經(jīng)過(guò)可以匯整成底下的流程的:
大概的流程就是上面寫(xiě)的那個(gè)樣子啦,你會(huì)發(fā)現(xiàn) init 這個(gè)家伙占的比重非常重!所以我們才會(huì)在第十七章的 pstree 命令中談到這家伙。那每一個(gè)程序的內(nèi)容主要是在干嘛呢?底下就分別來(lái)談一談吧!
BIOS, boot loader 與 kernel 加載
我們?cè)诘谌略?jīng)談過(guò)簡(jiǎn)單的啟動(dòng)流程與 MBR 的功能,當(dāng)時(shí)為了多重啟動(dòng)而進(jìn)行的簡(jiǎn)短的介紹。現(xiàn)在你已經(jīng)有足夠的 Linux 基礎(chǔ)了,所以底下讓我們來(lái)加強(qiáng)說(shuō)明啦!
- BIOS, 啟動(dòng)自我測(cè)試與 MBR
我們?cè)诘诹阏碌挠?jì)算機(jī)概論就曾談過(guò)計(jì)算機(jī)主機(jī)架構(gòu),在個(gè)人計(jì)算機(jī)架構(gòu)下,你想要啟動(dòng)整部系統(tǒng)首先就得要讓系統(tǒng)去加載 BIOS (Basic Input Output System),并透過(guò) BIOS 程序去加載 CMOS 的資訊,并且藉由 CMOS 內(nèi)的配置值取得主機(jī)的各項(xiàng)硬件配置,例如 CPU 與周邊設(shè)備的溝通時(shí)脈啊、啟動(dòng)裝置的搜尋順序啊、硬盤(pán)的大小與類型啊、系統(tǒng)時(shí)間啊、各周邊匯流排的是否啟動(dòng) Plug and Play (PnP, 隨插即用裝置) 啊、各周邊設(shè)備的 I/O 位址啊、以及與 CPU 溝通的 IRQ 岔斷等等的資訊。
在取得這些資訊后,BIOS 還會(huì)進(jìn)行啟動(dòng)自我測(cè)試 (Power-on Self Test, POST) (注1)。然后開(kāi)始運(yùn)行硬件偵測(cè)的初始化,并配置 PnP 裝置,之后再定義出可啟動(dòng)的裝置順序,接下來(lái)就會(huì)開(kāi)始進(jìn)行啟動(dòng)裝置的數(shù)據(jù)讀取了 (MBR 相關(guān)的任務(wù)開(kāi)始)。
由於我們的系統(tǒng)軟件大多放置到硬盤(pán)中嘛!所以 BIOS 會(huì)指定啟動(dòng)的裝置好讓我們可以讀取磁碟中的操作系統(tǒng)核心文件。但由於不同的操作系統(tǒng)他的文件系統(tǒng)格式不相同,因此我們必須要以一個(gè)啟動(dòng)管理程序來(lái)處理核心文件加載 (load) 的問(wèn)題,因此這個(gè)啟動(dòng)管理程序就被稱為 Boot Loader 了。那這個(gè) Boot Loader 程序安裝在哪里呢?就在啟動(dòng)裝置的第一個(gè)磁區(qū) (sector) 內(nèi),也就是我們一直談到的 MBR (Master Boot Record, 主要啟動(dòng)記錄區(qū))。
那你會(huì)不會(huì)覺(jué)得很奇怪啊?既然核心文件需要 loader 來(lái)讀取,那每個(gè)操作系統(tǒng)的 loader 都不相同,這樣的話 BIOS 又是如何讀取 MBR 內(nèi)的 loader 呢?很有趣的問(wèn)題吧!其實(shí) BIOS 是透過(guò)硬件的 INT 13 中斷功能來(lái)讀取 MBR的,也就是說(shuō),只要 BIOS 能夠偵測(cè)的到你的磁碟 (不論該磁碟是 SATA 還是 IDE 介面),那他就有辦法透過(guò) INT 13這條通道來(lái)讀取該磁碟的第一個(gè)磁區(qū)內(nèi)的 MBR 啦!(注2)這樣 boot loader 也就能夠被運(yùn)行羅!
| Tips: 我們知道每顆硬盤(pán)的第一個(gè)磁區(qū)內(nèi)含有 446 bytes的 MBR 區(qū)域,那么如果我的主機(jī)上面有兩顆硬盤(pán)的話,系統(tǒng)會(huì)去哪顆硬盤(pán)的 MBR 讀取 boot loader 呢?這個(gè)就得要看 BIOS 的配置了。基本上,我們常常講的『系統(tǒng)的 MBR』其實(shí)指的是 第一個(gè)啟動(dòng)裝置的 MBR 才對(duì)!所以,改天如果你要將啟動(dòng)管理程序安裝到某顆硬盤(pán)的 MBR 時(shí),要特別注意當(dāng)時(shí)系統(tǒng)的『第一個(gè)啟動(dòng)裝置』是哪個(gè),否則會(huì)安裝到錯(cuò)誤的硬盤(pán)上面的 MBR 喔!重要重要! |
- Boot Loader 的功能
剛剛說(shuō)到 Loader 的最主要功能是要認(rèn)識(shí)操作系統(tǒng)的文件格式并據(jù)以加載核心到主內(nèi)存中去運(yùn)行。由於不同操作系統(tǒng)的文件格式不一致,因此每種操作系統(tǒng)都有自己的 boot loader 啦!用自己的 loader才有辦法加載核心文件嘛!那問(wèn)題就來(lái)啦,你應(yīng)該有聽(tīng)說(shuō)過(guò)多重操作系統(tǒng)吧?也就是在一部主機(jī)上面安裝多種不同的操作系統(tǒng)。既然你 (1)必須要使用自己的 loader 才能夠加載屬於自己的操作系統(tǒng)核心,而 (2)系統(tǒng)的 MBR 只有一個(gè),那你怎么會(huì)有辦法同時(shí)在一部主機(jī)上面安裝 Windows 與 Linux 呢?
這就得要回到第八章的磁碟文件系統(tǒng)去回憶一下文件系統(tǒng)功能了。其實(shí)每個(gè)文件系統(tǒng) (filesystem, 或者是 partition) 都會(huì)保留一塊啟動(dòng)磁區(qū) (boot sector) 提供操作系統(tǒng)安裝 boot loader ,而通常操作系統(tǒng)默認(rèn)都會(huì)安裝一份 loader 到他根目錄所在的文件系統(tǒng)的 boot sector 上。如果我們?cè)谝徊恐鳈C(jī)上面安裝 Windows與 Linux 后,該 boot sector, boot loader 與 MBR 的相關(guān)性會(huì)有點(diǎn)像下圖:
圖 1.2.1、 boot loader 安裝在 MBR, boot sector 與操作系統(tǒng)的關(guān)系
如上圖所示,每個(gè)操作系統(tǒng)默認(rèn)是會(huì)安裝一套 boot loader 到他自己的文件系統(tǒng)中 (就是每個(gè) filesystem 左下角的方框),而在 Linux 系統(tǒng)安裝時(shí),你可以選擇將 boot loader 安裝到 MBR 去,也可以選擇不安裝。如果選擇安裝到 MBR 的話,那理論上你在 MBR 與 boot sector 都會(huì)保有一份 boot loader 程序的。至於 Windows 安裝時(shí),他默認(rèn)會(huì)主動(dòng)的將 MBR 與 boot sector 都裝上一份 boot loader!所以啦,你會(huì)發(fā)現(xiàn)安裝多重操作系統(tǒng)時(shí),你的 MBR 常常會(huì)被不同的操作系統(tǒng)的 boot loader 所覆蓋啦! ^_^
我們剛剛提到的兩個(gè)問(wèn)題還是沒(méi)有解決啊!雖然各個(gè)操作系統(tǒng)都可以安裝一份 boot loader 到他們的 boot sector 中,這樣操作系統(tǒng)可以透過(guò)自己的 boot loader 來(lái)加載核心了。問(wèn)題是系統(tǒng)的 MBR 只有一個(gè)哩!你要怎么運(yùn)行 boot sector 里面的 loader 啊?這個(gè)我們得要回憶一下第三章約略提過(guò)的 boot loader 的功能了。boot loader主要的功能如下:
- 提供菜單:使用者可以選擇不同的啟動(dòng)項(xiàng)目,這也是多重啟動(dòng)的重要功能!
- 加載核心文件:直接指向可啟動(dòng)的程序區(qū)段來(lái)開(kāi)始操作系統(tǒng);
- 轉(zhuǎn)交其他 loader:將啟動(dòng)管理功能轉(zhuǎn)交給其他 loader 負(fù)責(zé)。
由於具有菜單功能,因此我們可以選擇不同的核心來(lái)啟動(dòng)。而由於具有控制權(quán)轉(zhuǎn)交的功能,因此我們可以加載其他 boot sector內(nèi)的 loader 啦!不過(guò) Windows 的 loader 默認(rèn)不具有控制權(quán)轉(zhuǎn)交的功能,因此你不能使用 Windows 的 loader來(lái)加載 Linux 的 loader 喔!這也是為啥第三章談到 MBR 與多重啟動(dòng)時(shí),會(huì)特別強(qiáng)調(diào)先裝 Windows 再裝 Linux 的緣故。我們將上述的三個(gè)功能以底下的圖示來(lái)解釋你就看的懂了!(與第三章的圖示也非常類似啦!)
圖 1.2.2、 啟動(dòng)管理程序的菜單功能與控制權(quán)轉(zhuǎn)交功能示意圖
如上圖所示,我的 MBR 使用 Linux 的 grub 這個(gè)啟動(dòng)管理程序,并且里面假設(shè)已經(jīng)有了三個(gè)菜單,第一個(gè)菜單可以直接指向 Linux 的核心文件并且直接加載核心來(lái)啟動(dòng);第二個(gè)菜單可以將啟動(dòng)管理程序控制權(quán)交給 Windows來(lái)管理,此時(shí) Windows 的 loader 會(huì)接管啟動(dòng)流程,這個(gè)時(shí)候他就能夠啟動(dòng) windows 了。第三個(gè)菜單則是使用 Linux 在 boot sector 內(nèi)的啟動(dòng)管理程序,此時(shí)就會(huì)跳出另一個(gè) grub 的菜單啦!了解了嗎?
而最終 boot loader 的功能就是『加載 kernel 文件』啦!
- 加載核心偵測(cè)硬件與 initrd 的功能
當(dāng)我們藉由 boot loader 的管理而開(kāi)始讀取核心文件后,接下來(lái), Linux 就會(huì)將核心解壓縮到主內(nèi)存當(dāng)中,并且利用核心的功能,開(kāi)始測(cè)試與驅(qū)動(dòng)各個(gè)周邊裝置,包括儲(chǔ)存裝置、CPU、網(wǎng)絡(luò)卡、聲卡等等。此時(shí) Linux 核心會(huì)以自己的功能重新偵測(cè)一次硬件,而不一定會(huì)使用 BIOS 偵測(cè)到的硬件資訊喔!也就是說(shuō),核心此時(shí)才開(kāi)始接管 BIOS 后的工作了。那么核心文件在哪里啊?一般來(lái)說(shuō),他會(huì)被放置到 /boot 里面,并且取名為 /boot/vmlinuz 才對(duì)!
| [root@www ~]# ls --format=single-column -F /boot config-2.6.18-92.el5 <==此版本核心被編譯時(shí)選擇的功能與模塊配置檔 grub/ <==就是啟動(dòng)管理程序 grub 相關(guān)數(shù)據(jù)目錄 initrd-2.6.18-92.el5.img <==虛擬文件系統(tǒng)檔! System.map-2.6.18-92.el5 <==核心功能放置到內(nèi)存位址的對(duì)應(yīng)表 vmlinuz-2.6.18-92.el5 <==就是核心文件啦!最重要者! |
從上表我們也可以知道此版本的 Linux 核心為 2.6.18-92.el5 這個(gè)版本!為了硬件開(kāi)發(fā)商與其他核心功能開(kāi)發(fā)者的便利,因此 Linux 核心是可以透過(guò)動(dòng)態(tài)加載核心模塊的 (就請(qǐng)想成驅(qū)動(dòng)程序即可),這些核心模塊就放置在 /lib/modules/ 目錄內(nèi)。由於模塊放置到磁碟根目錄內(nèi) (要記得 /lib 不可以與 / 分別放在不同的 partition !),因此在啟動(dòng)的過(guò)程中核心必須要掛載根目錄,這樣才能夠讀取核心模塊提供加載驅(qū)動(dòng)程序的功能。而且為了擔(dān)心影響到磁碟內(nèi)的文件系統(tǒng),因此啟動(dòng)過(guò)程中根目錄是以唯讀的方式來(lái)掛載的喔。
一般來(lái)說(shuō),非必要的功能且可以編譯成為模塊的核心功能,目前的 Linux distributions 都會(huì)將他編譯成為模塊。因此 U盤(pán), SATA, SCSI... 等磁碟裝置的驅(qū)動(dòng)程序通常都是以模塊的方式來(lái)存在的。現(xiàn)在來(lái)思考一種情況,假設(shè)你的 linux 是安裝在 SATA 磁碟上面的,你可以透過(guò) BIOS 的 INT 13 取得 boot loader 與 kernel 文件來(lái)啟動(dòng),然后 kernel 會(huì)開(kāi)始接管系統(tǒng)并且偵測(cè)硬件及嘗試掛載根目錄來(lái)取得額外的驅(qū)動(dòng)程序。
問(wèn)題是,核心根本不認(rèn)識(shí) SATA 磁碟,所以需要加載 SATA 磁碟的驅(qū)動(dòng)程序,否則根本就無(wú)法掛載根目錄。但是 SATA 的驅(qū)動(dòng)程序在 /lib/modules 內(nèi),你根本無(wú)法掛載根目錄又怎么讀取到 /lib/modules/ 內(nèi)的驅(qū)動(dòng)程序?是吧!非常的兩難吧!在這個(gè)情況之下,你的 Linux 是無(wú)法順利啟動(dòng)的!那怎辦?沒(méi)關(guān)系,我們可以透過(guò)虛擬文件系統(tǒng)來(lái)處理這個(gè)問(wèn)題。
虛擬文件系統(tǒng) (Initial RAM Disk) 一般使用的檔名為 /boot/initrd,這個(gè)文件的特色是,他也能夠透過(guò) boot loader 來(lái)加載到內(nèi)存中,然后這個(gè)文件會(huì)被解壓縮并且在內(nèi)存當(dāng)中模擬成一個(gè)根目錄,且此模擬在內(nèi)存當(dāng)中的文件系統(tǒng)能夠提供一支可運(yùn)行的程序,透過(guò)該程序來(lái)加載啟動(dòng)過(guò)程中所最需要的核心模塊,通常這些模塊就是 U盤(pán), RAID, LVM, SCSI 等文件系統(tǒng)與磁碟介面的驅(qū)動(dòng)程序啦!等加載完成后,會(huì)幫助核心重新呼叫 /sbin/init 來(lái)開(kāi)始后續(xù)的正常啟動(dòng)流程。
圖 1.2.3、 BIOS 與 boot loader 及核心加載流程示意圖
如上圖所示,boot loader 可以加載 kernel 與 initrd ,然后在內(nèi)存中讓 initrd 解壓縮成為根目錄,kernel 就能夠藉此加載適當(dāng)?shù)尿?qū)動(dòng)程序,最終釋放虛擬文件系統(tǒng),并掛載實(shí)際的根目錄文件系統(tǒng),就能夠開(kāi)始后續(xù)的正常啟動(dòng)流程。更詳細(xì)的 initrd 說(shuō)明,你可以自行使用 man initrd 去查閱看看。底下讓我們來(lái)了解一下 CentOS 5.x 的 initrd 文件內(nèi)容有什么吧! ^_^
| # 1. 先將 /boot/initrd 復(fù)制到 /tmp/initrd 目錄中,等待解壓縮: [root@www ~]# mkdir /tmp/initrd [root@www ~]# cp /boot/initrd-2.6.18-92.el5.img /tmp/initrd/ [root@www ~]# cd /tmp/initrd [root@www initrd]# file initrd-2.6.18-92.el5.img initrd-2.6.18-92.el5.img: gzip compressed data, ... # 原來(lái)是 gzip 的壓縮檔!因?yàn)槭?gzip ,所以擴(kuò)展名給他改成 .gz 吧!# 2. 將上述的文件解壓縮: [root@www initrd]# mv initrd-2.6.18-92.el5.img initrd-2.6.18-92.el5.gz [root@www initrd]# gzip -d initrd-2.6.18-92.el5.gz [root@www initrd]# file initrd-2.6.18-92.el5 initrd-2.6.18-92.el5: ASCII cpio archive (SVR4 with no CRC) # 搞了老半天,原來(lái)還是 cpio 的命令壓縮成的文件啊!解壓縮看看!# 3. 用 cpio 解壓縮 [root@www initrd]# cpio -ivcdu < initrd-2.6.18-92.el5 [root@www initrd]# ll drwx------ 2 root root 4096 Apr 10 02:05 bin drwx------ 3 root root 4096 Apr 10 02:05 dev drwx------ 2 root root 4096 Apr 10 02:05 etc -rwx------ 1 root root 1888 Apr 10 02:05 init -rw------- 1 root root 5408768 Apr 10 02:00 initrd-2.6.18-92.el5 drwx------ 3 root root 4096 Apr 10 02:05 lib drwx------ 2 root root 4096 Apr 10 02:05 proc lrwxrwxrwx 1 root root 3 Apr 10 02:05 sbin -> bin drwx------ 2 root root 4096 Apr 10 02:05 sys drwx------ 2 root root 4096 Apr 10 02:05 sysroot # 看!是否很像根目錄!尤其也是有 init 這個(gè)運(yùn)行檔!務(wù)必看一下權(quán)限! # 接下來(lái)看看 init 這個(gè)文件內(nèi)有啥咚咚?# 4. 觀察 init 文件內(nèi)較重要的運(yùn)行項(xiàng)目 [root@www initrd]# cat init #!/bin/nash <==使用類似 bash 的 shell 來(lái)運(yùn)行 mount -t proc /proc /proc <==掛載內(nèi)存的虛擬文件系統(tǒng) ....(中間省略).... echo Creating initial device nodes mknod /dev/null c 1 3 <==創(chuàng)建系統(tǒng)所需要的各項(xiàng)裝置! ....(中間省略).... echo "Loading ehci-hcd.ko module" insmod /lib/ehci-hcd.ko <==加載各項(xiàng)核心模塊,就是驅(qū)動(dòng)程序! ....(中間省略).... echo Creating root device. mkrootdev -t ext3 -o defaults,ro hdc2 <==嘗試掛載根目錄啦! ....(底下省略).... |
嘿嘿!透過(guò)上述運(yùn)行檔的內(nèi)容,我們可以知道 initrd 有加載模塊并且嘗試掛載了虛擬文件系統(tǒng)。接下來(lái)就能夠順利的運(yùn)行啦!那么是否一定需要 initrd 呢?
| 例題: 是否沒(méi)有 initrd 就無(wú)法順利啟動(dòng)? 答: 不見(jiàn)得的!需要 initrd 最重要的原因是,當(dāng)啟動(dòng)時(shí)無(wú)法掛載根目錄的情況下,此時(shí)就一定需要 initrd ,例如你的根目錄在特殊的磁碟介面 (U盤(pán), SATA, SCSI) ,或者是你的文件系統(tǒng)較為特殊 (LVM, RAID) 等等,才會(huì)需要 initrd。 如果你的 Linux 是安裝在 IDE 介面的磁碟上,并且使用默認(rèn)的 ext2/ext3 文件系統(tǒng),那么不需要 initrd 也能夠順利的啟動(dòng)進(jìn)入 Linux 的! |
在核心完整的加載后,您的主機(jī)應(yīng)該就開(kāi)始正確的運(yùn)行了,接下來(lái),就是要開(kāi)始運(yùn)行系統(tǒng)的第一支程序: /sbin/init。
第一支程序 init 及配置檔/etc/inittab 與 runlevel
在核心加載完畢、進(jìn)行完硬件偵測(cè)與驅(qū)動(dòng)程序加載后,此時(shí)你的主機(jī)硬件應(yīng)該已經(jīng)準(zhǔn)備就緒了 (ready) ,此時(shí)核心會(huì)主動(dòng)的呼叫第一支程序,那就是 /sbin/init 羅。這也是為啥第十七章的 pstree 命令介紹時(shí),你會(huì)發(fā)現(xiàn) init 的 PID 號(hào)碼是一號(hào)啦。/sbin/init 最主要的功能就是準(zhǔn)備軟件運(yùn)行的環(huán)境,包括系統(tǒng)的主機(jī)名稱、網(wǎng)絡(luò)配置、語(yǔ)系處理、文件系統(tǒng)格式及其他服務(wù)的啟動(dòng)等。而所有的動(dòng)作都會(huì)透過(guò) init 的配置檔,亦即是 /etc/inittab 來(lái)規(guī)劃,而 inittab 內(nèi)還有一個(gè)很重要的配置項(xiàng)目,那就是默認(rèn)的 runlevel (啟動(dòng)運(yùn)行等級(jí)) 啦!
- Run level:運(yùn)行等級(jí)有哪些?
那么什么是 run level 呢?他有什么功用啊?其實(shí)很簡(jiǎn)單啦, Linux 就是藉由配置 run level 來(lái)規(guī)定系統(tǒng)使用不同的服務(wù)來(lái)啟動(dòng),讓 Linux 的使用環(huán)境不同。基本上,依據(jù)有無(wú)網(wǎng)絡(luò)與有無(wú) X Window而將 run level 分為 7 個(gè)等級(jí),分別是:
- 0 - halt (系統(tǒng)直接關(guān)機(jī))
- 1 - single user mode (單人維護(hù)模式,用在系統(tǒng)出問(wèn)題時(shí)的維護(hù))
- 2 - Multi-user, without NFS (類似底下的 runlevel 3,但無(wú) NFS 服務(wù))
- 3 - Full multi-user mode (完整含有網(wǎng)絡(luò)功能的純文字模式)
- 4 - unused (系統(tǒng)保留功能)
- 5 - X11 (與 runlevel 3 類似,但加載使用 X Window)
- 6 - reboot (重新啟動(dòng))
由於 run level 0, 4, 6 不是關(guān)機(jī)、重新啟動(dòng)就是系統(tǒng)保留的,所以:『 您當(dāng)然不能將默認(rèn)的 run level 配置為這三個(gè)值 』,否則系統(tǒng)就會(huì)不斷的自動(dòng)關(guān)機(jī)或自動(dòng)重新啟動(dòng)....好了,那么我們啟動(dòng)時(shí),到底是如何取得系統(tǒng)的 run level 的?當(dāng)然是 /etc/inittab 所配置的羅!那么 /etc/inittab 到底有什么資訊呢?我們先來(lái)看看這個(gè)文件的內(nèi)容好了:
- /etc/inittab 的內(nèi)容與語(yǔ)法
| [root@www ~]# vim /etc/inittab id:5:initdefault: <==默認(rèn)的 runlevel 配置, 此 runlevel 為 5 si::sysinit:/etc/rc.d/rc.sysinit <==準(zhǔn)備系統(tǒng)軟件運(yùn)行的環(huán)境的腳本運(yùn)行檔# 7 個(gè)不同 run level 的,需要啟動(dòng)的服務(wù)的 scripts 放置路徑: l0:0:wait:/etc/rc.d/rc 0 <==runlevel 0 在 /etc/rc.d/rc0.d/ l1:1:wait:/etc/rc.d/rc 1 <==runlevel 1 在 /etc/rc.d/rc1.d/ l2:2:wait:/etc/rc.d/rc 2 <==runlevel 2 在 /etc/rc.d/rc2.d/ l3:3:wait:/etc/rc.d/rc 3 <==runlevel 3 在 /etc/rc.d/rc3.d/ l4:4:wait:/etc/rc.d/rc 4 <==runlevel 4 在 /etc/rc.d/rc4.d/ l5:5:wait:/etc/rc.d/rc 5 <==runlevel 5 在 /etc/rc.d/rc5.d/ l6:6:wait:/etc/rc.d/rc 6 <==runlevel 6 在 /etc/rc.d/rc6.d/# 是否允許按下 [ctrl]+[alt]+[del] 就重新啟動(dòng)的配置項(xiàng)目: ca::ctrlaltdel:/sbin/shutdown -t3 -r now# 底下兩個(gè)配置則是關(guān)於不斷電系統(tǒng)的 (UPS),一個(gè)是沒(méi)電力時(shí)的關(guān)機(jī),一個(gè)是復(fù)電的處理 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"1:2345:respawn:/sbin/mingetty tty1 <==其實(shí) tty1~tty6 是由底下這六行決定的。 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 tty6x:5:respawn:/etc/X11/prefdm -nodaemon <==X window 則是這行決定的! |
讓我們解析一下這個(gè)文件吧!首先,這個(gè)文件的語(yǔ)法是利用冒號(hào) (:) 將配置分隔成為四個(gè)欄位,每個(gè)欄位的意義與說(shuō)明如下:
| [配置項(xiàng)目]:[run level]:[init 的動(dòng)作行為]:[命令項(xiàng)目] |
| inittab 配置值 | 意義說(shuō)明 |
| initdefault | 代表默認(rèn)的 run level 配置值 |
| sysinit | 代表系統(tǒng)初始化的動(dòng)作項(xiàng)目 |
| ctrlaltdel | 代表 [ctrl]+[alt]+[del] 三個(gè)按鍵是否可以重新啟動(dòng)的配置 |
| wait | 代表后面欄位配置的命令項(xiàng)目必須要運(yùn)行完畢才能繼續(xù)底下其他的動(dòng)作 |
| respawn | 代表后面欄位的命令可以無(wú)限制的再生 (重新啟動(dòng))。舉例來(lái)說(shuō), tty1 的 mingetty 產(chǎn)生的可登陸畫(huà)面,在你注銷而結(jié)束后,系統(tǒng)會(huì)再開(kāi)一個(gè)新的可登陸畫(huà)面等待下一個(gè)登陸。 |
- init 的處理流程
事實(shí)上 /etc/inittab 的配置也有點(diǎn)類似 shell script 啦,因?yàn)樵撐募?nèi)容的配置也是一行一行的從上往下處理的,因此我們可以知道 CentOS 的 init 依據(jù) inittab 配置的處理流程會(huì)是:
現(xiàn)在你可以知道為啥 [ctrl]+[alt]+[del] 可以重新啟動(dòng)而我們默認(rèn)提供 6 個(gè)虛擬終端機(jī) (tty1~tty6) 給你使用了吧!由於整個(gè)配置都是依據(jù) /etc/inittab 來(lái)決定的,因此如果你想要修改任何細(xì)節(jié)的話,可以這樣做喔:
- 如果不想讓使用者利用 [crtl]+[alt]+[del] 來(lái)重新啟動(dòng)系統(tǒng),可以將『ca::ctrlaltdel:/sbin/shutdown -t3 -r now 』加上注解 (#) 來(lái)取消該配置
- 規(guī)定啟動(dòng)的默認(rèn) run level 是純文字的 3 號(hào)或者是具有圖形介面的 5 號(hào) ,可經(jīng)由『 id:5:initdefault: 』那個(gè)數(shù)字來(lái)決定!以鳥(niǎo)哥自己這個(gè)文件為例,我是使用默認(rèn)的圖形介面。如果你想要關(guān)閉圖形介面的話,將該行 5 改成 3 即可。
- 如果不想要啟動(dòng)六個(gè)終端機(jī) (tty1~tty6),那么可以將『6:2345:respawn:/sbin/mingetty tty6』關(guān)閉數(shù)個(gè)。但務(wù)必至少啟動(dòng)一個(gè)喔!
所以說(shuō),你現(xiàn)在會(huì)自行修改登陸時(shí)的默認(rèn) run level 配置值了嗎?夠簡(jiǎn)單的吧?一般來(lái)說(shuō),我們默認(rèn)都是 3 或者是 5 來(lái)作為默認(rèn)的 run level 的。但有時(shí)后可能需要進(jìn)入 run level 1,也就是單人維護(hù)模式的環(huán)境當(dāng)中。這個(gè) run level 1 有點(diǎn)像是 Windows 系統(tǒng)當(dāng)中的『安全模式』啦,專門(mén)用來(lái)處理當(dāng)系統(tǒng)有問(wèn)題時(shí)的操作環(huán)境。此外,當(dāng)系統(tǒng)發(fā)現(xiàn)有問(wèn)題時(shí),舉例來(lái)說(shuō),不正常關(guān)機(jī)造成filesystem 的不一致現(xiàn)象時(shí),系統(tǒng)會(huì)主動(dòng)的進(jìn)入單人維護(hù)模式呢!
好了, init 在取得 run level 之后,接下來(lái)要干嘛?上面 /etc/inittab 文件內(nèi)容不是有提到 sysinit 嗎?準(zhǔn)備初始化系統(tǒng)了吧!
init 處理系統(tǒng)初始化流程 (/etc/rc.d/rc.sysinit)
還記得上面提到 /etc/inittab 里頭有這一句『 si::sysinit:/etc/rc.d/rc.sysinit 』吧?這表示:『我開(kāi)始加載各項(xiàng)系統(tǒng)服務(wù)之前,得先做好整個(gè)系統(tǒng)環(huán)境,我主要利用/etc/rc.d/rc.sysinit 這個(gè) shell script 來(lái)配置好我的系統(tǒng)環(huán)境的。』夠清楚了吧?所以,我想要知道到底 CentOS 啟動(dòng)的過(guò)程當(dāng)中幫我進(jìn)行了什么動(dòng)作,就得要仔細(xì)的分析 /etc/rc.d/rc.sysinit 羅。
| Tips: 老實(shí)說(shuō),這個(gè)文件的檔名在各不同的 distributions 當(dāng)中都不相同,例如 SuSE server 9 就使用 /etc/init.d/boot 與 /etc/init.d/rc 來(lái)進(jìn)行的。所以,你最好還是自行到 /etc/inittab 去察看一下系統(tǒng)的工作喔! ^_^ |
如果你使用 vim 去查閱過(guò) /etc/rc.d/rc.sysinit 的話,那么可以發(fā)現(xiàn)他主要的工作大抵有這幾項(xiàng):
讀取網(wǎng)絡(luò)配置檔 /etc/sysconfig/network ,取得主機(jī)名稱與默認(rèn)通訊閘 (gateway) 等網(wǎng)絡(luò)環(huán)境。
除掛載內(nèi)存裝置 /proc 之外,還會(huì)主動(dòng)偵測(cè)系統(tǒng)上是否具有 usb 的裝置,若有則會(huì)主動(dòng)加載 usb 的驅(qū)動(dòng)程序,并且嘗試掛載 usb 的文件系統(tǒng)。
我們?cè)诘谑哒抡劦降?SELinux 在此時(shí)進(jìn)行一些檢測(cè),并且檢測(cè)是否需要幫所有的文件重新編寫(xiě)標(biāo)準(zhǔn)的 SELinux 類型 (auto relabel)。
亂數(shù)產(chǎn)生器可以幫助系統(tǒng)進(jìn)行一些口令加密演算的功能,在此需要啟動(dòng)兩次亂數(shù)產(chǎn)生器。
根據(jù)核心在啟動(dòng)時(shí)偵測(cè)的結(jié)果 (/proc/sys/kernel/modprobe ) 開(kāi)始進(jìn)行 ide / scsi /網(wǎng)絡(luò) / 音效 等周邊設(shè)備的偵測(cè),以及利用以加載的核心模塊進(jìn)行 PnP 裝置的參數(shù)測(cè)試。
使用者可以在 /etc/sysconfig/modules/*.modules 加入自訂的模塊,則此時(shí)會(huì)被加載到系統(tǒng)當(dāng)中
系統(tǒng)會(huì)主動(dòng)去讀取 /etc/sysctl.conf 這個(gè)文件的配置值,使核心功能成為我們想要的樣子。
在 /etc/rc.d/rc.sysinit 將基本的系統(tǒng)配置數(shù)據(jù)都寫(xiě)好了,也將系統(tǒng)的數(shù)據(jù)配置完整!而如果你想要知道到底啟動(dòng)的過(guò)程中發(fā)生了什么事情呢?那么就運(yùn)行『 dmesg 』吧。另外,基本上,在這個(gè)文件當(dāng)中所進(jìn)行的很多工作的默認(rèn)配置檔,其實(shí)都在 /etc/sysconfig/ 當(dāng)中呢!所以,請(qǐng)記得將 /etc/sysconfig/ 內(nèi)的文件好好的瞧一瞧喔! ^_^
在這個(gè)過(guò)程當(dāng)中,比較值得注意的是自訂模塊的加載!在 CentOS 當(dāng)中,如果我們想要加載核心模塊的話,可以將整個(gè)模塊寫(xiě)入到 /etc/sysconfig/modules/*.modules 當(dāng)中,在該目錄下,只要記得檔名最后是以 .modules 結(jié)尾即可。這個(gè)過(guò)程是非必要的,因?yàn)槲覀兡壳暗哪J(rèn)模塊實(shí)在已經(jīng)很夠用了,除非是您的主機(jī)硬件實(shí)在太新了,非要自己加載新的模塊不可,否則,在經(jīng)過(guò) /etc/rc.d/rc.sysinit 的處理后,你的主機(jī)系統(tǒng)應(yīng)該是已經(jīng)跑得很順暢了啦!就等著你將系統(tǒng)相關(guān)的服務(wù)與網(wǎng)絡(luò)服務(wù)啟動(dòng)羅!
啟動(dòng)系統(tǒng)服務(wù)與相關(guān)啟動(dòng)配置檔 (/etc/rc.d/rc N & /etc/sysconfig)
加載核心讓整個(gè)系統(tǒng)準(zhǔn)備接受命令來(lái)工作,再經(jīng)過(guò) /etc/rc.d/rc.sysinit的系統(tǒng)模塊與相關(guān)硬件資訊的初始化后,你的 CentOS 系統(tǒng)應(yīng)該已經(jīng)順利工作了。只是,我們還得要啟動(dòng)系統(tǒng)所需要的各項(xiàng)『服務(wù)』啊!這樣主機(jī)才能提供我們相關(guān)的網(wǎng)絡(luò)或者是主機(jī)功能嘛!這個(gè)時(shí)候,依據(jù)我們?cè)?/etc/inittab 里面提到的 run level 配置值,就可以來(lái)決定啟動(dòng)的服務(wù)項(xiàng)目了。舉例來(lái)說(shuō),使用 run level 3 當(dāng)然就不需要啟動(dòng) X Window 的相關(guān)服務(wù)羅,您說(shuō)是吧?
那么各個(gè)不同的 run level 服務(wù)啟動(dòng)的各個(gè) shell script 放在哪?還記得 /etc/inittab 里面提到的:
| 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 <==本例中,以此項(xiàng)目來(lái)解釋 l6:6:wait:/etc/rc.d/rc 6 |
上面提到的就是各個(gè) run level 要運(yùn)行的各項(xiàng)腳本放置處啦!主要是透過(guò) /etc/rc.d/rc 這個(gè)命令來(lái)處理相關(guān)任務(wù)!由於鳥(niǎo)哥使用默認(rèn)的 runlevel 5 ,因此我們主要針對(duì)上述特殊字體那行來(lái)解釋好了: /etc/rc.d/rc 5 的意義是這樣的(建議您自行使用 vim 去觀察一下 /etc/rc.d/rc 這個(gè)文件,你會(huì)更有概念!):
- 透過(guò)外部第一號(hào)參數(shù) ($1) 來(lái)取得想要運(yùn)行的腳本目錄。亦即由 /etc/rc.d/rc 5 可以取得 /etc/rc5.d/ 這個(gè)目錄來(lái)準(zhǔn)備處理相關(guān)的腳本程序;
- 找到 /etc/rc5.d/K??* 開(kāi)頭的文件,并進(jìn)行『 /etc/rc5.d/K??* stop 』的動(dòng)作;
- 找到 /etc/rc5.d/S??* 開(kāi)頭的文件,并進(jìn)行『 /etc/rc5.d/S??* start 』的動(dòng)作;
透過(guò)上面的說(shuō)明我們可以知道所有的項(xiàng)目都與 /etc/rc5.d/ 有關(guān),那么我們就來(lái)瞧瞧這個(gè)目錄下有些什么玩意兒吧!
| [root@www ~]# ll /etc/rc5.d/ lrwxrwxrwx 1 root root 16 Sep 4 2008 K02dhcdbd -> ../init.d/dhcdbd ....(中間省略).... lrwxrwxrwx 1 root root 14 Sep 4 2008 K91capi -> ../init.d/capi lrwxrwxrwx 1 root root 23 Sep 4 2008 S00microcode_ctl -> ../init.d/microcode_ctl lrwxrwxrwx 1 root root 22 Sep 4 2008 S02lvm2-monitor -> ../init.d/lvm2-monitor ....(中間省略).... lrwxrwxrwx 1 root root 17 Sep 4 2008 S10network -> ../init.d/network ....(中間省略).... lrwxrwxrwx 1 root root 11 Sep 4 2008 S99local -> ../rc.local lrwxrwxrwx 1 root root 16 Sep 4 2008 S99smartd -> ../init.d/smartd ....(底下省略).... |
在這個(gè)目錄下的文件很有趣,主要具有幾個(gè)特點(diǎn):
- 檔名全部以 Sxx 或 Kxx ,其中 xx 為數(shù)字,且這些數(shù)字在文件之間是有相關(guān)性的!
- 全部是連結(jié)檔,連結(jié)到 stand alone 服務(wù)啟動(dòng)的目錄 /etc/init.d/ 去
我們?cè)诘谑苏抡勥^(guò)服務(wù)的啟動(dòng)主要是以『/etc/init.d/服務(wù)檔名 {start,stop}』來(lái)啟動(dòng)與關(guān)閉的,那么透過(guò)剛剛 /etc/rc.d/rc 程序的解說(shuō),我們可以清楚的了解到了 /etc/rc5.d/[SK]xx 其實(shí)就是跑到 /etc/init.d/ 去找到相對(duì)應(yīng)的服務(wù)腳本,然后分別進(jìn)行 start (Sxx) 或 stop (Kxx) 的動(dòng)作而已啦!舉例來(lái)說(shuō),以上述的表格內(nèi)的 K91capi 及 S10network 為例好了,透過(guò) /etc/rc.d/rc 5 的運(yùn)行,這兩個(gè)文件會(huì)這樣進(jìn)行:
- /etc/rc5.d/K91capi stop --> /etc/init.d/capi stop
- /etc/rc5.d/S10network start --> /etc/init.d/network start
所以說(shuō),你有想要啟動(dòng)該 runlevel 時(shí)就運(yùn)行的服務(wù),那么利用 Sxx 并指向 /etc/init.d/ 的特定服務(wù)啟動(dòng)腳本后,該服務(wù)就能夠在啟動(dòng)時(shí)啟動(dòng)啦!就這么簡(jiǎn)單!問(wèn)題是,你需要自行處理這個(gè) K, S 開(kāi)頭的連結(jié)檔嗎?并不需要的,第十八章談到的 chkconfig 就是在負(fù)責(zé)處理這個(gè)連結(jié)檔啦!這樣有沒(méi)有跟第十八章的觀念串在一起了呢? ^_^
那么為什么 K 與 S 后面要有數(shù)字呢?因?yàn)楦鞑煌姆?wù)其實(shí)還是互有關(guān)系的。舉例來(lái)說(shuō),如果要啟動(dòng) WWW 服務(wù),總是得要有網(wǎng)絡(luò)吧?所以 /etc/init.d/network 就會(huì)比較先被啟動(dòng)啦!那么您就會(huì)知道在 S 或者是 K 后面接的數(shù)字是啥意思了吧?嘿嘿,那就是運(yùn)行的順序啦!那么哪個(gè)文件被最后運(yùn)行呢?看到最后一個(gè)被運(yùn)行的項(xiàng)目是啥?沒(méi)錯(cuò),就是 S99local ,亦即是:/etc/rc.d/rc.local 這個(gè)文件啦!
使用者自訂啟動(dòng)啟動(dòng)程序 (/etc/rc.d/rc.local)
在完成默認(rèn) runlevel 指定的各項(xiàng)服務(wù)的啟動(dòng)后,如果我還有其他的動(dòng)作想要完成時(shí),舉例來(lái)說(shuō),我還想要寄一封 mail 給某個(gè)系統(tǒng)管理帳號(hào),通知他,系統(tǒng)剛剛重新啟動(dòng)完畢,那么是否應(yīng)該要制作一個(gè) shell script 放置在 /etc/init.d/ 里面,然后再以連結(jié)方式連結(jié)到/etc/rc5.d/ 里面呢?呵呵!當(dāng)然不需要!還記得上一小節(jié)提到的 /etc/rc.d/rc.local 吧?這個(gè)文件就可以運(yùn)行您自己想要運(yùn)行的系統(tǒng)命令了。
也就是說(shuō),我有任何想要在啟動(dòng)時(shí)就進(jìn)行的工作時(shí),直接將他寫(xiě)入 /etc/rc.d/rc.local ,那么該工作就會(huì)在啟動(dòng)的時(shí)候自動(dòng)被加載喔!而不必等我們登陸系統(tǒng)去啟動(dòng)呢!是否很方便啊!一般來(lái)說(shuō),鳥(niǎo)哥就很喜歡把自己制作的 shell script 完整檔名寫(xiě)入/etc/rc.d/rc.local ,如此一來(lái),啟動(dòng)就會(huì)將我的 shell script 運(yùn)行過(guò),真是好棒那!
根據(jù) /etc/inittab 之配置,加載終端機(jī)或 X-Window 介面
在完成了系統(tǒng)所有服務(wù)的啟動(dòng)后,接下來(lái) Linux 就會(huì)啟動(dòng)終端機(jī)或者是 X Window 來(lái)等待使用者登陸啦!實(shí)際參考的項(xiàng)目是 /etc/inittab 內(nèi)的這一段:
| 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 x:5:respawn:/etc/X11/prefdm -nodaemon |
這一段代表,在 run level 2, 3, 4, 5 時(shí),都會(huì)運(yùn)行 /sbin/mingetty 這個(gè)咚咚,而且運(yùn)行六個(gè),這也是為何我們 Linux 會(huì)提供『六個(gè)純文字終端機(jī)』的配置所在啊!因?yàn)?mingetty 就是在啟動(dòng)終端機(jī)的命令說(shuō)。
要注意的是那個(gè) respawn 的 init 動(dòng)作項(xiàng)目,他代表『當(dāng)后面的命令被終止 (terminal) 時(shí),init 會(huì)主動(dòng)的重新啟動(dòng)該項(xiàng)目。』這也是為何我們登陸 tty1 終端機(jī)介面后,以 exit 離開(kāi)后,系統(tǒng)還是會(huì)重新顯示等待使用者輸入的畫(huà)面的原因啊!
如果改天您不想要有六個(gè)終端機(jī)時(shí),可以取消某些終端機(jī)介面嗎?當(dāng)然可以啊!就將上面表格當(dāng)中的某些項(xiàng)目注解掉即可!例如不想要 tty5 與 tty6 ,就將那兩行注解,則下次重新啟動(dòng)后,您的 Linux 就只剩下『 F1 ~ F4 』有效而已,這樣說(shuō),可以了解吧!!^_^
至於如果我們使用的是 run level 5 呢?那么除了這六個(gè)終端機(jī)之外, init 還會(huì)運(yùn)行 /etc/X11/prefdm -nodaemon那個(gè)命令喔!該命令我們會(huì)在第二十四章、X Window 再來(lái)詳談!他主要的功能就是在啟動(dòng) X Window 啦!
啟動(dòng)過(guò)程會(huì)用到的主要配置檔
我們?cè)?/sbin/init 的運(yùn)行過(guò)程中有談到許多運(yùn)行腳本,包括 /etc/rc.d/rc.sysinit 以及 /etc/rc.d/rc 等等,其實(shí)這些腳本都會(huì)使用到相當(dāng)多的系統(tǒng)配置檔,這些啟動(dòng)過(guò)程會(huì)用到的配置檔則大多放置在 /etc/sysconfig/ 目錄下。同時(shí),由於核心還是需要加載一些驅(qū)動(dòng)程序 (核心模塊),此時(shí)系統(tǒng)自訂的裝置與模塊對(duì)應(yīng)檔 (/etc/modprobe.conf) 就顯的挺重要了喔!
- 關(guān)於模塊: /etc/modprobe.conf
還記得我們?cè)? /etc/rc.d/rc.sysinit 當(dāng)中談到的加載使用者自訂模塊的地方嗎?就是在 /etc/sysconfig/modules/ 目錄下啊!雖然核心提供的默認(rèn)模塊已經(jīng)很足夠我們使用了,但是,某些條件下我們還是得對(duì)模塊進(jìn)行一些參數(shù)的規(guī)劃,此時(shí)就得要使用到 /etc/modprobe.conf 羅!舉例來(lái)說(shuō),鳥(niǎo)哥的 CentOS 主機(jī)的 modprobe.conf 有點(diǎn)像這樣:
| [root@www ~]# cat /etc/modprobe.conf alias eth0 8139too <==讓 eth0 使用 8139too 的模塊 alias scsi_hostadapter pata_sis alias snd-card-0 snd-trident options snd-card-0 index=0 <==額外指定 snd-card-0 的參數(shù)功能 options snd-trident index=0 |
這個(gè)文件大多在指定系統(tǒng)內(nèi)的硬件所使用的模塊啦!這個(gè)文件通常系統(tǒng)是可以自行產(chǎn)生的,所以你不必手動(dòng)去訂正他!不過(guò),如果系統(tǒng)捉到錯(cuò)誤的驅(qū)動(dòng)程序,或者是你想要使用升級(jí)的驅(qū)動(dòng)程序來(lái)對(duì)應(yīng)相關(guān)的硬件配備時(shí),你就得要自行手動(dòng)的處理一下這個(gè)文件了。
以上表的第一行為例,鳥(niǎo)哥使用螃蟹卡 (Realtek 的芯片組) 來(lái)作為我的網(wǎng)絡(luò)卡,那螃蟹卡使用的模塊就是 8139too啦!這樣看的懂了吧?當(dāng)我要啟動(dòng)網(wǎng)絡(luò)卡時(shí),系統(tǒng)會(huì)跑到這個(gè)文件來(lái)查閱一下,然后加載 8139too 驅(qū)動(dòng)程序來(lái)驅(qū)動(dòng)網(wǎng)絡(luò)卡羅!更多的相關(guān)說(shuō)明,請(qǐng) man modprobe.conf 喔!
- /etc/sysconfig/*
不說(shuō)您也知道,整個(gè)啟動(dòng)的過(guò)程當(dāng)中,老是讀取的一些服務(wù)的相關(guān)配置檔都是記錄在 /etc/sysconfig 目錄下的!那么該目錄底下有些啥玩意兒?我們找?guī)讉€(gè)重要的文件來(lái)談?wù)?#xff1a;
- authconfig:
這個(gè)文件主要在規(guī)范使用者的身份認(rèn)證的機(jī)制,包括是否使用本機(jī)的 /etc/passwd, /etc/shadow 等,以及 /etc/shadow 口令記錄使用何種加密演算法,還有是否使用外部口令服務(wù)器提供的帳號(hào)驗(yàn)證 (NIS, LDAP) 等。系統(tǒng)默認(rèn)使用 MD5 加密演算法,并且不使用外部的身份驗(yàn)證機(jī)制;
- clock:
此文件在配置 Linux 主機(jī)的時(shí)區(qū),可以使用格林威治時(shí)間(GMT),也可以使用臺(tái)灣的本地時(shí)間 (local)。基本上,在 clock 文件內(nèi)的配置項(xiàng)目『 ZONE 』所參考的時(shí)區(qū)位於 /usr/share/zoneinfo 目錄下的相對(duì)路徑中。而且要修改時(shí)區(qū)的話,還得將 /usr/share/zoneinfo/Asia/Taipei 這個(gè)文件復(fù)制成為 /etc/localtime 才行!
- i18n:
i18n 在配置一些語(yǔ)系的使用方面,例如最麻煩的文字介面下的日期顯示問(wèn)題!如果你是以中文安裝的,那么默認(rèn)語(yǔ)系會(huì)被選擇 zh_TW.UTF8 ,所以在純文字介面之下,你的文件日期顯示可能就會(huì)呈現(xiàn)亂碼!這個(gè)時(shí)候就需要更改一下這里啦!更動(dòng)這個(gè) i18n 的文件,將里面的 LC_TIME 改成 en 即可!
- keyboard & mouse:
keyboard 與 mouse 就是在配置鍵盤(pán)與鼠標(biāo)的形式;
- network:
network 可以配置是否要啟動(dòng)網(wǎng)絡(luò),以及配置主機(jī)名稱還有通訊閘 (GATEWAY) 這兩個(gè)重要資訊呢!
- network-scripts/:
至於 network-scripts 里面的文件,則是主要用在配置網(wǎng)絡(luò)卡~這部份我們?cè)诜?wù)器架設(shè)篇才會(huì)提到!
總而言之一句話,這個(gè)目錄下的文件很重要的啦!啟動(dòng)過(guò)程里面常常會(huì)讀取到的!
Run level 的切換
在我們完成上面的所有資訊后,其實(shí)整個(gè) Linux 主機(jī)就已經(jīng)在等待我們使用者的登陸啦!但是,相信您應(yīng)該還是會(huì)有一點(diǎn)疑問(wèn)的地方,那就是:『我該如何切換 run level 呢?』會(huì)不會(huì)很難啊?不會(huì)啦!很簡(jiǎn)單~但是依據(jù)運(yùn)行的時(shí)間而有不同的方式啊!
事實(shí)上,與 run level 有關(guān)的啟動(dòng)其實(shí)是在 /etc/rc.d/rc.sysinit 運(yùn)行完畢之后。也就是說(shuō),其實(shí) run level 的不同僅是 /etc/rc[0-6].d 里面啟動(dòng)的服務(wù)不同而已。不過(guò),依據(jù)啟動(dòng)是否自動(dòng)進(jìn)入不同 run level 的配置,我們可以說(shuō):
假設(shè)原本我們是以 run level 5 登陸系統(tǒng)的,但是因?yàn)槟承┮蛩?#xff0c;想要切換成為 run level 3 時(shí),該怎么辦呢?很簡(jiǎn)單啊,運(yùn)行『 init 3 』即可切換。但是 init 3 這個(gè)動(dòng)作到底做了什么呢?我們不是說(shuō)了嗎?事實(shí)上,不同的 run level 只是加載的服務(wù)不同罷了,亦即是 /etc/rc5.d/ 還有 /etc/rc3.d 內(nèi)的 Sxxname 與 Kxxname 有差異而已。所以說(shuō),當(dāng)運(yùn)行 init 3 時(shí),系統(tǒng)會(huì):
- 先比對(duì) /etc/rc3.d/ 及 /etc/rc5.d 內(nèi)的 K 與 S 開(kāi)頭的文件;
- 在新的 runlevel 亦即是 /etc/rc3.d/ 內(nèi)有多的 K 開(kāi)頭文件,則予以關(guān)閉;
- 在新的 runlevel 亦即是 /etc/rc3.d/ 內(nèi)有多的 S 開(kāi)頭文件,則予以啟動(dòng);
也就是說(shuō),兩個(gè) run level 都存在的服務(wù)就不會(huì)被關(guān)閉啦!如此一來(lái),就很容易切換 run level 了,而且還不需要重新啟動(dòng)呢!真方便。那我怎么知道目前的 run level 是多少呢?直接在 bash 當(dāng)中輸入 runlevel 即可啊!
| [root@www ~]# runlevel N 5 # 左邊代表前一個(gè) runlevel ,右邊代表目前的 runlevel。 # 由於之前并沒(méi)有切換過(guò) runlevel ,因此前一個(gè) runlevel 不存在 (N) |
| # 將目前的 runlevel 切換成為 3 (注意, tty7 的數(shù)據(jù)會(huì)消失!) [root@www ~]# init 3 NIT: Sending processes the TERM signal Applying Intel CPU microcode update: [ OK ] Starting background readahead: [ OK ] Starting irqbalance: [ OK ] Starting httpd: [ OK ] Starting anacron: [ OK ] # 這代表,新的 runlevel 亦即是 runlevel3 比前一個(gè) runlevel 多出了上述 5 個(gè)服務(wù)[root@www ~]# runlevel 5 3 # 看吧!前一個(gè)是 runlevel 5 ,目前的是 runlevel 3 啦! |
那么你能不能利用 init 來(lái)進(jìn)行關(guān)機(jī)與重新啟動(dòng)呢?可以的啦!利用『 init 0 』就能夠關(guān)機(jī),而『 init 6 』就能夠重新啟動(dòng)!為什么?往前翻一下 runlevel 的定義即可了解吧!
核心與核心模塊
談完了整個(gè)啟動(dòng)的流程,您應(yīng)該會(huì)知道,在整個(gè)啟動(dòng)的過(guò)程當(dāng)中,是否能夠成功的驅(qū)動(dòng)我們主機(jī)的硬件配備,是核心 (kernel) 的工作!而核心一般都是壓縮檔,因此在使用核心之前,就得要將他解壓縮后,才能加載主內(nèi)存當(dāng)中。
另外,為了應(yīng)付日新月異的硬件,目前的核心都是具有『可讀取模塊化驅(qū)動(dòng)程序』的功能,亦即是所謂的『 modules (模塊化)』的功能啦!所謂的模塊化可以將他想成是一個(gè)『外掛程序』,該外掛程序可能由硬件開(kāi)發(fā)廠商提供,也有可能我們的核心本來(lái)就支持~不過(guò),較新的硬件,通常都需要硬件開(kāi)發(fā)商提供驅(qū)動(dòng)程序模塊啦!
那么核心與核心模塊放在哪?
- 核心: /boot/vmlinuz 或 /boot/vmlinuz-version;
- 核心解壓縮所需 RAM Disk: /boot/initrd (/boot/initrd-version);
- 核心模塊: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel;
- 核心原始碼: /usr/src/linux 或 /usr/src/kernels/ (要安裝才會(huì)有,默認(rèn)不安裝)
如果該核心被順利的加載系統(tǒng)當(dāng)中了,那么就會(huì)有幾個(gè)資訊紀(jì)錄下來(lái):
- 核心版本: /proc/version
- 系統(tǒng)核心功能: /proc/sys/kernel
問(wèn)題來(lái)啦,如果我有個(gè)新的硬件,偏偏我的操作系統(tǒng)不支持,該怎么辦?很簡(jiǎn)單啊!
- 重新編譯核心,并加入最新的硬件驅(qū)動(dòng)程序原始碼;
- 將該硬件的驅(qū)動(dòng)程序編譯成為模塊,在啟動(dòng)時(shí)加載該模塊
上面第一點(diǎn)還很好理解,反正就是重新編譯核心就是了。不過(guò),核心編譯很不容易啊!我們會(huì)在后續(xù)章節(jié)約略介紹核心編譯的整個(gè)程序。比較有趣的則是將該硬件的驅(qū)動(dòng)程序編譯成為模塊啦!關(guān)於編譯的方法,可以參考后續(xù)的第二十二章、原始碼與 tarball的介紹。我們這個(gè)章節(jié)僅是說(shuō)明一下,如果想要加載一個(gè)已經(jīng)存在的模塊時(shí),該如何是好?
核心模塊與相依性
既然要處理核心模塊,自然就得要了解了解我們核心提供的模塊之間的相關(guān)性啦!基本上,核心模塊的放置處是在 /lib/modules/$(uname -r)/kernel 當(dāng)中,里面主要還分成幾個(gè)目錄:
| arch :與硬件平臺(tái)有關(guān)的項(xiàng)目,例如 CPU 的等級(jí)等等; crypto :核心所支持的加密的技術(shù),例如 md5 或者是 des 等等; drivers :一些硬件的驅(qū)動(dòng)程序,例如顯卡、網(wǎng)絡(luò)卡、PCI 相關(guān)硬件等等; fs :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等; lib :一些函式庫(kù); net :與網(wǎng)絡(luò)有關(guān)的各項(xiàng)協(xié)議數(shù)據(jù),還有防火墻模塊 (net/ipv4/netfilter/*) 等等; sound :與音效有關(guān)的各項(xiàng)模塊; |
如果要我們一個(gè)一個(gè)的去檢查這些模塊的主要資訊,然后定義出他們的相依性,我們可能會(huì)瘋掉吧!所以說(shuō),我們的 Linux 當(dāng)然會(huì)提供一些模塊相依性的解決方案羅~對(duì)啦!那就是檢查 /lib/modules/$(uname -r)/modules.dep這個(gè)文件啦!他記錄了在核心支持的模塊的各項(xiàng)相依性。
那么這個(gè)文件如何創(chuàng)建呢?挺簡(jiǎn)單!利用 depmod 這個(gè)命令就可以達(dá)到創(chuàng)建該文件的需求了!
| [root@www ~]# depmod [-Ane] 選項(xiàng)與參數(shù): -A :不加任何參數(shù)時(shí), depmod 會(huì)主動(dòng)的去分析目前核心的模塊,并且重新寫(xiě)入/lib/modules/$(uname -r)/modules.dep 當(dāng)中。若加入 -A 參數(shù)時(shí),則 depmod會(huì)去搜尋比 modules.dep 內(nèi)還要新的模塊,如果真找到新模塊,才會(huì)升級(jí)。 -n :不寫(xiě)入 modules.dep ,而是將結(jié)果輸出到螢?zāi)簧?standard out); -e :顯示出目前已加載的不可運(yùn)行的模塊名稱范例一:若我做好一個(gè)網(wǎng)絡(luò)卡驅(qū)動(dòng)程序,檔名為 a.ko,該如何升級(jí)核心相依性? [root@www ~]# cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net [root@www ~]# depmod |
以上面的范例一為例,我們的 Linux kernel 2.6.x 版本的核心模塊擴(kuò)展名一定是 .ko 結(jié)尾的,當(dāng)你使用 depmod 之后,該程序會(huì)跑到模塊標(biāo)準(zhǔn)放置目錄 /lib/modules/$(uname -r)/kernel ,并依據(jù)相關(guān)目錄的定義將全部的模塊捉出來(lái)分析,最終才將分析的結(jié)果寫(xiě)入 modules.dep 文件中的吶!這個(gè)文件很重要喔!因?yàn)樗麜?huì)影響到本章稍后會(huì)介紹的 modprobe 命令的應(yīng)用!
核心模塊的觀察
那你到底曉不曉得目前核心加載了多少的模塊呢?粉簡(jiǎn)單啦!利用 lsmod 即可!
| [root@www ~]# lsmod Module Size Used by autofs4 24517 2 hidp 23105 2 ....(中間省略).... 8139too 28737 0 8139cp 26305 0 mii 9409 2 8139too,8139cp <==mii 還被 8139cp, 8139too 使用 ....(中間省略).... uhci_hcd 25421 0 <==底下三個(gè)是 U盤(pán) 相關(guān)的模塊! ohci_hcd 23261 0 ehci_hcd 33357 0 |
使用 lsmod 之后,系統(tǒng)會(huì)顯示出目前已經(jīng)存在於核心當(dāng)中的模塊,顯示的內(nèi)容包括有:
- 模塊名稱(Module);
- 模塊的大小(size);
- 此模塊是否被其他模塊所使用 (Used by)。
也就是說(shuō),模塊其實(shí)真的有相依性喔!舉上表為例, mii 這個(gè)模塊會(huì)被 8139too 所使用。簡(jiǎn)單的說(shuō),就是『當(dāng)你要加載 8139too 時(shí),需要先加載 mii 這個(gè)模塊才可以順利的加載 8139too』的意思。那么除了顯示出目前的模塊外,我還可以查閱每個(gè)模塊的資訊嗎?舉例來(lái)說(shuō),我們知道 8139too是螃蟹卡的驅(qū)動(dòng)程序,那么 mii 是什么咚咚?就用 modinfo 來(lái)觀察吧!
| [root@www ~]# modinfo [-adln] [module_name|filename] 選項(xiàng)與參數(shù): -a :僅列出作者名稱; -d :僅列出該 modules 的說(shuō)明 (description); -l :僅列出授權(quán) (license); -n :僅列出該模塊的詳細(xì)路徑。范例一:由上個(gè)表格當(dāng)中,請(qǐng)列出 mii 這個(gè)模塊的相關(guān)資訊: [root@www ~]# modinfo mii filename: /lib/modules/2.6.18-92.el5/kernel/drivers/net/mii.ko license: GPL description: MII hardware support library author: Jeff Garzik <jgarzik@pobox.com> srcversion: 16DCEDEE4B5629C222C352D depends: vermagic: 2.6.18-92.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1 # 可以看到這個(gè)模塊的來(lái)源,以及該模塊的簡(jiǎn)易說(shuō)明!(是硬件支持函式庫(kù))范例二:我有一個(gè)模塊名稱為 a.ko ,請(qǐng)問(wèn)該模塊的資訊為? [root@www ~]# modinfo a.ko ....(省略).... |
事實(shí)上,這個(gè) modinfo 除了可以『查閱在核心內(nèi)的模塊』之外,還可以檢查『某個(gè)模塊文件』,因此,如果你想要知道某個(gè)文件代表的意義為何,利用 modinfo 加上完整檔名吧!看看就曉得是啥玩意兒羅! ^_^
核心模塊的加載與移除
好了,如果我想要自行手動(dòng)加載模塊,又該如何是好?有很多方法啦,最簡(jiǎn)單而且建議的,是使用 modprobe 這個(gè)命令來(lái)加載模塊,這是因?yàn)?modprobe 會(huì)主動(dòng)的去搜尋 modules.dep 的內(nèi)容,先克服了模塊的相依性后,才決定需要加載的模塊有哪些,很方便。至於 insmod 則完全由使用者自行加載一個(gè)完整檔名的模塊,并不會(huì)主動(dòng)的分析模塊相依性啊!
| [root@www ~]# insmod [/full/path/module_name] [parameters]范例一:請(qǐng)嘗試加載 cifs.ko 這個(gè)『文件系統(tǒng)』模塊 [root@www ~]# insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko [root@www ~]# lsmod | grep cifs cifs 212789 0 |
他立刻就將該模塊加載羅~但是 insmod 后面接的模塊必須要是完整的『檔名』才行!那如何移除這個(gè)模塊呢?
| [root@www ~]# rmmod [-fw] module_name 選項(xiàng)與參數(shù): -f :強(qiáng)制將該模塊移除掉,不論是否正被使用; -w :若該模塊正被使用,則 rmmod 會(huì)等待該模塊被使用完畢后,才移除他!范例一:將剛剛加載的 cifs 模塊移除! [root@www ~]# rmmod cifs范例二:請(qǐng)加載 vfat 這個(gè)『文件系統(tǒng)』模塊 [root@www ~]# insmod /lib/modules/$(uname -r)/kernel/fs/vfat/vfat.ko insmod: error inserting '/lib/modules/2.6.18-92.el5/kernel/fs/vfat/vfat.ko': -1 Unknown symbol in module # 無(wú)法加載 vfat 這個(gè)模塊啊!傷腦筋! |
使用 insmod 與 rmmod 的問(wèn)題就是,你必須要自行找到模塊的完整檔名才行,而且如同上述范例二的結(jié)果,萬(wàn)一模塊有相依屬性的問(wèn)題時(shí),你將無(wú)法直接加載或移除該模塊呢!所以近年來(lái)我們都建議直接使用 modprobe 來(lái)處理模塊加載的問(wèn)題,這個(gè)命令的用法是:
| [root@www ~]# modprobe [-lcfr] module_name 選項(xiàng)與參數(shù): -c :列出目前系統(tǒng)所有的模塊!(更詳細(xì)的代號(hào)對(duì)應(yīng)表) -l :列出目前在 /lib/modules/`uname -r`/kernel 當(dāng)中的所有模塊完整檔名; -f :強(qiáng)制加載該模塊; -r :類似 rmmod ,就是移除某個(gè)模塊羅~范例一:加載 cifs 模塊 [root@www ~]# modprobe cifs # 很方便吧!不需要知道完整的模塊檔名,這是因?yàn)樵撏暾麢n名已經(jīng)記錄到 # /lib/modules/`uname -r`/modules.dep 當(dāng)中的緣故啊!如果要移除的話: [root@www ~]# modprobe -r cifs |
使用 modprobe 真的是要比 insmod 方便很多!因?yàn)樗侵苯尤ニ褜?modules.dep 的紀(jì)錄,所以羅,當(dāng)然可以克服模塊的相依性問(wèn)題,而且還不需要知道該模塊的詳細(xì)路徑呢!好方便! ^_^
例題: 嘗試使用 modprobe 加載 vfat 這個(gè)模塊,并且觀察該模塊的相關(guān)模塊是哪個(gè)? 答: 我們使用 modprobe 來(lái)加載,再以 lsmod 來(lái)觀察與 grep 擷取關(guān)鍵字看看:
|
核心模塊的額外參數(shù)配置:/etc/modprobe.conf
這個(gè)文件我們之前已經(jīng)談過(guò)了,這里只是再?gòu)?qiáng)調(diào)一下而已,如果您想要修改某些模塊的額外參數(shù)配置,就在這個(gè)文件內(nèi)配置吧!我們假設(shè)一個(gè)案例好了,假設(shè)我的網(wǎng)絡(luò)卡 eth0 是使用 ne ,但是 eth1 同樣也使用 ne ,為了避免同一個(gè)模塊會(huì)導(dǎo)致網(wǎng)絡(luò)卡的錯(cuò)亂,因此,我可以先找到 eth0 與 eth1 的 I/O 與 IRQ ,假設(shè):
- eth0 : I/O (0x300) 且 IRQ=5
- eth1 : I/O (0x320) 且 IRQ=7
則:
| [root@www ~]# vi /etc/modprobe.conf alias eth0 ne alias eth1 ne options eth0 io=0x300 irq=5 options eth1 io=0x320 irq=7 |
嘿嘿!如此一來(lái),我的 Linux 就不會(huì)捉錯(cuò)網(wǎng)絡(luò)卡的對(duì)應(yīng)羅!因?yàn)楸晃覐?qiáng)制指定某個(gè) I/O 咯嘛! ^_^
Boot Loader: Grub
在看完了前面的整個(gè)啟動(dòng)流程,以及核心模塊的整理之后,你應(yīng)該會(huì)發(fā)現(xiàn)到一件事情,那就是『 boot loader 是加載核心的重要工具』啊!沒(méi)有 boot loader 的話,那么kernel 根本就沒(méi)有辦法被系統(tǒng)加載的呢!所以,底下我們會(huì)先談一談 boot loader 的功能,然后再講一講現(xiàn)階段 Linux 里頭最主流的 grub 這個(gè) boot loader 吧!
boot loader 的兩個(gè) stage
我們?cè)诘谝恍」?jié)啟動(dòng)流程的地方曾經(jīng)講過(guò),在 BIOS 讀完資訊后,接下來(lái)就是會(huì)到第一個(gè)啟動(dòng)裝置的 MBR 去讀取 boot loader 了。這個(gè) boot loader 可以具有菜單功能、直接加載核心文件以及控制權(quán)移交的功能等,系統(tǒng)必須要有 loader 才有辦法加載該操作系統(tǒng)的核心就是了。但是我們都知道, MBR 是整個(gè)硬盤(pán)的第一個(gè) sector 內(nèi)的一個(gè)區(qū)塊,充其量整個(gè)大小也才 446 bytes 而已。我們的 loader 功能這么強(qiáng),光是程序碼與配置數(shù)據(jù)不可能只占不到 446 bytes 的容量吧?那如何安裝?
為了解決這個(gè)問(wèn)題,所以 Linux 將 boot loader 的程序碼運(yùn)行與配置值加載分成兩個(gè)階段 (stage) 來(lái)運(yùn)行:
- Stage 1:運(yùn)行 boot loader 主程序:
第一階段為運(yùn)行 boot loader 的主程序,這個(gè)主程序必須要被安裝在啟動(dòng)區(qū),亦即是 MBR 或者是 boot sector。但如前所述,因?yàn)?MBR 實(shí)在太小了,所以,MBR 或 boot sector 通常僅安裝 boot loader 的最小主程序,并沒(méi)有安裝 loader 的相關(guān)配置檔;
- Stage 2:主程序加載配置檔:
第二階段為透過(guò) boot loader 加載所有配置檔與相關(guān)的環(huán)境參數(shù)文件 (包括文件系統(tǒng)定義與主要配置檔 menu.lst),一般來(lái)說(shuō),配置檔都在 /boot 底下。
那么這些配置檔是放在哪里啊?這些與 grub 有關(guān)的文件都放置到 /boot/grub 中,那我們就來(lái)看看有哪些文件吧!
| [root@www ~]# ls -l /boot/grub -rw-r--r-- device.map <==grub 的裝置對(duì)應(yīng)檔(底下會(huì)談到) -rw-r--r-- e2fs_stage1_5 <==ext2/ext3 文件系統(tǒng)之定義檔 -rw-r--r-- fat_stage1_5 <==FAT 文件系統(tǒng)之定義檔 -rw-r--r-- ffs_stage1_5 <==FFS 文件系統(tǒng)之定義檔 -rw------- grub.conf <==grub 在 Red Hat 的配置檔 -rw-r--r-- iso9660_stage1_5 <==光驅(qū)文件系統(tǒng)定義檔 -rw-r--r-- jfs_stage1_5 <==jfs 文件系統(tǒng)定義檔 lrwxrwxrwx menu.lst -> ./grub.conf <==其實(shí) menu.lst 才是配置檔! -rw-r--r-- minix_stage1_5 <==minix 文件系統(tǒng)定義檔 -rw-r--r-- reiserfs_stage1_5 <==reiserfs 文件系統(tǒng)定義檔 -rw-r--r-- splash.xpm.gz <==啟動(dòng)時(shí)在 grub 底下的背景圖示 -rw-r--r-- stage1 <==stage 1 的相關(guān)說(shuō)明 -rw-r--r-- stage2 <==stage 2 的相關(guān)說(shuō)明 -rw-r--r-- ufs2_stage1_5 <==UFS 的文件系統(tǒng)定義檔 -rw-r--r-- vstafs_stage1_5 <==vstafs 文件系統(tǒng)定義檔 -rw-r--r-- xfs_stage1_5 <==xfs 文件系統(tǒng)定義檔 |
從上面的說(shuō)明你可以知道 /boot/grub/ 目錄下最重要的就是配置檔 (menu.lst) 以及各種文件系統(tǒng)的定義!我們的 loader 讀取了這種文件系統(tǒng)定義數(shù)據(jù)后,就能夠認(rèn)識(shí)文件系統(tǒng)并讀取在該文件系統(tǒng)內(nèi)的核心文件羅。至於 grub 的配置檔檔名,其實(shí)應(yīng)該是 menu.lst 的,只是在 Red Hat 里面被定義成為 /boot/grub.conf 而已。鳥(niǎo)哥建議您還是記憶 menu.lst 比較好喔!
所以從上面的文件來(lái)看, grub 認(rèn)識(shí)的文件系統(tǒng)真的非常多喔!正因?yàn)槿绱?#xff0c;所以 grub才會(huì)取代 Lilo 這個(gè)老牌的 boot loader 嘛!好了,接下來(lái)就來(lái)瞧瞧配置檔內(nèi)有啥配置值吧!
grub 的配置檔 /boot/grub/menu.lst 與菜單類型
grub 是目前使用最廣泛的 Linux 啟動(dòng)管理程序,舊的 Lilo 這個(gè)啟動(dòng)管理程序現(xiàn)在已經(jīng)很少見(jiàn)了,所以本章才會(huì)將 Lilo 的介紹舍棄的說(shuō)。grub 的優(yōu)點(diǎn)挺多的,包括有:
- 認(rèn)識(shí)與支持較多的文件系統(tǒng),并且可以使用 grub 的主程序直接在文件系統(tǒng)中搜尋核心檔名;
- 啟動(dòng)的時(shí)候,可以『自行編輯與修改啟動(dòng)配置項(xiàng)目』,類似 bash 的命令模式;
- 可以動(dòng)態(tài)搜尋配置檔,而不需要在修改配置檔后重新安裝 grub 。亦即是我們只要修改完/boot/grub/menu.lst 里頭的配置后,下次啟動(dòng)就生效了!
上面第三點(diǎn)其實(shí)就是 Stage 1, Stage 2 分別安裝在 MBR (主程序) 與文件系統(tǒng)當(dāng)中 (配置檔與定義檔) 的原因啦!好了,接下來(lái),讓我們好好了解一下 grub 的配置檔: /boot/grub/menu.lst 這玩意兒吧!要注意喔,那個(gè) lst 是 LST 的小寫(xiě),不要搞錯(cuò)羅!
- 硬盤(pán)與分割槽在 grub 中的代號(hào)
安裝在 MBR 的 grub 主程序,最重要的任務(wù)之一就是從磁碟當(dāng)中加載核心文件,以讓核心能夠順利的驅(qū)動(dòng)整個(gè)系統(tǒng)的硬件。所以羅, grub 必須要認(rèn)識(shí)硬盤(pán)才行啊!那么 grub 到底是如何認(rèn)識(shí)硬盤(pán)的呢?嘿嘿! grub 對(duì)硬盤(pán)的代號(hào)配置與傳統(tǒng)的 Linux 磁碟代號(hào)可完全是不同的!grub 對(duì)硬盤(pán)的識(shí)別使用的是如下的代號(hào):
(hd0,0)夠神了吧?跟 /dev/hda1 風(fēng)馬牛不相干~怎么辦啊?其實(shí)只要注意幾個(gè)東西即可,那就是:
- 硬盤(pán)代號(hào)以小括號(hào) ( ) 包起來(lái);
- 硬盤(pán)以 hd 表示,后面會(huì)接一組數(shù)字;
- 以『搜尋順序』做為硬盤(pán)的編號(hào),而不是依照硬盤(pán)排線的排序!(這個(gè)重要!)
- 第一個(gè)搜尋到的硬盤(pán)為 0 號(hào),第二個(gè)為 1 號(hào),以此類推;
- 每顆硬盤(pán)的第一個(gè) partition 代號(hào)為 0 ,依序類推。
所以說(shuō),第一顆『搜尋到的硬盤(pán)』代號(hào)為:『(hd0)』,而該顆硬盤(pán)的第一號(hào)分割槽為『(hd0,0)』,這樣說(shuō)了解了吧?反正你要記得,在 grub 里面,他開(kāi)始的數(shù)字是 0 而不是 1 就是了!
| Tips: 在較舊的主板上面,通常第一顆硬盤(pán)會(huì)插在 IDE 1 的 master 上,就會(huì)是 /dev/hda,所以常常我們可能會(huì)誤會(huì) /dev/hda 就是 (hd0),其實(shí)不是喔!要看你的 BIOS 配置值才行!有的主板 BIOS 可以調(diào)整啟動(dòng)的硬盤(pán)搜尋順序,那么就要注意了,因?yàn)?grub 的硬盤(pán)代號(hào)可能會(huì)跟著改變吶!留意留意! |
所以說(shuō),整個(gè)硬盤(pán)代號(hào)為:
| 硬盤(pán)搜尋順序 | 在 Grub 當(dāng)中的代號(hào) |
| 第一顆 | (hd0) (hd0,0) (hd0,1) (hd0,4).... |
| 第二顆 | (hd1) (hd1,0) (hd1,1) (hd1,4).... |
| 第三顆 | (hd2) (hd2,0) (hd2,1) (hd2,4).... |
這樣應(yīng)該比較好看出來(lái)了吧?第一顆硬盤(pán)的 MBR 安裝處的硬盤(pán)代號(hào)就是『(hd0)』,而第一顆硬盤(pán)的第一個(gè)分割槽的 boot sector 代號(hào)就是『(hd0,0)』第一顆硬盤(pán)的第一個(gè)邏輯分割槽的 boot sector 代號(hào)為『(hd0,4)』了了吧!
| 例題: 假設(shè)你的系統(tǒng)僅有一顆 SATA 硬盤(pán),請(qǐng)說(shuō)明該硬盤(pán)的第一個(gè)邏輯分割槽在 Linux 與 grub 當(dāng)中的檔名與代號(hào): 答: 因?yàn)槭?SATA 磁碟,加上使用邏輯分割槽,因此 Linux 當(dāng)中的檔名為 /dev/sda5 才對(duì) (1~4 保留給 primary 與 extended 使用)。至於 grub 當(dāng)中的磁碟代號(hào)則由於僅有一顆磁碟,因此代號(hào)會(huì)是『 (hd0,4) 』才對(duì)。 |
- /boot/grub/menu.lst 配置檔:
了解了 grub 當(dāng)中最麻煩的硬盤(pán)代號(hào)后,接下來(lái),我們就可以瞧一瞧配置檔的內(nèi)容了。先看一下鳥(niǎo)哥的 CentOS內(nèi)的 /boot/grub/menu.lst 好了:
| [root@www ~]# vim /boot/grub/menu.lst default=0 <==默認(rèn)啟動(dòng)選項(xiàng),使用第 1 個(gè)啟動(dòng)菜單 (title) timeout=5 <==若 5 秒內(nèi)未動(dòng)鍵盤(pán),使用默認(rèn)菜單啟動(dòng) splashimage=(hd0,0)/grub/splash.xpm.gz <==背景圖示所在的文件 hiddenmenu <==讀秒期間是否顯示出完整的菜單畫(huà)面(默認(rèn)隱藏) title CentOS (2.6.18-92.el5) <==第一個(gè)菜單的內(nèi)容root (hd0,0)kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quietinitrd /initrd-2.6.18-92.el5.img |
在 title 以前的四行,都是屬於 grub 的整體配置,包括默認(rèn)的等待時(shí)間與默認(rèn)的啟動(dòng)項(xiàng)目,還有顯示的畫(huà)面特性等等。至於 title 后面才是指定啟動(dòng)的核心文件或者是 boot loader 控制權(quán)。在整體配置方面的項(xiàng)目主要常見(jiàn)的有:
- default=0
這個(gè)必須要與 title 作為對(duì)照,在配置檔里面有幾個(gè) title ,啟動(dòng)的時(shí)候就會(huì)有幾個(gè)菜單可以選擇。由於 grub 啟始號(hào)碼為 0 號(hào),因此 default=0 代表使用『第一個(gè) title 項(xiàng)目』來(lái)啟動(dòng)的意思。default 的意思是,如果在讀秒時(shí)間結(jié)束前都沒(méi)有動(dòng)到鍵盤(pán), grub 默認(rèn)使用此 title 項(xiàng)目 (在此為 0 號(hào)) 來(lái)啟動(dòng)。
- timeout=5
啟動(dòng)時(shí)會(huì)進(jìn)行讀秒,如果在 5 秒鐘內(nèi)沒(méi)有按下任何按鍵,就會(huì)使用上面提到的 default 后面接的那個(gè) title 項(xiàng)目來(lái)啟動(dòng)的意思。如果你覺(jué)得 5 秒太短,那可以將這個(gè)數(shù)值調(diào)大 (例如 30 秒) 即可。此外,如果 timeout=0 代表直接使用 default 值進(jìn)行啟動(dòng)而不讀秒,timeout=-1 則代表直接進(jìn)入菜單不讀秒了!
- splashimage=(hd0,0)/grub/splash.xpm.gz
有沒(méi)有發(fā)現(xiàn)你的 CentOS 在啟動(dòng)的時(shí)候背景不是黑白而是有色彩變化的呢?那就是這個(gè)文件提供的背景圖示啦(注3)!不過(guò)這個(gè)文件的實(shí)際路徑寫(xiě)法怎么會(huì)是這樣啊?很簡(jiǎn)單啊~上述的意思是:在 (hd0,0) 這個(gè)分割槽內(nèi)的最頂層目錄中,底下的 grub/splash.xpm.gz 那個(gè)文件的意思。由於鳥(niǎo)哥將 /boot 這個(gè)目錄獨(dú)立成為 /dev/hda1 ,因此這邊就會(huì)寫(xiě)成『在 /dev/hda1 里面的 grub/splash.xpm.gz 』的意思啦!想一想,如果你的 /boot 目錄并沒(méi)有獨(dú)立成為一個(gè)分割槽,這里會(huì)寫(xiě)成如何?
- hiddenmenu
這個(gè)說(shuō)的是,啟動(dòng)時(shí)是否要顯示菜單?目前 CentOS 默認(rèn)是不要顯示菜單,如果您想要顯示菜單,那就將這個(gè)配置值注解掉!
整體配置的地方大概是這樣,而底下那個(gè) title 則是顯示啟動(dòng)的配置項(xiàng)目。如同前一小節(jié)提到的,啟動(dòng)時(shí)可以選擇(1)直接指定核心文件啟動(dòng)或 (2)將 boot loader 控制權(quán)轉(zhuǎn)移到下個(gè) loader (此過(guò)程稱為 chain-loader)。每個(gè) title 后面接的是『該啟動(dòng)項(xiàng)目名稱的顯示』,亦即是在菜單出現(xiàn)時(shí),菜單上面的名稱而已。那么這兩種方式的配置有啥不同呢?
既然要指定核心啟動(dòng),所以當(dāng)然要找到核心文件啦!此外,有可能還需要用到 initrd 的 RAM Disk 配置檔。但是如前說(shuō)的,尚未啟動(dòng)完成,所以我們必須要以 grub 的硬盤(pán)識(shí)別方式找出完整的 kernel 與 initrd 檔名才行。因此,我們可能需要有底下的方式來(lái)配置才行!
| 1. 先指定核心文件放置的 partition,再讀取文件 (目錄樹(shù)),最后才加入文件的實(shí)際檔名與路徑 (kernel 與 initrd);鳥(niǎo)哥的 /boot 為 /dev/hda1 ,因此核心文件的配置則成為: root (hd0,0) <==代表核心文件放在那個(gè) partition 當(dāng)中 kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet initrd /initrd-2.6.18-92.el5.img |
root :代表的是『核心文件放置的那個(gè) partition 而不是根目錄』喔!不要搞錯(cuò)了!以鳥(niǎo)哥的案例來(lái)說(shuō),我的根目錄為 /dev/hda2 而 /boot 獨(dú)立為 /dev/hda1 ,因?yàn)榕c /boot 有關(guān),所以磁碟代號(hào)就會(huì)成為 (hd0,0) 羅。
kernel :至於 kernel 后面接的則是核心的檔名,而在檔名后面接的則是核心的參數(shù)。由於啟動(dòng)過(guò)程中需要掛載根目錄,因此 kernel 后面接的那個(gè) root=LABEL=/1 指的是『Linux 的根目錄在哪個(gè) partition 』的意思。還記得第八章談過(guò)的 LABEL 掛載功能吧?是的,這里使用 LABEL 來(lái)掛載根目錄。至於 rhgb 為色彩顯示而 quiet 則是安靜模式 (螢?zāi)徊粫?huì)輸出核心偵測(cè)的資訊)。
initrd :就是前面提到的 initrd 制作出 RAM Disk 的文件檔名啦!
| 2. 直接指定 partition 與檔名,不需要額外指定核心文件所在裝置代號(hào) kernel (hd0,0)/vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet initrd (hd0,0)/initrd-2.6.18-92.el5.img |
| 例題: 我的系統(tǒng)分割是: /dev/hda1 (/), /dev/hda2 (swap) 而已,且我的核心文件為 /boot/vmlinuz,請(qǐng)問(wèn) grub 的 menu.lst 內(nèi)該如何撰寫(xiě)核心文件位置? 答: 我們使用疊代的方式來(lái)了解一下好了。由於核心檔名為 /boot/vmlinuz,轉(zhuǎn)成裝置檔名與代號(hào)會(huì)成為如下的過(guò)程: 原始文件: /boot/vmlinuz ↓ Linux 裝置:(/dev/hda1)/boot/vmlinuz ↓ grub 裝置:(hd0,0)/boot/vmlinuz 所以最終的 kernel 寫(xiě)法會(huì)變成: kernel (hd0,0)/boot/vmlinuz root=/dev/hda1 ... |
| 例題: 同上,只是我的分割情況變成: /dev/sda1 (/boot), /dev/sda5 (/) 時(shí)? 答: 由於 /boot 被獨(dú)立出來(lái)了,所以情況會(huì)不一樣喔!如下所示: 原始文件: /boot/vmlinuz ↓ Linux 裝置:(/dev/sda1)/vmlinuz ↓ grub 裝置:(hd0,0)/vmlinuz 所以最終的 kernel 寫(xiě)法會(huì)變成: kernel (hd0,0)/vmlinuz root=/dev/sda5 ... |
所謂的 chain loader (啟動(dòng)管理程序的鏈結(jié)) 僅是在將控制權(quán)交給下一個(gè) boot loader 而已,所以 grub 并不需要認(rèn)識(shí)與找出 kernel 的檔名 ,『 他只是將 boot的控制權(quán)交給下一個(gè) boot sector 或 MBR 內(nèi)的 boot loader 而已 』所以通常他也不需要去查驗(yàn)下一個(gè) boot loader 的文件系統(tǒng)!
一般來(lái)說(shuō), chain loader 的配置只要兩個(gè)就夠了,一個(gè)是預(yù)計(jì)要前往的 boot sector 所在的分割槽代號(hào),另一個(gè)則是配置 chainloader 在那個(gè)分割槽的 boot sector (第一個(gè)磁區(qū)) 上!假設(shè)我的 Windows 分割槽在 /dev/hda1 ,且我又只有一顆硬盤(pán),那么要 grub 將控制權(quán)交給 windows 的 loader 只要這樣就夠了:
| [root@www ~]# vi /boot/grub/menu.lst ....前略.... title Windows partitionroot (hd0,0) <==配置使用此分割槽chainloader +1 <== +1 可以想成第一個(gè)磁區(qū),亦即是 boot sector |
| [root@www ~]# vi /boot/grub/menu.lst ....前略.... title Windows partitionrootnoverify (hd0,0) <==不檢驗(yàn)此分割槽chainloader +1makeactive <==配置此分割槽為啟動(dòng)碟(active) |
| [root@www ~]# vi /boot/grub/menu.lst ....前略.... title Windows partitionhide (hd0,4) <==隱藏 (hd0,4) 這個(gè)分割槽rootnoverify (hd0,0)chainloader +1makeactive |
initrd 的重要性與創(chuàng)建新 initrd 文件
我們?cè)诒菊律栽缰啊? boot loader 與 kernel 加載』的地方已經(jīng)提到過(guò) initrd 這玩意兒,他的目的在於提供啟動(dòng)過(guò)程中所需要的最重要核心模塊,以讓系統(tǒng)啟動(dòng)過(guò)程可以順利完成。會(huì)需要 initrd 的原因,是因?yàn)楹诵哪K放置於 /lib/modules/$(uname -r)/kernel/ 當(dāng)中,這些模塊必須要根目錄 (/) 被掛載時(shí)才能夠被讀取。但是如果核心本身不具備磁碟的驅(qū)動(dòng)程序時(shí),當(dāng)然無(wú)法掛載根目錄,也就沒(méi)有辦法取得驅(qū)動(dòng)程序,因此造成兩難的地步。
initrd 可以將 /lib/modules/.... 內(nèi)的『?jiǎn)?dòng)過(guò)程當(dāng)中一定需要的模塊』包成一個(gè)文件 (檔名就是 initrd),然后在啟動(dòng)時(shí)透過(guò)主機(jī)的 INT 13 硬件功能將該文件讀出來(lái)解壓縮,并且 initrd 在內(nèi)存內(nèi)會(huì)模擬成為根目錄,由於此虛擬文件系統(tǒng) (Initial RAM Disk) 主要包含磁碟與文件系統(tǒng)的模塊,因此我們的核心最后就能夠認(rèn)識(shí)實(shí)際的磁碟,那就能夠進(jìn)行實(shí)際根目錄的掛載啦!所以說(shuō):『initrd內(nèi)所包含的模塊大多是與啟動(dòng)過(guò)程有關(guān),而主要以文件系統(tǒng)及硬盤(pán)模塊 (如 usb, SCSI 等) 為主』的啦!
一般來(lái)說(shuō),需要 initrd 的時(shí)刻為:
- 根目錄所在磁碟為 SATA、U盤(pán) 或 SCSI 等連接介面;
- 根目錄所在文件系統(tǒng)為 LVM, RAID 等特殊格式;
- 根目錄所在文件系統(tǒng)為非傳統(tǒng) Linux 認(rèn)識(shí)的文件系統(tǒng)時(shí);
- 其他必須要在核心加載時(shí)提供的模塊。
| Tips: 之前鳥(niǎo)哥忽略 initrd 這個(gè)文件的重要性,是因?yàn)轼B(niǎo)哥很窮... ^_^。因?yàn)轼B(niǎo)哥的 Linux 主機(jī)都是較早期的硬件,使用的是 IDE 介面的硬盤(pán),而且并沒(méi)有使用 LVM 等特殊格式的文件系統(tǒng),而 Linux 核心本身就認(rèn)識(shí) IDE 介面的磁碟,因此不需要 initrd 也可以順利啟動(dòng)完成的。自從 SATA 硬盤(pán)流行起來(lái)后,沒(méi)有 initrd 就沒(méi)辦法啟動(dòng)了!因?yàn)?SATA 硬盤(pán)使用的是 SCSI 模塊來(lái)驅(qū)動(dòng)的,而 Linux 默認(rèn)將 SCSI 功能編譯成為模塊.... |
一般來(lái)說(shuō),各 distribution 提供的核心都會(huì)附上 initrd 文件,但如果你有特殊需要所以想重制 initrd 文件的話,可以使用 mkinitrd 來(lái)處理的。這個(gè)文件的處理方式很簡(jiǎn)單, man mkinitrd 就知道了! ^_^。我們還是簡(jiǎn)單的介紹一下去!
| [root@www ~]# mkinitrd [-v] [--with=模塊名稱] initrd檔名 核心版本 選項(xiàng)與參數(shù): -v :顯示 mkinitrd 的運(yùn)行過(guò)程 --with=模塊名稱:模塊名稱指的是模塊的名字而已,不需要填寫(xiě)檔名。舉例來(lái)說(shuō),目前核心版本的 ext3 文件系統(tǒng)模塊為底下的檔名:/lib/modules/$(uname -r)/kernel/fs/ext3/ext3.ko那你應(yīng)該要寫(xiě)成: --with=ext3 就好了 (省略 .ko) initrd檔名:你所要?jiǎng)?chuàng)建的 initrd 檔名,盡量取有意義又好記的名字。 核心版本 :某一個(gè)核心的版本,如果是目前的核心則是『 $(uname -r) 』范例一:以 mkinitrd 的默認(rèn)功能創(chuàng)建一個(gè) initrd 虛擬磁碟文件 [root@www ~]# mkinitrd -v initrd_$(uname -r) $(uname -r) Creating initramfs Looking for deps of module ehci-hcd Looking for deps of module ohci-hcd ....(中間省略).... Adding module ehci-hcd <==最終加入 initrd 的就是底下的模塊 Adding module ohci-hcd Adding module uhci-hcd Adding module jbd Adding module ext3 Adding module scsi_mod Adding module sd_mod Adding module libata Adding module pata_sis[root@www ~]# ll initrd_* -rw------- 1 root root 2406443 Apr 30 02:55 initrd_2.6.18-92.el5 # 由於目前的核心版本可使用 uname -r 取得,因此鳥(niǎo)哥使用較簡(jiǎn)單的命令來(lái)處理羅~ # 此時(shí) initrd 會(huì)被創(chuàng)建起來(lái),你可以將他移動(dòng)到 /boot 等待使用。范例二:添加 8139too 這個(gè)模塊的 initrd 文件 [root@www ~]# mkinitrd -v --with=8139too initrd_vbirdtest $(uname -r) ....(前面省略).... Adding module mii Adding module 8139too <==看到?jīng)]!這樣就加入了! |
initrd 創(chuàng)建完成之后,同時(shí)核心也處理完畢后,我們就可以使用 grub 來(lái)創(chuàng)建菜單了!底下繼續(xù)瞧一瞧吧!
測(cè)試與安裝 grub
如果你的 Linux 主機(jī)本來(lái)就是使用 grub 作為 loader 的話,那么你就不需要重新安裝 grub 了,因?yàn)?grub 本來(lái)就會(huì)主動(dòng)去讀取配置檔啊!您說(shuō)是吧!但如果你的 Linux 原來(lái)使用的并非 grub ,那么就需要來(lái)安裝啦!如何安裝呢?首先,你必須要使用 grub-install 將一些必要的文件復(fù)制到/boot/grub 里面去,你應(yīng)該這樣做的:
| Tips: 安裝些什么呢?因?yàn)?boot loader 有兩個(gè) stage ,而配置檔得要放置到適當(dāng)?shù)牡胤健_@個(gè) grub-install 就是在安裝配置檔 (包括文件系統(tǒng)定義檔與 menu.lst 等等) 而已!如果要將 grub 的 stage1 主程序安裝起來(lái),就得要使用 grub shell 的功能喔!本章稍后會(huì)介紹。 |
| [root@www ~]# grub-install [--root-directory=DIR] INSTALL_DEVICE 選項(xiàng)與參數(shù): --root-directory=DIR 那個(gè) DIR 為實(shí)際的目錄,使用 grub-install 默認(rèn)會(huì)將grub 所有的文件都復(fù)制到 /boot/grub/* ,如果想要復(fù)制到其他目錄與裝置去,就得要用這個(gè)參數(shù)。 INSTALL_DEVICE 安裝的裝置代號(hào)啦!范例一:將 grub 安裝在目前系統(tǒng)的 MBR 底下,我的系統(tǒng)為 /dev/hda: [root@www ~]# grub-install /dev/hda # 因?yàn)樵?/dev/hda 就是使用 grub ,所以似乎不會(huì)出現(xiàn)什么特別的信息。 # 如果去查閱一下 /boot/grub 的內(nèi)容,會(huì)發(fā)現(xiàn)所有的文件都升級(jí)了,因?yàn)槲覀冎匮b了!范例二:我的 /home 為獨(dú)立的 /dev/hda3 ,如何安裝 grub 到 /dev/hda3 (boot sector) [root@www ~]# grub-install --root-directory=/home /dev/hda3 Probing devices to guess BIOS drives. This may take a long time. Installation finished. No error reported. This is the contents of the device map /home/boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'.(fd0) /dev/fd0 (hd0) /dev/hda <==會(huì)給予裝置代號(hào)的對(duì)應(yīng)表![root@www ~]# ll /home/boot/grub/ -rw-r--r-- 1 root root 30 Apr 30 11:12 device.map -rw-r--r-- 1 root root 7584 Apr 30 11:12 e2fs_stage1_5 ....(底下省略).... # 看!文件都安裝進(jìn)來(lái)了!但是注意到,我們并沒(méi)有配置檔喔!那要自己創(chuàng)建! |
所以說(shuō), grub-install 是安裝 grub 相關(guān)的文件 (例如文件系統(tǒng)定義檔) 到你的裝置上面去等待在啟動(dòng)時(shí)被讀取,但還需要配置好配置檔 (menu.lst) 后,再以 grub shell 來(lái)安裝 grub 主程序到 MBR 或者是 boot sector 上面去喔!好了,那我們來(lái)思考一下想要安裝的數(shù)據(jù)。
例題: 我預(yù)計(jì)啟動(dòng)時(shí)要直接顯示菜單,且菜單倒數(shù)為 30 秒。另外,在原本的 menu.lst 當(dāng)中新增三個(gè)啟動(dòng)菜單,分別如下說(shuō)明:
|
我們已經(jīng)將配置檔處理完畢,但是你要知道的是,我們并不知道 /dev/hda1 到底有沒(méi)有包含 grub 的主程序,因此我們想要將 grub 主程序再次的安裝到 /dev/hda1 的 boot sector ,也想要重新安裝 grub 到 MBR 上面去。此時(shí)我們就得要使用 grub shell 羅!整個(gè)安裝與 grub shell 的動(dòng)作其實(shí)很簡(jiǎn)單,如果您有興趣研究的話,可以使用 info grub 去查閱~鳥(niǎo)哥這里僅介紹幾個(gè)有用的命令而已。
- 用『 root (hdx,x) 』選擇含有 grub 目錄的那個(gè) partition 代號(hào);
- 用『 find /boot/grub/stage1 』看看能否找到安裝資訊文件;
- 用『 find /boot/vmlinuz 』看看能否找到 kernel file (不一定要成功!);
- 用『 setup (hdx,x) 』或『 setup (hdx) 』將 grub 安裝在 boot sector 或 MBR;
- 用『 quit 』來(lái)離開(kāi) grub shell !
由於我們最需要安裝的就是那個(gè) stage1 啦!那才是 grub 的主程序嘛!而且配置檔通常與主程序擺在同一個(gè)目錄下。因此我們需要使用 root (hd0,0) 去找到 /boot/grub/stage1 喔!接下來(lái),請(qǐng)用 grub 來(lái)進(jìn)入 grub shell 吧!進(jìn)入 grub 后,會(huì)出現(xiàn)一個(gè)『 grub> 』的提示字節(jié)啊!
| [root@www ~]# grub# 1. 先配置一下含有 grub 目錄的那個(gè) partition 啊! grub> root (hd0,0)Filesystem type is ext2fs, partition type 0x83 # 鳥(niǎo)哥主機(jī)的分割中,/boot/grub 在 /boot 的分割槽,亦即是 /dev/hda1 內(nèi)喔! # 另外, grub 也能夠分辨出該分割槽的文件系統(tǒng) (ext2)。# 2. 搜尋一下,是否存在 stage1 這個(gè)資訊文件? grub> find /boot/grub/stage1(hd0,2) # 見(jiàn)鬼!怎么會(huì)只有一個(gè)!我們明明有 /boot/grub 與 /home/boot/grub 啊! # 因?yàn)?/boot 是獨(dú)立的,因此要找到該檔名就得要用如下的方式:grub> find /grub/stage1(hd0,0) # 這樣就能夠找到羅!要特別注意 grub 找到不是目錄樹(shù),而是裝置內(nèi)的文件。# 3. 搜尋一下是否可以找到核心? /boot/vmlinuz-2.6.18-92.el5 ? grub> find /boot/vmlinuz-2.6.18-92.el5 Error 15: File not found grub> find /vmlinuz-2.6.18-92.el5(hd0,0) # 再次強(qiáng)調(diào),因?yàn)?/boot/ 是獨(dú)立的,因此就會(huì)變成上頭的模樣羅!# 4. 將主程序安裝上去吧!安裝到 MBR 看看! grub> setup (hd0)Checking if "/boot/grub/stage1" exists... no <==因?yàn)?/boot 是獨(dú)立的Checking if "/grub/stage1" exists... yes <==所以這個(gè)檔名才是對(duì)的!Checking if "/grub/stage2" exists... yesChecking if "/grub/e2fs_stage1_5" exists... yesRunning "embed /grub/e2fs_stage1_5 (hd0)"... 15 sectors are embedded. succeededRunning "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded <==將 stage1 程序安裝妥當(dāng)羅! Done. # 很好!確實(shí)有裝起來(lái)~這樣 grub 就在 MBR 當(dāng)中了!# 5. 那么重復(fù)安裝到我的 /dev/hda1 呢?亦即是 boot sector 當(dāng)中? grub> setup (hd0,0)Checking if "/boot/grub/stage1" exists... noChecking if "/grub/stage1" exists... yesChecking if "/grub/stage2" exists... yesChecking if "/grub/e2fs_stage1_5" exists... yesRunning "embed /grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)Running "embed /grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)Running "install /grub/stage1 (hd0,0) /grub/stage2 p /grub/grub.conf "... succeeded Done. # 雖然無(wú)法將 stage1_5 安裝到 boot sector 去,不過(guò),還不會(huì)有問(wèn)題, # 重點(diǎn)是最后面那個(gè) stage1 要安裝后,顯示 succeeded 字樣就可以了!grub> quit |
如此一來(lái),就已經(jīng)將 grub 安裝到 MBR 及 /dev/hda1 的 boot sector 里面去了!而且讀取的是 (hd0,0) 里面的 /grub/menu.lst 那個(gè)文件喔!真是很重要啊!重要到不行!
最后總結(jié)一下:
啟動(dòng)前的額外功能修改
事實(shí)上,上一個(gè)小節(jié)配置好之后,你的 grub 就已經(jīng)在你的 Linux 系統(tǒng)上面了,而且同時(shí)存在於MBR 與 boot sector 當(dāng)中呢!所以,我們已經(jīng)可以重新啟動(dòng)來(lái)查閱看看啦!另外,如果你正在進(jìn)行啟動(dòng),那么請(qǐng)注意,我們可以在默認(rèn)菜單 (鳥(niǎo)哥的范例當(dāng)中是 30 秒) 按下任意鍵,還可以進(jìn)行 grub 的『線上編修』功能喔!真是棒啊!先來(lái)看看啟動(dòng)畫(huà)面吧!
圖 3.5.1、grub 啟動(dòng)畫(huà)面示意圖
由於鳥(niǎo)哥將隱藏菜單的功能取消了,因此你會(huì)直接看到這四個(gè)菜單,同時(shí)會(huì)有讀秒的咚咚在倒數(shù)。菜單部分的畫(huà)面其實(shí)就是 title 后面的文字啦!你現(xiàn)在知道如何修改 title 后面的文字了吧! ^_^。如果你使用上下鍵去選擇第二 (/dev/hda1 boot sector) 或第三 (MBR loader) 時(shí),會(huì)發(fā)現(xiàn)同樣的畫(huà)面重復(fù)出現(xiàn)!這是因?yàn)槟莾蓚€(gè)是 loader 移交而已嘛!而我們都使用相同的 grub 與相同的 menu.lst 配置檔!因此這個(gè)畫(huà)面就會(huì)重復(fù)出現(xiàn)了!這樣了解乎?
另外,如果你再仔細(xì)看的話,會(huì)發(fā)現(xiàn)到上圖中底部還有一些細(xì)部的選項(xiàng),似乎有個(gè) 'e' edit 的樣子!沒(méi)錯(cuò)~ grub 支持線上編修命令喔!這是個(gè)很有用的功能!假如剛剛你將 menu.lst 的內(nèi)容寫(xiě)錯(cuò)了,導(dǎo)致出現(xiàn)無(wú)法啟動(dòng)的問(wèn)題時(shí),我們可以查閱該 title 菜單的內(nèi)容并加以修改喔!舉例來(lái)說(shuō),我想要知道第一個(gè)菜單的實(shí)際內(nèi)容時(shí),將反白光棒移動(dòng)到第一個(gè)菜單,再按下 'e' 會(huì)進(jìn)入如下畫(huà)面:
圖 3.5.2、grub 單一菜單內(nèi)容
哈哈!這不就是我們?cè)?menu.lst 里面配置的東西嗎?沒(méi)錯(cuò)!此時(shí)你還可以繼續(xù)進(jìn)一步修改喔!注意看到上圖最底下的說(shuō)明,你還可以使用:
- e:進(jìn)入 grub shell 的編輯畫(huà)面;
- o:在光標(biāo)所在行底下再新增一行;
- d:將光標(biāo)所在行刪除。
我們說(shuō)過(guò), grub 是可以直接使用核心文件來(lái)啟動(dòng)的,所以,如果您很清楚的知道你的根目錄 (/) 在那個(gè) partition ,而且知道你的核心文件檔名 (通常都會(huì)有個(gè) /boot/vmlinuz 連結(jié)到正確的檔名),那么直接在圖三的畫(huà)面當(dāng)中,以上述的 o, d, e 三個(gè)按鍵來(lái)編修,成為類似底下這樣:
圖 3.5.3、grub edit 的線上編修功能
按下 [Enter] 按鍵后,然后輸入 b 來(lái) boot ,就可以啟動(dòng)啦!所以說(shuō),萬(wàn)一你的 /boot/grub/menu.lst 配置錯(cuò)誤,或者是因?yàn)榘惭b的緣故,或者是因?yàn)楹诵奈募木壒?#xff0c;導(dǎo)致無(wú)法順利啟動(dòng)時(shí),記得啊,可以在 grub 的菜單部分,使用 grub shell 的方式去查詢 (find) 或者是直接指定核心文件,就能夠啟動(dòng)啦! ^_^
另外,很多時(shí)候我們的 grub 可能會(huì)發(fā)生錯(cuò)誤,導(dǎo)致『連 grub 都無(wú)法啟動(dòng)』,那么根本就無(wú)法使用grub 的線上編修功能嘛!怎么辦?沒(méi)關(guān)系啊!我們可以利用具有 grub 啟動(dòng)的 CD 來(lái)啟動(dòng),然后再以 CD 的 grub 的線上編修,嘿嘿!同樣可以使用硬盤(pán)上面的核心文件來(lái)啟動(dòng)啦!很好玩吧! ^_^
關(guān)於核心功能當(dāng)中的 vga 配置
事實(shí)上,你的 tty1~tty6 除了 80x24 的解析度外,還能夠有其他解析度的支持喔!但前提之下是你的核心必須支持FRAMEBUFFER_CONSOLE 這個(gè)核心功能選項(xiàng)才行。如何確定有沒(méi)有支持呢?你可以查閱 /boot/config-2.6.18-92.el5 這個(gè)文件,然后這樣搜尋:
| [root@www ~]# grep 'FRAMEBUFFER_CONSOLE' /boot/config-2.6.18-92.el5 CONFIG_FRAMEBUFFER_CONSOLE=y # 這個(gè)項(xiàng)目如果出現(xiàn) y 那就是有支持啦!如果被注解或是 n ,那就是沒(méi)支持啦! |
那么如何調(diào)整 tty1 ~ tty6 終端機(jī)的解析度呢?先參考底下的表格再說(shuō) (此為十進(jìn)位數(shù)值):
| 彩度\解析度 | 640x480 | 800x600 | 1024x768 | 1280x1024 | bit |
| 256 | 769 | 771 | 773 | 775 | 8 bit |
| 32768 | 784 | 787 | 790 | 793 | 15 bit |
| 65536 | 785 | 788 | 791 | 794 | 16 bit |
| 16.8M | 786 | 789 | 792 | 795 | 32 bit |
假設(shè)你想要將你的終端機(jī)螢?zāi)唤馕龆日{(diào)整到 1024x768 ,且色彩深度為 15bit 色的時(shí)候,就得要指定 vga=790 那個(gè)數(shù)字!舉例來(lái)說(shuō),鳥(niǎo)哥的 tty1 就想要這樣的解析度時(shí),你可以這樣做:
| [root@www ~]# vim /boot/grub/menu.lst ....(前面省略).... title CentOS (2.6.18-92.el5)root (hd0,0)kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet vga=790initrd /initrd-2.6.18-92.el5.img ....(后面省略).... |
重新啟動(dòng)并選擇此菜單進(jìn)入 Linux,你跑到 tty1 去看看,嘿嘿!就已經(jīng)是 1024x768 的解析度羅!只是字會(huì)變的很小,但是畫(huà)面的范圍會(huì)加大就是了。不過(guò),某些版本支持的是 16 進(jìn)位制,所以還需要修改一下格式呢!一般使用上表當(dāng)中的值應(yīng)該就可以了。不過(guò),由於不同的操作系統(tǒng)與硬件可能會(huì)有不一樣的情況,因此,上面的值不見(jiàn)得一定可以在您的機(jī)器上面測(cè)試成功,建議您可以分別配置看看哩~以找出可以使用的值! ^_^
BIOS 無(wú)法讀取大硬盤(pán)的問(wèn)題
現(xiàn)今的硬盤(pán)容量越來(lái)越大,如果你使用舊的主板來(lái)安插大容量硬盤(pán)時(shí),可能由於系統(tǒng) BIOS 或者是其他問(wèn)題,導(dǎo)致 BIOS 無(wú)法判斷該硬盤(pán)的容量,此時(shí)你的系統(tǒng)讀取可能會(huì)有問(wèn)題。為什么呢?
我們?cè)诒菊乱婚_(kāi)始的啟動(dòng)流程講過(guò),當(dāng)進(jìn)入 Linux 核心功能后,他會(huì)主動(dòng)的再去偵測(cè)一下整個(gè)系統(tǒng),因此 BIOS 捉不到的硬件在 Linux 核心反而可能會(huì)可以捉到而正常使用。舉例來(lái)說(shuō),過(guò)去很多朋友常常會(huì)發(fā)現(xiàn),『我的系統(tǒng)使用 DVD 啟動(dòng)安裝時(shí),可以順利的安裝好 Linux ,但是第一次啟動(dòng)時(shí),螢?zāi)恢怀霈F(xiàn)黑壓壓的一片,且出現(xiàn) grub> 的字樣,而無(wú)法進(jìn)入 Linux 系統(tǒng)中』,這又是怎么一回事?
- 在安裝的過(guò)程中,由於是使用 DVD 或 CD 啟動(dòng),因此加載 Linux 核心不成問(wèn)題,而核心會(huì)去偵測(cè)系統(tǒng)硬件,因此可以捉到BIOS 捉不到的硬盤(pán),此時(shí)你確實(shí)可以安裝 Linux 在大容量的硬盤(pán)上,且不會(huì)出現(xiàn)任何問(wèn)題。
- 但是在進(jìn)入硬盤(pán)啟動(dòng)時(shí),由於 kernel 與 initrd 文件都是透過(guò) BIOS 的 INT 13 通道讀取的,因此你的 kernel 與 initrd 如果放置在 BIOS 無(wú)法判斷的磁區(qū)中,當(dāng)然就無(wú)法被系統(tǒng)加載,而僅會(huì)出現(xiàn) grub shell (grub>)等待你的處理而已。
更多 grub 錯(cuò)誤的代碼查詢可以到底下的連結(jié)查閱:
- http://orgs.man.ac.uk/documentation/grub/grub_toc.html#SEC_Contents
現(xiàn)在你知道問(wèn)題所在啦!那就是 BIOS 無(wú)法讀取大容量磁碟內(nèi)的 kernel 與 initrd 文件。那如何解決呢?很簡(jiǎn)單啦!就讓 kernel 與 initrd 文件放置在大硬盤(pán)的最前頭,由於 BIOS 至少可以讀到大磁碟的1024 磁柱內(nèi)的數(shù)據(jù),因此就能夠讀取核心與虛擬文件系統(tǒng)的文件羅。那如何讓 kernel 與 initrd 放置到整顆硬盤(pán)的最前面呢?簡(jiǎn)單的要命吧!就創(chuàng)建 /boot 獨(dú)立分割槽,并將 /boot 放置到最前面即可!更多其他的解決方案可參考文后的延伸閱讀(注4)
萬(wàn)一你已經(jīng)安裝了 Linux 且發(fā)生了上述的問(wèn)題,那該怎辦?你可以這樣作的:
- 最簡(jiǎn)單的做法,就是直接重灌,并且制作出 /boot 掛載的 partition ,同時(shí)確認(rèn)該 partition 是在 1024 cylinder 之前才行。
- 如果實(shí)在不想重灌,沒(méi)有關(guān)系,利用我們剛剛上頭提到的 grub 功能,額外創(chuàng)建一個(gè)可啟動(dòng)軟盤(pán),或者是直接以光驅(qū)啟動(dòng),然后以 grub 的編寫(xiě)能力進(jìn)入 Linux 。
- 另外的辦法其實(shí)是騙過(guò) BIOS ,直接將硬盤(pán)的 cylinder, head, sector 等等資訊直接寫(xiě)到BIOS 當(dāng)中去,如此一來(lái)你的 BIOS 可能就可以讀得到與支持的到你的大硬盤(pán)了。
不過(guò),鳥(niǎo)哥還是建議您可以重新安裝,并且制作出 /boot 這個(gè) partition 啦! ^_^!這也是為啥這次更版中,鳥(niǎo)哥特別強(qiáng)調(diào)要分割出 /boot 這個(gè)分割槽的原因啊!
為個(gè)別菜單加上口令
想像一個(gè)環(huán)境,如果你管理的是一間計(jì)算機(jī)教室,這間計(jì)算機(jī)教室因?yàn)榭蓪?duì)外開(kāi)放,但是你又擔(dān)心某些 partition 被學(xué)生不小心的弄亂,因此你可能會(huì)想要將某些啟動(dòng)菜單作個(gè)保護(hù)。這個(gè)時(shí)候,為每個(gè)菜單作個(gè)加密的口令就是個(gè)可行的方案啦!那如何在啟動(dòng)的過(guò)程里面提供口令保護(hù)呢?首先,你必須要?jiǎng)?chuàng)建口令,而且還需要是加密過(guò)后的喔!否則人家跑到 /boot/grub/menu.lst 不就可以探查到你的啟動(dòng)口令了?那如何創(chuàng)建加密的口令呢?我們可以透過(guò) grub 提供的 md5 編碼來(lái)處理的,如下所示:
| [root@www ~]# grub-md5-crypt Password: <==輸入口令 Retype password: <==再輸入一次 $1$kvlI0/$byrbNgkt/.REKPQdfg287. <==這就是產(chǎn)生的 md5 口令! |
上面產(chǎn)生的最后一行,由 $ 開(kāi)始到 . 結(jié)束的那行,就是你的口令經(jīng)過(guò) md5 編碼過(guò)后的咚咚!將這個(gè)口令復(fù)制下來(lái)吧!假設(shè)我們要將第一個(gè)選項(xiàng)加入這個(gè)口令,而第四個(gè)選項(xiàng)加入另外的口令,那你應(yīng)該要這樣做:
| [root@www ~]# vim /boot/grub/menu.lst ....(前面省略).... title CentOS (2.6.18-92.el5)password --md5 $1$kvlI0/$byrbNgkt/.REKPQdfg287.root (hd0,0)kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet vga=790initrd /initrd-2.6.18-92.el5.img ....(中間省略).... title single user modepassword --md5 $1$GFnI0/$UuiZc/7snugLtVN4J/WyM/root (hd0,0)kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet singleinitrd /initrd-2.6.18-92.el5.img |
上表的案例中,我們兩個(gè)菜單進(jìn)入的口令并不相同,可以進(jìn)行同學(xué)的分類啦!不過(guò)這樣也造成一個(gè)問(wèn)題,那就是一定要輸入口令才能夠進(jìn)入啟動(dòng)流程,如果你在遠(yuǎn)程使用 reboot 重新啟動(dòng),并且主機(jī)前面并沒(méi)有任何人的話....你的主機(jī)并不會(huì)主動(dòng)進(jìn)入啟動(dòng)程序喔! ^_^
你必須要注意的是:password 這個(gè)項(xiàng)目一定要在 title 底下的第一行。不過(guò),此項(xiàng)功能還是可能被破解的,因?yàn)槭褂谜呖梢酝高^(guò)編輯模式 (e) 進(jìn)入菜單,并刪除口令欄位并按下 b 就能夠進(jìn)行啟動(dòng)流程了!真糟糕!那怎辦?只好透過(guò)整體的 password (放在所有的 title 之前) ,然后在 title 底下的第一行配置 lock ,那使用者想要編輯時(shí),也得要輸入口令才行啊!配置有點(diǎn)像這樣:
| [root@www ~]# vim /boot/grub/menu.lst default=0 timeout=30 password --md5 $1$kvlI0/$byrbNgkt/.REKPQdfg287. <==放在整體配置處 splashimage=(hd0,0)/grub/splash.xpm.gz #hiddenmenu title CentOS (2.6.18-92.el5)lock <==多了鎖死的功能root (hd0,0)kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet vga=790initrd /initrd-2.6.18-92.el5.img |
那么重新啟動(dòng)后,畫(huà)面會(huì)像這樣:
圖 3.8.1、 grub 加密的示意圖
你可以看到最下方僅出現(xiàn) p 的功能,由於 2, 3, 4 菜單并沒(méi)有使用 lock ,因此這三個(gè)菜單使用者還是可以運(yùn)行啟動(dòng)程序,但是第一個(gè)菜單由於有 lock 項(xiàng)目,因此除非你輸入正確的口令,否則第一個(gè)菜單是無(wú)法被加載運(yùn)行的。另外,這個(gè)項(xiàng)目也能夠避免你的 menu.lst 在啟動(dòng)的過(guò)程中被亂改,是具有保密 menu.lst 的功能啦!與剛剛的菜單口令功能不同。
啟動(dòng)過(guò)程的問(wèn)題解決
很多時(shí)候,我們可能因?yàn)樽隽四承┡渲?#xff0c;或者是因?yàn)椴徽jP(guān)機(jī) (例如未經(jīng)通知的停電等等) 而導(dǎo)致系統(tǒng)的filesystem 錯(cuò)亂,此時(shí),Linux 可能無(wú)法順利啟動(dòng)成功,那怎么辦呢?難道要重灌?當(dāng)然不需要啦!進(jìn)入 run level 1 (單人維護(hù)模式) 去處理處理,應(yīng)該就 OK 的啦!底下我們就來(lái)談一談如何處理幾個(gè)常見(jiàn)的問(wèn)題!
忘記 root 口令的解決之道
大家都知道鳥(niǎo)哥的記憶力不佳,容易忘東忘西的,那如果連 root 的口令都忘記了,怎么辦?其實(shí)在 Linux 環(huán)境中 root 口令忘記時(shí)還是可以救回來(lái)的!只要能夠進(jìn)入并且掛載 / ,然后重新配置一下 root 的口令,就救回來(lái)啦!這是因?yàn)閱?dòng)流程中,若強(qiáng)制核心進(jìn)入 runlevel 1 時(shí),默認(rèn)是不需要口令即可取得一個(gè) root 的 shell 來(lái)救援的。整個(gè)動(dòng)作有點(diǎn)像這樣:
| grub edit> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quiet single |
init 配置檔錯(cuò)誤
前一個(gè) root 口令挽救的方法其實(shí)可以用在很多地方,唯一一個(gè)無(wú)法挽救的情況,那就是 /etc/inittab 這個(gè)文件配置錯(cuò)誤導(dǎo)致的無(wú)法啟動(dòng)!根據(jù)啟動(dòng)流程,我們知道 runlevel 0~6 都會(huì)讀取 /etc/inittab 配置檔,因此你使用 single mode (runlevel 1) 當(dāng)然也是要讀取 /etc/inittab 來(lái)進(jìn)行啟動(dòng)的。那既然無(wú)法進(jìn)入單人維護(hù)模式,就表示這題無(wú)解羅?非也非也,既然默認(rèn)的 init 無(wú)法運(yùn)行,那我們就告訴核心不要運(yùn)行 init ,改呼叫 bash 啊!可以略過(guò) init 嗎?可以的,同樣在啟動(dòng)進(jìn)入 grub 后,同樣在 grub edit 的情況下這樣做:
| grub edit> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quiet init=/bin/bash |
因?yàn)槲覀冎付撕诵暮艚械牡谝恢С绦?(init) 變成 /bin/bash,因此 /sbin/init 就不會(huì)被運(yùn)行。又根據(jù)啟動(dòng)流程的說(shuō)明,我們知道此時(shí)雖然可以利用 root 取得 bash 來(lái)工作,但此時(shí) (1)除了根目錄外,其他的目錄都沒(méi)有被掛載;(2)根目錄被掛載成為唯讀狀態(tài)。因此我們還需要進(jìn)行一些動(dòng)作才行!如下所示:
圖 4.2.1、 略過(guò) init 的程序,直接進(jìn)入 bash shell
鳥(niǎo)哥僅下達(dá)兩個(gè)命令,『 mount -o remount,rw / 』用途是將根目錄重新掛載成為可讀寫(xiě),至於『 mount -a 』則是參考 /etc/fstab 的內(nèi)容重新掛載文件系統(tǒng)!此時(shí)你又可以啟動(dòng)進(jìn)行救援的工作了!只是救援完畢后,你得要使用『 reboot 』重新啟動(dòng)一次才行!
BIOS 磁碟對(duì)應(yīng)的問(wèn)題 (device.map)
由於目前硬盤(pán)很便宜啊,所以很多朋友就想說(shuō):『那我能不能將 Windows 安裝在 /dev/hda 而 Linux 安裝在 /dev/hdb ,然后調(diào)整 BIOS 的啟動(dòng)裝置順序,如此則兩套系統(tǒng)各有各的 loader 安裝在個(gè)別硬盤(pán)的 MBR 當(dāng)中了!』。這個(gè)想法非常好,如此一來(lái)兩者就不會(huì)互相干擾,因?yàn)槊款w磁碟的 MBR 個(gè)別有不同操作系統(tǒng)的 loader 嘛!問(wèn)題是,grub 對(duì)磁碟的裝置代號(hào)使用的是偵測(cè)到的順序啊!也就是說(shuō),你調(diào)整了 BIOS 磁碟啟動(dòng)順序后,你的 menu.lst 內(nèi)的裝置代號(hào)就可能會(huì)對(duì)應(yīng)到錯(cuò)誤的磁碟上了!啊!真想哭!
沒(méi)關(guān)系的,我們可以透過(guò) /boot/grub/device.map 這個(gè)文件來(lái)寫(xiě)死每個(gè)裝置對(duì) grub 磁碟代號(hào)的對(duì)應(yīng)喔!舉例來(lái)說(shuō),鳥(niǎo)哥的這個(gè)文件內(nèi)容如下:
| [root@www ~]# cat /boot/grub/device.map (fd0) /dev/fd0 (hd0) /dev/hda |
如果你不清楚如何處理的話,也可以利用 grub-install 的功能喔!例如:
| [root@www ~]# grub-install --recheck /dev/hda1 |
這樣 device.map 就會(huì)主動(dòng)的被升級(jí)了!這樣了解乎?
因文件系統(tǒng)錯(cuò)誤而無(wú)法啟動(dòng)
如果因?yàn)榕渲缅e(cuò)誤導(dǎo)致無(wú)法啟動(dòng)時(shí),要怎么辦啊?這就更簡(jiǎn)單了!最容易出錯(cuò)的配置而導(dǎo)致無(wú)法順利啟動(dòng)的步驟,通常就是 /etc/fstab 這個(gè)文件了,尤其是使用者在實(shí)作 Quota 時(shí),最容易寫(xiě)錯(cuò)參數(shù),又沒(méi)有經(jīng)過(guò) mount -a 來(lái)測(cè)試掛載,就立刻直接重新啟動(dòng),真要命!無(wú)法啟動(dòng)成功怎么辦?這種情況的問(wèn)題大多如下面的畫(huà)面所示:
圖 4.4.1、 文件系統(tǒng)錯(cuò)誤的示意圖
看到最后兩行,他說(shuō)可以輸入 root 的口令繼續(xù)加以救援喔!那請(qǐng)輸入 root 的口令來(lái)取得 bash 并以mount -o remount,rw / 將根目錄掛載成可讀寫(xiě)后,繼續(xù)處理吧!其實(shí)會(huì)造成上述畫(huà)面可能的原因除了 /etc/fstab編輯錯(cuò)誤之外,如果你曾經(jīng)不正常關(guān)機(jī)后,也可能導(dǎo)致文件系統(tǒng)不一致 (Inconsistent) 的情況,也有可能會(huì)出現(xiàn)相同的問(wèn)題啊!如果是磁區(qū)錯(cuò)亂的情況,請(qǐng)看到上圖中的第二行處, fsck 告知其實(shí)是 /dev/md0 出錯(cuò),此時(shí)你就應(yīng)該要利用 fsck 去檢測(cè) /dev/md0 才是!等到系統(tǒng)發(fā)現(xiàn)錯(cuò)誤,并且出現(xiàn)『clear [Y/N]』時(shí),輸入『 y 』吧!
這個(gè) fsck 的過(guò)程可能會(huì)很長(zhǎng),而且如果你的 partition 上面的 filesystem 有過(guò)多的數(shù)據(jù)損毀時(shí),即使 fsck 完成后,可能因?yàn)閭较到y(tǒng)槽,導(dǎo)致某些關(guān)鍵系統(tǒng)文件數(shù)據(jù)的損毀,那么依舊是無(wú)法進(jìn)入 Linux 的。此時(shí),就好就是將系統(tǒng)當(dāng)中的重要數(shù)據(jù)復(fù)制出來(lái),然后重新安裝,并且檢驗(yàn)一下,是否實(shí)體硬盤(pán)有損傷的現(xiàn)象才好!不過(guò)一般來(lái)說(shuō),不太可能會(huì)這樣啦~通常都是 fsck 處理完畢后,就能夠順利再次進(jìn)入 Linux 了。
利用 chroot 切換到另一顆硬盤(pán)工作
仔細(xì)檢查一下,你的 Linux 里面應(yīng)該會(huì)有一個(gè)名為 chroot 的命令才對(duì)!這是啥?這是『 change root directory 』的意思啦!意思就是說(shuō),可以暫時(shí)將根目錄移動(dòng)到某個(gè)目錄下,然后去處理某個(gè)問(wèn)題,最后再離開(kāi)該 root 而回到原本的系統(tǒng)當(dāng)中。
舉例來(lái)說(shuō),補(bǔ)習(xí)班中心最容易有兩三個(gè) Linux 系統(tǒng)在同一個(gè)主機(jī)上面,假設(shè)我的第一個(gè) Linux無(wú)法進(jìn)入了,那么我可以使用第二個(gè) Linux 啟動(dòng),然后在第二個(gè) Linux 系統(tǒng)下將第一個(gè) Linux 掛載起來(lái),最后用 chroot 變換到第一個(gè) Linux ,就能夠進(jìn)入到第一個(gè) Linux 的環(huán)境當(dāng)中去處理工作了。
你同樣也可以將你的 Linux 硬盤(pán)拔到另一個(gè) Linux 主機(jī)上面去,然后用這個(gè) chroot 來(lái)切換,以處理你的硬盤(pán)問(wèn)題啊!那怎么做啊?粉簡(jiǎn)單啦!
掛載點(diǎn) 裝置檔名/ → /dev/hdb1/var → /dev/hdb2/home → /dev/hdb3/usr → /dev/hdb5 若如此的話,那么在我目前的這個(gè) Linux 底下,我可以創(chuàng)建一個(gè)目錄,然后可以這樣做:
掛載點(diǎn) 裝置檔名/chroot/ → /dev/hdb1/chroot/var/ → /dev/hdb2/chroot/home/ → /dev/hdb3/chroot/usr/ → /dev/hdb5
重點(diǎn)回顧
- Linux 不可隨意關(guān)機(jī),否則容易造成文件系統(tǒng)錯(cuò)亂或者是其他無(wú)法啟動(dòng)的問(wèn)題;
- 啟動(dòng)流程主要是:BIOS、MBR、Loader、kernel+initrd、/sbin/init 等流程
- Loader 具有提供菜單、加載核心文件、轉(zhuǎn)交控制權(quán)給其他 loader 等功能。
- boot loader 可以安裝在 MBR 或者是每個(gè)分割槽的 boot sector 區(qū)域中
- initrd 可以提供核心在啟動(dòng)過(guò)程中所需要的最重要的模塊,通常與磁碟及文件系統(tǒng)有關(guān)的模塊;
- init 的配置檔為 /etc/inittab ,此文件內(nèi)容可以配置默認(rèn) runlevel、系統(tǒng)初始化腳本、不同運(yùn)行等級(jí)的服務(wù)啟動(dòng)等;
- 額外的裝置與模塊對(duì)應(yīng),可寫(xiě)入 /etc/modprobe.conf 中;
- 核心模塊的管理可使用 lsmod, modinfo, rmmod, insmod, modprobe 等命令;
- modprobe 主要參考 /lib/modules/$(uanem -r)/modules.dep 的配置來(lái)加載與卸載核心模塊;
- grub 的配置檔與相關(guān)文件系統(tǒng)定義檔大多放置於 /boot/grub 目錄中,配置檔名為 menu.lst
- grub 對(duì)磁碟的代號(hào)配置與 Linux 不同,主要透過(guò)偵測(cè)的順序來(lái)給予配置。如 (hd0) 及 (hd0,0) 等。
- menu.lst 內(nèi)每個(gè)菜單與 titile 有關(guān),而直接指定核心啟動(dòng)時(shí),至少需要 kernel 及 initrd 兩個(gè)項(xiàng)目
- menu.lst 內(nèi)配置 loader 控制權(quán)移交時(shí),最重要者為 chainloader +1 這個(gè)項(xiàng)目。
- 若想要重建 initrd ,可使用 mkinitrd 處理
- 重新安裝 grub 到 MBR 或 boot sector 時(shí),可以利用 grub shell 來(lái)處理。
- 若想要進(jìn)入救援模式,可於啟動(dòng)菜單過(guò)程中,在 kernel 的項(xiàng)目后面加入『 single 』或『 init=/bin/bash 』等方式來(lái)進(jìn)入救援模式。
- 我們可以對(duì) grub 的個(gè)別菜單給予不同的口令。
本章習(xí)題
( 要看答案請(qǐng)將鼠標(biāo)移動(dòng)到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
- 情境模擬題一:利用救援光盤(pán)來(lái)處理系統(tǒng)的錯(cuò)誤導(dǎo)致無(wú)法啟動(dòng)的問(wèn)題。
- 目標(biāo):了解救援光盤(pán)的功能;
- 前提:了解 grub 的原理,并且知道如何使用 chroot 功能;
- 需求:打字可以再加快一點(diǎn)啊! ^_^
這個(gè)部分鳥(niǎo)哥就不捉圖了,請(qǐng)大家自行處理羅~假設(shè)你的系統(tǒng)出問(wèn)題而無(wú)法順利啟動(dòng),此時(shí)拿出原版光盤(pán),然后重新以光盤(pán)來(lái)啟動(dòng)你的系統(tǒng)。然后你應(yīng)該要這樣作的:
- 利用光盤(pán)啟動(dòng)時(shí),到了看到 boot: 的階段,按下 [F5] 之后會(huì)看到可以輸入的選項(xiàng),此時(shí)請(qǐng)輸入:
就能夠進(jìn)入救援模式的偵測(cè)了!boot: linux rescue
- 然后請(qǐng)選擇語(yǔ)系與鍵盤(pán)對(duì)應(yīng),這個(gè)與安裝過(guò)程是一模一樣啦!所以選擇『 English』與『 us 』即可!
- 接下來(lái)會(huì)問(wèn)你是否需要啟動(dòng)網(wǎng)絡(luò),因?yàn)槲覀兊南到y(tǒng)是出問(wèn)題要處理,所以不需要啟動(dòng)網(wǎng)絡(luò)啦!選擇『No』即可;
- 然后就進(jìn)入救援光盤(pán)模式的文件系統(tǒng)搜尋了!這個(gè)救援光盤(pán)會(huì)去找出目前你的主機(jī)里面與 CentOS 5.x 相關(guān)的操作系統(tǒng),并將該操作系統(tǒng)匯整成為一個(gè) chroot 的環(huán)境等待你的處置!但是他會(huì)有三個(gè)模式可以選擇,分別是『continue』繼續(xù)成為可讀寫(xiě)掛載;『Read-Only』將偵測(cè)到的操作系統(tǒng)變成唯讀掛載;『Skip』略過(guò)這次的救援動(dòng)作。在這里我們選擇『 Continue 』吧!
- 然后系統(tǒng)會(huì)將偵測(cè)到的資訊通知你!一般來(lái)說(shuō),可能會(huì)在螢?zāi)簧巷@示類似這樣的信息:『 chroot /mnt/sysimage』此時(shí)請(qǐng)按下 OK 吧!
- 按下 OK 后,系統(tǒng)會(huì)丟給你一個(gè) shell 使用,先用 df 看一下掛載情況是否正確?若不正確請(qǐng)手動(dòng)掛載其他未被掛載的 partition 。等到一切搞定后,利用 chroot /mnt/sysimage來(lái)轉(zhuǎn)成你原本的操作系統(tǒng)環(huán)境吧!等到你將一切出問(wèn)題的地方都搞定,請(qǐng) reboot 系統(tǒng),且取出光盤(pán),用硬盤(pán)啟動(dòng)吧!
簡(jiǎn)答題部分:
- 如何察看與修改 runlevel 呢? 察看很簡(jiǎn)單,只要輸入『 runlevel 』就可以得知。而如果要修改目前的 runlevel ,可以直接輸入 init [level] 例如要去到 runlevel 3 可以:『 init 3 』即可。如果想要每次啟動(dòng)都配置固定的 runlevel ,那么可以修改 /etc/inittab 這個(gè)文件!將里面這一行改成:『id:3:initdefault:』即可。
- 我有個(gè)朋友跟我說(shuō),他想要讓一個(gè)程序在 Linux 系統(tǒng)下一啟動(dòng)就啟動(dòng),但是在關(guān)機(jī)前會(huì)自動(dòng)的先結(jié)束該程序,我該怎么建議他? 由於 /etc/rc.d/rc[0-6].d 里面有的 Sxxname 與Kxxname 可以配置啟動(dòng)啟動(dòng)與關(guān)機(jī)結(jié)束的事項(xiàng)!所以我就可以輕易的寫(xiě)一個(gè) script放在 /etc/rc.d/init.d 里面,并連結(jié)到我的 run-level 里頭,就可以讓他自由自在的啟動(dòng)與結(jié)束了!
- 萬(wàn)一不幸,我的一些模塊沒(méi)有辦法讓 Linux 的核心捉到,但是偏偏這個(gè)核心明明就有支持該模塊,我要讓該模塊在啟動(dòng)的時(shí)候就被加載,那么應(yīng)該寫(xiě)入那個(gè)文件? 應(yīng)該寫(xiě)入 /etc/modprobe.conf (kernel 2.6.x) 或者是 /etc/modules.conf (kernel 2.4.x) 這個(gè)文件,他是模塊加載相關(guān)的地方呢!當(dāng)然,也可以寫(xiě)入 /etc/sysconfig/modules/* 里面。
- 如何在 grub 啟動(dòng)過(guò)程當(dāng)中,指定以『 run level 1 』來(lái)啟動(dòng)? 在啟動(dòng)進(jìn)入 boot loader 之后,利用 grub shell 的功能,亦即輸入『 e 』進(jìn)入編輯模式,然后在 kernel 后面添加:
kernel (hd0,0)/boot/vmlinuz ro root=/dev/hda1 .... single
那個(gè) single 也可以改成 1 ,就能夠進(jìn)入。同樣的,若使用 lilo 時(shí),按下 tab 按鍵后,輸入
label_name -s
就能夠進(jìn)入 run level 1 羅! - 由於一些無(wú)心之過(guò),導(dǎo)致系統(tǒng)啟動(dòng)時(shí),只要運(yùn)行 init 就會(huì)產(chǎn)生錯(cuò)誤而無(wú)法繼續(xù)啟動(dòng),我們知道可以在啟動(dòng)的時(shí)候,不要以 init 加載系統(tǒng),可以轉(zhuǎn)換第一支運(yùn)行程序,假設(shè)我第一支運(yùn)行程序想要改為 /bin/bash ,好讓我自行維護(hù)系統(tǒng)(不同於 run level 1 喔!),該如何進(jìn)行此一工作? 在啟動(dòng)的過(guò)程當(dāng)中,進(jìn)入 lilo 或 grub 的畫(huà)面后,在 kernel 的參數(shù)環(huán)境下,加入 init=/bin/bash來(lái)取代 /sbin/init ,則可略過(guò) init 與 /etc/inittab 的配置項(xiàng)目,不過(guò),您必須相當(dāng)熟悉 grub 與 lilo 的配置才行喔! ^_^
- 在 CentOS 當(dāng)中,我們?nèi)绾巫詣?dòng)可加載的模塊? 可以經(jīng)由配置 /etc/modprobe.conf 或者是將自行做好的配置檔寫(xiě)入到 /etc/sysconfig/modules/ 目錄中,并且將檔名取為 filename.modules ,注意喔,文件結(jié)果務(wù)必是 .modules 才行。相關(guān)資訊可以參考 /etc/rc.d/rc.sysinit 喔!
- 如果你不小心先安裝 Linux 再安裝 Windows 導(dǎo)致 boot loader 無(wú)法找到 Linux 的啟動(dòng)菜單,該如何挽救?
方法有很多,例如:
(1)藉助第三方軟件,安裝類似 spfdisk 的軟件在 MBR 里面,因?yàn)樗瑫r(shí)認(rèn)識(shí) Linux 與 Windows ,所以就可以用他來(lái)進(jìn)入 Linux 啦!
(2)或者使用類似 KNOPPIX 的 Live CD 以光盤(pán)啟動(dòng)進(jìn)入 Linux 之后,再以 chroot 軟件切換根目錄 (/),然后重新安裝 grub 等 boot loader ,同樣也可以重新讓兩個(gè)操作系統(tǒng)存在啦!
總之,只要你知道 MBR / Super block / boot loader 之間的相關(guān)性,怎么切換都可能啊! ^_^
參考數(shù)據(jù)與延伸閱讀
- 注1:BIOS 的 POST 功能解釋:http://en.wikipedia.org/wiki/Power-on_self-test
- 注2:BIOS 的 INT 13 硬件中斷解釋:http://en.wikipedia.org/wiki/INT_13
- 注3:關(guān)於 splash 的相關(guān)說(shuō)明:http://ruslug.rutgers.edu/~mcgrof/grub-images/
- 注4:一些 grub 出錯(cuò)時(shí)的解決之道:
http://wiki.linuxquestions.org/wiki/GRUB_boot_menu
http://forums.gentoo.org/viewtopic.php?t=122656&highlight=grub+error+collection - info grub
- GNU 官方網(wǎng)站關(guān)於 grub 的說(shuō)明文件:
http://www.gnu.org/software/grub/manual/html_node/ - 純文字螢?zāi)唤馕龆鹊男薷姆椒?#xff1a;
http://phorum.study-area.org/viewtopic.php?t=14776
2003/02/10:第一次完成
2005/09/19:將舊的文章移動(dòng)到 此處 。
2005/09/26:將 核心編譯 一文訂為進(jìn)階篇,不一定要學(xué)啦!但是核心模塊不可不題,所以,新增一小節(jié)!
2005/09/28:終於給他完成去!好累~
2005/10/09:加上參考文獻(xiàn)數(shù)據(jù),以及修改一些些 kernel 啟動(dòng)時(shí), grub 的 vga 配置值的解說(shuō)。
2005/11/09:加上了關(guān)於較大硬盤(pán)所產(chǎn)生的困擾!
2006/08/21:MBR 應(yīng)該只有 512 bytes ,結(jié)果誤植為 512 Kbytes ,抱歉!
2007/06/27:新增 initrd 的說(shuō)明,請(qǐng)參考這里。
2009/04/09:將舊的基於 FC4 的文章移動(dòng)到此處。
2009/04/10:取消了 LILO 的 boot loader 說(shuō)明!畢竟這玩意兒已經(jīng)退流行!所以不再?gòu)?qiáng)調(diào)!有需要請(qǐng)查詢此處。
2009/04/30:修訂完畢,加強(qiáng) init=/bin/bash 的說(shuō)明,以及 grub 的口令管理!
2009/09/14:加入情境模擬,并根據(jù)討論區(qū) linuxfans 兄的建議,修改了一些地方!詳情請(qǐng)參考討論區(qū)建議!
出處:http://vbird.dic.ksu.edu.tw/linux_basic/0510osloader.php
總結(jié)
以上是生活随笔為你收集整理的鸟哥的Linux私房菜(基础篇)- 第二十章、启动流程、模块管理与 Loader的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 鸟哥的Linux私房菜(基础篇)- 第十
- 下一篇: 鸟哥的Linux私房菜(基础篇)- 第二