linux開機后第一個程序--init


 

 

背景知識

計算機啟動基本流程如下

1)首先開機自檢-POST,

2)自檢通過后根據CMOS的配置找到第一個可啟動磁盤的MBR中的boot loader程序(一般在啟動磁盤的第一個物理扇區,占446字節),並把控制權交給boot loader

3)bootloader完成操作系統內核的加載,並把控制權交給內核

4)內核繼續完成系統的啟動

 

說明:

1)POST,會檢查自身硬件是否正常. 在BIOS進行設置,管理

2)BIOS:保存着系統最重要的基本輸入輸出程序,系統信息設置、開機上電自檢程序和系統啟動自舉程序等。

3)CMOS:主板上的一塊可讀寫的RAM芯片,主要用來保存當前系統的硬件配置和操作人員對某些參數的設定。由系統通過一塊后備電池供電,因此無論是在關機狀態中,還是遇到系統掉電情況,CMOS信息都不會丟失。現在多數廠家將CMOS設置程序做到了 BIOS芯片中,在開機時通過按下某個特定鍵就可進入CMOS設置程序而非常方便地對系統進行設置,因此這種CMOS設置又通常被叫做BIOS設置。

4)MBR:主引導記錄,一共512字節,詳細內容如下

                446: bootloader
                64: fat--磁盤分區表
                2: 55AA--bootloader是否有效的標記
 
要了解boot loader,首先需要說下boot sequnence.
 
5)BOOT Sequence: 按次序查找各引導設備,第一個有引導程序的設備即為本次啟動用到設備。引導設備中用到的程序叫 bootloader(引導加載器)。
       例如:
              windows上的引導加載器叫ntloader
              Linux:LILO:LInux loader
     
       為了能夠引導不同的操作系統,於是有了GRUB
              GRUB: GRand Uniform Bootloader---統一引導加載器,可引導多個引導系統,現在發展到第2代。
                        GRUB 0.X: GRUB Legacy
                        GRUB 1.x: GRUB2---2代GRUB,完全重寫了
                功能:提供一個菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,然后解壓、展開,並把系統控制權移交給內核;    
 
      GRUB: 啟動加載過程     http://blog.csdn.net/u011797751/article/details/50256907
 
6)內核加載后需要解壓,展開,然后進行自身初始化,包括如下內容:
    
                1)探測可識別到的所有硬件設備;
                2)加載硬件驅動程序;(有可能會借助於ramdisk加載驅動)
                3)以只讀方式掛載根文件系統;
                4)運行用戶空間的第一個應用程序:/sbin/init

 7)ramdisk--虛擬內存盤,通過軟件將一部分內存(RAM)模擬為硬盤來使用的一種技術

內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問;

這種技術在centos5中存在一個問題:內存把ramdisk當作是一個硬盤,即使這部分已經放在內存中,依然會被ramdisk當作硬盤放到緩沖區,浪費了資源,而ramfs可以被視為一個文件系統,可以直接在內存中運行,所以centos5-->6做了一個升級,ramdisk --> ramfs

                        CentOS 5: initrd,  工具程序:mkinitrd
                        CentOS 6: initramfs, 工具程序:mkinitrd, dracut

 

 

正文開始

 1.  /sbin/init是如何運作的呢?
            CentOS 5:
                運行級別:為了系統的運行或維護等應用目的而設定;
                    0-6:7個級別
                        0:關機
                        1:單用戶模式(root, 無須登錄), single  ----維護模式,比如可以重置密碼;
                        2:  多用戶模式,會啟動網絡功能,但不會啟動NFS  -----維護模式;
                        3:多用戶模式,正常模式;文本界面;
                        4:預留級別;可同3級別;
                        5:多用戶模式,正常模式;圖形界面;
                        6:重啟
                    默認級別:
                        3, 5
                    切換級別:
                        init #
                    查看級別:
                        runlevel
                        who -r
 
 配置文件:/etc/inittab
            文件中每一行定義一種action以及與之對應的process,每一列如下
             id:runlevel:action:process,例如id:5:initdefault:
 
                        action:
                            wait: 切換至此級別運行一次;
                            respawn:此process終止,就重新啟動之;
                            initdefault:設定默認運行級別;process省略;
                            sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit;
                            ...
 
一些例子:
                    id:3:initdefault:
                    si::sysinit:/etc/rc.d/rc.sysinit    #運行級別為空,表示所有級別
                    l0:0:wait:/etc/rc.d/rc 0
                    l1:1:wait:/etc/rc.d/rc 1
                    ...
                    l6:6:wait:/etc/rc.d/rc 6
                        說明:rc 0 --> 意味着讀取/etc/rc.d/rc0.d/
                            K*: K##*:##運行次序;數字越小,越先運行;數字越小的服務,通常依賴到別的服務----要先殺;
                            S*: S##*:##運行次序;數字越小,越先運行;數字越小的服務,通常被依賴到的服務---要先啟動;
              運行過程如下:
                            for srv in /etc/rc.d/rc0.d/K*; do
                                $srv stop
                            done
 
                            for srv in /etc/rc.d/rc0.d/S*; do
                                $srv start
                            done
etc/rc.d/init.d/目錄下的所有啟動腳本都被鏈接到/etc/rc.d/目錄下的各級別目錄中,比如/rc3.d, rc4.d, rc5.d
 
CentOS 7 ,配置文件:/usr/lib/systemd/system, /etc/systemd/system 
CentOS 6,配置文件:/etc/inittab, /etc/init/*.conf (其實用的這個)
 
 
 
2.  chkconfig命令:   
                                         
查看服務在所有級別的啟動或關閉設定情形: chkconfig [--list] [name]      
                     
添加:新添加了一個服務程序,需要把啟動腳本放在目錄/etc/rc.d/init.d (/etc/init.d),然后需要在各級別上創建鏈接文件
         chkconfig --add name,在配置文件中指明級別,優先級如下                
           #!/bin/bash
           #
           # chkconfig: LLLL nn nn  (這里的LLLL表示各級別,寫上的就表示S,第一個nn表示S的優先級,第2個nn表示K的優先級,例如chkconfig: 345 66 33,一般K的優先級要小於S的優先級)                     
         查看鏈接文件,比如新建服務名字是testsrv,ls -l /etc/rc.d/rc0.d/K33testsrv      ls -l /etc/rc.d/rc3.d/S66testrv
                                  
刪除:chkconfig --del name
                                
修改指定的鏈接類型:
chkconfig [--level levels] name <on|off|reset>
--level LLLL: 指定要設置的級別;省略時表示2345;
 
注意:
正常級別下(ls /etc/rc.d/rc3.d/目錄中),最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本(ls -l /etc/rc.d/rc3.d/S99local查看);因此,不便或不需寫成腳本放置於/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置於/etc/rc.d/rc.local文件中(里面放置開機服務最后一步要運行的東西);
 
 
 
 
3. update-rc.d命令
 
ubuntu中和chkconfig類似的開機啟動控制命令
以tomcat為例子,如果是啟動命令,可以在/etc/rc.local中添加
如果想運行腳本,則需要先將腳本復制或者軟連接到/etc/init.d/目錄下,然后用:update-rc.d tomcat defaults NN命令(NN為啟動順序,比如95),如果想卸載, update-rc.d -f tomcat remove


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM