linux的啓動過程以及啓動注意事項

前言:連linux的啓動原理都不知道?那怎麼對linux進行優化?那麼問題來了,究竟linux是怎麼啓動的,哎!總結吧。

內容:

  1. 當然是對啓動的總結,慢慢來吧!

1)當給電的時候,主板的控制芯片會對CPU進行重置並且等待電壓穩定,等電壓穩定之後CPU就開始從FFFF0H處開始執行指令,但是這個地方只有一個跳轉指令,跳轉到真正的BIOS代碼處,這時候BIOS就會進行POST加電自檢了,加電-CPU-ROM-BIOS-System Clock-DMA-64KB RAM-IRQ-顯卡等。
2)BIOS這個時候就是掌權了,BIOS根據預先設定好的,去找對應分區或者硬盤上的MBR(Master Boot Record)。
3)讀取並且執行MBR中的bootloader(主流的就是GRUB)
注意:此時的由於沒有加載內核所以並沒有文件系統,但是GRUB對文件系統敏感的(file-system sensitive)也就是說能夠識別常見的文件系統。
   4)botloader要加載Kernel了,Kernel會如果要想加載根文件系統就要能夠識別硬盤分區等,但是此     時會沒有硬盤驅動,那麼就要有求於initrd(initial ram disk ),內核會將這個文件解開,作爲根    文件系統使用,那麼啓動必須的一些驅動模塊就可以通過initrd來加載。
注意:設計 initrd 的主要目的 
目的是讓系統的啓動分爲兩個階段。首先,帶有最少但是必要的驅動(這些驅動是在配置內核時選擇嵌入方式)的內核啓動。然後,其它需要的模塊將從 initrd 中根據實際需要加載(使用
udev 機制,最重要的根文件系統所在硬盤的控制器接口module)。這樣就可以不必將所有的驅動都編譯進內核,而根據實際情況有選擇地加載。對於啓動較慢的設備如 usb 設備等,如果將驅動編譯進內核,當內核訪問其上的文件系統時,通常設備還沒有準備好,就會造成訪問失敗。所以,通常在 initrd 中加載 usb 驅動,然後休眠幾秒鐘,帶設備初始化完成後,再掛載其中的文件系統。  
  5)等待必要的驅動安裝好之後,Kernel此時已經知道了文件系統,那麼此時Kernel就會去呼叫init程序  ,init程序是系統用戶空間的第一個程序,其他的程序都是由這個程序生出來的額,init也會去取的run-  level等信息。
6)    Init執行/etc/rc.d/rc.sysinit文件準備軟件執行的作業環境(如一些網絡和始終等)
7)    Init去執行run-level的各種服務
8)    Init執行/etc/rc.d/rc.local檔案;
9)    Init執行終端的仿真程序mingetty來啓動登錄程序(login),等待用戶的登錄。
2.    上面說了一下啓動的大概過程,那麼有些具體的細節接下來陳述嘍。
1)記錄一下運行等級吧,這個事很重要的,windows有安全模式能夠修復一些由於錯誤操作的等帶來的問題。那麼同理linux也有運行級別可以來解決一些問題。
運行級別:
0:halt 這個是很暴力的停機。
1:single user mode ,這個是直接用管理員身份登錄,絲毫不需要密碼的方式。當然在登錄的時候就是grub引導的時候選擇運行級別可以用S,s,single等標示。
2:mutil user mode,no NFS 你懂的,有時候由於NFS服務器的原因,導致不能開機啦,這可怎麼辦,運行級別2是最好的選擇。
3:multi user mode,text mode 這個是很標準的運行級別了,很常用。
4:reserved 保留
5:multi user mode,graphic mode 這個是圖形界面啦
6:reboot:重啓
介紹幾個有用的查詢命令:
runlevel 這個命令會有兩個結果,第一個結果是上次的運行等級,第二個是本次的運行等級。
who –r 同上
查詢內核
uname –r
這裏補充一下:實際上在哪個運行級別上運行,都是在運行/etc/rc.d/sysinit 之後,然後根據/etc/inittab 中的內容設置默認的運行級別,實質也就是運行了不同的/etc/rc#.d腳本中的K和S而已。/etc/rc#.d知識對應/etc/rc.d/rc#.d的一個符號鏈接。
如果要是切換運行等級:init # #是對應的等級(init 0關機,init 6重啓),過程是如下:(此處拿運行等級3和運行等級5之間切換)
1.先對比/etc/rc3.d和/etc/rc5.d的K和S文件;
2.切換到的等級中如果有多的K則關閉,少的S就打開。
2)linux的bootloader種類;
1.LILO:linux loader(8GB的限制)
2.GRUB:Grand Unified Bootloader
Stage1:第一階段是爲了引導第二階段,第一階段就是爲了知道第二階段的文件系統,如何去讀取相關的配置文件。/boot下有很多的stage
*_stage1_5:文件系統的解釋代碼,根據/boot分區(或/boot所在分區)的具體文件系統類型  而異,如:ext3分區的話就是e2fs_stage1_5。在stage1_5沒有被加載以前,系統無法識別任何文件系統(但是可以通過BIOS中斷方式INT 13h讀取磁盤指定扇區的內容)。
Stage2:GRUB的核心,運行的時候會把系統切換到保護模式,設置好C運行環境之後尋找menulist這個是grub.conf的鏈接文件。如果沒有的話就執行一個shell等待我們輸入命令。
總結:grub在第一階段會加載相關的*_stage1_5文件,然後知道相應的文件系統,然後才能夠從文件系統/boot中讀取到grub.conf文件,後續加載Kernel和initrd等。
3)具體是什麼是grup的配置文件?
grup.conf
default=0  # 設定默認啓動的title的編號,從0開始編號
timeout=5  # 等待用戶選擇的超時時長,單位是秒
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz  # grub引導系統時的圖片
hiddenmenu # 隱藏菜單
password redhat(這裏是明文的密碼,在加載操作系統的時候進行密碼的驗證)
password --md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG. 這個可以用grub-md5-crypt 生成MD5加密後的密碼,然後將加密後的密碼放在這個地方就行了。
對於linux來說一個操作系統有幾個不同版本的內核,所以一個title就對應一個內核。
title Red Hat Enterprise Linux Server (2.6.18-308.el5)  # 內核標題,或操作系統名稱,字符串,可自由修改
   root (hd0,0)  # 內核文件所在的設備;對grub而言,所有類型硬盤一律hd,格式爲(hd#,N);hd#, #表示第幾個磁盤;最後的N表示對應磁盤的分區;
   kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet   # 內核文件路徑,及傳遞給內核的參數
   initrd /initrd-2.6.18-308.el5.img # ramdisk文件路徑
   password --md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG. 加載內核的時候需要輸入密碼。
title Install Red Hat Enterprise Linux 5
   root (hd0,0)
   kernel /vmlinuz-5 ks=http://172.16.0.1/workstation.cfg ksdevice=eth0 noipv6
   initrd /initrd-5
   password --md5 $1$FSUEU/$uhUUc8USBK5QAXc.BfW4m.
4)下面說一下,那麼如果grub壞掉怎麼辦。
1.    如何安裝grub的stage1(在沒有關機的情況下,grup損壞了,修復的過程,如果重啓了,那麼只能是用救援模式了)
# grub
grub> root (hd0,0)指定內核所在分區
grub> setup(hd0) 安裝
注意這個命令使用完之後一定要sync同步到硬盤上之後再重啓,否則只能救援模式了。
  2.如果grub損壞怎麼辦?
  grub.conf配置文件損壞之後就會在進入系統的是後進入到grup命令行模式
此時要做的幾件事:
      1.可以用root (hd#自動補全來探測大概/boot在哪個硬盤分區上,一般的0x83就可能是,但是0x82就不用想了,一般是交換分區。
       2.先找到Kernel,initrd,根文件系統在哪裏。利用find (hd#,#)/自動補全,查看對應設備分區中是不是有需要的文件。
       3.指定Kernel,用Kernel命令 kernel /vm 自動補齊,屬性是ro root=根文件系統所在的位置(磁盤分區)。
       4.指定initrd,同樣可以initrd /in  自動補全就行了。
       5.boot引導內核。

         注意:如果在引導過程中出現Kernel panic -not syncing:Attempted to kill init問題那麼就在Kernel指定的時候添加selinux=0

但是重啓之後就又會出現進去grup命令行的模式。所以要想每次重啓之後都能夠順利的引導要修復grub.conf文件。

        5)  那麼Kernel加載之後又是如何初始化的呢?

        Kernel初始化的過程:

        1、設備探測

        2、驅動初始化(可能會從initrdinitramfs)文件中裝載驅動模塊)

        3、以只讀掛載根文件系統;

        4、裝載第一個進程initPID1

            那麼init是什麼東西?init是在/sbin/init 這個進程最主要就是準備軟件執行需要的環                  境,init程序都是靠/etc/inittab來規劃的。

             /etc/inittab這個文件中又涉及很多的腳本,主要有/etc/rc.d/rc.sysinit,這個文件的作用             有很多的作用,主要還是進行環境的準備。

            /etc/rc這個主要是給不同執行rc1.d  rc2.d等文件系統中文件,rc1.d等這下文件中有很多的             鏈接文件,這些文件都鏈接到init中的相應服務腳本,並且要啓動的用S表示,後面的數字是說             明啓動的順序。K表示的是要關閉的服務,數字小的先關閉,數字大的則後關閉,同理S的相反。

             /etc/rc.local這個文件主要是裏面記錄的是用戶想要開機啓動的除了init啓動之後額外的啓              動項目。

            還有一個關於模塊的/etc/modprobe.conf這裏面記錄的硬件所要用到的一些驅動模塊。

            開機過程中讀取的一些服務的參數就是在/etc/sysconf/*下。這下面有哪些文件

            例如:authconfig:規範身份認證的機制。

            Clock:主機的時區等。

            I18n 設定在一些語系方面的使用,

            Keyboard&mouse:鍵盤和鼠標的形式。

            Network:可以設定是否要啓用網絡的等。

            這個目錄中的文件都是很重要的文件,都是能夠在開機的時候要讀取到的文件。

        6)  核心和核心模塊

        1.核心:/boot/vmlinuz

        核心解壓縮需要RAM Disk:/boot/initrd

        核心模塊:/lib/modules/version/kernel

        核心原始碼:/usr/src/linux

        看一下這裏的核心模塊。如果我們要加入一個模塊的話,我們需要找到驅動的依賴性, /lib/modules/$(uname -r)/modules.dep目錄中記載着依賴性。這個目錄如何去建立,depmod命令可以做到。

        簡單介紹一下depmod命令吧,不加任何參數的話,depmod會主動的去分析目前核心的模塊,並且重新的寫入/lib/modules/$(uname -r)/modules.dep –A參數則會去尋找比modules.dep內還要新的模塊,如果有就會更新。

                                    -n:不寫入modul.dep,而是將結果輸出到屏幕上

                                    -e:顯示出母親已加載的不可執行的模塊名稱。

                                    例如:如何將一個新的網卡驅動更行到依賴文件中。

                                             先將驅動放入到/lib/modules/$(uname-r)/kernel/drivers/net

                                             然後執行depmod

                           注意一下:lsmod就是顯示系統中已存在覈心中的模塊。

        Modinfo是查詢模塊的信息:

        -a列出作者名稱;

        -d:僅列出modules的說明

        -l:僅列出授權。

        -n:僅列出該模塊的詳細路徑。

        2.如何手動加載模塊?

        Modprobe會主動的去搜尋module.dep的內容,客服依賴性很方便啊。

        Insmod則是完全由使用者加載一個完整文件名的模塊,並不會去分析依賴性,但是會立即加載。例如:insmod /lib/modules/&(uname -r)/kernel/fs/vfat/vfat.ko

        rmmod是移除模塊的,-f強制移除,無論是不是在用。-w正在被使用就等待用完之後移除。

        這兩個命令有一定的問題就是要加上完整的路徑和文件名,如果模塊有一定的依賴性就無法完成。

        所以有一個更好用的命令來處理這個問題。

        Modprobe –c 列出目前系統所有的模塊!(更詳細的代號對應表)

        -l 列出所有在/lib/modules/`uname –r`/kernel 當中所有模塊的完整文件名。

        -f強制加載該模塊。

        -r 這個類似rmmod

        注意核心模塊的額外參數設定在/etc/modprobe.conf.

        7/etc/init.d/下的文件。SysV風格

        chkconfig –list所有的運行進程             

                                   啓動優先次序,關閉優先次序

        # chkconfig: runlevels SS KK

        chkconfig命令來爲此腳本在rc#.d目錄創建鏈接時,runlevels表示默認創建爲S*開頭的鏈接,-表示沒有級別,默認爲S*開頭的鏈接;除此之外的級別默認創建爲K*開頭的鏈接;

                 S後面的啓動優先級爲SS所表示的數字;K後面關閉優先次序爲KK所表示的數字;

        # description: 用於說明此腳本的簡單功能;\, 續行

        使用chkconfig - –add service_name 加入到系統服務中,也就是要在對應的rc#.d文件中創建相應的文件。

                 Chkconfig– -del service_name 就是刪除

                 Chkconfig–level 24 myservice off就是要關閉在24運行級別上的服務

        

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