1. 程式人生 > >linux中init.d資料夾的說明

linux中init.d資料夾的說明

一、簡單說明

  /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程式,讓某些程式在開關機時執行。