Linux啓動之個人總結

以下文章包含了一些網上的內容,也有自己學習過程中自己的總結,以前在某個網站上發過一次,這裏也發一下,目的在於拋磚引玉。
Linux開機不是簡單的按電源
1、        計算機讀取BIOS來加載硬件信息並完成硬件的自檢,然後讀取BIOS設置的第一個可開機的設備。
2、        讀取並執行第一個開機設備的MBR的boot loader(grub、lilo、spfdisk等引導程序)
a)        boot loader提供的功能有3個:提供選單:使用者可以選擇不同的開機項目,可以選擇不同的核心啓動;載入核心檔案:直接指向可開機的程序區段來開始操作系統;轉交其它loader:將開機管理功能轉交給其它loader 負責。這裏的要點是系統能夠使用的引導加載程序必須能夠認識文件系統。
b)        boot loader是存儲在MBR中的,雖然不同的操作系統的boot loader不同,但是BIOS通過硬件的INT 13中斷來讀取MBR,也就是說,BIOS能檢測到硬盤,就能通過INT 13中斷來讀取MBR了,這樣boot loader也就能被執行了。
c)        boot loader的大小可能會超過466,解決方法是將引導加載程序分成兩段來執行,第一階段僅安裝引導加載程序的最小主程序,此主程序必須安裝在啓動區,即MBR或第一個扇區,不去安裝相關配置文件。第二階段爲載入引導加載程序的所有設置文件和相關的環境參數文件,一般來說,設置文件都在/boot目錄,如grub.conf
注:MBR不屬於任何操作系統,不能用操作系統提供的磁盤操作命令來讀取它,但是可以通過命令來修改和重寫。位於硬盤的0柱面,0磁頭,1扇區,共分爲3部分引導程序區,硬盤分區表區,扇區結束標誌區,MBR總大小爲512字節,其中引導程序區佔466個字節,它負責檢測硬盤分區表和尋找可引導分區並將其引導扇區信息加載到內存;硬盤分區表佔64個字節,含4個分區項,每個分區項長16個字節,這也就是每個硬盤主分區加擴展分區的數量最多有4個的原因,與此同時,每個硬盤最多只能有一個擴展分區,這個擴展分區不能被直接使用,必須和邏輯分區結合起來使用,每個硬盤分區表裏面記載了每個分區的類型、大小和分區開始、結束的位置等重要內容;扇區結束標誌位爲2個字節,固定爲55AA,如果標誌錯誤,系統無法啓動。
3、        依據boot loader的設定加載kernel和initrd,kernel檢測硬件設備並加載驅動
a)        由boot loader管理開始加載內核,首先將內核解壓到內存中,利用內核功能測試和驅動各個裝置,如CPU、網卡、聲卡等,這是kernel自身進行的檢測,不一定使用BIOS檢測的硬件信息。
b)        核心是/boot/vmlinuz*文件,核心可以動態加載核心模塊,比如各種驅動程序
c)        核心模塊放置在/lib/modules目錄,因爲系統啓動第一個掛載的分區爲/,假設內核無法識別硬盤,需要加載硬盤的驅動程序才能識別,但是讀取驅動程序又必須先掛載模塊分區,這時候就需要initrd,這個文件/boot/initrd*,它可以被boot loader加載到內存中,並被虛擬成一個根目錄/,完成開機過程中最重要的核心模塊的加載,完成後釋放虛擬系統,掛載實際的文件系統,開始後續的正常開機流程。沒有initrd,也可以順利開機,只有在特殊的磁盤接口(USB, SATA, SCSI) , 或者檔案系統較爲特殊(LVM, RAID) 等等在開機時無法掛載/的時候才需要它。
4、        硬件驅動完成後,kernel會去執行初始化腳本程序
a)        核心加載完成後,開始執行系統的第一個二進制腳本:/sbin/init,它的主要功能是準備軟件執行的環境,包括主機名、網絡環境、語系、啓動各種服務等,init會去讀取/etc/inittab文件並根據其設置完成以上動作。/etc/inittab 的設定也有點類似shell腳本,文件內容的設置也是逐行從上向下處理,init 的處理流程爲:
1. 先取得runlevel 亦即預設執行等級的相關等級
2. 使用/etc/rc.d/rc.sysinit 進行系統初始化
3. 由於runlevel 是5 ,因此只執行l5:5:wait:/etc/rc.d/rc 5,其它行則略過
4. 設定好[ctrl]+[alt]+[del] 這組的組合鍵功能
5. 設定不斷電系統的pf, pr 兩種機制;
6. 啓動mingetty 的六個終端機(tty1 ~ tty6)
7. 最終以/etc/X11/perfdm -nodaemon 啓動圖形接口啦!
b)        inittab文件定義了啓動的運行級別,根據不同的級別開啓/關閉不同的服務。
1、首先文件定義了7個run level,分別是:
0        - halt (系統直接關機)
1        - single user mode (單用戶模式,用在系統出問題時的維護)
2        - Multi-user, without NFS (類似底下的runlevel 3,但無NFS 服務)
3        - Full multi-user mode (完整含有網絡功能的純文字模式)
4        - unused (系統保留功能)
5        - X11 (與runlevel 3 類似,但加載使用X Window)
6        - reboot (重新開機)
2、 根據上述init處理inittab文件的內容的流程,可以讀取默認的啓動級別,同時根據指定接下來執行的腳本文件等信息,文件的語法是利用冒號(:) 將設定分隔成爲四個字段,每個字段的意義與說明爲:[設定項目]:[run level]:[init 的動作行爲]:[指令項目]
設定項目:最多四個字符,代表init 的主要工作項目,只是一個簡單的代表說明
run level:該項目在哪些run level 底下進行的意思。如果是35 則代表runlevel 3 與5 都會執行
init 的動作項目:主要可以進行的動作項目意義有initdefault(代表預設的run level 設定值)、sysinit(代表系統初始化的動作項目)、ctrlaltdel(代表三個按鍵是否可以重新啓動的設定)、wait(代表後面字段設定的指令項目必須要執行完畢才能繼續底下其它的動作)、respawn(代表後面字段的指令可以無限制的再生,舉例來說, tty1 的mingetty產生的可登入畫面, 在你註銷而結束後,系統會再開一個新的可登入畫面等待下一個登入)
指令項目:亦即應該可以進行的指令,通常是一些script
3、 重要信息摘錄有:
id:5:initdefault: <==預設的runlevel 設定, 此runlevel 爲5
si::sysinit:/etc/rc.d/rc.sysinit <==系統的環境腳本
1:2345:respawn:/sbin/mingetty tty1 <==共有tty1~tty6個終端
x:5:respawn:/etc/X11/prefdm -nodaemon <==X window 則是這行決定
c)        rc.sysinit腳本inittab中指定rc.sysinit這個shell腳本來設置系統環境,這個腳本的主要工作有:
1、        獲取網絡環境與主機類型(首先讀取網絡設置文件/etc/sysconfig/network,獲取主機名與默認網關等網絡環境)
2、        測試與載入內存設備/proc及USB設備/sys
3、        決定是否啓動SELinux
4、        接口設備的檢測和即插即用(PnP)參數的測試
5、        用戶自定義模塊的加載(可在/etc/sysconfig/modules/*.modules加入自定義模塊,此時會自動加載到系統中)
6、        加載核心的相關設置(系統會去主動讀取/etc/sysctl.conf文件的設置)
7、        設置系統時間
8、        設置終端控制檯的字形
9、        設置RAID與LVM等硬盤功能
10、        以fsck檢測磁盤文件系統
11、        如果需要,進行磁盤配額quota的轉換
12、        重新以可讀取模式載入系統磁盤
13、        啓動quota功能
14、        啓動系統隨機設備(產生隨機數功能)
15、        清除啓動過程中的臨時文件
16、        將啓動相關信息加載到/var/log/dmesg文件中
經過上述過程,基本的系統設置都完成了,基本上這個文件中執行的很多工作的默認設置文件都在/etc/sysconfig中。
d)        rc.n 文件:rc.sysinit執行完成後,根據inittab文件中的設置值,根據不同的默認運行級別,來啓動系統所需的各項服務,只執行與運行級別對應的腳本,其他都忽略,每一個運行級別對應/etc/rc.d/rc.n目錄下的文件都是以S或K開頭的文件,這些文件都是連接文件,它們連接到/etc/rc.d/init.d目錄下的shell腳本(/etc/rc.d/init.d和/etc/init.d其實是一樣的,因爲這兩個目錄是連接文件),其中S打頭的文件是啓動時需要啓動的服務文件連接,K開頭的文件爲關機或者更改運行級別時需要關閉的服務的文件連接,S和K後面的數字是執行的順序。
如系統變換運行等級從5到3時,系統會去比較兩個運行等級對應K和S開頭的文件,然後關閉那些rc5.d中啓動且不存在rc3.d中的對應服務,啓動那些rc3.d中需要啓動且不存在與rc5.d中的服務。
runlevel命令可以顯示當前的運行等級
e)        rc.local:利用此文件完成用戶自定義的開機工作。根據文件inittab中設置,完成了所有的系統服務啓動後,Linux會啓動終端或者X桌面系統,在運行級別時2345時,都會執行/sbin/mingetty,這個腳本就是啓動終端的命令,執行了6個,這就是爲什麼會有6個純文本中終端的設置。同時respawn的init,表示後面的命令被終止時init會自動重新啓動該項目,這也就是爲什麼以exit離開後,系統還是會重新顯示用戶登錄的界面的原因。
5、        最流行grub引導程序:
a)        /boot/grub目錄下文件:
-rw-r--r-- device.map <==grub 的裝置對應文件
-rw-r--r-- e2fs_stage1_5 <==ext2/ext3 檔案系統定義文件
-rw-r--r-- fat_stage1_5 <==FAT 檔案系統定義文件
-rw-r--r-- ffs_stage1_5 <==FFS 檔案系統定義文件
-rw------- grub.conf <==grub 在Red Hat 的配置文件
-rw-r--r-- iso9660_stage1_5 <==光驅檔案系統定義文件
-rw-r--r-- jfs_stage1_5 <==jfs 檔案系統定義文件
lrwxrwxrwx menu.lst -> ./grub.conf <==menu.lst 纔是配置文件
-rw-r--r-- minix_stage1_5 <==minix 檔案系統定義文件
-rw-r--r-- reiserfs_stage1_5 <==reiserfs 檔案系統定義文件
-rw-r--r-- splash.xpm.gz <==開機時在grub 底下的背景圖示
-rw-r--r-- stage1 <==引導程序第一階段的相關說明
-rw-r--r-- stage2 <==引導程序第二階段的相關說明
-rw-r--r-- ufs2_stage1_5 <==UFS的檔案系統定義文件
-rw-r--r-- vstafs_stage1_5 <==vstafs 檔案系統定義文件
-rw-r--r-- xfs_stage1_5 <==xfs 檔案系統定義文件
menu.lst有時候也叫grub.conf,但是/boot/grub/下會有一個名叫menu.lst的符號鏈接指向它。它是grub引導系統的配置文件。
文件基本選項:
default 0:grub的默認啓動項
timeout 5: 指定一個超時值,單位爲秒,若用戶在grub等待的超時時間範圍內沒有任何操作,則啓動默認項
hidemenu: 開機時是否顯示多選項菜單,若被設置則啓動的時候默認不顯示選項菜單,否則grub啓動時自動顯示選項菜單
color white/blue: 指定grub菜單的默認顏色
password --md5 $1$etSG6$LlxT8irAfAv5vYQn6tZUw1: 指定一個密碼,啓用grub的密碼保護,這個命令需要放置在title下第一行。爲安全起見,一般使用md5值,這個值可以使用grub-md5-crypt或者在grub shell中使用md5crypt生成,也可以直接使用字母或者數字。當要修改加密的啓動項時,需要按p鍵,然後輸入密碼。需要注意的是爲了放置點擊e,進入編輯模式,然後刪除密碼字段,再按下b啓動系統,這時可以將密碼設置設置在整體上,而不是放置在某一個title下,相對應的title下增加一行lock <==多了死鎖的功能
產生MD5密碼命令示例如
#grub-md5-crypt
Password: <==輸入密碼
Retype password: <==再輸入一次
$1$kvlI0/$byrbNgkt/.REKPQdfg287. <==這就是產生的md5 密碼!
一個啓動Linux的菜單項
title Linux*:指定此菜單項的名稱,既在grub列表裏的名稱
root  (hd0,0): 指定啓動分區,注意,編號從0開始:比如第一塊硬盤的第一個分區應該是(hd0,0)。啓動分區的編號可以使用fdisk -l查詢,但是需要root權限
kernel /boot/vmlinuz-2.6.20-16-generic: 系統內核
root=UUID=3f784cd9-516f-4808-a601-b19356f6bdea ro quiet splash locale=zh_CN vga=0x318:
指定啓動的內核的絕對路徑和名稱,後邊跟參數,一般來說root參數就是你的根文件系統,一定要有的,可以像範例中使用 uuit表示,也可以直接使用/dev/sda2或者/dev/hda1這樣的表示。其實有root和kernel兩行就可以啓動linux了
initrd  /boot/initrd.img-2.6.20-16-generic: 指定系統啓動訪問真正的根文件系統前,訪問的ramdisk映象
savedefault: 如果選擇了這個啓動項,那麼下次啓動時就用此項作爲默認項. 在前面設置爲default saved時有效
Linux kernel常用的參數
root:根文件系統的位置。
ro:可讀寫,當啓動分區是JFS等格式時需要使用此參數使得系統可以在啓動是存放日誌。
quiet:安靜模式,不顯示核心檢測的信息。
splash:顯示徽標。
locale:指定locale
vga:指定終端的顯示模式。要調整tty1 ~ tty6 終端機的分辨率呢參考下面表格(此爲十進制數值):彩度/分辨率bit
640x480         800x600         1024x768         1280x1024
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
b)        啓動項的操作
對於多個啓動項,可以選擇啓動項後,點擊e進入編輯狀態,完成後可以是點擊b按鍵進行引導。萬一/boot/grub/menu.lst 設定錯誤,或者是因爲安裝的緣故,或者是因爲核心檔案的緣故,導致無法順利開機時,記得啊,可以在grub 的選單部分, 使用grub shell 的方式去查詢(find) 或者是直接指定核心檔案,就能夠開機。
c)        救援模式:
當系統連單用戶模式都無法進入時或出現GRUB命令行也不能解決的引導問題,我們就需要使用Linux救援模式來進行故障排除了。步驟如下:
1、將Linux安裝光盤放入光驅,F2進入BIOS設置爲光盤引導,F10保存退出,當Linux安裝畫面出現後,在“boot:”提示符後輸入“linux rescue”回車進入救援模式。(F5鍵查看模式詳細信息)
2、系統會檢測硬件,引導光盤上的Linux環境,提示選擇救援模式下使用的語言,選擇英文,中文爲亂碼;鍵盤設置用默認的“us”就好;網絡設置暫不用。
3、接下來系統將試圖查找根分區。默認在救援模式,硬盤的根分區將掛載到光盤Linux環境的/mnt/sysimage目錄下,默認選項“continue”表示掛載權限爲讀寫; “Read-only”爲只讀,如果出現檢測失敗可以選擇“skip”跳過。此處,因爲要對系統進行修復,所以需要有讀寫權限,一般選擇默認選項 “continue”。進入下一步後,系統提示執行“chroot /mnt/sysimage”命令,可以將根目錄掛載到我們硬盤系統的根目錄中去。
4、修改引導配置文件vim /boot/grub/grub.conf,輸入grub命令可以修復引導程序
grub> root (hd0,0) 和title下的root一致
grub>setup (hd0) 真正的修復
grub>quit 退出
案例一:雙系統啓動修復
當我們安裝雙系統環境,先安裝Linux再安裝Windows;或者已經安裝好雙系統環境的Windows損壞,在重新安裝Windows後,保存 GRUB的MBR(Master Boot Record,主引導記錄)會被Windows系統的自舉程序NTLDR所覆蓋,造成Linux系統無法引導。
1、如果要恢復雙系統引導,首先用上述方法進入救援模式,執行chroot命令如下:
sh-3.1# chroot /mnt/sysimage
2、將根目錄切換到硬盤系統的根目錄中,然後執行grub-install命令重新安裝GRUB:
sh-3.1# grub-install /dev/hda
“/dev/hda”爲硬盤名稱,如使用SCSI硬盤或Linux安裝在第二塊IDE硬盤,此項設置要做相應調整。
3、然後依次執行exit命令,退出chroot模式及救援模式(執行兩次exit命令):
sh-3.1# exit
sh-3.1# exit
系統重啓後,將恢復GRUB引導的雙系統啓動。
案例二:系統配置文件丟失修復
如果/etc/inittab誤刪除或修改錯誤,Linux將無法正常啓動。此時,只有通過救援模式纔可以解決此類問題。
1、有備份文件的恢復辦法
進入救援模式,執行chroot命令後,如果有此文件的備份(強烈建議系統中的重要數據目錄,如/etc、/boot等要進行備份),直接將備份文件拷貝回去,退出重啓即可。如果是配置文件修改錯誤,如比較典型的/boot/grub/grub.conf及/etc/passwd的文件修改錯誤,也可以直接修正恢復。假設有備份文件/etc/inittab.bak,則在救援模式下執行:
sh-3.1# chroot /mnt/sysimage
sh-3.1# cp /etc/inittab.bak /etc/inittab
2、沒有備份文件的恢復辦法
如果一些配置文件丟失或軟件誤刪除,且無備份,可以通過重新安裝軟件包來恢復,首先查找到/etc/inittab屬於哪一個RPM包(即便文件丟失,因爲存在RPM數據庫,一樣可以查找到結果):
sh-3.1# chroot /mnt/sysimage
sh-3.1# rpm -qf /etc/inittab
initscripts-8.45.3-1
退出chroot模式:
sh-3.1# exit
掛載存放RPM包的安裝光盤(在救援模式下,光盤通常掛載在/mnt/source目錄下):
sh-3.1# mount /dev/hdc /mnt/source
Fedora系統的RPM包存放在光盤Fedora/RPMS目錄下,其他Linux存放位置大同小異,這裏不一一列舉;另外,因爲要修復的硬盤系統的根目錄在/mnt/sysimage下,需要使用--root選項指定其位置。覆蓋安裝/etc/inittab文件所在的RPM包:
sh-3.1# rpm -ivh --replacepkgs --root /mnt/sysimage /mnt/source/Fedora/RPMS/ initscripts-8.45.3-1.i386.rpm
其中的rpm命令選項“--replacepkgs”表示覆蓋安裝,執行完成後,即已經恢復了此文件。如果想只提取RPM包中的/etc/inittab文件進行恢復,可以在進入救援模式後,執行命令:
sh-3.1# rpm2cpio /mnt/source/Fedora/RPMS/initscripts-8.45.3-1.i386.rpm
| cpio -idv ./etc/inittab
sh-3.1# cp etc/inittab /mnt/sysimage/etc
注意此命令執行時不能將文件直接恢復至/etc目錄,只能提取到當前目錄下,且恢復的文件名稱所在路徑要寫完整的絕對路徑。提取文件成功後,將其複製到根分區所在的/mnt/sysimage目錄下相應位置即可。
d)        inittab配置文件錯誤(/etc/inittab)
這個文件設定錯誤導致的無法開機!根據開機流程,我們知道runlevel 0~6 都會讀取/etc/inittab文件, 因此你使用單用戶模式也是要讀取/etc/inittab 來進行開機的。這時是無法進入單人維護模式的,那就需要告訴核心不要執行init ,改使用bash,從而略過init,操作同樣在開機進入grub 後,同樣在grub edit 的情況下這樣做:
grub edit> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quiet init=/bin/bash
因爲我們指定了核心呼叫的第一支程序(init) 變成/bin/bash,因此/sbin/init 就不會被執行。又根據開機流程的說明,我們知道此時雖然可以利用root 取得bash 來工作,但此時(1)除了根目錄外,其它的目錄都沒有被掛載; (2)根目錄被掛載成爲只讀狀態。因此我們還需要進行一些動作才行!如下所示:

僅下達兩個指令,『mount -o remount,rw / 』用途是將根目錄重新掛載成爲可寫, 至於『mount -a 』則是參考/etc/fstab 的內容重新掛載檔案系統!此時你又可以開機進行救援的工作了! 只是救援完畢後,你得要使用『reboot 』重新開機一次
e)如果grub.conf文件損壞,不能正常啓動系統,啓動時進入grub提示狀態:
注意:以下grub環境可以使用Tab鍵補全喲!
grub>
3.  設置grub的根設備爲linux內核所在分區,因爲我的/boot分區安裝在第一塊硬盤的第一個分區,所以設置爲(hd0,0),注意這裏是不區分IDC硬盤與SCSI硬盤的!
grub> root (hd0,0)
4.  設置內核參數,加載內核文件,因爲我是安裝的獨立的/boot分區,如果/boot分區是放在/分區下面,則內核文件要指定爲/boot/vmlinuz-verstion!
grub>kernel /vmlinuz-2.6.18-53.el5PAE ro root=/dev/VolGroup00/LogVol00 rhgb quiet
5.  加載內核鏡像文件
grub> initrd /initrd-2.6.18-53.el5PAE.img
6.  引導系統
grub>boot
7.  進入系統後,修復或者創建新的/boot/grub/grub.conf文件,確保系統下次能夠正常啓動;
8.如果你有光盤,還有另外一種修復方法,即進入linux rescue模式去修復grub.conf文件。
a) 光盤引導,進入linux rescue模式
boot: linux rescue
b) 根目錄切換
sh-3.1#chroot /mnt/sysimage
c) 現在就可以修復或者重建grub.conf文件啦
sh-3.1# vi /boot/grub/grub.conf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章