Linux-Android系统启动之INIT进程和system v init
Linux系統(tǒng)啟動(dòng)之INIT進(jìn)程和system v init
一. Linux系統(tǒng)啟動(dòng)之INIT進(jìn)程和system v init
1. 首先介紹一下INIT進(jìn)程
?init進(jìn)程在Start_kernel執(zhí)行完畢之后,也就是Kernel初始化完畢之后啟動(dòng),是系統(tǒng)所有進(jìn)程的起點(diǎn),內(nèi)核在完成核內(nèi)引導(dǎo)以后,即在本線程(進(jìn)程)空間內(nèi)加載init程序,它的進(jìn)程號(hào)是1。
?如果是使用system v init啟動(dòng)的話,實(shí)際上system v init就是一個(gè)INIT進(jìn)程.?
2. 接下來(lái)介紹一下/etc/inittab文件
?init程序需要讀取/etc/inittab文件作為其行為指針,inittab是以行為單位的描述性(非執(zhí)行性)文本,每一個(gè)指令行都具有以下格式:?id:runlevel:action:process其中id為入口標(biāo)識(shí)符,runlevel為運(yùn)行級(jí)別,action為動(dòng)作代號(hào),process為具體的執(zhí)行程序。
?id一般要求4個(gè)字符以內(nèi),對(duì)于getty或其他login程序項(xiàng),要求id與tty的編號(hào)相同,否則getty程序?qū)⒉荒苷9ぷ鳌?br />?runlevel 是init所處于的運(yùn)行級(jí)別的標(biāo)識(shí),一般使用0-6以及S或s。0、1、6運(yùn)行級(jí)別被系統(tǒng)保留,0作為shutdown動(dòng)作,1作為重啟至單用戶模式,6 為重啟;S和s意義相同,表示單用戶模式,且無(wú)需inittab文件,因此也不在inittab中出現(xiàn),實(shí)際上,進(jìn)入單用戶模式時(shí),init直接在控制臺(tái)(/dev/console)上運(yùn)行/sbin/sulogin。
?在一般的系統(tǒng)實(shí)現(xiàn)中,都使用了2、3、4、5幾個(gè)級(jí)別,在Redhat系統(tǒng)中,2表示無(wú)NFS支持的多用戶模式,3表示完全多用戶模式(也是最常用的級(jí)別),4保留給用戶自定義,5表示XDM圖形登錄方式。7-9級(jí)別也是可以使用的,傳統(tǒng)的unix系統(tǒng)沒有定義這幾個(gè)級(jí)別。runlevel可以是并列的多個(gè)值,以匹配多個(gè)運(yùn)行級(jí)別,對(duì)大多數(shù)action來(lái)說(shuō),僅當(dāng)runlevel與當(dāng)前運(yùn)行級(jí)別匹配成功才會(huì)執(zhí)行。
initdefault 是一個(gè)特殊的action值,用于標(biāo)識(shí)缺省的啟動(dòng)級(jí)別;當(dāng)init由核心激活以后,它將讀取inittab中的initdefault項(xiàng),取得其中的 runlevel,并作為當(dāng)前的運(yùn)行級(jí)別。如果沒有inittab文件,或者其中沒有initdefault項(xiàng),init將在控制臺(tái)上請(qǐng)求輸入.
3. 分析一下system v init的流程???
>> 首先會(huì)執(zhí)行/etc/rc.d/rc.sysinit,它主要完成啟動(dòng)交換分區(qū)/檢查磁盤/配置主機(jī)名/檢查并掛載文件系統(tǒng)/加載并初始化硬件模塊等功能;
>> 然后執(zhí)行缺省的運(yùn)行級(jí)別模式(例如通過(guò)id:5:initdefault指定缺省的運(yùn)行級(jí)別為5的話,則會(huì)到etc/rc.d/rc5.d目錄下尋找并執(zhí)行所有的配置文件,實(shí)際上該目錄下的所有配置文件都是鏈接到/etc/rc.d/init.d目錄下的文件,可以通過(guò)ls -l命令來(lái)查看具體的鏈接關(guān)系);
>> 接下來(lái)去執(zhí)行/etc/rc.d/rc.local腳本文件(這是INIT執(zhí)行的最后一個(gè)腳本文件,所以用戶可以在這個(gè)文件中添加一些需要在登陸之前執(zhí)行的命令,作用上和PC電腦windows或者dos系統(tǒng)中c盤根目錄下的autoexec.bat作用完全一樣);
>> 最后去執(zhí)行/bin/login程序
?
?如果上述的初始化過(guò)程都能夠正常結(jié)束的話,將為使用者進(jìn)行初始化環(huán)境操作,并將控制權(quán)交給shell.
二. 由Linux系統(tǒng)啟動(dòng)之INIT進(jìn)程和system v init想到的系統(tǒng)開機(jī)啟動(dòng)應(yīng)用程序的調(diào)用
?通過(guò)上面的講述可以看到,系統(tǒng)的啟動(dòng)過(guò)程中init進(jìn)程會(huì)去etc/rc.d/rc*.d目錄下尋找并執(zhí)行默認(rèn)運(yùn)行級(jí)別的配置文件,顯然在這個(gè)過(guò)程中可以通過(guò)添加配置文件來(lái)啟動(dòng)我們自己的應(yīng)用程序.同時(shí),我們也注意到system v init執(zhí)行流程的第三步中會(huì)去檢查并執(zhí)行/etc/rc.d/rc.local腳本文件,可以通過(guò)該腳本文件來(lái)啟動(dòng)我們自己的應(yīng)用程序.
?所以,我們得到如下的結(jié)論:
1. 在啟動(dòng)/etc/init.d下添加啟動(dòng)腳本,創(chuàng)建/etc/rc.d/.../目錄下的鏈接
?實(shí)際上系統(tǒng)中絕大部分的應(yīng)用程序都是通過(guò)這種方式來(lái)進(jìn)行啟動(dòng)的。
?有關(guān)腳本的語(yǔ)法和寫法不是這里描述的重點(diǎn),網(wǎng)上資料一大把,去問(wèn)BAIDU&GOOGLE吧.
2. 直接在/etc/rc.d/rc.local中添加命令,該腳本在啟動(dòng)過(guò)程中調(diào)用
?比如我機(jī)器F10上rc.local的內(nèi)容如下:
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
?相應(yīng)的在后面天加上自己要啟動(dòng)的應(yīng)用程序就可以了,例如有些example中使用如下的方式啟動(dòng)nfs:/etc/rc.d/init.d/nfs restart (注釋以下,restart為調(diào)用腳本時(shí)候的參數(shù))
?通過(guò)查詢資料,突然想起來(lái)可以通過(guò)u-boot或者類似的boot程序給kernel傳遞參數(shù),通過(guò)參數(shù)來(lái)指定啟動(dòng)的應(yīng)用程序名字及其路徑,例如init=/passion's program(注釋:這只是參數(shù)的一部分,完整的參數(shù)還有其它的內(nèi)容,可以參照boot代碼或者kernel參數(shù)的相關(guān)介紹).只不過(guò),這個(gè)時(shí)候啟動(dòng)應(yīng)用程序的時(shí)間和上面的兩種方法不太一樣,這個(gè)是在kernel初始化剛結(jié)束的時(shí)候啟動(dòng)的,就是在system v init還沒有啟動(dòng)的時(shí)候調(diào)用的.當(dāng)然了,上面的兩種方法啟動(dòng)的應(yīng)用程序的也不是在同一時(shí)刻進(jìn)行調(diào)用.
?
?好了,收工.
?
總結(jié)
以上是生活随笔為你收集整理的Linux-Android系统启动之INIT进程和system v init的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux学习之zImage内核镜像解压
- 下一篇: cmd关闭端口的命令是什么(如何开放端口