Linux啓動流程和grub詳解


   


 還記得Windows的啓動流程嗎?相信大家能說出來個大概,爲什麼說出個大概呢,因爲Windows是圖形界面啓動的,但是開機過程都做了什麼,你知道嗎,相反,Linux啓動的時候,會把這些加載到屏幕上面顯示,那接下來我們來看看Linux啓動都發生了些什麼把!!!


Linux啓動流程圖

wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg


簡解開機啓動流程

    當用戶打開電源後,BIOS開機自檢,確定啓動設備,安裝啓動設備啓動設備上面安裝的GRUB開始引導Linux,Linux首先先進行內核引導,通過跟切換,執行init程序,init程序確定啓動級別,根據啓動級別進行系統初始化和運行的服務,然後返回init啓動終端,用戶通過驗證成功登陸Shell,這就是一個從開機到登陸的啓動過程


第一步:硬件引導啓動


wKioL1fVBKryShbGAADrFHTlj-4910.png


這一部分簡單的說就是,BIOS程序引導並加載MBRBootloader程序,也即grub bootloader程序。


當用戶打開電源後POST開始自檢,檢測硬件設備是否確實或者存在故障(是否影響正常開機),如果不影響正常開機,就把任務交給BIOS


BIOS通過搜索,安裝啓動確定啓動設備


啓動項爲硬盤,BIOS去讀取硬盤的前512字節到內存,找到BootLoader,確定GRUB


第二步:GRUB引導啓動內核

wKiom1fVCCiS_otBAACaCaDmT6Y903.png

這一步分概況起來即使:GRUB程序加載執行並開始引導kernel程序

Boot Loader就是在操作系統內核運行之前運行的一小段程序。通過GRUB引導可以確定內核程序,因爲引導扇區只有446字節,GRUB只是一個小的程序安裝在裏面,真正使用的在MBR後面的扇區存放,我們想使用Bootloader GRUB功能必須讀取後面的文件,Bootloader GRUB功能程序的運行和加載配置選項分爲三個階段


A.Stage1階段:

Stage1階段其實就是執行系統安裝時預先寫入到MBR的Bootloader中的程序。

Stage1階段的任務僅是將硬盤0柱面0磁道2扇區的內容讀入內存並執行,它是Stage1.5階段或Stage2階段的入口,引導進入Stage1.5階段或Stage2階段。 

在此Stage1階段,還沒有識別文件系統的能力。


B.Stage1.5階段

stage1.5階段是stage1階段和stage2階段的中間橋樑。stage1.5階段具有識別啓動分區文件系統的能力,此後GRUB程序便有能力去訪問/boot分區下/grub目錄下的 stage2文件,並將stage2載入內存執行。


C.Stage2階段

Stage2階段執行時,首先會解析GRUB程序的配置文件grub.conf,並依配置文件決定是否顯示系統啓動菜單。然後加載內核鏡像到內存中,通過initrd程序建立RAMDisk內存虛擬根文件系統。此時控制權將轉交給內核程序。


第三部:內核引導啓動

wKiom1fVClews7eUAAA00sCzm-c795.png


這一部分主要是通過在內存中建立虛擬根文件系統實現相關設備的驅動並建立和切換到真正的根文件系統。


解壓內核鏡像加載到內存,以及initrd程序建立RAMDisk內存虛擬根文件系統後,內核開始驅動基本硬件,並調用虛擬根文件系統中的init程序加載驅動模塊初始化系統中各種設備的相關配置工作,其中包括CPU、I/O、存儲設備等。當所需的驅動程序加載完後,會根據grub.conf配置文件中“root=XXX”部分所指定的內容創建一個根設備,然後將根文件系統以只讀的方式掛載,並切換到真正的根文件系統上,同時調用系統進程的老祖宗進程/sbin/init程序,進入系統初始化階段。


第四步:系統初始化

wKiom1fVC3mg-U07AADipmcMw3g129.png

這一步是通過/sbin/init,init程序準備軟件運行壞境,啓動系統服務


通過/etc/inittab文件確定運行級別,然後去執行系統初始化腳本/etc/rc.sysinit,爲用戶初始化用戶空間環境,在完成初始化後,根據運行級別,系統開始對應級別的目錄啓動服務,關閉那些不要的服務(裏面S99local -> ../rc.local)用戶自動服務啓動腳本


文件詳解:

/etc/inittab文件

wKioL1fVHw_iyP9TAADW9PL__FM892.png

這個文件是設置系統啓動的默認級別


設置默認運行級別

  (1)運行級別:爲了系統的運行或維護等目的而設定的機制;

    0-6:共7個級別;

     0:關機,shutdown

     1:單用戶模式(single user),root用戶,無須認證,維護模式;

     2:多用戶模式(multi user),會啓動網絡功能,但不會啓動NFS,維護模式;

     3:多用戶模式(multi user),完全功能模式,文本界面;

     4:預留級別:目前無特別使用目的,但習慣以同3級別功能使用;

     5:多用戶模式(multi user),完全功能模式,圖形界面;

     6:重啓,reboot

centos5和6已經不一樣了,CentOS5這裏還可以設置【ctrl】+【alt】+【del】和【UPS】【tty】【和系統初始化腳本】,現在這些已經默認了,在這個文件由詳解


系統初始化腳本:/etc/rc.d/rc.sysinit

(1)設置主機名;

(2)設置歡迎信息;

(3)激活udev和selinux;

(4)掛載/etc/fstab文件中定義的所有文件系統;

(5)檢測根文件系統,並以讀寫方式重新掛載根文件系統;(重新掛載是指根文件檢測完之後)

(6)設置系統時鐘;

(7)根據/etc/sysctl.conf文件來設置內核參數;

(8)激活lvm即軟raid設備;

(9)激活swap設備;

(10)加載額外設備的驅動程序;(內核加載驅動只加載根文件系統的)

(11)清理操作;


腳本文件/etc/rc.d/

關閉/啓動對應級別下的服務

[root@localhost ~]# ls /etc/rc.d/
init.d  rc  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local  rc.sysinit

  腳本文件/etc/rc.d/rc作用爲當級別切換時啓動或停止服務;此腳本接受傳遞的參數給腳本中$runlevel變量,然後,讀取/etc/rc$runlevel.d/K*和/etc/rc$runlevel.d/S*所有文件,這些文件就是爲什麼開機啓動後,有些服務會自動啓動,有些服務沒有啓動的原因。

[root@localhost ~]# ls /etc/rc.d/rc3.d/
K01smartd          K69rpcsvcgssd      K95rdma          S13cpuspeed          S25netfs      S82abrtd
K05wdaemon         K73winbind         K99rngd          S13irqbalance        S26acpid      S90crond
K10psacct          K74ntpd            S01sysstat       S13rpcbind           S26haldaemon  S95atd
K10saslauthd       K75ntpdate         S02lvm2-monitor  S15mdmonitor         S26udev-post  S99firstboot
K15htcacheclean    K75quota_nld       S08ip6tables     S22messagebus        S28autofs     S99local
K15httpd           K84wpa_supplicant  S08iptables      S23NetworkManager    S50bluetooth
K30spice-vdagentd  K87restorecond     S10network       S24nfslock           S50kdump
K50dnsmasq         K89netconsole      S11auditd        S24rpcgssd           S55sshd
K60nfs             K89rdisc           S11portreserve   S25blk-availability  S80postfix
K61nfs-rdma        K92pppoe-server    S12rsyslog       S25cups              S82abrt-ccpp

K*:要停止的服務,K##*,優先級,數字越小,越優先關閉,依賴的服務先關閉,然後再關閉被依賴的。

S*:要啓動的服務,S##*,優先級,數字越小,越是優先啓動,被依賴的服務先啓動,而依賴的服務後啓動。

這些文件都是鏈接文件,它們鏈接到了/etc/init.d/*目錄下的各個程序的,例如ntpd這個腳本

[root@localhost ~]# ls /etc/rc.d/rc3.d/K74ntpd -ld
lrwxrwxrwx. 1 root root 14 Jul 25 08:38 /etc/rc.d/rc3.d/K74ntpd -> ../init.d/ntpd


那我們怎麼設置某一服務下次重啓系統後是該關閉或者開啓呢?可以使用chkconfig命令實現:

checkconfig 

命令格式:

chkconfig [options] Service_Name [on|off] 
    Options: 
         --add              #→添加程序服務 
         --list             #→列出當前系統上所有的服務對應的級別是關閉還是啓動 
         --del              #→刪除某個服務(只是刪除鏈接文件,不刪除原文件) 
         --level [on|off]   #→指定某個服務對應哪些級別是on或off


用戶自定義開機啓動程序,可以根據自己的需求將一些執行命令或是寫到腳本/etc/rc.d/rc.local.當開機時就可以自動加載啦!

[root@localhost ~]# ll /etc/rc.d/rc3.d/S99local 
lrwxrwxrwx. 1 root root 11 Jul 25 08:37 /etc/rc.d/rc3.d/S99local -> ../rc.local


第五步:啓動終端,用戶登錄shell

wKioL1fVEcLxmKhIAACaOKZ5zJ8383.png

這一步是用戶登錄shell過程


如果沒有改變級別,默認情況執行/sbin/mingetty打開6個純文本終端,讓用戶輸入用戶名和密碼。輸入完成後,再調用login程序,覈對密碼。如果密碼正確,就從文件 /etc/passwd 讀取該用戶指定的shell,然後啓動這個shell。



GRUB詳解

當計算機加電自檢後,ROM BIOS加載MBR(主引導扇區,即硬盤第一扇區)中的代碼到內存中,這個扇區一共512字節,前446字節內容存放grub(bootloader)的關鍵引導程序,接着64字節放置硬盤分區表DPT(Disk Partition Table),一共四可以有四個主分區,佔64個字節,這也是爲什麼主分區最多隻有四個的原因,最後2個字節是固定的標誌0x55AA。當BIOS把引導程序加載到內存後就把控制權交給grub,而後grub的剩餘代碼將完成其它代碼的加載和搬移以及文件系統初始化查找等工作,最終加載內核映像文件,從而把控制權交給真正的內核運行。

wKiom1fVFunRTkoWAAAWIeqKFKQ983.png


/boot/grub/grub.conf配置文件詳解:

[root@centos6 grub]# ll /etc/grub.conf #/etc/grub.conf /boot/grub/grub.conf爲連接文件
lrwxrwxrwx. 1 root root 22 8月  11 03:29 /etc/grub.conf -> ../boot/grub/grub.conf
[root@centos6 grub]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0 #設定默認啓動菜單項,默認爲0開始
timeout=5 #指定菜單等待選擇的時長 
splashimage=(hd0,0)/grub/splash.xpm.gz #指定菜單的背景圖片的路徑,爲xpm格式,採用gzip壓縮
hiddenmenu #是否影藏菜單
password --md5 $1$1S9Xy$1MuGZSoPc2vAtkW.jvz0X/ #菜單編輯認證
title CentOS 6 (2.6.32-642.el6.x86_64) #定義菜單項
password 123456 #可以選擇明文
root (hd0,0) #本次grub查找stage2及其kernel文件所在設備分區,指定grub的根
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=240533cf-b37f-4460-974f-702bab867da5 nomodeset rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet #需要啓動的內核 
initrd /initramfs-2.6.32-642.el6.x86_64.img #內核匹配的ramfs文件

我剛纔在裏面加入了兩個密碼,對GRUB的保護機制,輸入密碼才能編輯

生成加密的密文

[root@localhost ~]# grub-md5-crypt 
Password: 
Retype password: 
$1$1S9Xy$1MuGZSoPc2vAtkW.jvz0X/

wKiom1fVGgSjHTPYAAAWeIkdU0M871.png

問題來了

如果grub被破壞了導致系統無法啓動該怎麼辦???


通過光盤進入緊急救援模式來進行修復

1,用關盤啓動,在安裝界面選擇 Rescue installed system 進入救援模式

2,根據提示選擇語言和鍵盤

3,選擇是否配置網卡,選擇no

4,根據硬盤上的系統提示已經找到並掛載在/mnt/sysimage下,continue用讀寫模式加載

5,輸入 chroot /mnt/sysimage 改變磁盤根目錄

6,fdisk -l /dev/sda 使用fdisk檢查分區

7,grub-install /dev/sda 安裝grub引導程序到磁盤/dev/sda的MBR扇區

8,exit

centos 7的安裝修複方式

sh 3.1#grub

grub>root(hd0,0)

grub>setup(hd0)

grub>quit


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