一、Linux開機流程
(一)power on 開機後加載BIOS(Basic Input Output System,基本的輸入輸出系統),BIOS加載
CMOS中所存放的當前主機各項硬件配置、系統時間、連接設備等信息;然後運行POST自檢,
檢查硬件設備,再檢查啓動設備,讀取MBR(主引導記錄(Master Boot Record)),轉接給操
作系統。
BIOS與CMOS的區別
BIOS與CMOS都是存儲器。二者的區別是BIOS爲只讀存儲器 (ROM或EPROM),而CMOS爲隨機存儲器(RAM);BIOS中存儲 的是程序,而CMOS中存儲的是普通信息。
CMOS中保存着BIOS程序的設置結果。而且,CMOS中的用戶信息和常規設置需要在BIOS程序引導計算機啓動後才能載入 。
引導程序稱爲boot loader,
1、存放在MBR中。512字節分爲三部分:
1) Boot loader 446字節,相當於指針程序,
如果是雙系統,會出現兩個選項。
注意:操作系統不僅會向MBR中寫入相應的系統啓動程序,還會在系統安裝的分區或文件系統上的
第一個扇區保存操作系統安裝的另外一份boot loader。
windows的boot loader不具備控制權的轉交功能。linux的GNU GRUB啓動引導程序支持控制
權的轉交。所以安裝windows和Linux雙系統,要先裝windows。
2)Partition table(分區表)64字節,
3)Magic Number(檢驗碼)2字節(校驗位必須爲55AA,否則boot loader啓動無效)。
(二)相關目錄
1、boot目錄:
vmlinuz-2.6.18-194.el5 當前系統的內核文件
initrd-2.6.18.-194.el5.img 系統的工具箱
System.map-2.6.18-194.el5 系統kernel中的變量的對應表(kernel的索引文件)
Symvers-2.6.18-194.el5.gz 模塊的符號信息
config-2.6.18-194.el5 系統kernel的配置文件
2、grub目錄:
stage1 bootloader的第一部分,指向調用stage2
*1_5的文件,是stage1到stage2中間過程需要加載的中間程序,主要是文件驅動等,支持對應的文
件系統;支持對應的文件系統後,就可以讀取stage2
stage2 bootloader的第二部分,grub的主要程序
1)grub開始運行,grub配置文件爲grub.conf
vi grub.conf查看
default=0 指定默認啓動引導配置。0表示選擇第一個。如果系統有兩個系統是用title做爲系統
的分隔符,第一個title後面就是第一個系統,用0表示。
timeout=5 就是默認在啓動選擇界面停留的時間,單位是秒。等待5秒自動進入默認操作系統
splashimage = (hd0,0)/grub/splash.xpm.gz
hd0表示當前主機中的第一塊硬盤 ;
,後面的0代表第一個分區。
splash.xpm.gz gzip格式壓縮的xpm文件,xpm是一種圖形格式,該文件爲開機過程中顯示的紅色
背景
splashimage是grub啓動背景畫面,如果是自己寫grub.conf文件,可以不用寫。
hiddenmenu 不是一個參數,是開機倒計時不顯示選單的功能 。去掉後直接顯示選單。
title title後面就是系統在啓動時候顯示的文字
每一個title都是啓動選單中顯示的文字,到下一個title 中間的部分都是對引導選項的相關配
置。
root 指開機過程中grub加載的根文件系統位置
(hd0,0) 第一塊硬盤的第一個分區
kernel 當前指定的內核文件,內核所在位置和名稱
/vmlinuz-2.6.18-194.el5
ro root=LABEL=/ rhgb quiet 內核參數
ro read only以只讀方式掛接/根文件系統,
root 爲內核重新指定根目錄
LABEl=/ 以卷標名的方式描述一個分區,可以指定爲相應的設備名,如/dev/sda2。
以卷標方式表示的優點是避免磁盤加載前後出現的問題。
現在掛接的是真正的根目錄(爲了避免根目錄被破壞,以只讀方式掛接)。
rhgb彩色模式,表示redhat graphics boot,就是會看到圖片來代替啓動過程中顯示的文本信
息,這些信息在啓動後用dmesg也可以看到
quiet 靜默模式,表示在啓動過程中只有重要信息顯示,類似硬件自檢的消息不會顯示
initrd 在redhat3、4、5版本下都是以initrd方式加載內核工具箱。
/initrd-2.6.18-194.el5.img加載的目錄封裝的是最基本的模塊.。
initrd文件在內存中會解壓縮,內核把它當成/來掛接。
cpio:不支持讀取,只支持輸入(最開始用於備份磁帶)。
cpio -iv < initrd-2.6.18-194.el5.img 將文件傳輸給cpio,然後刪掉原文件,該目錄顯示爲
加載到內存,內核將initrd文件當成/來進行掛接;然後運行init第一個進程。文件類型、內容
如圖所示
vi init
init腳本中創建了/dev及子目錄、設備文件。
insmod加載模塊,/lib/下的ehci-hcd.ko, ohci-hcd.ko,uhci-hcd.ko這三個模塊是三種不同的
USB芯片的驅動模塊。
最後一條命令switchroot,切換根目錄,該命令的的結果是把當前根目錄的設置從initrd轉換爲
硬盤上真正的根目錄。現在是以只讀的方式掛接根文件系統。
總結:內核讀取到內存中,initrd在內存中掛接成內存中的文件系統,內核先將initrd內存中的
文件系統當成根來進行掛接,運行initrd內部的initrd程序(這個initrd程序其實是一個
腳本,這個腳本加載了一系列配置),切換到硬盤上真正的根,然後再運行硬盤上initrd
程序。
模塊文件保存在/lib/modules中,這就是/lib目錄必須掛載到/目錄下的原因。
3、grub出現故障如何修復
1)切換到grub目錄下,查看grub.conf文件
2) 查看grub.conf文件
vi grub.conf
注意:只有在redhat按照這個過程執行,redhat規定所有的配置文件以.conf文件結尾;
標準的linux系統下,加載的是menu.lst(軟鏈接文件,指向grub.conf)。
3)執行rm -f grub.conf,刪掉grub.conf
4)然後將grub的bootloader 破壞掉,
dd if=/dev/zero of=/dev/sda bs=446 count=1
從/dev/zero(虛擬文件,讀取的時候顯示無限個0)文件中抽取數據,寫到/dev/sda;執行結果是用
0把當前硬盤的頭446個字節覆蓋。
5)執行reboot重啓
6)顯示Operating system not found未安裝系統,系統無法引導
7)使用光盤的rescue模式修復
(1)進入光盤安裝界面,
(2)按F5鍵進入Rescue模式
(3)輸入linux rescue回車
(4)選擇安裝語言,默認English,點擊OK
(5)鍵盤模式默認us,點擊OK
(6)詢問是否開啓網絡,當前用不到,所以點擊No
(7)是否掃描當前的分區系統,自動掛接和加載,點擊Continue
(8)提示找到分區,並掛接到/mnt/sysimage
(9)執行chroot /mnt/sysimage
(10)現在可以找到硬盤根目錄,重新安裝grub,利用grub安裝程序重寫硬盤的MBR。使用grub-install
命令,查看使用方法
--root -directory=DIR 指定安裝grub的root目錄
--grub -shell=FILE 使用一個文件定義grub的shell程序
--recheck 檢查device map文件。如果存在的話.按照devicemap聲明的設備名,搜索設備。
devicemap文件屬性:
(11)執行grub-install --root-directory=/ --recheck /dev/sda(指定安裝的設備,安裝設備指的
某塊硬盤,不是某個分區)
(12)然後重新啓動,進入grub.shell,(一般直接修改grub.conf文件)
(13)查看root已經識別(hd0,0),修改kernel參數、initrd參數,加載完畢
(14)輸入boot,開始加載內核啓動系統。
(15)進入系統,現在如果重新啓動,依然出現grub提示符。因爲/boot/grub下的grun.conf文件仍未
恢復,完全修復系統還需要重新編寫grub.conf文件文件
vi grub.conf輸入如下內容
(16)再次重新啓動,系統已經修復完畢。
注意:爲了避免硬盤MBR損壞後無法,需要備份分區表。
備份命令
dd if=/dev/sda of=/root/bacup.img bs=512 count=1
將sda硬盤的頭512字節的數據保存到/root/bacup.img文件。
如果系統分區表,bootloader損壞,進入rescue修復模式,使用dd命令即可恢復。
(三)grub的結束是當前內核以只讀方式掛載根文件系統。然後運行磁盤上的init程序
(/sbin/init)。
這個init程序作用是找到系統配置文件(/etc/inittab),並且指定runlevel(系統運行級
別)。
vi /etc/inittab
runlevel模式
0 關機
1單用戶維護模式
2 多用戶模式,但不加載網絡服務
3 字符界面
4 系統保留,尚未使用
5 圖形模式
6 重啓
id:5 系統默認啓動模式
/etc/rc.d/rc.sysinit 開機啓動腳本
vi /etc/rc.d/rc.sysinit
/etc/inittab文件中
分別指定不同的runlevel級別下服務啓動的腳本;
l0 表示標籤;
0 表示不同runlevel級別;
wait等待前一個腳本運行完畢再運行下一個腳本;
腳本的內容:
該目錄下的軟鏈接文件以K打頭的服務系統腳本是不啓動的:以S打頭的是啓動的。數字代表啓
動或關閉的順序,如果數字相同則按照ASCII碼的順序排列。
鏈接的是/etc/rc.d/init.d/目錄下的腳本
不同的runlevel啓動級別區別是因爲啓動的服務腳本不同
特殊的是rc0.d,關機模式
除了開啓着兩個服務(殺死所有進程,關機),其餘全部關閉。