linux 系統啟動流程

假設以個人架設的linux主機為例:當你按下電源鍵之后,計算機硬件會主動讀取BIOS來加載硬件信息及進行硬件系統的自我測試,之后系統會主動讀取系統第一個可啟動的設備,此時就可以讀入引導裝載程序了。

引導程序可以指定使用哪個內核文件來啟動,并實際加載內核到內存中解壓縮與執行,此時內核就能夠開始在內存內活動,并檢測所有硬件信息,與加載適當的驅動程序來使這部主機開始運行,等到內核檢測硬件與加載驅動程序之后就可以啟動系統了。

linux系統的啟動流程如下:

1、 加載BIOS的硬件信息與進行自我測試,并依據設置取得第一個可啟動的設備。

       boot Sequence:按次序查找各引導設備,第一個有引導程序的設備即為本地啟用要用到的設備   (BIOS) 

2、 讀取執行第一個啟動設備內MBR的Bootloader(grub)    

                Boot Loader的功能:要認識操作系統的文件格式,并根據這個加載內核到內存中去執行。

                MBR是整個硬盤的第一個扇區內的一個塊,充其量整個大小也有446,要加載boot的分區的驅動程序,ll -h `locate *ext4.ko`可以看到驅動程序有631k,因此446個字節根本裝不下,不能加載驅動程序,因此linux將boot loader的程序代碼執行與設置分為兩個階段:

                                階段1、446個字節,不屬于任何一個分區,他是硬盤上面第一個扇區,也沒有文件系統,不需要驅動,

                                階段1.5、位于第一個扇區后面的扇區,用于存放/boot分區的文件系統的驅動程序,因為/boot是被ext4格式化的,因此需要驅動程序,才能該分區,/boot/grub/*,可以看到1.5階段的一些文件(備份使用)(fdisk -l 可以看到分區是從第一個柱面開始分的,所以還有0柱面8M的空間,用于存放這些數據,所以空間非常充裕 hexdump -C -n 15000 /dev/sda)。

                                階段2、掛載/boot目錄,加載內核文件,加載虛擬文件系統,掛載根文件系統,就是第三步所實現的功能,2st及內核等通常放置于一個基本磁盤分區(非raid,非lvs等/boot目錄可以單獨分區,如果想把根做成raid等非基本磁盤分區)。

                grub功能:提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本,把用戶選定的內核版本裝載到RAM中的特定空間中,解壓,展開,而后把系統控制權移交給內核

3、 依據Bootloader的設置加載Kernel文件到內存中,Kernel會開始檢測硬件與加載驅動程序(此時接管bios工作)。

                內核文件:/boot/vmlinuz-2.6.32-642.el6.x86_64

                驅動程序:/lib/modules/

                            該文件存在磁盤上,內核需要加載磁盤驅動,才能掛載根目錄,訪問驅動程序,所以此時根根本無法掛載,因此就需要一個虛擬文件系統文件

                虛擬文件系統文件:/boot/initramfs-2.6.32-642.el6.x86_64.img

                            在內存中解壓成一個偽根文件系統,內核借此加載適當的驅動程序,最總釋放虛擬文件系統,并掛載實際根目錄文件系統。

                            通過/bootloader加載到內存中,然后在內存中仿真成一個根目錄,且此仿真在內存中的文件系統能夠提供一個可執行程序,通過該程序來加載啟動過程中所最需要的驅動程序    (USB,raid,lv,scsi等),等載入完成之后,內核就能識別真正的根了,然后進程根切換,切換完成后,調用/sbin/init來開始后續的正常啟動流程。

                              該文件的查看方法:有file initramfs-2.6.32-642.el6.x86_64.img可以看到該文件是壓縮文件因此:

                                       1、mv initramfs-2.6.32-642.el6.x86_64.img initramfs-2.6.32-642.el6.x86_64.img.gz

                                            gzip -d initramfs-2.6.32-642.el6.x86_64.img.gz

                                            cat initramfs-2.6.32-642.el6.x86_64.img | cpio -id 

                                       2、zcat initramfs-2.6.32-642.el6.x86_64.img | cpio -id 

                            該文件刪除后的恢復方法:            

                                                        1、救援模式

                                                        2、chroot /mnt/sysimage  切換根  救援模式的工具比較少 因此切換到根

                                                        3、mkinitrd /boot/initramfs-`uname -r`.img   `uname -r`  此操作要在/boot目錄下運行

                                                        4、exit;exit;reboot

4、 在硬件驅動成功后,Kernel會主動調用init進程,而init進程會取得run-level信息

                     Init:準備軟件執行環境,包括系統主機名,網絡設置,文件系統格式及其他服務的啟動等。

                     配置文件:/etc/inittab,在配置文件有一個重要的設置,就是默認run-level 

5、 Init 執行/etc/rc.d/rc.sysinit文件來準備軟件執行的操作環境,配合好整個系統(如網絡,時區)

                            功能:
                                        1、設置主機名:
                                        2、設置歡迎信息
                                        3、激活udey和selinux
                                        4、掛載/etc/fstab文件中的定義的所有文件系統
                                        5、檢測根文件系統,并以讀寫方式重新掛載根文件系統

                                        6、設置系統時鐘;
                                        7、根據/etc/sysctl.conf文件的設定,來設定內核參數;
                                        8、激活lvm及軟raid
                                        9、激活swap設備
                                        10、加載額外設備的驅動程序;
                                        11、清理操作;

6、 啟動核心的外掛模塊(/etc/modprobe.conf)

                  用戶加載自定義模塊的驅動程序,通常該文件可以自行產生。

7、 Init運行runl-level的各個服務的啟動(script方式)

                運行級別:為了系統運行或維護的目的而設定的機制

                          0-6:7個級別

                          0:關機shutdown

                          1:單用戶模式(single user),root用戶,無需認證,維護模式

                          2、多用戶模式(multi user),會啟用網絡功能,但不會啟動NFS;維護模式

                          3、多用戶模式(mutli suer),完全功能模式;文本界面;

                          4、預留級別:目前無特別適用目的,但習慣以同3界別使用;

                          5、多用戶級別(multi user),完全功能模哦;

                               6、重啟模式,reboot

                  centos 6中/etc/inittab設置的默認級別為:

                                       id:5:initdefault:

                         其中:

                                id:runlevels:action:process

                                id:一個任務的標識符

                                 runlevels:在哪些級別下啟用此任務;

                                action:在什么條件下啟動此任務;

                                process:任務

                          action:

                                wait:等待切換至此任務所在的級別時執行一次;

                                  respawn:一旦此任務終止時,就會重新啟動

                                   initdefault:設定默認運行級別;此時process會省略

                                   sysinit:設定系統初始化方式,此處一般指定/etc/rc.d/rc.sysinit腳本;

 

                    啟動對應級別下的服務(看默認級別,如果默認級別是5 就運行5下面的程序):

                                   0:0:wait:/etc/rc.d/rc 0

                                       。。。。

                                   11:0:wait:/etc/rc.d/rc 5

                                   12:0:wait:/etc/rc.d/rc 6

                              init要讀取/etc/inittab配置文件完成初始化,該配置文件中有一堆的/etc/rc.d/rc 0,每個級別都有分別做了定義,他會等到你切換到該級別上來,切換過來后,init會到該級別下,將所有k開頭的文件stop掉,所有s啟動起來,這就是有些服務開機自動能啟動的原因。Fl,rc5.d 目錄下面的文件都是軟連接,對應的都是/etc/init.d/下面對應的服務腳本,且配置文件在/etc/sysconfig/目錄下,rc5.d目錄下都是以k或者s打頭的,后面跟的數字代表執行的順序,且是以字符進行排序,表示執行的優先級。

                     當然我們也可以自定義/etc/inittab中的服務:

                                例如:

                                                             1、進入/etc/init.d下建立腳本

                                                                    #!/bin/bash

                                                                    #chkconfig:35 88 22

                                                                    #description:test service 

                                                                        echo "How are you?"

                                                              2、chmod +x testrv

                                                              3、chkconfig –add testsrv

                                                              4、chkconfig –list testsrv

                                                                                    testrv    0:關閉 1:關閉 2:關閉 3:啟用 4:啟用 5:啟用 6:關閉

                                                              5、service testsrv

                                                              6、chkconfig –del testsrv

                                                            注意:chkconfig [–level <levels>] [–type <type>] <name> <on|off|reset|resetpriorities>

8、 Init執行/etc/rc.d/rc.local文件

                             目錄下中的/rc.local腳本,我們有任何啟動時就要運行的腳本可以寫到該文件中,在開機啟動的時候就會自動被加載。

9、 Init執行終端機模擬程序mingetty來啟動login進程,最后等待用戶登錄。

10、登錄后開始以shell控制合主機。

POST –> Boot Sequence (BIOS) –> Boot Loader (MBR) –> kernel(ramdisk) –rootfs –> switchroot    –> /sbin/init –>(/etc/init/*.conf,/etc/inittab) –> 設定默認運行級別 –> 運行系統初始化腳本 –> 關閉或啟動對應級別下的服務 –> 啟動終端

內核模塊的增刪查

    目前內核都是具有可讀取模塊化驅動程序的功能,我們也可以理解為驅動程序,那么到底目前內核中加載了多少模塊呢?

    lsmod:查詢內核中加載的模塊 常配合grep使用

                    Module                  Size  Used by                    
                    nls_utf8                1455  1 
                    fuse                   79892  2 
                    rfcomm                 71079  4 
                    sco                    17493  2 
                    bridge                 85674  0 
                    
                    模塊名稱           模塊大小   此模塊是否被其他模塊所使用

    modinfo:查詢模塊信息

        格式:modinfo [-adln] [module_name][filename]

        選項:

                        -a:僅列出作者名稱

                        -d:僅列出該modules的說明

                         -l:僅列出授權

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

    insmod:加載內核模塊(需要用戶自行加載一個完整文件名的模塊)

        格式:insmod [/full/path/module_name][parameters]

                            insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko(必須要完整的文件名)

    modprobe:加載內核模塊

        格式:modprobe [-lcfr] module_name

        選項:

                        -c:列出目前系統所有模塊

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

                        -f:起那個會加載模塊

                        -r:類似rmmod,就是刪除某個模塊

    rmmod:刪除模塊

        格式:rmmod [-fw] module_name

        選項:

                        -f:強制將模塊刪除掉,不管是否使用

                        -w:若該模塊正被使用,則rmmod會等待該模塊被使用完畢后才刪除他

   

原創文章,作者:Naruto,如若轉載,請注明出處:http://www.www58058.com/45390

(0)
NarutoNaruto
上一篇 2016-09-12 20:44
下一篇 2016-09-12 21:17

相關推薦

  • 0808文本處理作業

                           1 、刪除/etc/grub2.conf 文件中所有以空白開頭的行行首的空白字符。 答:sed  ‘@^[[:space]]\+@@’  /etc/grub2/cf…

    Linux干貨 2016-08-11
  • 馬哥教育網絡班21期+第11周課程練習

    1、請描述一次完整的加密通訊過程,結合圖示最佳。 Bob先利用單向加密算法提取當前數據的指紋(特征碼),再用自己的私鑰加密數據指紋并附加于數據尾部,然后利用對稱加密將整個文件加密,之后用對方的公鑰加密對稱加密密鑰附加于尾部。 Alice收到數據后,先用自己的私鑰解密,得到對稱加密密鑰,之后用對稱加密密鑰解密,然后用Bob的公鑰解密得到數據指紋,并且驗證了Bo…

    Linux干貨 2016-09-26
  • 優云實踐:巧用Salt,實現CMDB配置自動發現

    隨著互聯網+新形勢的發展,越來越多的企業步入雙態(穩敏雙態)IT時代,信息化環境越來越復雜,既有IOE三層架構,也有VCE、Openstack等云虛擬化架構和互聯網化的分布式大數據架構。所以,企業急需建立一套合適的配置管理庫(CMDB),像人類“大腦”一樣統一存儲從基礎架構到業務應用各層面的配置信息,以便協調“身體”(運維系統)各部分完成復雜的運維工作。 C…

    系統運維 2016-07-26
  • vim文本編輯器使用

    vim文本編輯器使用

    2017-09-20
  • 記事本操作的小小小技巧

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://jeffyyko.blog.51cto.com/28563/140063       大家在查看文本文件的時候,如果內容很多,想快速到達某一位置可能比較麻煩,這時如果按住shift,再點擊右側…

    Linux干貨 2015-03-26
  • rsyslog將日志記錄于MySQL中,并用loganalyzer進行分析日志

    1、首先來安裝lamp環境的支持,與其相關的軟件包      # yum -y install rsyslog-mysql mariadb-server php php-mysql php-gd httpd       說明:rsyslog-mysql在數據庫中生成一個庫文件,但這個文件需…

    Linux干貨 2013-09-03
欧美性久久久久