<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
    數(shù)據(jù)加載中……

    Debian的init進程初始化工作原理

    init和inittab
    =============
    Linux下為什么會要有個init?用過windows 9.x的人應(yīng)該知道有個批處理文件autoexec.bat,用過windows NT/2000系統(tǒng)的人應(yīng)該在控制面板中見過system service工具,它們的目的是相同的。只是比較起來windows下的這些東西功能太弱(當(dāng)然用法也更簡單)。
    init是Linux啟動的最后一步,它幫助用戶完成每次啟動系統(tǒng)都必須完成的一些重復(fù)性任務(wù),如加載文件系統(tǒng)、各類網(wǎng)絡(luò)服務(wù)等等程序;它還有一個重要用途,讓用戶自定義系統(tǒng)運行環(huán)境,只啟動需要的進程,關(guān)閉不用的進程,釋放內(nèi)存和處理器資源,讓系統(tǒng)運行得更快更穩(wěn)。

    init會按任務(wù)表執(zhí)行我們下的命令,這個任務(wù)表就是/etc/inittab文件。我們可以為系統(tǒng)制定多個運行環(huán)境以滿足不同任務(wù)的需要,在inittab中稱之為運行等級(runlevel)。例如,計算機要用來完成一種聯(lián)網(wǎng)編譯任務(wù)(與其它系統(tǒng)共享CPU周期,合作編譯軟件),這樣情況需占用大量CPU能力和內(nèi)存,所以當(dāng)計算機用作這種用途時,其他程序的運行要盡可能少。可設(shè)置一個運行等級(如:runlevel 4),把其它程序包括X Window全關(guān)閉,只啟動聯(lián)網(wǎng)編譯進程;其他時段,你的計算機要與Windows系統(tǒng)共享文件,需要啟動Samba,可以再定義一個運行等級(如:runlevel 2)。
    現(xiàn)在當(dāng)你要進行聯(lián)網(wǎng)編譯時可運行init 4,而不用手工去關(guān)閉每個暫不需要的進程;要與Windows系統(tǒng)共享文件可運行init 2。

    Debian系統(tǒng)對某些運行等級進行了預(yù)先配置(而且是無法修改的)

    runlevel 0:它的任務(wù)就是關(guān)閉所有程序,關(guān)機。如果計算機及內(nèi)核支持APM,系統(tǒng)電源可自動切斷。

    runlevel 1:為單用戶模式保留的。在這個運行等級下,除了一個root shell外,沒有其它程序運行。除了root文件系統(tǒng)以只讀方式安裝外,不安裝其它文件系統(tǒng)。該運行等級通常在恢復(fù)系統(tǒng)時用。

    runlevel 6:與runlevel 0非常相似,只是它是重啟系統(tǒng)而不是關(guān)閉系統(tǒng)。

    runlevel 2、3、4、5:Debian系統(tǒng)對它們沒有具體規(guī)定,通常可自由進行定制,它們都屬于多用戶模式。其中runlevel 3是Debian使用的默認運行等級。啟動Debian系統(tǒng)時,用的就是這個運行等級。

    下面是inittab文件的例子

    # /etc/inittab: init(8) configuration.
    # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

    # The default runlevel.
    id:2:initdefault:

    # Boot-time system configuration/initialization script.
    # This is run first except when booting in emergency (-b) mode.
    si::sysinit:/etc/init.d/rcS

    # What to do in single-user mode.
    ~~:S:wait:/sbin/sulogin

    # /etc/init.d executes the S and K scripts upon change
    # of runlevel.
    #
    # Runlevel 0 is halt.
    # Runlevel 1 is single-user.
    # Runlevels 2-5 are multi-user.
    # Runlevel 6 is reboot.

    l0:0:wait:/etc/init.d/rc 0
    l1:1:wait:/etc/init.d/rc 1
    l2:2:wait:/etc/init.d/rc 2
    l3:3:wait:/etc/init.d/rc 3
    l4:4:wait:/etc/init.d/rc 4
    l5:5:wait:/etc/init.d/rc 5
    l6:6:wait:/etc/init.d/rc 6
    # Normally not reached, but fallthrough in case of emergency.
    z6:6:respawn:/sbin/sulogin

    # What to do when CTRL-ALT-DEL is pressed.
    ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

    # Action on special keypress (ALT-UpArrow).
    #kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

    # What to do when the power fails/returns.
    pf::powerwait:/etc/init.d/powerfail start
    pn::powerfailnow:/etc/init.d/powerfail now
    po::powerokwait:/etc/init.d/powerfail stop

    # /sbin/getty invocations for the runlevels.
    #
    # The "id" field MUST be the same as the last
    # characters of the device (after "tty").
    #
    # Format:
    # <id>:<runlevels>:<action>:<process>
    #
    # Note that on most Debian systems tty7 is used by the X Window System,
    # so if you want to add more getty's go ahead but skip tty7 if you run X.
    #
    1:2345:respawn:/sbin/getty 38400 tty1
    2:23:respawn:/sbin/getty 38400 tty2
    3:23:respawn:/sbin/getty 38400 tty3
    4:23:respawn:/sbin/getty 38400 tty4
    5:23:respawn:/sbin/getty 38400 tty5
    6:23:respawn:/sbin/getty 38400 tty6

    # Example how to put a getty on a serial line (for a terminal)
    #
    #T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
    #T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

    # Example how to put a getty on a modem line.
    #
    #T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

    該文件有一個基本類型的指令,它們指定命令行,命令行所采取的動作,在何種運行等級下激活命令。這引起命令行的格式大體如下:

    id:runlevels:action:command

    id是任意一個名稱(具體是什么并不重要),runlevels是一個數(shù)字串(代表運行等級),action描述何時執(zhí)行命令,command指定執(zhí)行的實際命令。拿啟動getty的命令行舉例:

    1:2345:respawn:/sbin/getty 38400 tty1

    該命令告訴init,它應(yīng)該在引導(dǎo)后以運行等級2-5運行命令/sbin/getty 38400 tty1。動作標記respawn表示命令在退出時重新運行(當(dāng)用戶在shell輸入exit的時候)。

    從方面的文件中可以看到,運行等級2和3有六個活動的gettys,而等級4和5只有一個。假設(shè)運行等級4下有三個shell運行在虛擬控制臺。你在ID為2和3的命令行的運行等級字段添加了數(shù)字4,也就是說你將

    2:23:respawn:/sbin/getty 38400 tty2
    3:23:respawn:/sbin/getty 38400 tty3

    替換成

    2:234:respawn:/sbin/getty 38400 tty2
    3:234:respawn:/sbin/getty 38400 tty3

    然后重啟或執(zhí)行以下命令:

    telinit q

    對inittab進行修改。telinit q命令指示init重新加載它的配置。參閱telinit(8)。

    /etc/inittab的其它行看起來比較復(fù)雜,我們先看看還有哪些動作標記:

    ·respawn:啟動命令并監(jiān)視命令的執(zhí)行,當(dāng)進程退出時,再次執(zhí)行該命令(通常用于虛擬終端設(shè)備上的登錄提示)。 ·wait:進入指定運行等級時,啟動進程。init會停下來,直到執(zhí)行完成。這個標記用于設(shè)置特定等級下軟件的啟動。
    ·once:進入指定的任一運行等級時,啟動一次進程。
    ·boot:該命令在系統(tǒng)引導(dǎo)時運行。這種類型的指令忽略運行等級。
    ·bootwait:該命令在系統(tǒng)引導(dǎo)時運行,init等到它退出后才能繼續(xù)做別的事。
    ·off:禁用所有運行等級下的某個命令。
    ·initdefault:這種類型的項指定在系統(tǒng)引導(dǎo)時進入哪個運行等級。
    ·powerwait:這類指令給出在電源不足時需要執(zhí)行的命令。init直到進程完成后才繼續(xù)工作。
    ·powerfail:與powerwait類似,但init不等待進程完成。
    ·powerworkwait:電源正常后執(zhí)行。init暫停,直到進程結(jié)束。
    ·powerfailnow:當(dāng)便攜機電池或外部UPS電池電量不足時執(zhí)行。
    ·ctrlaltdel:指定init在捕獲ctrl+alt+del組合鍵時執(zhí)行的命令。
    ·kbdrequest:把特殊動作映射到特定的按鍵。Debian中的是alt+UpArrow。

    現(xiàn)在再看上面的文件是不是清楚了許多?

    更強大的sysvinit
    ================
    inittab的主要功能是描述引導(dǎo)及正常操作時,應(yīng)該在何種運行等級下啟動什么程序,每個運行等級的具體項目完全可以通常/etc/inittab來定義,但Debian有一個更健壯的方案sysvinit,它被認為是init最強大的應(yīng)用程序之一。Debian組織inittab的方式是把運行等級的大部分定義從inittab中移出來,移到一個腳本層次中去。惟一直接從inittab啟動的程序只有g(shù)etty,它用于虛擬設(shè)備上啟動登錄提示符,保留它因為它們要求特殊處理,在inittab之外處理要困難得多。

    inittab來啟動所有軟件當(dāng)然是可能的,但將所有配置寫在同一個文件既不方便查看也不方便維護,所以文件里會加上這許多行:

    l0:0:wait:/etc/init.d/rc 0
    l1:1:wait:/etc/init.d/rc 1
    l2:2:wait:/etc/init.d/rc 2
    l3:3:wait:/etc/init.d/rc 3
    l4:4:wait:/etc/init.d/rc 4
    l5:5:wait:/etc/init.d/rc 5
    l6:6:wait:/etc/init.d/rc 6

    這些行實際決定了系統(tǒng)在各個運行等級下的行為。它們?nèi)绾巫龅降囊苍S并不明顯,但至少我們知道主要意思:首先每行都有個符號ID lx,lx表示runlevel x;其次,每行只在一個運行等級下激活,該運行等級對應(yīng)著符號ID中的數(shù)字x。命令執(zhí)行時,init停下來,直到進程結(jié)束。最后,每個命令行調(diào)用一個腳本/etc/init.d/rc x,這里x代表當(dāng)前運行等級的數(shù)字。顯然各運行等級的具體任務(wù)在/etc/init.d/rc腳本中安排。

    Debian init設(shè)置的核心在/etc/init.d目錄。該目錄包含了啟動或停止重要軟件的腳本,為了簡化操作,規(guī)定每個腳本都使用相同的一套參數(shù)——start或stop。個別軟件包維護者為用戶著想,往這些腳本中加了其他功能,但init不會去調(diào)用它們。
    舉個例子,可調(diào)用:#/etc/init.d/apache start來啟動Apache,調(diào)用:#/etc/init.d/apache stop來關(guān)閉它。
    作為一個用戶工具,這是非常有用的,它讓用戶輕松啟動和關(guān)閉Debian所帶的復(fù)雜程序,不過在考慮如何啟動程序前,先檢查/etc/init.d,看看是不是已經(jīng)有腳本可以做這件事了。借助于這種機制,可以按自己的需求來調(diào)整運行等級,/etc/init.d/rc可以把系統(tǒng)引入所需的運行等級。/etc/rcx.d是一組指向/etc/init.d的符號鏈接。進行運行等級時,rc在運行等級目錄中按邏輯順序處理每個腳本。首先前綴為K的每個文件都以參數(shù)stop(按字母和數(shù)字順序)執(zhí)行;其次,以S為前綴的每個腳本都以參數(shù)start(按字母和數(shù)字順序)執(zhí)行。
    了解了工作原理,下面試著自己來構(gòu)造一個運行等級。我們使用運行等級5和與之相關(guān)的rc目錄/etc/rc5.d。首先,看看該目錄下的內(nèi)容:找出每個符號鏈接所做的工作;查看文件,判斷它來自哪個文件。經(jīng)過仔細查看,找出啟動無用程序的S打頭的腳本,把它們刪掉,在/etc/init.d中找出需要運行但未包括在內(nèi)的腳本,例如假設(shè)你想在運行等級5下啟動Samba,執(zhí)行命令:

    ln -s /etc/init.d/samba /etc/rc5.d/S20samba

    看到這里是不是對init有了新的了解,那么來測試一下學(xué)習(xí)成果:關(guān)閉Debian默認安裝時加載的gdm/xdm/kdm進程,讓Debian啟動到命令行終端而不是X。

    深入學(xué)習(xí):
    inittab(5)
    init(8)
    telinit(8)
    /usr/doc/sysvinit/*

    轉(zhuǎn)自:http://www.chinalinuxpub.com/bbs/archive/index.php/t-27715.html

    posted on 2005-06-24 20:30 weidagang2046 閱讀(257) 評論(0)  編輯  收藏 所屬分類: Linux

    主站蜘蛛池模板: 亚洲无人区视频大全| 222www免费视频| 亚洲精品中文字幕| 无码乱人伦一区二区亚洲一| 免费a级毛片在线观看| 97人妻无码一区二区精品免费| gogo免费在线观看| 亚洲aⅴ无码专区在线观看春色 | 一级黄色免费毛片| 亚洲一线产品二线产品| 亚洲精品亚洲人成在线观看麻豆| 亚洲一区爱区精品无码| 亚洲AV无码成H人在线观看| 成人免费a级毛片无码网站入口| 久章草在线精品视频免费观看| av片在线观看永久免费| 西西人体大胆免费视频| 亚洲精品国产综合久久久久紧| 亚洲av成人综合网| 国产精品亚洲午夜一区二区三区| 亚洲欧洲日产国产综合网| 亚洲不卡av不卡一区二区| 在线亚洲精品福利网址导航| 亚洲男人天堂2020| 亚洲国产成人五月综合网| yy6080亚洲一级理论| 免费欧洲毛片A级视频无风险| 免费看大美女大黄大色| 成年人网站在线免费观看| 色婷婷7777免费视频在线观看| 亚洲免费在线观看视频| av无码国产在线看免费网站| 3d成人免费动漫在线观看| 97在线视频免费播放| 亚洲精品国产免费| 在线视频精品免费| 青娱乐免费在线视频| 无码人妻精品中文字幕免费东京热| 亚洲视频免费观看| 黄色免费网站网址| 女人张开腿给人桶免费视频|