Slackware啓動腳本與System V啓動腳本的區別何在?
Slackware 使用BSD風格的init腳本,而不少別的發行版使用System V風格的init腳本。SysV和BSD腳本都是能讓人讀懂的,即它們都是shell腳本,而不是已編譯的程序。主要的區別在於腳本是如何設計的。
SysV腳本傾向於接受諸如start、stop、restart之類的參數,依它所啓動的程序而定。因此你能夠用 /etc/init.d/bind start 這樣的命令來啓動BIND,並用 /etc/init.d/bind stop 來中止BIND。
SysV的啓動還傾向於使用符號連接來組織啓動進程,例如在 /etc/rc.d/rc.4/中,可能會有指向別的目錄中的真正的腳本的各類各樣的符號連接。這些連接的命令會像是 S10network、S25xdm之類,其中的S表示啓動(start)該項服務(若是是K,則表示kill),而數字指定了腳本執行的順序。
SysV風格的啓動腳本的主要優勢在於可以設置成自動配置許多東西。例如,若你進入runlevel 6,你能夠創建一個連接叫K75bind來終止BIND,前提是連接所指向的文件已經設置好來作這件事。
SysV風格腳本的主要缺點是太過彎彎繞。假如我想增長一個服務,我要先寫一個SysV風格的腳本(不是容易的事),它至少要處理「start」(還可能有「stop」)。而後,我必須確保在每一個要運行這個服務的runlevel中正確地設置好符號連接。若是剛好這個服務須要在已經連續編號的兩個腳本之間運行,我就須要作一些對符號連接從新編號的工做(例如,S10xxx和S11yyy已經存在,而我想讓zzzz在它們之間運行,我就須要對前二者之一從新創建符號連接來把zzzz擠進去)。
想暫時改變SysV的啓動進程也是很是痛苦的事情。假如我不想在下次啓動時運行xxx服務,最簡單的辦法是刪除S10xxx這個連接,不算難吧?但若是我想在每一個runlevel中都去掉它,我就須要從每一個有關目錄中刪除S10xxx這個連接。而後,假如我改了主意,想從新運行xxx,我須要手工從新創建全部的符號連接。
這樣子無疑是在已經很複雜的啓動進程上疊牀架屋,而Slackware是不會這麼作的:它用BSD風格的啓動腳本。
BSD風格的腳本是直接了當的shell腳本,它們傾向於順序運行,而不須要start或stop之類參數。只要系統進入了它們的runlevel就會執行,就這麼簡單。
BSD風格的主要缺點是你須要一些其餘方法來控制後臺服務。例如,若我要中止BIND,我要先用命令 ps ax|grep named 找出 named的PID,而後kill這個PID(或者用這個pid的文件名)。可是我不能簡單地下個命令 /etc/init.d/bind stop (除非我已經寫了個這樣的SysV腳本)。
BSD風格腳本的主要優勢是它們很是容易閱讀和編輯。例如,若我想增長一個服務zzzz,我能夠在 /etc/rd.d/rc.local中增長一行 /usr/local/bin/zzzz,這樣只要是執行rc.local的runlevel,zzzz就會隨之運行。假如我只想在runlevel 4執行zzzz,我能夠把它放在 /etc/rc.d/rc.4 (不是目錄,而是一個腳本)中。若是我要改變執行順序,我只要把zzzz放在適當的服務之間,多數編輯器都支持在文件中間插入文本(就算ed都支持)。還有,你能夠用註釋的方式中止一個服務,而後去掉註釋讓它從新運行。
所以,當多數發行版採用SysV風格時,Slackware採用了BSD風格。對於許多Slackware用戶,BSD風格的易用性賽過SysV風格的強大功能。固然,你能夠有本身的意見。
與廣泛的觀點相反,從一種風格轉到另外一種並不那麼困難,只要把inittab和rc文件從一個系統拷貝到另外一個系統便可。init程序自身沒有改變,所謂「風格」可能是在inittab和它所調用的腳本中設置的。
譯註:如今slackware爲了提升兼容性,在/etc/rc.d/提供了rc.sysvinit腳本以適應某些基於SysV啓動過程的商業程序的須要。另外,在許多設置服務的腳本中,也接受start、stop、restart這一類參數,例如rc.sendmail、rc.sshd等。shell