0. 啟動流程一覽
- 1.加載BIOS的硬件信息與進行自我測試, 并依據(jù)設置取得第一個可啟動的設備(1st device)
- 2.讀取并執(zhí)行第一個啟動設備內(nèi)MBR的boot loader(即是grub, spfdisk等程序)
- 3.依據(jù)boot loader的設置加載Kernel, Kernel檢測硬件和加載驅動
- 4.在硬件驅動成功后, Kernel主動調(diào)用init進程, 而init會取得run-level信息
- 5.init執(zhí)行/etc/rc.d/rc.sysinit文件來準備軟件的操作環(huán)境(如網(wǎng)絡, 時區(qū)等)
- 6.init執(zhí)行run-level的各個服務的啟動(script方式)
- 7.init執(zhí)行/etc/rc.d/rc.local文件
- 8.init執(zhí)行終端機模擬程序mingetty來啟動login進程, 最后等待用戶登錄
# rhgb = redhat graphical boot - This is a GUI mode booting screen with most of the
# information hidden while the user sees a rotating activity icon spining and brief
# information as to what the computer is doing.
# quiet = hides the majority of boot messages before rhgb starts. These are supposed
# to make the common user more comfortable. They get alarmed about seeing the kernel # and initializing messages, so they hide them for their comfort.
1. BIOS, boot loader與kernel加載
1. BIOS, 開機自我檢測與MBR
BIOS --CMOS(取得硬件配置信息)--> 開機自檢(Power-on Self Test, POST) --> 執(zhí)行硬件檢測初始化并配置PnP設備(Plug and Play, 即插即用設備) --> 定義可啟動的設備順序 --> 啟動設備的讀取(MBR相關任務的開始)
由于不同的操作系統(tǒng)的文件系統(tǒng)格式不同, 必須要以對應的boot loader處理內(nèi)核文件的加載問題
2. BOOT Loader的功能
系統(tǒng)的MBR只有一個, 如何同時在一部主機上安裝Windows與Linux呢?
每個操作系統(tǒng)都默認安裝一套boot loader到它自己的文件系統(tǒng)中, 而linux在系統(tǒng)安裝時, 你可以選擇將boot loader安裝到MBR中, 也可以選擇不安裝, 至于windows默認會主動將MBR與boot sector都裝上一份boot loader
boot loader提供的主要功能如下:
1.提供菜單
2.加載內(nèi)核文件
-
3.轉交其他loader
由于windows的loader默認不具有控制權轉交功能, 因此你不能使用windows的loader來加載linux的loader
BIOS無法讀取大容量硬盤 (內(nèi)的kernel與initrd文件) 的問題:
系統(tǒng)使用DVD啟動安裝時, 可以順利安裝Linux, 但是第一次啟動時, 屏幕出現(xiàn)一片黑, 且出現(xiàn)grub>的字樣, 而無法進入Linux系統(tǒng)中, 這是什么問題?
- 使用DVD或CD啟動時, 加載內(nèi)核不是問題, 而內(nèi)核回去檢測系統(tǒng)硬件, 因此可以識別BIOS識別不到的硬盤, 故你確實可以在大容量硬盤上安裝Linux且不出現(xiàn)問題
- 但是進入硬盤啟動時, 由于kernel與initrd文件都是通過BIOS的INT 13通道讀取的, 因此你的kernel與initrd若放置在BIOS無法讀取到的扇區(qū)當中, 系統(tǒng)當然無法加載
如何解決?
- 將kernel與initrd文件放在大硬盤的最前面, 由于BIOS至少可以讀取到大磁盤的1024柱面的數(shù)據(jù), 股就能讀取內(nèi)核與虛擬文件系統(tǒng)的文件
- 那么怎么做呢? 新建/boot獨立分區(qū), 并將/boot放置到最前面即可
3. 加載內(nèi)核與檢測硬件與initrd的功能
通過boot loader的管理而開始讀取內(nèi)核文件后, linux會將該內(nèi)核解壓到內(nèi)存中, 利用內(nèi)核的功能, 重新檢測一次硬件, 而不一定會用BIOS檢測到的硬件信息, 也就是說, 內(nèi)核此時才開始接管BIOS后的工作
內(nèi)核文件路徑: /boot/vmlinuz
ls --format=single-column -F /boot
aquota.group
aquota.user
config-2.6.32-642.el6.x86_64 #此版本內(nèi)核被編譯時選擇的功能與模塊配置文件
efi/
grub/ #引導裝載程序grub相關數(shù)據(jù)目錄
initramfs-2.6.32-642.el6.x86_64.img
initrd-2.6.32-642.el6.x86_64kdump.img #虛擬文件系統(tǒng)文件
lost+found/
symvers-2.6.32-642.el6.x86_64.gz
System.map-2.6.32-642.el6.x86_64
vmlinuz-2.6.32-642.el6.x86_64* #內(nèi)核文件, 非常重要!!!
linux內(nèi)核是可以動態(tài)加載內(nèi)核模塊的, 由于模塊放置在磁盤根目錄內(nèi)(要記得 /lib 與 / 必須放在同一分區(qū)), 啟動過程中內(nèi)核必須掛載根目錄, 才能讀取內(nèi)核模塊提供加載驅動的功能
USB, SATA, SCSI等磁盤設備的驅動程序通常以模塊的方式存在
現(xiàn)在思考一種情況, 假設你的linux安裝自SATA硬盤上, 你可以通過BIOS的INT13取得boot loader與kernel文件來啟動, 然后kernel會開始接管系統(tǒng), 檢測硬件并嘗試掛載根目錄來取得額外的驅動程序, 問題是: 內(nèi)核根本不認識SATA磁盤, 所以需要加載SATA磁盤的驅動程序, 否則無法掛載根目錄, 但是SATA的驅動程序在/lib/modules內(nèi), 你根本無法掛載根目錄, 又怎么讀取到/lib/modules內(nèi)的驅動程序呢?
-
虛擬文件系統(tǒng)(initial RAM disk) 一般使用的文件名為
/boot/initrd
, 它的特色是, 也能通過boot loader加載到內(nèi)存中, 然后這個文件會被解壓并在內(nèi)存中仿真成一個根目錄, 能夠提供一個可執(zhí)行的程序, 通過該程序來加載啟動過程中最需要的內(nèi)核模塊, 這些模塊就是USB, RAID, LVM, SCSI等文件系統(tǒng)與磁盤接口的驅動程序
是否沒有initrd就無法順利啟動?
不見得, 最需要initrd的原因, 當啟動時無法掛載根目錄的情況下, 此時就一定需要initrd, 例如你的根目錄在特殊的磁盤接口(USB, SATA, SCSI), 或者你的文件系統(tǒng)較為特殊(LVM, RAID等), 才會需要initrd
2. 第一個進程init及配置文件/etc/inittab與runlevel
內(nèi)核硬件檢測完畢與驅動程序加載后, 此時你的主機硬件以準備就緒(ready), 此時內(nèi)核會主動調(diào)用第一個進程: /sbin/init
, 它最主要的功能就是準備軟件執(zhí)行的環(huán)境, 包括系統(tǒng)的主機名, 網(wǎng)絡設置, 語系處理, 文件系統(tǒng)格式以及其他服務的啟動等, 而所有的操作都會通過init的配置文件/etc/inttab
來規(guī)劃, 其中一個很重要的設置選項, runlevel
, (啟動執(zhí)行等級)
-
runlevel: 執(zhí)行等級, linux通過設置runlevel來規(guī)定系統(tǒng)啟動不同的服務
0 - halt (關機)
1 - singer user mode (單用戶維護模式)
2 - multi-user, without NFS (類似runlevel3, 無NFS服務)
3 - full-multi-user mode (完整含有網(wǎng)絡功能的純文本模式)
4 - unused (系統(tǒng)保留功能)
5 - X11(與runlevel類似, 加載使用X window)
6 - (重啟)
注: 不可將默認設置為0, 4, 6這三個值, 否則系統(tǒng)會不斷的關機或重啟
? 不正常關機造成文件系統(tǒng)的不一致現(xiàn)象時, 系統(tǒng)會主動進入單用戶維護模式
#inittab的內(nèi)容與語法
vi /etc/inittab
id:5:initdefault: #默認的runlevel設置, 此時runlevel為5
si::sysinit:/etc/rc.d/rc.sysinit #準備系統(tǒng)軟件執(zhí)行的環(huán)境的腳本執(zhí)行文件
#7個不同的runlevel, 需要啟動的服務的script放置路徑:
10:0:wait:/etc/rc.d/rc 0
11:1:wait:/etc/rc.d/rc 1
12:2:wait:/etc/rc.d/rc 2
13:3:wait:/etc/rc.d/rc 3
14:4:wait:/etc/rc.d/rc 4
15:5:wait:/etc/rc.d/rc 5
16:6:wait:/etc/rc.d/rc 6
#是否允許按下 [ctrl] + [alt] + [del] 就重新啟動的設置選項:
ca::ctrlaltdel:/sbin/shutdown -t 3 -r now
#tty1-tty6是由這六行決定的:
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 window是由這行決定的:
x:5:respawn:/etc/X11/prefdm -nodaemon
[設置選項]:[runlevel]:[init的操作行為]:[命令選項]
1.設置選項: 最多四個字符, 只是一個簡單的說明
2.runlevel: 如果是35則表示runlevel 3/5都會執(zhí)行
3.操作行為: 如下表
4.命令選項: 可進行的命令, 通常是一些script
inittab設置值 | 意義說明 |
---|---|
initdefault | 默認的runlevel設置值 |
sysinit | 系統(tǒng)初始化的操作選項 |
ctrlaltdel | 代表cril+alt+del三個按鍵是否可以重啟的設置 |
wait | 后面字段設置的命令項目必須要執(zhí)行完畢才能繼續(xù)下面的其他操作 |
respawn | 后面字段的命令可以無限再生, 例如: tty1的mingetty產(chǎn)生的登錄界面, 在你注銷后, 系統(tǒng)會再開一個新的可登陸界面等待下一個登錄 |
3. init處理系統(tǒng)初始化流程(/etc/rc.d/rc.sysinit)
開始各項系統(tǒng)服務之前, 先得設置好整個系統(tǒng)環(huán)境, 主要利用的就是/etc/rc.d/rc.sysinit
主要工作大致如下:
- 1.取得網(wǎng)絡環(huán)境與主機類型
- 2.測試與掛載內(nèi)存設備/proc即USB設備/sys
- 3.決定是否啟動SElinux
- 4.啟動系統(tǒng)隨機生成器
- 5.設置終端機(console)字體
- 6.設置顯示于啟動過程中的歡迎界面(textbanner)
- 7.設置系統(tǒng)時間(clock)與時區(qū)設置: 需讀入
/etc/sysconfig/clock
的設置值 - 8.接口設備的檢測與Plug and Play(PnP)參數(shù)的測試
- 9.用戶自定義模塊的加載:
/etc/sysconfig/modules/*.modules
- 10.加載內(nèi)核的相關設置: 系統(tǒng)會主動讀取
/etc/sysctl.conf
的設置值, 使內(nèi)核成為我們想要的樣子 - 11.設置主機名與初始化電源管理模塊(ACPI)
- 12.初始化軟件磁盤陣列: 主要通過
/etc/mdadm.conf
來設置 - 13.初始化LVM的文件系統(tǒng)設置
- 14.以fsck檢驗磁盤文件系統(tǒng): 會進行filesystem check
- 15.進行磁盤配額quota的轉換(非必要)
- 16.重新以可讀寫模式掛掛載系統(tǒng)磁盤
- 17.啟動quota功能: 所以我們不需要自定義quotaon的操作
- 18.啟動系統(tǒng)的偽隨機數(shù)生成器(pseudo-random)
- 19.清除啟動過程中的臨時文件
- 20.將啟動相關信息加載
/var/log/dmesg
文件
4. 啟動系統(tǒng)服務與相關啟動配置文件(/etc/rc.d/rc N & /etc/sysconfig)
經(jīng)過/etc/rc.d/rc.sysinit
的系統(tǒng)模塊與相關硬件信息的初始化后, 你的CenOS系統(tǒng)應該已經(jīng)順利工作了, 只是, 我們還得要啟動系統(tǒng)所需要的各項服務啊!
那么各個不同的runlevel服務啟動的的各個shell script放在哪?在/etc/inittab
中提到的:
10:0:wait:/etc/rc.d/rc 0
11:1:wait:/etc/rc.d/rc 1
12:2:wait:/etc/rc.d/rc 2
13:3:wait:/etc/rc.d/rc 3
14:4:wait:/etc/rc.d/rc 4
15:5:wait:/etc/rc.d/rc 5 #本例中, 以此選項來解釋
16:6:wait:/etc/rc.d/rc 6
- 通過外部第一號參數(shù)($1)來取得想要執(zhí)行的腳本目錄, 即由
/etc/rc.d/rc 5
可以取得/etc/rc.d/
這個目錄來準備相關處理的腳本程序 - 找到
/etc/rc5.d/K??*
開頭的文件, 并進行/etc/rc5.d/K??*stop
的操作 - 找到
/etc/rc5.d/S??*
開頭的文件, 并進行/etc/rc5.d/S??*start
的操作
/etc/rc5.d
內(nèi)全部是連接文件, 連接到stand alone服務啟動的目錄/etc/init.d/
去, super daemon與stand alone的服務主要是以/etc/init.d/服務文件名{start,stop}
來啟動與關閉的, 也就是說, 如果你有想要啟動改runlevel是就執(zhí)行的服務, 那么利用S??并指向/etc/init.d/
的特定服務啟動腳本后, 該服務就會在啟動時啟動, chkconfig
就是在負責處理這個連接文件, S或K后面的數(shù)字, 代表執(zhí)行的順序, 數(shù)字越小越先被執(zhí)行*
5. 用戶自定義開機啟動程序(/etc/rc.d/rc.local)
/etc/rc.d/rc.local
這個文件可以在啟動時執(zhí)行你自己想要執(zhí)行的系統(tǒng)命令
6. 根據(jù)/etc/inittab的設置加載終端機或X Window界面
在完成了系統(tǒng)所有服務的啟動后, 接下來Linux就會啟動終端機或者是X Window來等待用戶登錄, 實際參考/etc/inittab
內(nèi)這一段:
#tty1-tty6是由這六行決定的:
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 window是由這行決定的:
x:5:respawn:/etc/X11/prefdm -nodaemon
7. 啟動過程中會用到的主要配置文件
/sbin/init
的運行過程中有許多執(zhí)行腳本, 包括/etc/rc.d/rc.sysinit
以及/etc/rc.d/rc
等, 這些腳本都會使用到相當多的系統(tǒng)配置文件, 這些啟動過程中的配置文件大多放在/etc/sysconfig/
目錄下, 同時, 由于內(nèi)核還需要加在一些驅動程序(內(nèi)核模塊), 此時系統(tǒng)自定義的設備與模塊對應文件(/etc/modprobe.conf
)就顯得相當重要了
-
關于模塊:
/etc/modprobe.conf
某些條件下我們還是得對模塊進行一些參數(shù)的規(guī)劃, 此時就得用到
/etc/modprobe.conf
cat /etc/modprobe.conf
alias eth0 8139too #讓eth0使用8139too的模塊
alias scsi_hostadapter pata_sis
options snd-card-0 index=0 #額外指定snd-card-0的參數(shù)功能
options snd-trident index=0
這個文件大多在于制定系統(tǒng)內(nèi)硬件所使用的模塊, 這個文件通常是系統(tǒng)自行產(chǎn)生的, 一般不需要手動處理, 不過如果系統(tǒng)檢測到錯誤的驅動程序, 或者你想要使用更新的驅動程序來對應相關的硬件設備時, 就要自行手動處理一下這個文件了
-
/etc/sysconfig/*
, 總而言之, 這個文件很重要, 啟動過程中經(jīng)常會被讀取到-
authconfig
主要設置用戶的身份認證的機制, 包括是否使用本機的
/etc/passwd, /etc/shadow
等, 以及/etc/shadow
密碼記錄使用何種加密算法, 還有是否使用外部密碼服務器提供的賬號驗證(NIS, LDAP)等, 系統(tǒng)默認使用md5加密算法, 并且不使用外部的身份驗證機制 -
clock
用于設置Linux主機的時區(qū), 在clock文件內(nèi)的設置選項“ZONE”所參考的時區(qū)位于
/usr/share/zoneinfo/
目錄下的相對路徑中, 而且要修改時區(qū)的話, 還得將/usr/share/zoneinfo/Asia/Shanghai
這個文件復制成為/etc/localtime
才行 -
i18n
用于設置一些語系的使用方面
-
keyboard & mouse
設置鍵盤與鼠標的形式
-
network
設置是否要啟動網(wǎng)絡, 以及設置主機名還有網(wǎng)關
-
network-scripts/
主要用于設置網(wǎng)卡
-
8. Run level的切換
與runlevel有關的啟動其實是在/etc/rc.d/rc.sysinit
執(zhí)行完畢之后
#如何知道當前的runlevel?
runlevel
N 5 #左邊帶前一個runlevel, 右邊代表目前的runlevel, 若之前沒有切換過, 則前一個不存在(N)
#將目前的runlevel切換為3(注意: tty7的數(shù)據(jù)會消失)
init 3
內(nèi)核與內(nèi)核模塊
內(nèi)核一般都是壓縮文件, 因此在內(nèi)核使用之前, 就得要將它解壓后才能加載到內(nèi)存當中
目前內(nèi)核都是具有可讀取模塊化驅動程序的功能, 即所謂的“modules(模塊化)”功能, 所謂的模塊化可以將它想象成是一個“插件” (插件: 可以增加或增強軟件功能的輔助性程序)
內(nèi)核與內(nèi)核模塊放在哪里呢?
- 內(nèi)核:
/boot/vmlinuz
或/boot/vmlinuz-version
- 內(nèi)核解壓縮所需的RAMDisk:
/boot/initrd (/boot/initrd-version)
- 內(nèi)核模塊:
/lib/modules/version/kernel
或/lib/modules/$(uname -r)/kernel
- 內(nèi)核源碼:
/usr/src/linux/
或/usr/src/kernels/
(要安裝才會有! 默認不安裝) - 內(nèi)核版本:
/proc/version
- 系統(tǒng)內(nèi)核功能:
/proc/sys/kernel/
問題來了: 如果我有個新硬件, 偏偏我的操作系統(tǒng)不支持, 該怎么辦?
- 1.重新編譯內(nèi)核, 并加入最新的硬件驅動程序源碼
- 2.將該硬件的驅動程序編譯成模塊, 在啟動時加載該模塊
如果想要加載一個已存在的模塊時, 該如何是好?
1. 內(nèi)核模塊與依賴性
要處理內(nèi)核模塊, 首先要了解內(nèi)核提供的模塊之間的相關性
/lib/modules/$(uname -r)/kernel/中, 還分為幾個目錄:
arch #與硬件平臺有關的選項, 例如CPU的等級等
crypto #內(nèi)核所支持的加密技術, 例如md5或者des等
drivers #一些硬件的驅動程序, 例如顯卡, 網(wǎng)卡, PCI相關硬件等
fs #內(nèi)核所支持的文件系統(tǒng), 如vfat, reiserfs, nfs等
lib #一些函數(shù)庫
net #與網(wǎng)絡有關的各項協(xié)議數(shù)據(jù), 還有防火墻模塊(net/ipv4/netfilter/*)等
sound #與音效有關的各項模塊
如果我們要一個個檢查這些模塊的主要信息, 然后定義出它們的依賴性, 我們可能會瘋掉, linu已經(jīng)提供一些模塊依賴性的解決方案, 那就是檢查/lib/modules/$(uname -r)/kernel/modules.dep
這個文件, 它記錄了內(nèi)核支持的模塊的各項依賴性
#那么這個文件如何創(chuàng)建呢? depmod - program to generate modules.dep and map.files
depmod [-Ane]
-A : --quick, 不加任何參數(shù)時, depmod會主動分析目前內(nèi)核的模塊, 并且重新寫入/lib/modules/$(uname -r)/kernel/modules.dep當中, 若加入-A選項, 則depmod會查找比modules.dep內(nèi)還新的模塊, 如果真找到新模塊, 才會更新
-n : --dry-run, 不寫入modules.dep, 而是將結果輸出到屏幕上
-e : --errsyms, 顯示出目前已加載的不可執(zhí)行的模塊名稱
#實例: 若我做好一個網(wǎng)卡驅動程序, 文件名為a.ko, 該如何更新內(nèi)核依賴性?
cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net
depmod
#注: 內(nèi)核模塊擴張名一定是 .ko 結尾的
2. 內(nèi)核模塊的查看
#查看目前系統(tǒng)加載了多少模塊以及模塊間的依賴關系?
lsmod - program to show the status of modules in the linux kernel
Module Size Used by
模塊名稱 模塊的大小 此模塊是否被其他模塊所使用
autofs4 27000 3
target_core_file 9174 0
target_core_iblock,target_core_file,target_core_pscsi
configfs 29378 2 target_core_mod
#如何查看每個模塊的詳細信息或者自己的模塊信息?
modinfo - program to show infotmation about a linux kernel module
modinfo [module_name|filename]
3. 內(nèi)核模塊的加載與刪除
#modprobe會主動去查找modules.dep的內(nèi)容, 先克服模塊的依賴性之后, 再決定需要加載的模塊有哪些
modprobe [-lcfr] module_name
-l : 列出目前在/lib/modules/$(uname -r)/kernel/中的所有模塊的完整文件名
-c : 列出目前系統(tǒng)的所有模塊(更詳細的代號對應表), 類似/etc/modprobe.conf
* -f : 強制加載該模塊
* -r : 刪除某個模塊
#實例1: 加載cifs模塊
modprobe cifs #不需要完整的模塊文件名, 因為完整的模塊文件名已記錄到/lib/modules/$(uname -r)/modules.dep這個文件中, 若要刪除, 執(zhí)行如下命令:
modprobe -r cifs
#實例2: 加載vfat這個模塊, 并查看該模塊的相關模塊是哪個?
modprobe vfat
lsmod | grep vfat
modprobe -r vfat
4. 內(nèi)核模塊的額外參數(shù)設置: /etc/modprobe.conf
假設我的網(wǎng)卡eth0使用ne, 但是eth1同樣也使用ne, 為了避免同一個模塊導致網(wǎng)卡的錯亂, 因此先找到eth0與eth1的I/O與IRQ, 假設:
- eth0: I/O (0x300)且IRQ=5
- eth1: I/O (0x320)且IRQ=7
#則:
vi /etc/modprobe.conf
alias eth0 ne
alias eth1 ne
options eth0 io=0x300 irq=5
options eth1 io=0x320 irq=7
#如此一來, linux就不會捕獲錯網(wǎng)卡的對應了, 因為已經(jīng)強制指定某個I/O了
Boot Loader: Grub
1. boot loader的兩個stage
-
Stage1: 執(zhí)行boot loader主程序
主程序必須要被安裝在啟動區(qū), 即MBR或boot sector(但因為MBR時整個硬盤的第一個sector內(nèi)的一個塊, 整個大小也才446bytes), 故MBR或boot sector通常僅安裝boot loader的最小主程序, 不安裝相關配置文件
-
Stage2: 主程序加載配置文件
第二階段為通過boot loader加載所有配置文件與相關的環(huán)境參數(shù)文件(包括文件系統(tǒng)定義與主要配置文件menu.lst), 配置文件都放在/boot/grub下
ls -l /boot/grub
-rw-r--r--. 1 root root 45 Sep 11 09:46 device.map #grub的設備對應文件
-rw-r--r--. 1 root root 63 Jul 4 15:49 device.map.backup
-rw-r--r--. 1 root root 13428 Sep 11 09:46 e2fs_stage1_5 #ext2/3文件系統(tǒng)的定義文件
-rw-r--r--. 1 root root 12636 Sep 11 09:46 fat_stage1_5
-rw-r--r--. 1 root root 11780 Sep 11 09:46 ffs_stage1_5
-rw-------. 1 root root 1717 Sep 11 16:55 grub.conf #grub在Red Hat中的配置文件
-rw-r--r--. 1 root root 11772 Sep 11 09:46 iso9660_stage1_5
-rw-r--r--. 1 root root 13284 Sep 11 09:46 jfs_stage1_5
lrwxrwxrwx. 1 root root 11 Jul 4 15:49 menu.lst -> ./grub.conf #此文件很重要!!!
-rw-r--r--. 1 root root 11972 Sep 11 09:46 minix_stage1_5
-rw-r--r--. 1 root root 14428 Sep 11 09:46 reiserfs_stage1_5
-rw-r--r--. 1 root root 1341 May 7 2010 splash.xpm.gz #啟動時在grub下的后臺圖示
-rw-r--r--. 1 root root 512 Sep 11 09:46 stage1 #stage1的相關說明
-rw-r--r--. 1 root root 126148 Sep 11 09:46 stage2 #stage2的相關說明
-rw-r--r--. 1 root root 12040 Sep 11 09:46 ufs2_stage1_5
-rw-r--r--. 1 root root 11380 Sep 11 09:46 vstafs_stage1_5
-rw-r--r--. 1 root root 13980 Sep 11 09:46 xfs_stage1_5
我們的loader讀取了這種文件系統(tǒng)定義數(shù)據(jù)后, 就能認識文件系統(tǒng)并讀取該文件系統(tǒng)的內(nèi)核文件
2. grub的配置文件/boot/grub/menu.lst與菜單類型
grub的優(yōu)點:
- 1.認識和支持較多的文件系統(tǒng)
- 2.啟動時可以自行編輯和修改設置選項
- 3.動態(tài)查找配置文件, 而不需要在修改配置文件后重新安裝grub, 我們只要修改
/boot/grub/menu.lst
里頭的設置, 下次啟動后就生效了
硬盤與分區(qū)在grub中的代號
- grub到底是如何認識硬盤呢? 它對硬盤的識別使用如下代號:
- (hd0,0)
- 1.硬盤代號以小括號( )括起來
- 2.任何硬盤均以hd表示, 后面接一組數(shù)字
- 3.以“查找順序”作為硬盤的編號, 而不是硬盤扁平電纜的排序(這個重要!)
- 4.第一個查找的硬盤為0, 第二個為1, 以此類推
- 5.每塊硬盤的第一個分區(qū)為0, 依序類推
硬盤查找順序 | 在Grub當中的代號 |
---|---|
第一塊 | (hd0), (hd0,0), (hd0,1), (hd0,4) ... |
第二塊 | (hd1), (hd1,0), (hd1,1), (hd1,4) ... |
-
/boot/grub/menu.lst
配置文件
vi /boot/grub/menu.lst
#先是整體設置:
[password --md5 經(jīng)grub-md5-crypt加密后的密文] #password放在此處不會被破解
default=0 #默認啟動選項, 使用第一個菜單啟動
timeout=5 #若5秒內(nèi)未動鍵盤, 使用默認菜單啟動
splashimage=(hd0,0)/grub/splash.xpm.gz #后臺圖示所在的文件
hiddenmenu #讀秒期間是否顯示出完整的菜單界面(默認隱藏)
#直接指定內(nèi)核啟動
title Red Hat Enterprise Linux 6 (2.6.32-642.el6.x86_64)
[lock] #多了死鎖的功能
[password --md5 經(jīng)grub-md5-crypt加密后的密文] #password放在此處可以被破解
[rootnoverify (hd0,0)] #不檢驗此分區(qū)
root (hd0,0) #代表內(nèi)核文件放在哪個分區(qū), 而不是根目錄
[hide (hd0,4)] #隱藏(hd0,4)這個分區(qū)
[makeactive] #設置此分區(qū)為活動的(active)
[chainloader +1] #利用chainloader的方式轉交控制權
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/vg_linuxofalex-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_linuxofalex/lv_root rd_NO_MD rd_LVM_LV=vg_linuxofalex/lv_swap SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb vga=790 [single|1]
#kernel后接的是內(nèi)核的文件名, 而文件名后接的是內(nèi)核的參數(shù)
#由于啟動過程中要掛載根目錄, 因此kernel后面接的那個root=/dev/mapper/vg_linuxofalex-lv_root指的是linux的根目錄在哪個分區(qū), 可以使用LABEL來掛載根目錄
#至于rhgb為色彩顯示而quiet則是安靜模式(屏幕不會輸出內(nèi)核監(jiān)測信息)
initrd /initramfs-2.6.32-642.el6.x86_64.img
#initrd: 就是前面提到的initrd制作出的RAM Disk的文件名
#實例1: 我的系統(tǒng)分區(qū)是/dev/hda1(/), /dev/hd2(swap), 且我的內(nèi)核文件為/boot/vmlinuz, 請問grub的menu.lst內(nèi)該如何編寫內(nèi)核文件位置?
title Linux $(uname -r)
root (hd0,0)
kernel (hd0,0)/boot/vmlinuz ro root=/dev/hda1/ rhgb quiet #root=LABEL=/1
initrd (hd0,0)/boot/initrd.$(uname -r)
#注: 此處的/boot為(hd0,0)內(nèi)根目錄下的一個目錄
#實例2: 同上, 只是我的分區(qū)情況變成了/dev/sda1(/boot), /dev/sda5(/)時呢?
title Linux $(uname -r)
root (hd0,0)
kernel (hd0,0)/vmlinuz
initrd (hd0,0)/initrd.$(uname -r)
#注: 此處的/boot為在(hd0,0)內(nèi)獨立的一個分區(qū)
#如何重新讀取MBR內(nèi)的配置文件?
title Linux $(uname -r)
root (hd0) #MBR為整塊磁盤的第一個扇區(qū), 故用整塊磁盤的代號
...
3. initrd的重要性與創(chuàng)建新的initrd文件
initrd的目的: 提供啟動過程中最需要的內(nèi)核模塊
需要initrd的時刻:
- 1.根目錄所在的磁盤為SATA, SCSI, USB等特殊接口
- 2.根目錄所在文件系統(tǒng)為LVM, RAID等特殊格式
- 3.根目錄所在的文件系統(tǒng)為非傳統(tǒng)linux“認識”的文件系統(tǒng)
- 4.其他必須在內(nèi)核加載時提供的模塊
#如果你有特殊需求而想重置initrd文件的話?
mkinitrd [-v] [--with=新加入的模塊名稱] init文件名 內(nèi)核版本
-v : 顯示mkinitrd的運行過程
--with=新加入的模塊名稱 : 模塊名稱指的是模塊的名字而已, 不需要填寫絕對路徑的文件名, 例如: 目前內(nèi)核版本的ext3文件系統(tǒng)模塊下的文件名: /lib/modules/$(uname -r)/kernel/fs/ext3/ext3.ko 那你只要寫成"--with=ext3"就好了, (省略.ko)
initrd文件名 : 你所需要創(chuàng)建的initrd文件的文件名
內(nèi)核版本 : 某一個內(nèi)核版本, 若是目前的內(nèi)核版本則是"$(uname -r)"
#實例: 以mkinitrd的默認功能創(chuàng)建一個initrd的虛擬文件系統(tǒng)
mkinitrd -v initrd_$(uname -r) $(uname -r)
#實例二: 增加8139too這個模塊的initrd文件
mkinitrd -v --with=8139too initrd_$(uname -r) $(uname -r)
initrd創(chuàng)建完成之后, 同時內(nèi)核也處理完畢, 我們就可以使用grub新建菜單了
4. 測試與安裝grub
若你的linux原來使用的并非grub, 現(xiàn)再你希望使用grub, 該如何安裝它呢?
1. 利用grub-install安裝配置文件
grub-install [--root-directory=DIR] INSTALL_DEVICE
--root-directory=DIR : 那個DIR為實際的絕對路勁目錄, 使用grub-install默認將grub的所有文件都復制到/boot/grub/內(nèi), 如果想要復制到其他目錄與設備中, 就需要指定
INSTALL_DEVICE : 安裝的設備代號
#實例1: 將grub安裝在目錄系統(tǒng)的MBR下, 我的系統(tǒng)為/dev/sda
grub-install /dev/sda #默認安裝路徑/boot/grub下的所有目錄的時間會被更新, 因為我們重裝了
#實例2: 我的/home為獨立的/dev/sdb3, 如何安裝grub到/dev/sdb3 (boot sector)
grub-install --root-directory=/home /dev/sdb3
#會自動幫你生成/boot/grub/目錄與文件, 但是要注意, 我們沒有menu.lst這個配置文件, 這個文件需要自己手動創(chuàng)建
2. 將grub主程序安裝到boot sector或MBR
想要將grub的主程序再次安裝到/dev/sdb1的boot sector或MBR上, 需要使用grub shell
- 1.用
root (hdx,x)
c選擇含有grub目錄的那個分區(qū)代號 - 2.用
find /boot/grub/stage1
看看能否找到那個安裝信息文件 - 3.用
find /boot/vmlinuz
看看能否在到內(nèi)核文件(不一定要成功) - 4.用
setup (hdx,x)
或setup (hdx)
將grub安裝到boot sector或MBR中 - 5.用
quit
離開grub shell
grub #進入grub shell
#1. 先設置一下那個含有grub目錄的那個分區(qū)
grub>root (hd0,0)
Filesystem type is ext2fs, partition type 0x83 #此處可以發(fā)現(xiàn)grub能夠識別文件系統(tǒng)
#2. 查找一下是否存在stage1這個配置文件
grub>find /boot/grub/stage1
(hd0,2)
#怎么會只有一個, 我們明明有/boot/grub/與/home/boot/grub/啊?
#因為/boot是獨立的, 因此找到該文件就得用一下的方式:
grub>find /grub/stage1
(hd0,0)
#要特別注意grub找到的不是目錄樹, 而是設備內(nèi)的文件
#3. 查找是否可以找到內(nèi)核文件/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)
#4. 將主程序安裝到MBR
grub>setup (hd0)
#5. 重復安裝到/dev/sda1的boot sector中
grub>setup (hd0,0)
grub>quit
啟動過程的問題解決
1. init配置文件錯誤
單用戶模式唯一無法挽救的情況: /etc/inittab這個文件設置錯誤導致無法啟動
因為single mode(runlevel 1)也是要讀取/etc/inittab來進行開機的
既然默認的init無法執(zhí)行, 就告訴內(nèi)核不要執(zhí)行init, 改用bash, 在啟動進入grub后, 在grub edit下這樣做:
grubedit> kernel /vmlinuz-2.6.18-92.el15 ro root=LABEL=/1 rhgb quiet init=/bin/bash
2. BIOS磁盤對應問題
我可否將Windows安裝在/dev/sda中而Linux安裝在/dev/sdb中, 然后調(diào)整BIOS的啟動設備順序, 如此兩套系統(tǒng)都安裝在各自的MBR中, 這樣做非常好, 問題是: grub對磁盤的設備代號使用的是檢測到的順序! 也就是說, 你調(diào)整了BIOS磁盤的啟動順序后, 你的menu.lst可能對應到了錯誤的磁盤上
我們可以通過/boot/grub/device.map
這個文件來寫死每個設備對grub磁盤代號的對應關系
cat /boot/grub/device.map
(fd0) /dev/fd0
(hd0) /dev/sda
如果你不清楚如何處理的話, 也可以利用grub-install
的功能
grub-install --recheck /dev/sdb1 #這樣device.map就會主動更新了
3. 因為文件系統(tǒng)錯誤而無法啟動
- 最容易出錯的設置而導致無法順利啟動的步驟通常是
/etc/fstab
這個文件, 尤其是用戶在實踐quota時, 最容易寫錯參數(shù), 又沒有經(jīng)過mount -a
來測試掛載, 就立刻啟動, 就會出現(xiàn)問題 - 除了
/etc/fstab
編輯錯誤, 如果你曾經(jīng)不正常關機, 也可能導致文件系統(tǒng)不一致(inconsistent), 也有可能會出現(xiàn)相同的問題, 此時你就應該用fsck
檢測對應出錯的磁盤或分區(qū), 等到系統(tǒng)發(fā)現(xiàn)錯誤, 并出現(xiàn)clear[Y/N]
后, 輸入Y
4. 利用chroot切換到另一塊硬盤工作
chroot - change root directory
, 這個命令可以暫時將根目錄移到某個目錄下, 然后去處理某個問題, 最后再離開該root而回到原本的系統(tǒng)中
chroot更換根目錄時要注意以下幾點:
1.更換后的目錄要有對應的shell
2.要有對應shell的庫文件
例: ldd $(which bash)
, 其中庫目錄的名稱也需要注意,lib或lib64
-
3.其他命令在執(zhí)行時同樣有庫的依賴關系
本文基于<鳥哥的Linux私房菜>, 歸納整理, 在此致謝鳥哥.