linux中init.d文件夾的說明


 

linux中init.d文件夾的說明 - crazyCodeLove - 博客園 https://www.cnblogs.com/zhaopengcheng/p/5806379.html

一、簡單說明

  /etc/init.d 是 /etc/rc.d/init.d 的軟鏈接(soft link)。可以通過 ll 命令查看。

ls -ld /etc/init.d
lrwxrwxrwx. 1 root root 11 Aug 30 2015 /etc/init.d -> rc.d/init.d

  都是用來放服務腳本的,當Linux啟動時,會尋找這些目錄中的服務腳本,並根據腳本的run level確定不同的啟動級別。

  在制作服務腳本的過程中,使用了Linux的兩個版本,CentOS和Ubuntu,需要在兩個版本中都可以開機啟動服務。但Ubuntu沒有 /etc/rc.d/init.d這個目錄,所以,為了保持同一種服務在CentOS和Ubuntu使用的統一性,將服務腳本(注:服務腳本在兩個不同版本中是不同的)都放在 /etc/init.d 目錄下,最終達到的效果是相同的。

  需要說明的是:在CentOS和Ubuntu兩個版本中,除了服務腳本放置的目錄是相同的,服務腳本的編寫及服務配置都是不同的。比如CentOS使用Chkconfig進行配置,而Ubuntu使用sysv-rc-conf進行配置。

  

  2 系統啟動過程

  1)BIOS自檢 ,BIOS的功能由兩部分組成,分別是POST碼和Runtime服務。POST階段完成后它將從存儲器中被清除,而Runtime服務會被一直保留,用於目標操作系統的啟動。BIOS兩個階段所做的詳細工作如下:

  步驟1:上電自檢POST(Power-on self test),主要負責檢測系統外圍關鍵設備(如:CPU、內存、顯卡、I/O、鍵盤鼠標等)是否正常。例如,最常見的是內存松動的情況,BIOS自檢階段會報錯,系統就無法啟動起來;

  步驟2:步驟1成功后,便會執行一段小程序用來枚舉本地設備並對其初始化。這一步主要是根據我們在BIOS中設置的系統啟動順序來搜索用於啟動系統的驅動器,如硬盤、光盤、U盤、軟盤和網絡等。我們以硬盤啟動為例,BIOS此時去讀取硬盤驅動器的第一個扇區(MBR,512字節),然后執行里面的代碼。實際上這里BIOS並不關心啟動設備第一個扇區中是什么內容,它只是負責讀取該扇區內容、並執行。

  至此,BIOS的任務就完成了,此后將系統啟動的控制權移交到MBR部分的代碼。

  2)系統引導,通常情況下,諸如lilo、grub這些常見的引導程序都直接安裝在MBR中。詳細過程,請自行google

  3)啟動內核,它首先會去解析grub的配置文件/boot/grub/grub.conf,然后加載內核鏡像到內存中,並將控制權轉交給內核。而內核會立即初始化系統中各設備並做相關的配置工作,其中包括CPU、I/O、存儲設備等。

  關於Linux的設備驅動程序的加載,有一部分驅動程序直接被編譯進內核鏡像中,另一部分驅動程序則是以模塊的形式放在initrd(ramdisk)中。

   Linux內核需要適應多種不同的硬件架構,但是將所有的硬件驅動編入內核又是不實際的,而且內核也不可能每新出一種硬件結構,就將該硬件的設備驅動寫入內核。實際上Linux的內核鏡像僅是包含了基本的硬件驅動,在系統安裝過程中會檢測系統硬件信息,根據安裝信息和系統硬件信息將一部分設備驅動寫入 initrd 。這樣在以后啟動系統時,一部分設備驅動就放在initrd中來加載。這里有必要給大家再多介紹一下initrd這個東東:

   initrd 的英文含義是 bootloader initialized RAM disk,就是由 boot loader 初始化的內存盤。在 linu2.6內核啟動前,boot loader 會將存儲介質中的 initrd 文件加載到內存,內核啟動時會在訪問真正的根文件系統前先訪問該內存中的 initrd 文件系統。在 boot loader 配置了 initrd 的情況下,內核啟動被分成了兩個階段,第一階段先執行 initrd 文件系統中的init,完成加載驅動模塊等任務,第二階段才會執行真正的根文件系統中的 /sbin/init 進程。

  通過以上分析,grub的stage2將initrd加載到內存里,讓后將其中的內容釋放到內容中,內核便去執行initrd中的init腳本,這時內核將控制權交給了init文件處理。我們簡單瀏覽一下init腳本的內容,發現它也主要是加載各種存儲介質相關的設備驅動程序。當所需的驅動程序加載完后,會創建一個根設備,然后將根文件系統rootfs以只讀的方式掛載。這一步結束后,釋放未使用的內存,轉換到真正的根文件系統上面去,同時運行/sbin/init程序,執行系統的1號進程。此后系統的控制權就全權交給/sbin/init進程了。

 

  初始化系統,接下來就是初始化系統的工作了,/sbin/init進程是系統其他所有進程的父進程,當它接管了系統的控制權先之后,它首先會去讀取/etc/inittab文件來執行相應的腳本進行系統初始化,如設置鍵盤、字體,裝載模塊,設置網絡等。主要包括以下工作:

  (1)執行系統初始化腳本(/etc/rc.d/rc.sysinit),對系統進行基本的配置,以讀寫方式掛載根文件系統及其它文件系統,到此系統算是基本運行起來了,后面需要進行運行級別的確定及相應服務的啟動。

  (2)執行/etc/rc.d/rc腳本。該文件定義了服務啟動的順序是先K后S,而具體的每個運行級別的服務狀態是放在/etc/rc.d/rc*.d(*=0~6)目錄下,所有的文件均是指向/etc/init.d下相應文件的符號鏈接。rc.sysinit通過分析/etc/inittab文件來確定系統的啟動級別,然后才去執行/etc/rc.d/rc*.d下的文件。

/etc/init.d-> /etc/rc.d/init.d

/etc/rc ->/etc/rc.d/rc

/etc/rc*.d ->/etc/rc.d/rc*.d

/etc/rc.local-> /etc/rc.d/rc.local

/etc/rc.sysinit-> /etc/rc.d/rc.sysinit

  我們以啟動級別3為例來簡要說明一下,/etc/rc.d/rc3.d目錄,該目錄下的內容全部都是以 S 或 K 開頭的鏈接文件,都鏈接到"/etc/rc.d/init.d"目錄下的各種shell腳本。S表示的是啟動時需要start的服務內容,K表示關機時需要關閉的服務內容。/etc/rc.d/rc*.d中的系統服務會在系統后台啟動,如果要對某個運行級別中的服務進行更具體的定制,通過chkconfig命令來操作,或者通過setup、ntsys、system-config-services來進行定制。如果我們需要自己增加啟動的內容,可以在init.d目錄中增加相關的shell腳本,然后在rc*.d目錄中建立鏈接文件指向該shell腳本。這些shell腳本的啟動或結束順序是由S或K字母后面的數字決定,數字越小的腳本越先執行。例如,/etc/rc.d/rc3.d /S01sysstat就比/etc/rc.d/rc3.d /S99local先執行。

  (3)執行用戶自定義引導程序/etc/rc.d/rc.local。其實當執行/etc/rc.d/rc3.d/S99local時,它就是在執行/etc/rc.d/rc.local。S99local是指向rc.local的符號鏈接。就是一般來說,自定義的程序不需要執行上面所說的繁瑣的建立shell增加鏈接文件的步驟,只需要將命令放在rc.local里面就可以了,這個shell腳本就是保留給用戶自定義啟動內容的。

  (4)完成了系統所有的啟動任務后,linux會啟動終端或X-Window來等待用戶登錄。tty1,tty2,tty3...這表示在運行等級1,2,3,4的時候,都會執行"/sbin/mingetty",而且執行了6個,所以linux會有6個純文本終端,mingetty就是啟動終端的命令。除了這6個之外還會執行"/etc/X11/prefdm-nodaemon"這個主要啟動X-Window

至此,系統就啟動完畢了。

接下來就是執行/bin/login程序,進入登錄狀態

 

二、 init.d目錄包含許多系統各種服務的啟動和停止腳本。

  /etc/init.d里的shell腳本能夠響應start,stop,restart,reload命令來管理某個具體的應用。比如經常看到的命令: /etc/init.d/networking start 這些腳本也可被其他trigger直接激活執行,這些trigger被軟連接在/etc/rcN.d/中。這些原理似乎可以用來寫daemon程序,讓某些程序在開關機時運行。

 


免責聲明!

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



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