Linux系統(tǒng)啟動流程

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私房菜>, 歸納整理, 在此致謝鳥哥.
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蜓陌,隨后出現(xiàn)的幾起案子豪墅,更是在濱河造成了極大的恐慌胚迫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毡泻,居然都是意外死亡,警方通過查閱死者的電腦和手機粘优,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門仇味,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雹顺,你說我怎么就攤上這事丹墨。” “怎么了嬉愧?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵贩挣,是天一觀的道長。 經(jīng)常有香客問我没酣,道長揽惹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任四康,我火速辦了婚禮搪搏,結果婚禮上,老公的妹妹穿的比我還像新娘闪金。我一直安慰自己疯溺,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布哎垦。 她就那樣靜靜地躺著囱嫩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漏设。 梳的紋絲不亂的頭發(fā)上墨闲,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音郑口,去河邊找鬼鸳碧。 笑死盾鳞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的瞻离。 我是一名探鬼主播腾仅,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼套利!你這毒婦竟也來了推励?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肉迫,失蹤者是張志新(化名)和其女友劉穎验辞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喊衫,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡跌造,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了格侯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼻听。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖联四,靈堂內(nèi)的尸體忽然破棺而出撑碴,到底是詐尸還是另有隱情,我是刑警寧澤朝墩,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布醉拓,位于F島的核電站,受9級特大地震影響收苏,放射性物質(zhì)發(fā)生泄漏亿卤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一鹿霸、第九天 我趴在偏房一處隱蔽的房頂上張望排吴。 院中可真熱鬧,春花似錦懦鼠、人聲如沸钻哩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽街氢。三九已至,卻和暖如春睦袖,著一層夾襖步出監(jiān)牢的瞬間珊肃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伦乔,地道東北人厉亏。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像评矩,于是被迫代替她去往敵國和親叶堆。 傳聞我的和親對象是個殘疾皇子阱飘,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容