[Linux學習筆記] Linux系統引導流程(一)

前面咱們已經介紹過以CentOS爲例的Linux系統的安裝以及Linux經常使用命令的使用,本節內容咱們將介紹Linux系統引導流程。當按下電源的那一刻,到咱們看到用戶界面,這其中都發生了些什麼呢?趕快來一探究竟.shell

下圖爲Linux系統引導流程過程圖: 
bash

如下對Linux引導流程過程作一個簡單的說明: 服務器

1. POST加電自檢spa

POST(POST ON SELF TEST)首先對每個設備進行檢查,完成後會尋找存有引導記錄的設備,找到讀入操做系統的引導記錄,將系統控制權交給引導記錄。
操作系統

2. MBR引導
code

MBR(Master Boot Record),MBR記錄通常是在磁盤0磁道1扇區,共512字節,前446個字節是BootLoader,後面的4*16個字節是存放分區信息的,最後兩個字節是校驗信息的 。
orm

3. GRUB加載內核
進程

GRUB(GRand Unified Bootloader)就是MBR前446個字節,是Booloader的一種,它的做用是選擇要啓動的內核。
圖片

GRUB用於載入內核,查看GRUB配置文件: CentOS-7系統: /boot/grub2/grub.cfgip

內核啓動後完成了兩件事: (1)驅動硬件; (2)啓動init進程

4. 啓動init進程

init啓動後讀取inittab配置文件,執行缺省運行級別,從而繼續引導進程。在UNIX系統中,init是第一個能夠存在的進程,它的PID恆爲1,但它也必須想一個更高級的功能負責: PID爲0的內核調度器(分配CPU時間)。

這個過程包含了多個步驟,以CentOS-7之前的系統爲例說明:

    (1) 讀取/etc/inittab,選擇默認級別<經常使用的運行級別有3:表示多用戶; 5:X Window環境,關於運行級別的內容放在本文最後,而且十分重要>

    (2) 執行初始化系統腳本,這個腳本在/etc/rc.d/rc.sysinit中

    (3) 執行/etc/rc.d/rcX.d/下的腳本<默認級別是5,則會讀取rc5.d下的全部腳本,來控制系統啓動的時候啓動或關閉那些服務>

        這裏的腳本大體分爲兩類,以S開頭的和以K開頭的。 

        S:表明開機啓動的 

        K:表示開機時不啓動的 

        文件命令格式,例如: 

        S01sysstat S: 開機啓動; 01: 啓動次序; sysstat: 啓動腳本名。注意: 該文件爲軟連接

    (4) 執行/etc/rc.d/rc.local腳本,這是啓動過程當中最後啓動的一個腳本,而後會執行/bin/login 登錄用戶。

下面圖片中將更具體的展示了系統啓動過程當中經歷的過程:


注意:

CentOS-7版本之前系統inittab配置文件存放目錄: /etc/inittab

CentOS-7系統inittab配置文件也存放在/etc/inittab,但並未作實際配置,而是引向了運行級別配置文件

-------------------------------------------------------------------------------- L v S a n t o r i n i 的 分 割 線 -------------------------------------------------------------------------------- 

設置開機自啓動服務或程序:

(1) 肯定系統運行級別

(2) 編寫腳本文件,並賦予文件可執行權限

(3) 建立對應的軟鏈接文件置於在對應的rcN.d目錄下(N表示運行級別: 0,1,2,3,4,5,6)

    注意: 軟鏈接文件名要以啓動腳本命名規範來命名,例如: S10sysstat

如此操做,下次設備重啓就能夠執行自定義的啓動腳本了。

舉例(CentOS 7之前版本)<此段因爲無設備環境,未驗證,讀者可看下邊用chkconfig添加啓動服務的示例>:

[root@localhost rc5.d]# cd /etc/rc.d/rc5.d
[root@localhost rc5.d]# pwd
/etc/rc.d/rc5.d
[root@localhost rc5.d]# vi /etc/rc.d/init.d/start.script 
[root@localhost rc5.d]# cat /etc/rc.d/init.d/start.script 
date >> /home/santorini/out.log
who >> /home/santorini/out.log
ls -l /etc >> /home/santorini/out.log
[root@localhost rc5.d]# ll /etc/rc.d/init.d/start.script 
-rw-r--r--. 1 root root 101 Nov 16 21:36 /etc/rc.d/init.d/start.script
[root@localhost rc5.d]# chmod 755 /etc/rc.d/init.d/start.script 
[root@localhost rc5.d]# ll /etc/rc.d/init.d/start.script 
-rwxr-xr-x. 1 root root 101 Nov 16 21:36 /etc/rc.d/init.d/start.script
[root@localhost rc5.d]# ln -s /etc/rc.d/init.d/start.script S20defineBySantorini
[root@localhost rc5.d]# ll
total 0
lrwxrwxrwx. 1 root root 20 Nov 14 10:24 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Nov 16 21:00 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 29 Nov 16 21:39 S20defineBySantorini -> /etc/rc.d/init.d/start.script

在介紹完下面的chkconfig命令後,咱們將給出CentOS-7系統如何運行安裝自啓動服務.

chkconfig命令:

chkconfig命令主要用來更新(啓動或中止)和查詢系統服務的運行級信息。chkconfig不是當即自動禁止或激活一個服務,它只是簡單的改變了符號鏈接.

語法: 
chkconfig [--add][--del][--list][系統服務] 或 chkconfig [--level <等級代號>][系統服務][on/off/reset]
參數用法:
 --add  增長所指定的系統服務,讓chkconfig指令得以管理它,並同時在系統啓動的敘述文件內增長相關數據;
 --del  刪除所指定的系統服務,再也不由chkconfig指令管理,並同時在系統啓動的敘述文件內刪除相關數據;
 --level<等級代號>  指定讀系統服務要在哪個執行等級中開啓或關閉;
詳細:
chkconfig --list [name]:顯示全部運行級系統服務的運行狀態信息(on或off)。若是指定了name,那麼只顯示指定的服務在不一樣運行級的狀態。
chkconfig --add name:增長一項新的服務。chkconfig確保每一個運行級有一項啓動(S)或者殺死(K)入口。若有缺乏,則會從缺省的init腳本自動創建。
chkconfig --del name:刪除服務,並把相關符號鏈接從/etc/rc[0-6].d刪除。
chkconfig [--level levels] name [on/off/reset]:設置某一服務在指定的運行級別是啓動,中止仍是重置。

CentOS-7系統安裝自啓動服務:

[root@localhost init.d]# pwd
/etc/rc.d/init.d
[root@localhost init.d]# vi defined 
[root@localhost init.d]# cat defined 
#!/bin/bash
#chkconfig: 5 10 90   (注意10表示啓動優先級,90表示中止優先級, 5表示運行級別)
#description: define
date >> /Hello.log
ls -l /etc >> /Hello.log
[root@localhost init.d]# ls -l
total 36
-rw-r--r--. 1 root root    97 Nov 17 21:49 defined
-rw-r--r--. 1 root root 13430 Jan 15  2015 functions
-rwxr-xr-x. 1 root root  2989 Jan 15  2015 netconsole
-rwxr-xr-x. 1 root root  6470 Jan 15  2015 network
-rw-r--r--. 1 root root  1160 Mar  6  2015 README
[root@localhost init.d]# chmod 755 defined 
[root@localhost init.d]# ls -l
total 36
-rwxr-xr-x. 1 root root    97 Nov 17 21:49 defined
-rw-r--r--. 1 root root 13430 Jan 15  2015 functions
-rwxr-xr-x. 1 root root  2989 Jan 15  2015 netconsole
-rwxr-xr-x. 1 root root  6470 Jan 15  2015 network
-rw-r--r--. 1 root root  1160 Mar  6  2015 README
[root@localhost init.d]# chkconfig --add defined 
[root@localhost init.d]# cd /etc/rc.d/rc5.d
[root@localhost rc5.d]# pwd
/etc/rc.d/rc5.d
[root@localhost rc5.d]# ll
total 0
lrwxrwxrwx. 1 root root 20 Nov 14 10:24 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Nov 17 21:43 S10defined -> ../init.d/defined
lrwxrwxrwx. 1 root root 17 Nov 16 21:00 S10network -> ../init.d/network

CentOS-7安裝自啓動服務步驟:

(1) 在/etc/init.d目錄下新建開機啓動時要執行的腳本,並賦予執行權限

(2) 使用chkconfig --add 命令添加啓動服務.(執行完此命令後將在對應的運行級別rcN.d下生成相應的軟連接文件,而且軟連接指向/etc/init.d下剛纔建立的執行腳本)

ntsysv命令:

ntsysv:相似圖形界面管理模式來設置開機啓動服務。(RedHat特有的,基本上chkconfig就很好用了)

注意: 執行此命令須要root用戶權限

總結一下功能按鈕:

上下鍵:能夠在中間的方框當中,在各個服務之間移動;

空格鍵:能夠用來選擇或取消你所須要或須要取消的服務,[*]表示開機啓動;

tab鍵:能夠在方框、OK、Cancel之間移動;

[F1]鍵:能夠顯示該服務的說明。

[root@localhost ~]# runlevel   ##查看當前運行級別
N 5
[root@localhost ~]# ntsysv --level 3   ##設置運行級別爲3的開機啓動項
[root@localhost ~]# ntsysv    ##設置當前運行級別的開機啓動項

下圖爲鍵入ntsysv後顯示的類圖形界面:

+++++++++++++++++++++++++++++++++++++++++++ O T H E R   I N T R O D U C T I O N ++++++++++++++++++++++++++++++++++++++++++++++++

相關概念:

CMOS: 在計算機領域,CMOS常指保存計算機基本啓動信息(如日期、時間、啓動設置等)的芯片。有時人們會把CMOS和BIOS混稱,其實CMOS是主板上的一塊可讀寫的並行或串行FLASH芯片,是用來保存BIOS的硬件配置和用戶對某些參數的設定。

硬件時鐘(hwclock)和軟件時鐘(系統時間):

[root@localhost ~]# date   ##軟件時鐘
Sat Nov 14 08:28:12 CST 2015
[root@localhost ~]# hwclock   ##硬件時鐘
Sat 14 Nov 2015 08:27:35 AM CST  -0.192386 seconds

軟硬件同步時鐘及時間設置:

-s, --hctosys        set the system time from the hardware clock  ##將系統時間設置爲硬件時鐘
-w, --systohc        set the hardware clock from the current system time  ##將硬件時鐘設置爲系統時間
[root@localhost ~]# hwclock --set --date="2011-08-14 16:45:05"  ##設置硬件時鐘時間
[root@localhost ~]# date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]  ##設置系統時間

runlevel(運行級別):

    runlevel 用來表示在init進程結束以後的系統狀態,在系統的硬件中沒有固定的信息來表示runlevel,它純粹是一種軟件結構。init和 inittab是runlevel影響系統狀態的惟一緣由。下面簡單說明各運行級別runlevel:

0 - halt 關機,讓init關閉全部進程並關機;

1 - Single user mode 單用戶模式,只能系統管理員進入,沒有圖形界面,在該模式下處理在有登陸用戶時不能進行更改的文件;

2 - Multiuser,without NFS 容許系統進入多用戶的模式,沒有圖形界面,但並不支持文件共享,這種模式不多應用;

3 - Full multiuser mode 最經常使用的運行模式,主要用來提供真正的多用戶模式,也是多數服務器的缺省模式;

4 - unused 通常不被系統使用;

5 - X11 將系統初始化爲專用的X Window終端;

6 - 關閉全部運行的進程並從新啓動系統(系統將不斷重啓).

運行級別的切換:

[root@localhost ~]# init 5

inittab文件剖析:

在inittab中,全部條目採起如下格式:  id:run-levels:action:process

id:標識符,通常爲兩位字母或數字

run-levels:指定運行級別,能夠指定多個

action:指定運行狀態

process:指定要運行的腳本/命令

=====

action經常使用取值:

initdefault: 指定系統缺省啓動的運行級別;

sysinit: 系統啓動執行process中指定的命令

wait: 執行process中指定的命令,並等其結束在運行其餘命令

once: 執行process中指定的命令,不等待其結束

ctrlaltdel: 按下Ctrl+Alt+Del時執行process指定的命令

powerfail: 當出現電源錯誤時執行process指定的命令,不等待其結束

powerokwait: 當電源恢復時執行process指定的命令

respawn: 一旦process指定的命令終止,便從新運行該命令

相關文章
相關標籤/搜索