前面咱們已經介紹過以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指定的命令終止,便從新運行該命令