Linux開機啓動流程

轉載:https://www.cnblogs.com/tcicy/p/8462040.html

linux開機啓動詳細流程圖:
Linux開機啓動流程

一、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)
二、BOOT Loader
linux的boot loader(上文提到的小程序) 常見的有兩種:lilo grub
因爲lilo存在着一個1024柱面的限制,並且更改了磁盤上的啓動信息文件後需要重新啓動系統才能同步446字節的內容,因爲lilo的缺陷,已經被grub所取代.現在的絕大多數類linux系統都採用grub做boot loader;
grub則沒有了lilo各種限制,而且方便到能修改系統文件的啓動內容就可以立刻與446內容同步.
那麼我們就看看grub的內容 它存在於 /boot/grub中
GRUB有幾個重要的文件,STAGE1、STAGE1.5、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:包含一些附加的驅動程序

三、內核啓動
內核啓動後會向bios查詢電腦的所有硬件信息,然後自己接手下來管理這些設備,以便提供給linux使用
內核會試着驅動這些設備,這些設備的驅動一部分包含在內核中,叫做靜態驅動,一部分以模塊的方式(動態)存放文件系統中,由
於此時還未掛載任何文件系統,因此還不能使用文件系統中的模塊,這裏只能驅動在內核中存在的硬件驅動程序的對應設備.想驅動內核中未包含的硬件驅動就需要加載文件系統.
內核會嘗試掛載根文件系統,根文件系統至少包含 /etc /bin /sbin /lib /dev 這5大目錄
他們5個缺一不可.都會導致系統無法啓動
根文件系統掛載是以只讀方式掛載的,因爲這時linux還在啓動階段,並不穩定,避免破壞系統資料
四、啓動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**
N 3
N是上次的級別,3是當前級別 也就是說機器開機就是3級別
切換級別
init 5

掛載文件系統
/etc/fstab
第一項 是要mount的存儲裝置的實體位置或者用卷標
第二項 要掛到哪個目錄位置
第三項 指定要掛載的系統格式
第四項 mount時要設定的狀態,只讀或defauls
第五項 提供DUMP功能,在系統DUMP時需要BACKUP的標誌位,其內定位置是 0
第六項 設定開機時文件系統是否要check
除了root的文件系統其必要的check爲1 其他視需要而定 默認是0
LABEL=/boot /boot ext3 defaults 1 2

用戶登錄

開機啓動程序加載完畢以後,就要讓用戶登錄了。

Linux開機啓動流程
一般來說,用戶的登錄方式有三種:

(1)命令行登錄
(2)ssh登錄
(3)圖形界面登錄

這三種情況,都有自己的方式對用戶進行認證。

(1)命令行登錄:init進程調用getty程序(意爲get teletype),讓用戶輸入用戶名和密碼。輸入完成後,再調用login程序,覈對密碼(Debian還會再多運行一個身份覈對程序/etc/pam.d/login)。如果密碼正確,就從文件 /etc/passwd 讀取該用戶指定的shell,然後啓動這個shell。

(2)ssh登錄:這時系統調用sshd程序(Debian還會再運行/etc/pam.d/ssh ),取代getty和login,然後啓動shell。

(3)圖形界面登錄:init進程調用顯示管理器,Gnome圖形界面對應的顯示管理器爲gdm(GNOME Display Manager),然後用戶輸入用戶名和密碼。如果密碼正確,就讀取/etc/gdm3/Xsession,啓動用戶的會話。

進入login shell

所謂shell,簡單說就是命令行界面,讓用戶可以直接與操作系統對話。用戶登錄時打開的shell,就叫做login shell。
Linux開機啓動流程

Debian默認的shell是Bash,它會讀入一系列的配置文件。上一步的三種情況,在這一步的處理,也存在差異。

(1)命令行登錄:首先讀入 /etc/profile,這是對所有用戶都有效的配置;然後依次尋找下面三個文件,這是針對當前用戶的配置。

  ~/.bash_profile
  ~/.bash_login
  ~/.profile  

需要注意的是,這三個文件只要有一個存在,就不再讀入後面的文件了。比如,要是 ~/.bash_profile 存在,就不會再讀入後面兩個文件了。

(2)ssh登錄:與第一種情況完全相同。

(3)圖形界面登錄:只加載 /etc/profile 和 ~/.profile。也就是說,~/.bash_profile 不管有沒有,都不會運行。

打開non-login shell

老實說,上一步完成以後,Linux的啓動過程就算結束了,用戶已經可以看到命令行提示符或者圖形界面了。但是,爲了內容的完整,必須再介紹一下這一步。

用戶進入操作系統以後,常常會再手動開啓一個shell。這個shell就叫做 non-login shell,意思是它不同於登錄時出現的那個shell,不讀取/etc/profile和.profile等配置文件。
Linux開機啓動流程

non-login shell的重要性,不僅在於它是用戶最常接觸的那個shell,還在於它會讀入用戶自己的bash配置文件 ~/.bashrc。大多數時候,我們對於bash的定製,都是寫在這個文件裏面的。

你也許會問,要是不進入 non-login shell,豈不是.bashrc就不會運行了,因此bash 也就不能完成定製了?事實上,Debian已經考慮到這個問題了,請打開文件 ~/.profile,可以看到下面的代碼:

  if [ -n "$BASH_VERSION" ]; then    
   if [ -f "$HOME/.bashrc" ]; then      
   . "$HOME/.bashrc"    
   fi  
  fi  

上面代碼先判斷變量 $BASH_VERSION 是否有值,然後判斷主目錄下是否存在 .bashrc 文件,如果存在就運行該文件。第三行開頭的那個點,是source命令的簡寫形式,表示運行某個文件,寫成"source ~/.bashrc"也是可以的。

因此,只要運行~/.profile文件,~/.bashrc文件就會連帶運行。但是上一節的第一種情況提到過,如果存在~/.bash_profile文件,那麼有可能不會運行~/.profile文件。解決這個問題很簡單,把下面代碼寫入.bash_profile就行了。

  if [ -f ~/.profile ]; then    
   . ~/.profile
  fi 
 
這樣一來,不管是哪種情況,.bashrc都會執行,用戶的設置可以放心地都寫入這個文件了。

Bash的設置之所以如此繁瑣,是由於歷史原因造成的。早期的時候,計算機運行速度很慢,載入配置文件需要很長時間,Bash的作者只好把配置文件分成了幾個部分,階段性載入。系統的通用設置放在 /etc/profile,用戶個人的、需要被所有子進程繼承的設置放在.profile,不需要被繼承的設置放在.bashrc。

順便提一下,除了Linux以外, Mac OS X 使用的shell也是Bash。但是,它只加載.bash_profile,然後在.bash_profile裏面調用.bashrc。而且,不管是ssh登錄,還是在圖形界面裏啓動shell窗口,都是如此。

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