Linux啟動之個人總結

來源:互聯網
上載者:User

以下文章包含了一些網上的內容,也有自己學習過程中自己的總結,以前在某個網站上發過一次,這裡也發一下,目的在於拋磚引玉。
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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.