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
下一篇 2016-09-12

相關推薦

  • GREP命令學習筆記

    GREP命令,全稱:Global search REgular expression and Print out the line. 是一個非常強大的文本搜索命令,與SED(stream editor,文本編輯工具)和AWK(文本分析、報告生成器)并稱文本處理三劍客。 一.GREP命令基本使用格式 grep [OPTIONS] PATTERN [FILE&#…

    Linux干貨 2016-06-22
  • Samba服務

    一 服務端配置 1 安裝所需軟件 [root@centos7 ~]# yum install samba samba-common -y samba主要提供SMB服務所需的各項服務程序、相關的文件及其他和Samba相關的設置等 samba-common提供服務端和客戶端都會用的的數據,包括主配置文件、語法檢查等 2 添加Samba用戶 添加smb1、smb2…

    Linux干貨 2017-06-13
  • 進程與周期任務

    STAT:進程狀態: R:running S: interruptablesleeping D: uninterruptable sleeping T: stopped Z: zombie +: 前臺進程 l: 多線程進程 L:內存分頁并帶鎖 N:低優先級進程 <: 高優先級進程 s: session leader,會話(子進程)發起者 top欄位信息…

    Linux干貨 2017-05-15
  • CentOS 6開機啟動流程理論篇

    CentOS 6開機啟動流程理論篇 centos 系統的啟動流程 grub 破壞Linux的核心文件再修復體驗系統啟動流程 概述 任 何系統啟動的第一步必然是加電,然后計算機硬件會主動地讀取BIOS來加載硬件設備信息并檢測,之后系統會主動地讀取第一個有引導程序的設備,該引導程序 (grub)可以指定使用哪個內核來啟動,并將其加載至內存當中運行,同時內核還要加…

    Linux干貨 2016-09-19
  • Nginx的編譯安裝

    nginx.html Nginx的編譯安裝 一、Nginx的特點 二、獲取并編譯Nginx 三、配置主頁面 四、配置編譯文件時的選項及模塊 一、Nginx的特點 1、Nginx 專為性能優化而開發,性能是其最重要的考量,實現上非常注重效率 。它支持內核 Poll 模型,能經受高負載的考驗,有報告表明能支持高達 50,000 個并發連接數。 2、Nginx 具…

    Linux干貨 2016-03-20
  • N25_第四周博客作業

    N25_第四周博客作業   1、復制/etc/ske1目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組合其他用戶均沒有任何訪問權限。     2、編輯/etc/group文件,添加組hadoop.。             &nb…

    Linux干貨 2016-12-24
欧美性久久久久