天天看點

Linux引導過程及服務控制

一. Linux的引導過程

(1) 開機自檢(BIOS):BIOS(Basic Input/Output System),基本輸入輸出系統,該系統存儲于主機闆的ROM晶片上,計算機在開機時,會最先讀取該系統,然後會有一個加電自檢過程,這個過程其實就是檢查CPU和記憶體,計算機最基本的組成單元(控制器、運算器和存儲器),還會檢查其他硬體,若沒有異常就開始加載BIOS程式到記憶體當中。詳細的BIOS功能,這邊就不說了,BIOS主要的一個功能就是存儲了磁盤的啟動順序,BIOS會按照啟動順序去查找第一個磁盤頭的MBR資訊,并加載和執行MBR中的Bootloader程式,若第一個磁盤不存在MBR,則會繼續查找第二個磁盤(PS:啟動順序可以在BIOS的界面中進行設定),一旦BootLoader程式被檢測并加載記憶體中,BIOS就将控制權交接給了BootLoader程式。

(2) MBR引導: MBR(Master Boot Record),主引導記錄,MBR存儲于磁盤的頭部,大小為512bytes,其中,446bytes用于存儲BootLoader程式,64bytes用于存儲分區表資訊,最後2bytes用于MBR的有效性檢查。

(3) GRUB菜單:

GRUB(Grand Unified Bootloader),多系統啟動程式,其執行過程可分為三個步驟:

    Stage1:這個其實就是MBR,它的主要工作就是查找并加載第二段Bootloader程式(stage2),但系統在沒啟動時,MBR根本找不到檔案系統,也就找不到stage2所存放的位置,是以,就有了stage1_5

    Stage1_5:該步驟就是為了識别檔案系統

    Stage2:GRUB程式會根據/boot/grub/grub.conf檔案查找Kernel的資訊,然後開始加載Kernel程式,當Kernel程式被檢測并在加載到記憶體中,GRUB就将控制權交接給了Kernel程式。

    PS:實際上這個步驟/boot還沒被挂載,GRUB直接識别grub所在磁盤的檔案系統,是以實際上應該是/grub/grub.conf檔案,該配置檔案的資訊如下:

grub.conf: 

#boot=/dev/sda

default=0 #設定預設啟動的title的編号,從0開始

timeout=5 #等待使用者選擇的逾時時間

splashimage=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景圖檔

hiddenmenu #隐藏菜單

title CentOS (2.6.18-194.el5PAE) #核心标題

root (hd0,0) #核心檔案所在的裝置

kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #核心檔案路徑以及傳遞給核心的參數

initrd /initrd-2.6.18-194.el5PAE.img #ramdisk檔案路徑

(4) 加載Linux核心(Kernel):

Kernel,核心,Kernel是Linux系統最主要的程式,實際上,Kernel的檔案很小,隻保留了最基本的子產品,并以壓縮的檔案形式存儲在硬碟中,當GRUB将Kernel讀進記憶體,記憶體開始解壓縮核心檔案。講核心啟動,應該先講下initrd這個檔案,

  initrd(Initial RAM Disk),它在stage2這個步驟就被拷貝到了記憶體中,這個檔案是在安裝系統時産生的,是一個臨時的根檔案系統(rootfs)。因為Kernel為了精簡,隻保留了最基本的子產品,是以,Kernel上并沒有各種硬體的驅動程式,也就無法識rootfs所在的裝置,故産生了initrd這個檔案,該檔案裝載了必要的驅動子產品,當Kernel啟動時,可以從initrd檔案中裝載驅動子產品,直到挂載真正的rootfs,然後将initrd從記憶體中移除。

  Kernel會以隻讀方式挂載根檔案系統,當根檔案系統被挂載後,開始裝載第一個程序(使用者空間的程序),執行/sbin/init,之後就将控制權交接給了init程式。

(5) Init程序初始化:

init,初始化,顧名思義,該程式就是進行OS初始化操作,實際上是根據/etc/inittab(定義了系統預設運作級别)設定的動作進行腳本的執行,第一個被執行的腳本為/etc/rc.d/rc.sysinit,這個是真正的OS初始化腳本,簡單講下這個腳本的任務(可以去看看實際腳本,看看都做了什麼):

① 激活udev和selinux;

② 根據/etc/sysctl.conf檔案,來設定核心參數;

③ 設定系統時鐘;

④ 裝載硬碟映射;

⑤ 啟用交換分區;

⑥ 設定主機名;

⑦ 根檔案系統檢測,并以讀寫方式重新挂載根檔案系統;

⑧ 激活RAID和LVM裝置;

⑨ 啟用磁盤配額;

⑩ 根據/etc/fstab,檢查并挂載其他檔案系統;

⑪ 清理過期的鎖和PID檔案

1) /etc/inittab配置預設運作級别:

inittab檔案的結構:id runlevels action process

① id 用于在inittab檔案中唯一辨別一個配置記錄

②runlevels 用于指定該記錄在哪些運作級别中運作

③action 用于描述記錄将執行哪種類型的動作

④ process 用于設定啟動程序所執行的指令

2) /etc/sysconfig/init:控制tty終端的開啟數量、終端顔色方案

3) /etc/init/rcS.conf:加載rc.sysinit腳本,完成系統初始化任務

4) /etc/init/rc.conf:相容腳本,負責各運作級别的調用處理

5) /etc/init/rcS-sulogin.conf:為單使用者模式啟動/sbin/sushell環境

6) /etc/init/control-alt-delete.conf:控制終端下的Ctrl+Alt+Del熱鍵操作

7) /etc/init/start-ttys.conf:配置tty終端的開啟數量、裝置檔案

8) /etc/init/tty.conf:控制tty終端的開啟

(6) Runlevel:

  runlevel,運作級别,不同的級别會啟動的服務不一樣,init會根據定義的級别去執行相應目錄下的腳本,Linux的啟動級别分為以下幾種

  0:關機模式

  1:單一使用者模式(直接以管理者身份進入)

  2:多使用者模式(無網絡)

  3:多使用者模式(指令行)

  4:保留

  5:多使用者模式(圖形界面)

  6:重新開機

  在不同的運作級别下,/etc/rc.d/rc這個腳本會分别執行不同目錄下的腳本

• Run level 0 – /etc/rc.d/rc0.d/

• Run level 1 – /etc/rc.d/rc1.d/

• Run level 2 – /etc/rc.d/rc2.d/

• Run level 3 – /etc/rc.d/rc3.d/

• Run level 4 – /etc/rc.d/rc4.d/

• Run level 5 – /etc/rc.d/rc5.d/

• Run level 6 – /etc/rc.d/rc6.d/

  這些目錄下的腳本隻有K和S開頭的檔案,K開頭的檔案為開機需要執行關閉的服務,S開頭的檔案為開機需要執行開啟的服務。

二. 服務控制及優化啟動過程

(1) 系統服務控制

① 使用systemctl工具:

格式:systemctl控制類型 服務名稱

列:[root@localhost~]#systemctl start network

[root@localhost~]#systemctl restart network

[root@localhost~]#systemctl stop network

[root@localhost~]#systemctl status network

network.service - LSB: Bring up/down networking

Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)

Active: inactive (dead) since Tue 2018-11-06 21:02:31 CST; 4s ago

Docs: man:systemd-sysv-generator(8)

Process: 8108 ExecStop=/etc/rc.d/init.d/network stop (code=exited, status=0/SUCCESS)

Process: 4455 ExecReload=/etc/rc.d/init.d/network reload (code=killed, signal=TERM)

Process: 7834 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)

繼續閱讀