init詳解
理解:
當系統啟動時,首先啟動核心,核心調用init來完成引導進程。
init啟動時,它會在/etc/inittab內尋找預設的運行層級:如id : 2 : initdefault :
運行 /etc/rc.d/init.d中運行層級為2的啟動指令碼。由於init.d中的運行層級的這些指令碼都用ln 命令串連到 /etc/rc.d/rcn.d 目錄。例如/etc/rc.d/rc2.d/S10network對應/etc/rc.d/init.d下的network 指令碼的。因此運行/etc/rc.d/rc2.d下的指令碼。
如/etc/rc.d/rc2.d/S10network或/etc/rc.d/rc2.d/K45named等,則在第10個啟動network,在第45個終止named
init詳解
1、什麼是init進程
init進程,是一個由核心啟動的使用者級進程,核心自行啟動後,就通過啟動init來完成引導進程。所以,init始終是第一個進程(其進程編號始終為1)
2、檔案位置
/sbin/init。如果核心找不到init,它就會試著運行/bin/sh
3、運行層級
運行級就是作業系統當前正在啟動並執行功能層級。這個層級從1到6 ,具有不同的功能。
# 0 - 停機(千萬不能把initdefault 設定為0 )
# 1 - 單一使用者模式
# 2 - 多使用者,沒有 NFS
# 3 - 完全多使用者模式(標準的運行級)
# 4 - 沒有用到
# 5 - X11 (xwindow)
# 6 - 重新啟動 (千萬不要把initdefault 設定為6 )
1)、運行層級的配置是在/etc/inittab 檔案裡配置的。最先啟動並執行服務是/etc/rc.d 下的檔案。啟動指令碼都是位於 /etc/rc.d/init.d中的。這些指令碼被用ln 命令串連到 /etc/rc.d/rcn.d 目錄。(這裡的n 就是運行級0-6) 運行層級的配置
如下所示:
12 : 2 : wait : /etc/init.d/rc2
12:是一個任意指定的標籤;
2:表示這一行適用於運行那個層級(這裡是2);
wait:進入運行層級時,init應該等待第四個欄位內的命令結束。
/etc/init.d/rc2:Linux版本的不同,採用的具體命令也不同,運行層級的配置也有差別。
2)、init啟動時,它會在/etc/inittab內尋找一個程式碼,這一行指定了預設的運行層級:
id : 2 : initdefault :
3)、rcn.d與inittab的關係
rcn.d目錄和運行層級n相關。/ect/rc.d/rcn.d是用ln命令和/etc/rc.d/init.d中的指令碼關聯的,例如:
rc2.d 目錄下面的檔案就是和運行層級2 相關的。
/etc/rc.d/rc2.d/S10network對應/etc/rc.d/init.d下的network 指令碼的
檔案開頭的S 代表start 就是啟動服務的意思,後面的數字10 就是啟動的順序
/etc/rc.d/rc2.d/S80postfix,80 就是順序在10 以後,因為沒有啟動網路的情況下,啟動postfix是沒有任何作用的
/etc/rc.d/rc3.d/S60nfslock,NFS 要用到這個檔案,一般用在多使用者環境下,所以放在rc3.d 目錄下
/etc/rc.d/rc2.d/K45named ,K 代表 kill
標準的Linux運行級為3 或者5 ,如果是3 的話,系統就在多使用者狀態。如果是5的話,則是運行著X Window 系統。如果目前正在3或5,而你把運行級降低到2的話,init 就會執行 K45named 指令碼。
不同的運行級有不同的用處,例如,如果丟失了root 口令,那麼可以讓機器啟動進入單使用者狀態來設定。在啟動後的 lilo 提示符下輸入:init=/bin/sh rw
就可以使機器進入運行級1 ,並把 root 檔案系統掛為讀寫。他會跳過所有系統認證, 讓你使用passwd 程式來改變root口令,然後啟動到一個新的運行級。
4、/etc/inittab中的特殊配置
/etc/inittab中,有幾個特殊的特性,允許init重新啟用特殊事件。這些特殊特性都是用第三個欄位中的特殊關鍵字標記出來的。比如:
1. powerwait
允許init在電源被切斷時,關閉系統。其前提是具有U P S和監視U P S並通知init電源已被切斷的軟體。
2. ctrlaltdel
允許init在使用者於控制台鍵盤上按下C t r l + A l t + D e l按鍵組合時,重新啟動系統。注意,如果該系統放在一個公用場所,系統管理員可將C t r l + A l t + D e l按鍵組合配置為別的行為,比如忽略等。
3. sysinit
系統啟動時準備啟動並執行命令。比如說,這個命令將清除/tmp。
其他的關鍵字及其使用詳情,可參考inittab手冊頁。
運行層級補充
1、確定當前的運行層級
本章不是針對系統管理員的,但是作為s h e l l編程者,應當瞭解r c . s c r i p t s是什麼,它們是被怎樣放置到運行層級配置目錄中的。順便說一下,如果想知道當前的運行層級,可以用下面的命令:
who -r
在‘run level’後面的數字就是當前的運行層級。後面的時間是系統最近一次重啟動的時間。
如果是L I N U X系統,那麼
$ runlevel
2 3
第一列表示系統的前一個運行層級,第二列表示系統當前的運行層級,在這裡是3。
2、inittab
i n i t t a b檔案所包含的域具有嚴格的格式。該檔案中每個條目的格式為:
i d : r s t a r t : a c t i o n : p r o c e s s
其中,i d域是相應進程的唯一標識。
r s t a r t域所包含的數字表示運行該進程的層級。
a c t i o n域告訴i n i t進程如何對待p r o c e s s所對應的進程。這裡可以有很多種動作,但是最常見的是w a i t和r e s p a w n。w a i t意味著當進程啟動後等待它結束。r e s p a w n則意味著如果該進程不
存在,則啟動相應的進程,如果它存在,那麼只要它一掉下來就立即重新啟動它。
p r o c e s s域包含了實際要啟動並執行命令。
該檔案的第一行是系統預設的運行層級,這裡是層級3,一般都是這樣。
以數字1 0到1 6開始的行啟動或停止該運行層級所對應的全部運行層級指令碼。例如,該檔案中有這樣一行:
15:5:wait:/etc/rc.d/rc 5
它的意思是,在運行層級5應該以參數5執行指令碼/ e t c / r c . d / r c,即/ e t c / r c . d / r c執行/ e t c / r c . d / r c 5 . d
目錄中的所有指令碼。
在上述檔案的最後一行,在運行層級2、3、4和5,該進程將會始終存在,即使暫時掉下來,大概也不會超過1 s。這一始終存在的進程是串口t t y S 1上的m i n g e t t y。該命令含有一個參數,即終端類型為v t 1 0 0。
3、運行層級指令碼的格式
r c N . d目錄中的指令碼都是一些連結,這樣是為了省去不必要的副本。這些連結的格式為:
S n n n . s c r i p t _ n a m e
K n n n . s c r i p t _ n a m e
其中,
S:代表啟動相應的進程
K:代表殺死相應的進程
n n:是0 0至9 9的兩位元字,不過在有些系統中是0 0 0至9 9 9三位元字。在不同目錄中的連結應採用同一數字。例如,如果某個服務在r c 3 . d中啟動時名為S 4 5 . m y s c r i p t,那麼如果希望它
在r c 2 . d中啟動,應當使用連結名S 4 5 . m y s c r i p t。
s c r i p t _ n a m e:相應指令碼的檔案名稱,根據所在作業系統的不同,它們可能位於下列目錄中:
/ u s r / s b i n / i n i t . d
/ e t c / r c . d
/ e t c / i n i t . d
當i n i t 進程調用相應的運行層級指令碼時,殺進程按照從高到低的K序號進行,即
K23,myscript K12.named;而啟動進程按照從低到高的序號進行。如果使用的是L I N U X系統,K序號將按照從高到低的順序執行。
安裝運行指令碼
1、安裝運行層級指令碼
如果想要安裝自己的運行層級指令碼,必須:
• 編寫該指令碼,確保它符合調用標準。
• 確信它能夠啟動或終止相應的服務。
• 將該指令碼放置於(取決於作業系統) / e t c / i n i t . d或/ u s r / s b i n / i n i t . d或/ e t c / r c . d中。
• 在相應的r c N . d目錄中按照合理的命名方式建立連結。
下面的指令碼能夠啟動或停止一個名為r c . a u d i t的審核應用程式。該服務運行於層級3、5、4,停止於層級6、2、1。通過查看r c N . d中的條目,我們發現序號3 5空閑,於是就使用該序號。
實際上,系統並不對使用已佔用的序號作任何檢查。
讓我們假定該指令碼已經通過了測試。它能夠正確地啟動和停止審核服務。現在我們把該指令碼放置在相應的運行層級目錄中。
在本系統中,r c N . d目錄位於/ e t c / r c . d目錄下,而我的運行層級指令碼儲存在/ e t c / r c . d / i n i t . d目錄下。如果系統目錄結構與上面的不同,那麼需要對下面的命令作相應的調整。
我們首先啟動該指令碼—記住啟動指令碼所使用的連結名是以S打頭的。
$pwd
/etc/rc.d/rc3.d
$ln -s ../init.d/rc.audit S35rc.audit
$ls -l
....
lrwxrwxrws 1 root root .....S35rc.audit -> ../init.d/rc.audit
.......
我們已經建立了相應的連結。ls -l命令的結果顯示該連結指向/ e t c / i n i t . d / r c . a u d i t檔案。現在只要進入其他的相關目錄( r c 4 . d
和r c 5 . d )使用同樣的命令就可以啟動其他相應的服務。
如果希望停止某個指令碼的運行,可以使用如下命令:
$pwd
/etc/rc.d/rc6.d
$ln -s ../init.d/rc.audit K35rc.audit
$ls -l
...
lrwxrwxrwx 1 root root ... K35rc.audit -> ../init.d/rc.audit
...
在其他相關目錄中,也可以如法炮製,停止相應的審核服務。現在當系統重啟動時(運行層級6 ),它將被停止;在運行層級切換到2或1時也是如此。該服務在運行層級4或5中同樣也會被啟動。
2、使用inittab來啟動應用程式
我們還可以用其他的方法來啟動應用程式。可以通過在i n i t t a b檔案中加入相應的條目來做到這一點。
系統運行在層級3時運行我的一個磁碟鏡像檢查指令碼。
首先我確定該指令碼能夠正確運行,然後對i n i t t a b檔案做備份。
$ cp /etc/initab /etc/inittab.bak
接下來編輯i n i t t a b檔案,在該檔案末尾加入這樣一個條目:
rc.diskchecker:3:once:/usr/local/etc/rc.diskchecker > /dev/console 2>&1
儲存並退出。
上面的一條意思是:
行首的r c . d i s k c h e c k e r是該進程在運行層級3中的唯一標識。該進程只運行一次。所要啟動並執行指令碼是/ u s r / l o c a l / e t c / r c . d i s k c h e c k e r,所有的輸出都被送到控制台。
3、啟動和停止服務的其他方法:rc.local
如果不想把/ e t c / i n i t t a b檔案弄得過於雜亂,還有其他的方法可以實現啟動和停止服務的功能。大多數系統都含有一個名為r c . l o c a l的檔案,一般來說也是位於/ e t c目錄下。該指令檔將在i n i t t a b和運行層級指令碼之後運行。可以在該檔案中加入任何命令,或從中調用最習慣用的啟動指令碼。
有些系統還在/ b i n目錄下(更多的是在/ u s r / s b i n目錄下)含有一個名為s h u t d o w n的指令檔。
可以使用它來關閉某些服務。
[javascript]關於onselectstart
這個屬性用在body中,可以實現對文本的選擇與否的控制,onselectstart="return true" -- 可選,是預設項,false -- 不可選。如果要實現對頁面上某些對象文本資訊的控制,可以採用編寫當該對象為指定對象時返回一個boolean值的方法來控制。
function allowedSelect()
{
var obj= event.srcElement ;
if(obj.tagName== "input" && the.type.toLowerCase() == "text" )
return true;
else
return true ;
}
ondragstart
<body ondragstart="return false">
禁止滑鼠在網頁上拖動.