linux開機啓動流程:linux
1、BIOS 加電自檢
當你按電源開關開機時,電腦會首先去啓動BIOS(基本輸入輸出系統),BIOS通常是集成在主板上的.
BIOS 的工做
1.檢測鏈接硬件,好比顯卡,內存,磁盤等等,檢測的目的是之後把這些設備信息提供給操做系統
2.尋找啓動磁盤,每一種BIOS都會有開機啓動菜單,能夠在菜單裏設置以哪一個設備啓動系統
好比:光驅,硬盤,網絡等等,這個菜單能夠設置多個選項,依照設置次序在設備上尋找啓動信息
3.找到了啓動硬盤,接着BIOS就會在磁盤上找啓動扇區,找到內核啓動系統.
1)先試着尋找第一個扇區,也就是主引導記錄MBR(Master Boot Record)
2)若是第一個扇區上沒有沒有存在操做系統,再去尋找標記爲BOOT的分區.
不管是MBR仍是BOOT分區,存儲操做系統的空間都只有446字節;
若是沒有在上面提到的位置找到操做系統的內核,那麼BIOS就沒法繼續啓動工做.
而咱們的內核每每會大於446個字節,存放在磁盤的其餘位置上,既然446裝不下內核,又爲了能順利的找到放在其餘位置上的內核,
人們想出了一個辦法就在446字節裏寫了一個小程序,當BIOS試着啓動操做系統時就會執行這個小程序,而後再由小程序來載入其餘位置的內核.這個小程序就是啓動載入器(boot loader)
2、BOOT Loader
linux的boot loader(上文提到的小程序) 常見的有兩種:lilo grub
由於lilo存在着一個1024柱面的限制,而且更改了磁盤上的啓動信息文件後須要從新啓動系統才能同步446字節的內容,由於lilo的缺陷,已經被grub所取代.如今的絕大多數類linux系統都採用grub作boot loader;
grub則沒有了lilo各類限制,並且方便到能修改系統文件的啓動內容就能夠馬上與446內容同步.
那麼咱們就看看grub的內容 它存在於 /boot/grub中
GRUB有幾個重要的文件,STAGE一、STAGE1.五、STAGE2
STAGE1:它只有512字節,一般放在MBR中,它的做用很簡單,就是在系統啓動時用於裝載STAGE2並將控制權交給它。
STAGE2:GRUB的核心,全部的功能都是由它實現。
STAGE1.5:介於STAGE1和STAGE2之間,是它們的橋樑,由於STAGE2較大,一般都是放在一個文件系統當中的,可是STAGE1並不能識別文件系統格式,
因此才須要STAGE1.5來引導位於某個文件系統當中的STAGE2。根據文件系統格式的不一樣,STAGE1.5也須要相應的文件,如:e2fs_stage1_5,fat_stage1_5,分別用於識別ext和fat的文件系統格式。它存放於1-63的柱面之間.
引導順序以下:STAGE1->;STAGE1.5->;STAGE2,
主要的配置文件時 grub.conf
裏面選項含義:
title:一個操做系統引動的標頭,可使多個
root :指明所需文件存在於哪一個磁盤哪一個分區上 (hd0,0)表示第一個硬盤,第一個分區,可參考/boot/grub/device.map
kernel:內核文件的名字,而且會有一些加載內核時的參數 or表明以只讀方式加載
initrd:包含一些附加的驅動程序ios
3、內核啓動
內核啓動後會向bios查詢電腦的全部硬件信息,而後本身接手下來管理這些設備,以便提供給linux使用
內核會試着驅動這些設備,這些設備的驅動一部分包含在內核中,叫作靜態驅動,一部分以模塊的方式(動態)存放文件系統中,由
於此時還未掛載任何文件系統,所以還不能使用文件系統中的模塊,這裏只能驅動在內核中存在的硬件驅動程序的對應設備.想驅動內核中未包含的硬件驅動就須要加載文件系統.
內核會嘗試掛載根文件系統,根文件系統至少包含 /etc /bin /sbin /lib /dev 這5大目錄
他們5個缺一不可.都會致使系統沒法啓動
根文件系統掛載是以只讀方式掛載的,由於這時linux還在啓動階段,並不穩定,避免破壞系統資料
4、啓動INIT服務
順利的掛載了根文件系統後,就會啓動init服務
內核會按 /sbin/init /etc/init /bin/init 順序尋找init程序,
若是找不到則內核報錯 這裏存在一個參數 init=/bin/sh 若是啓動時指定了則最後執行/bin/sh
而不會產生內核報錯.也被稱爲快速啓動,由於它忽略了不少啓動初始化工做.
啓動init的目的就是爲了初始化系統環境,啓動了init就證實了內核已經順利啓動,接下來就由init服務來創建linux使用環境
init作了什麼?它會讀取 /etc/inittab 文件,根據這個文件的信息來進行初始化工做.
會執行三個腳本 /etc/rc.d/rc.sysinit /etc/rc.d/rc /etc/rc.d/rc.local
rc.sysinit 主要的功能用來創建系統的基本環境
啓動udev selinux子系統
udev負責產生 /dev中的文件,selinux負責加強系統的安全性
設定核心參數 sysctl -p 加載 /etc/sysctl.conf
設定系統時間 將硬件時間設定爲系統時間
加載鍵盤和交換分區 swapon -a -e
設置主機名,掛載文件系統,並將根從新掛載爲可讀寫的.
加載動態驅動模塊
USB設備與RAID & LVM
卸載 /initrd/ 目錄小程序
rc 腳本設置啓動級別 linux中有許多不一樣的啓動級別,不一樣的啓動級別會制定不一樣的服務 根據指定rc的參數會對應執行 /etc/rc.d/rc[0-6].d/ 中的鏈接腳本文件 以S開頭的則啓動 rc.local 前兩個腳本都是系統相當重要的腳本,若是咱們想在啓動過程當中放置一些其餘程序 應該使用rc.local腳本中 由於S99local存在於rc[2-5].d中 三個RC腳本執行完畢後,就會創建虛擬主控制檯 執行 /bin/login 就提供了用戶登錄界面了 若是是圖形 L5級別的話,會啓動X window登陸界面 全部的啓動就都已經完畢 用戶環境初始化 輸入用戶名和密碼系統驗證,而後會執行 /etc/profile /etc/profile.d/*.sh $HOME/.bash_profile /etc/bashrc $HOME/.bashrc
啓動級別
0 關機
1 單用戶
2 多用戶模式但帶網絡但不能遠程登陸
3 不受限多用戶模式 TUI
4 保留
5 圖形模式
6 從新啓動
查看啓動級別
# runlevel 或者 who -r
N 3
N是上次的級別,3是當前級別 也就是說機器開機就是3級別
切換級別
init 5centos
設置開機自動寫的服務安全
1 將本身所寫的腳本放到/etc/init.d, 並將腳本加上執行權限chmod +x 腳本名
bash
[root@centos6 rc.d]# ll -hi /etc/init.d網絡
1179741 lrwxrwxrwx. 1 root root 11 Aug 17 13:35 /etc/init.d -> rc.d/init.dide
[root@centos6 etc]# ll -di /etc/rc.d/init.d/spa
1179742 drwxr-xr-x. 2 root root 4096 Aug 25 06:21 /etc/rc.d/init.d/操作系統
2 在腳本中寫入
#!/bin/bash
#chkconfig:35 88 22 #35表示在級別3和級別5下開啓此程序
#88表示開機時運行的優先級
#22表示關機時運行的優先級
#description:testsrv script
3 執行chkconfig --add 腳本名稱,此時在/etc/rc.d/目錄下的rc3.d和rc5.d中建立腳本的鏈接,K表明關機關閉順序,S表明開機啓動順序
chkconfig命令:
查看服務在全部級別的啓動或關閉設定情形:
chkconfig[--list] [name]
添加:
SysV的服務腳本放置於/etc/rc.d/init.d(/etc/init.d)
chkconfig--add name
#!/bin/bash
#LLLL 表示初始在哪一個級別下啓動,-表示都不啓動
# chkconfig: LLLL nnnn
刪除:
chkconfig--del name
修改指定的連接類型
chkconfig[--level levels] name <on|off|reset>
--level LLLL: 指定要設置的級別;省略時表示2345